Package com.asakusafw.yaess.flowlog

Source Code of com.asakusafw.yaess.flowlog.FlowLoggerTest

/**
* Copyright 2011-2014 Asakusa Framework Team.
*
* 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.asakusafw.yaess.flowlog;

import static com.asakusafw.yaess.core.ExecutionPhase.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Scanner;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import com.asakusafw.yaess.core.ExecutionContext;
import com.asakusafw.yaess.core.ExecutionMonitor;
import com.asakusafw.yaess.core.ExecutionPhase;
import com.asakusafw.yaess.core.PhaseMonitor.JobStatus;

/**
* Test for {@link FlowLogger}.
*/
public class FlowLoggerTest {

    /**
     * Temporary folder.
     */
    @Rule
    public final TemporaryFolder folder = new TemporaryFolder();

    /**
     * simple senario.
     * @throws Exception if failed
     */
    @Test
    public void simple() throws Exception {
        FlowLoggerProfile profile = profile(false, false, false);
        File log = profile.getLogFile(context(MAIN));
        File escape = profile.getEscapeFile(context(MAIN));

        int l00 = 0;

        FlowLogger log1 = new FlowLogger(context(MAIN), profile);
        log1.open(1);
        int l11 = checkLines(log, l00, MAIN);
        log1.close();
        int l12 = checkLines(log, l11, MAIN);

        FlowLogger log2 = new FlowLogger(context(CLEANUP), profile);
        log2.open(1);
        int l21 = checkLines(log, l12, CLEANUP);
        log2.close();

        assertThat(log.isFile(), is(false));
        checkLines(escape, l21, CLEANUP);
    }

    /**
     * logs two phases.
     * @throws Exception if failed
     */
    @Test
    public void chain() throws Exception {
        FlowLoggerProfile profile = profile(false, false, false);
        File log = profile.getLogFile(context(MAIN));
        File escape = profile.getEscapeFile(context(MAIN));

        int l00 = 0;

        FlowLogger log1 = new FlowLogger(context(MAIN), profile);
        log1.open(1);
        int l11 = checkLines(log, l00, MAIN);
        log1.close();
        int l12 = checkLines(log, l11, MAIN);

        FlowLogger log2 = new FlowLogger(context(CLEANUP), profile);
        log2.open(1);
        int l21 = checkLines(log, l12, CLEANUP);
        log2.close();
        assertThat(log.isFile(), is(false));
        checkLines(escape, l21, CLEANUP);

        FlowLogger log3 = new FlowLogger(context(SETUP), profile);
        log3.open(1);
        int l31 = checkLines(log, l00, SETUP);
        log3.close();
        checkLines(log, l31, SETUP);
    }

    /**
     * clear last log.
     * @throws Exception if failed
     */
    @Test
    public void deleteOnSetup() throws Exception {
        FlowLoggerProfile profile = profile(false, true, false);
        File log = profile.getLogFile(context(MAIN));

        int l00 = 0;

        FlowLogger log1 = new FlowLogger(context(MAIN), profile);
        log1.open(1);
        int l11 = checkLines(log, l00, MAIN);
        log1.close();
        int l12 = checkLines(log, l11, MAIN);

        FlowLogger log2 = new FlowLogger(context(SETUP), profile);
        log2.open(1);
        int l21 = checkLines(log, l00, SETUP);
        log2.close();
        checkLines(log, l21, SETUP);

        assertThat(l21, is(lessThan(l12)));
    }

    /**
     * logs two phases, and cleanup.
     * @throws Exception if failed
     */
    @Test
    public void deleteOnCleanup() throws Exception {
        FlowLoggerProfile profile = profile(false, true, true);
        File log = profile.getLogFile(context(MAIN));
        File escape = profile.getEscapeFile(context(MAIN));

        int l00 = 0;

        FlowLogger log1 = new FlowLogger(context(MAIN), profile);
        log1.open(1);
        int l11 = checkLines(log, l00, MAIN);
        log1.close();
        int l12 = checkLines(log, l11, MAIN);

        FlowLogger log2 = new FlowLogger(context(CLEANUP), profile);
        log2.open(1);
        checkLines(log, l12, CLEANUP);
        log2.close();

        assertThat(log.isFile(), is(false));
        assertThat(escape.isFile(), is(false));
    }

    /**
     * logs two phases, and cleanup is prevented.
     * @throws Exception if failed
     */
    @Test
    public void deleteOnCleanup_error() throws Exception {
        FlowLoggerProfile profile = profile(true, true, true);
        File log = profile.getLogFile(context(MAIN));
        File escape = profile.getEscapeFile(context(MAIN));

        int l00 = 0;

        FlowLogger log1 = new FlowLogger(context(MAIN), profile);
        log1.open(1);
        int l11 = checkLines(log, l00, MAIN);
        log1.close();
        int l12 = checkLines(log, l11, MAIN);

        FlowLogger log2 = new FlowLogger(context(CLEANUP), profile);
        log2.open(1);
        try {
            checkLines(log, l12, CLEANUP);
            ExecutionMonitor jm = log2.createJobMonitor("hoge", 1);
            jm.open(1);
            jm.close();
            log2.reportJobStatus("hoge", JobStatus.FAILED, new Exception());
        } finally {
            log2.close();
        }
        assertThat(log.isFile(), is(true));
        assertThat(escape.isFile(), is(false));
    }

    private int checkLines(File log, int last, ExecutionPhase phase) throws IOException {
        int count = 0;
        boolean found = false;
        assertThat(log.isFile(), is(true));
        String pattern = phase.toString();
        Scanner scanner = new Scanner(log, "UTF-8");
        try {
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                if (found == false && count >= last) {
                    found = line.indexOf(pattern) >= 0;
                }
                count++;
            }
        } finally {
            scanner.close();
        }
        assertThat(pattern, found, is(true));
        assertThat(count, greaterThan(last));
        return count;
    }

    private ExecutionContext context(ExecutionPhase phase) {
        return new ExecutionContext("batch", "flow", "exec", phase, Collections.<String, String>emptyMap());
    }

    private FlowLoggerProfile profile(boolean reportJob, boolean deleteOnSetup, boolean deleteOnCleanup) {
        return new FlowLoggerProfile(
                folder.getRoot(),
                Charset.forName("UTF-8"),
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
                0.10,
                reportJob,
                deleteOnSetup,
                deleteOnCleanup);
    }
}
TOP

Related Classes of com.asakusafw.yaess.flowlog.FlowLoggerTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.