com.fujitsu.dc.common.ads.AdsWriteFailureLogWriterTest.java Source code

Java tutorial

Introduction

Here is the source code for com.fujitsu.dc.common.ads.AdsWriteFailureLogWriterTest.java

Source

/**
 * personium.io
 * Copyright 2014 FUJITSU LIMITED
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.fujitsu.dc.common.ads;

    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.IOUtils;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;

    import com.fujitsu.dc.common.ads.AdsWriteFailureLogInfo.OperationKind;

    /**
     * ADS????.
     */
    public class AdsWriteFailureLogWriterTest {

        private static final String PIO_VERSION_DUMMY = "1.3.18-test";

        private AdsWriteFailureLogWriter writer;

        /**
         * ???????.
         * @throws InterruptedException InterruptedException
         */
        @Before
        public void before() throws InterruptedException {
            writer = AdsWriteFailureLogWriter.getInstance("./", PIO_VERSION_DUMMY, true);
        }

        /**
         * ??ADS??????.
         * @param writer writer
         * @return ?
         */
        private File getAdsWriteFailureLog() {
            File file = null;
            try {
                Class<?> clazz = AbstractAdsWriteFailureLog.class;
                Field baseDir = clazz.getDeclaredField("baseDir");
                baseDir.setAccessible(true);
                String baseDirV = (String) baseDir.get(writer);
                clazz = writer.getClass();
                Field createdTime = clazz.getDeclaredField("createdTime");
                createdTime.setAccessible(true);
                Long createdTimeV = (Long) createdTime.get(writer);
                final String fileName = String.format(AbstractAdsWriteFailureLog.LOGNAME_FORMAT_ACTIVE,
                        PIO_VERSION_DUMMY, createdTimeV);
                file = new File(baseDirV, fileName);
            } catch (Exception e) {
                e.printStackTrace();
                fail("configuration failed.");
            }
            return file;
        }

        /**
         * ??ADS??????.
         * @param writer writer
         * @return ?
         */
        private File getRotatedAdsWriteFailureLog() {
            File file = null;
            try {
                Class<?> clazz = AbstractAdsWriteFailureLog.class;
                Field baseDir = clazz.getDeclaredField("baseDir");
                baseDir.setAccessible(true);
                String baseDirV = (String) baseDir.get(writer);
                clazz = writer.getClass();
                Field createdTime = clazz.getDeclaredField("createdTime");
                createdTime.setAccessible(true);
                Long createdTimeV = (Long) createdTime.get(writer);
                final String fileName = String.format(AbstractAdsWriteFailureLog.LOGNAME_FORMAT_ROTATE,
                        PIO_VERSION_DUMMY, createdTimeV);
                file = new File(baseDirV, fileName);
            } catch (Exception e) {
                e.printStackTrace();
                fail("configuration failed.");
            }
            return file;
        }

        /**
         * ADS??????????.
         */
        @Test
        public void ADS??????????()
        {

            File file = null;
            try {
                writer.openActiveFile();
                file = getAdsWriteFailureLog();
            } catch (AdsWriteFailureLogException e) {
                fail("open failed");
                e.printStackTrace();
            } finally {
                try {
                    writer.closeActiveFile();
                } catch (AdsWriteFailureLogException e) {
                    e.printStackTrace();
                }
                if (null != file) {
                    file.delete();
                }
            }
        }

        /**
         * ??ADS???????????????.
         */
        @Test
        public void ??ADS???????????????()
        {

            File file = getAdsWriteFailureLog();

            try {
                writer.openActiveFile();
                file.delete();
                writer.openActiveFile();
            } catch (AdsWriteFailureLogException e) {
                fail("open failure test failed");
            } finally {
                try {
                    writer.closeActiveFile();
                } catch (AdsWriteFailureLogException e) {
                    e.printStackTrace();
                } finally {
                    file.delete();
                }
            }
        }

        /**
         * ??ADS????OutputStream????????????.<br />
         * ???????????????Windows????????Ignore??????
         */
        @Test
        @Ignore
        public void ??ADS????OutputStream????????????()
        {

            try {
                writer.openActiveFile();
            } catch (AdsWriteFailureLogException e) {
                fail("open failure test failed");
            }

            File file = null;
            try {
                Class<?> clazz = writer.getClass();
                Field ostream = clazz.getDeclaredField("activeFileOutputStream");
                ostream.setAccessible(true);
                ostream.set(writer, null);
                file = getAdsWriteFailureLog();
            } catch (Exception e) {
                e.printStackTrace();
                fail("configuration failed.");
            }

            try {
                writer.openActiveFile();
                fail("open failure test failed");
            } catch (AdsWriteFailureLogException e) {
                assertTrue(file.exists());
            } finally {
                if (null != file) {
                    file.delete();
                }
            }
        }

        /**
         * ADS?????????????.
         */
        @Test
        public void ADS?????????????()
        {

            long time = System.currentTimeMillis();
            AdsWriteFailureLogInfo loginfo = new AdsWriteFailureLogInfo("u0_anon", "Cell", "odata-lock", "routing-id",
                    "uuid-key", OperationKind.CREATE, 1, time);
            String expected = String.format("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", loginfo.getIndexName(),
                    loginfo.getType(), loginfo.getLockKey(), loginfo.getRoutingId(), loginfo.getUuid(),
                    loginfo.getOperation(), loginfo.getEsVersion(), loginfo.getUpdated());
            File file = null;
            try {
                writer.openActiveFile();
                writer.writeActiveFile(loginfo);
                file = getAdsWriteFailureLog();
            } catch (AdsWriteFailureLogException e) {
                fail("open or write failed");
                e.printStackTrace();
            } finally {
                try {
                    writer.closeActiveFile();
                } catch (AdsWriteFailureLogException e) {
                    e.printStackTrace();
                }
            }
            FileReader reader = null;
            try {
                reader = new FileReader(file);
                char[] cbuf = new char[(int) file.length()];
                reader.read(cbuf, 0, (int) file.length());
                String content = String.valueOf(cbuf);
                assertEquals(expected, content);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(reader);
                if (null != file) {
                    file.delete();
                }
            }
        }

        /**
         * ADS??????????.
         */
        @Test
        public void ADS??????????()
        {

            File srcFile = null;
            File dstFile = null;
            try {
                writer.openActiveFile();
                srcFile = getAdsWriteFailureLog();
                dstFile = writer.rotateActiveFile();
                assertFalse(srcFile.exists());
                assertTrue(dstFile.exists());
            } catch (AdsWriteFailureLogException e) {
                fail("rotate failed");
                e.printStackTrace();
            } finally {
                try {
                    writer.closeActiveFile();
                } catch (AdsWriteFailureLogException e) {
                    e.printStackTrace();
                }
                if (null != dstFile) {
                    dstFile.delete();
                }
            }
        }

        /**
         * ADS???????????????.
         */
        @Test
        public void ADS???????????????()
        {

        File srcFile = null;
        File dstFile = null;
        try {
            writer.openActiveFile();
            srcFile = getAdsWriteFailureLog();
            dstFile = getRotatedAdsWriteFailureLog();
            dstFile.mkdir();
            writer.rotateActiveFile();
            fail("rotate failed");
        } catch (AdsWriteFailureLogException e) {
            assertTrue(srcFile.exists());
            assertFalse(dstFile.isFile());
        } finally {
            try {
                writer.closeActiveFile();
            } catch (AdsWriteFailureLogException e) {
                e.printStackTrace();
            }
            if (null != srcFile) {
                srcFile.delete();
            }
            if (null != dstFile) {
                dstFile.delete();
            }
        }
    }

    /**
     * ?10?ADS??????????????.
     * @throws AdsWriteFailureLogException AdsWriteFailureLogException
     */
    @Test
    public void ?10 ?ADS??????????????()throws AdsWriteFailureLogException
        {
        // ?
        AdsWriteFailureLogInfo loginfo = new AdsWriteFailureLogInfo(
                "u0_anon", "Cell", "odata-lock", "routing-id", "uuid-key", OperationKind.CREATE, 1, 333333333L);
        String expected = String.format("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s",
                loginfo.getIndexName(),
                loginfo.getType(),
                loginfo.getLockKey(),
                loginfo.getRoutingId(),
                loginfo.getUuid(),
                loginfo.getOperation(),
                loginfo.getEsVersion(),
                loginfo.getUpdated());

        File dir = new File("./testdir");
        try {
            Class<?> clazz = AbstractAdsWriteFailureLog.class;
            Field baseDir = clazz.getDeclaredField("baseDir");
            baseDir.setAccessible(true);
            baseDir.set(writer, "./testdir");
            if (!dir.mkdir()) {
                fail("mkdir failed(environment error): " + dir.getAbsolutePath());
            }
        } catch (Exception e) {
            e.printStackTrace();
            fail("configuration failed.");
        }
        // ??10?????
        File file = null;
        try {
            writer.openActiveFile();
            file = getAdsWriteFailureLog(); // ????????
            List<AdsWriter> threadList = new ArrayList<AdsWriter>();
            for (int i = 0; i < 100; i++) {
                AdsWriter thread = new AdsWriter();
                threadList.add(thread);
                thread.start();
            }
            for (AdsWriter thread : threadList) {
                try {
                    thread.join(); // ???
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    fail(e.getMessage());
                }
            }
        } finally {
            // ?
            try {
                writer.closeActiveFile();
            } catch (AdsWriteFailureLogException e) {
                e.printStackTrace();
            }
            // ???
            // 100?100?????????10000??????
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new FileReader(file));
                int count = 0;
                while (reader.ready()) {
                    String line = reader.readLine();
                    assertEquals(expected, line); // ???
                    count++;
                }
                assertEquals(10000, count); // ??
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(reader);
                if (null != dir) {
                    try {
                        FileUtils.forceDelete(dir);
                    } catch (IOException e) {
                        e.printStackTrace();
                        fail("environment error.");
                    }
                }
            }
        }
    }

        /**
         * ADS?????????.
         */
        class AdsWriter extends Thread {

            /**
             * .
             */
            public void run() {
                AdsWriteFailureLogWriter logWriter = AdsWriteFailureLogWriter.getInstance("./", PIO_VERSION_DUMMY,
                        true);
                AdsWriteFailureLogInfo loginfo = new AdsWriteFailureLogInfo("u0_anon", "Cell", "odata-lock",
                        "routing-id", "uuid-key", AdsWriteFailureLogInfo.OperationKind.CREATE, 1, 333333333L);
                try {
                    for (int i = 0; i < 100; i++) {
                        logWriter.openActiveFile();
                        logWriter.writeActiveFile(loginfo);
                    }
                } catch (AdsWriteFailureLogException e) {
                    e.printStackTrace();
                    fail("check failed");
                }
            }
        }
    }