Package com.asakusafw.compiler.windgate

Source Code of com.asakusafw.compiler.windgate.WindGateIoProcessorTest

/**
* 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.compiler.windgate;

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;

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

import com.asakusafw.compiler.flow.ExternalIoCommandProvider;
import com.asakusafw.compiler.flow.ExternalIoCommandProvider.Command;
import com.asakusafw.compiler.flow.ExternalIoCommandProvider.CommandContext;
import com.asakusafw.compiler.flow.FlowCompilerOptions;
import com.asakusafw.compiler.flow.FlowDescriptionDriver;
import com.asakusafw.compiler.flow.Location;
import com.asakusafw.compiler.testing.DirectFlowCompiler;
import com.asakusafw.compiler.testing.JobflowInfo;
import com.asakusafw.compiler.windgate.testing.model.Simple;
import com.asakusafw.vocabulary.flow.FlowDescription;
import com.asakusafw.vocabulary.flow.In;
import com.asakusafw.vocabulary.flow.Out;
import com.asakusafw.vocabulary.windgate.WindGateExporterDescription;
import com.asakusafw.vocabulary.windgate.WindGateImporterDescription;
import com.asakusafw.windgate.core.DriverScript;

/**
* Test for {@link WindGateIoProcessor}.
*/
public class WindGateIoProcessorTest {

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

    /**
     * Simple case.
     * @throws Exception if failed
     */
    @Test
    public void simple() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        Out<Simple> out = flow.createOut("out1", new Export(Simple.class, "testing", dummy()));

        FlowDescription desc = new IdentityFlow<Simple>(in, out);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, not(nullValue()));
        List<ExternalIoCommandProvider> commands = info.getCommandProviders();
        ExternalIoCommandProvider provider = WindGateIoProcessor.findRelated(commands);
        assertThat(provider, not(nullValue()));

        CommandContext context = new CommandContext("home", "id", "");
        List<Command> importer = provider.getImportCommand(context);
        List<Command> exporter = provider.getExportCommand(context);
        List<Command> finalizer = provider.getFinalizeCommand(context);
        assertThat(importer.size(), is(1));
        assertThat(exporter.size(), is(1));
        assertThat(finalizer.size(), is(1));
        assertThat(mode(importer, "testing"), is(WindGateIoProcessor.OPT_BEGIN));
        assertThat(mode(exporter, "testing"), is(WindGateIoProcessor.OPT_END));
        assertThat(find(finalizer, "testing"), is(notNullValue()));
    }

    /**
     * Different profiles.
     * @throws Exception if failed
     */
    @Test
    public void different_profile() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        Out<Simple> out = flow.createOut("out1", new Export(Simple.class, "other", dummy()));

        FlowDescription desc = new IdentityFlow<Simple>(in, out);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, not(nullValue()));
        List<ExternalIoCommandProvider> commands = info.getCommandProviders();
        ExternalIoCommandProvider provider = WindGateIoProcessor.findRelated(commands);
        assertThat(provider, not(nullValue()));

        CommandContext context = new CommandContext("home", "id", "");
        List<Command> importer = provider.getImportCommand(context);
        List<Command> exporter = provider.getExportCommand(context);
        List<Command> finalizer = provider.getFinalizeCommand(context);
        assertThat(importer.size(), is(1));
        assertThat(exporter.size(), is(1));
        assertThat(finalizer.size(), is(2));
        assertThat(mode(importer, "testing"), is(WindGateIoProcessor.OPT_ONESHOT));
        assertThat(mode(exporter, "other"), is(WindGateIoProcessor.OPT_ONESHOT));
        assertThat(find(finalizer, "testing"), is(notNullValue()));
        assertThat(find(finalizer, "other"), is(notNullValue()));
    }

    /**
     * Multiple I/O with same profile.
     * @throws Exception if failed
     */
    @Test
    public void same_profile() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in1 = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        In<Simple> in2 = flow.createIn("in2", new Import(Simple.class, "testing", dummy()));
        Out<Simple> out1 = flow.createOut("out1", new Export(Simple.class, "testing", dummy()));
        Out<Simple> out2 = flow.createOut("out2", new Export(Simple.class, "testing", dummy()));

        FlowDescription desc = new DualIdentityFlow<Simple>(in1, in2, out1, out2);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, not(nullValue()));
        List<ExternalIoCommandProvider> commands = info.getCommandProviders();
        ExternalIoCommandProvider provider = WindGateIoProcessor.findRelated(commands);
        assertThat(provider, not(nullValue()));

        CommandContext context = new CommandContext("home", "id", "");
        List<Command> importer = provider.getImportCommand(context);
        List<Command> exporter = provider.getExportCommand(context);
        List<Command> finalizer = provider.getFinalizeCommand(context);
        assertThat(importer.size(), is(1));
        assertThat(exporter.size(), is(1));
        assertThat(finalizer.size(), is(1));
        assertThat(mode(importer, "testing"), is(WindGateIoProcessor.OPT_BEGIN));
        assertThat(mode(exporter, "testing"), is(WindGateIoProcessor.OPT_END));
        assertThat(find(finalizer, "testing"), is(notNullValue()));
    }

    /**
     * Multiple I/O with different profiles in input.
     * @throws Exception if failed
     */
    @Test
    public void mutlti_profile_input() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in1 = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        In<Simple> in2 = flow.createIn("in2", new Import(Simple.class, "other", dummy()));
        Out<Simple> out1 = flow.createOut("out1", new Export(Simple.class, "testing", dummy()));
        Out<Simple> out2 = flow.createOut("out2", new Export(Simple.class, "testing", dummy()));

        FlowDescription desc = new DualIdentityFlow<Simple>(in1, in2, out1, out2);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, not(nullValue()));
        List<ExternalIoCommandProvider> commands = info.getCommandProviders();
        ExternalIoCommandProvider provider = WindGateIoProcessor.findRelated(commands);
        assertThat(provider, not(nullValue()));

        CommandContext context = new CommandContext("home", "id", "");
        List<Command> importer = provider.getImportCommand(context);
        List<Command> exporter = provider.getExportCommand(context);
        List<Command> finalizer = provider.getFinalizeCommand(context);
        assertThat(importer.size(), is(2));
        assertThat(exporter.size(), is(1));
        assertThat(finalizer.size(), is(2));
        assertThat(mode(importer, "testing"), is(WindGateIoProcessor.OPT_BEGIN));
        assertThat(mode(importer, "other"), is(WindGateIoProcessor.OPT_ONESHOT));
        assertThat(mode(exporter, "testing"), is(WindGateIoProcessor.OPT_END));
        assertThat(find(finalizer, "testing"), is(notNullValue()));
        assertThat(find(finalizer, "other"), is(notNullValue()));
    }

    /**
     * Multiple I/O with different profiles in input.
     * @throws Exception if failed
     */
    @Test
    public void multi_profile_output() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in1 = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        In<Simple> in2 = flow.createIn("in2", new Import(Simple.class, "testing", dummy()));
        Out<Simple> out1 = flow.createOut("out1", new Export(Simple.class, "testing", dummy()));
        Out<Simple> out2 = flow.createOut("out2", new Export(Simple.class, "other", dummy()));

        FlowDescription desc = new DualIdentityFlow<Simple>(in1, in2, out1, out2);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, not(nullValue()));
        List<ExternalIoCommandProvider> commands = info.getCommandProviders();
        ExternalIoCommandProvider provider = WindGateIoProcessor.findRelated(commands);
        assertThat(provider, not(nullValue()));

        CommandContext context = new CommandContext("home", "id", "");
        List<Command> importer = provider.getImportCommand(context);
        List<Command> exporter = provider.getExportCommand(context);
        List<Command> finalizer = provider.getFinalizeCommand(context);
        assertThat(importer.size(), is(1));
        assertThat(exporter.size(), is(2));
        assertThat(finalizer.size(), is(2));
        assertThat(mode(importer, "testing"), is(WindGateIoProcessor.OPT_BEGIN));
        assertThat(mode(exporter, "testing"), is(WindGateIoProcessor.OPT_END));
        assertThat(mode(exporter, "other"), is(WindGateIoProcessor.OPT_ONESHOT));
        assertThat(find(finalizer, "testing"), is(notNullValue()));
        assertThat(find(finalizer, "other"), is(notNullValue()));
    }

    /**
     * Multiple I/O with different profiles in input and output.
     * @throws Exception if failed
     */
    @Test
    public void multi_profile_inout() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in1 = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        In<Simple> in2 = flow.createIn("in2", new Import(Simple.class, "other", dummy()));
        Out<Simple> out1 = flow.createOut("out1", new Export(Simple.class, "testing", dummy()));
        Out<Simple> out2 = flow.createOut("out2", new Export(Simple.class, "other", dummy()));

        FlowDescription desc = new DualIdentityFlow<Simple>(in1, in2, out1, out2);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, not(nullValue()));
        List<ExternalIoCommandProvider> commands = info.getCommandProviders();
        ExternalIoCommandProvider provider = WindGateIoProcessor.findRelated(commands);
        assertThat(provider, not(nullValue()));

        CommandContext context = new CommandContext("home", "id", "");
        List<Command> importer = provider.getImportCommand(context);
        List<Command> exporter = provider.getExportCommand(context);
        List<Command> finalizer = provider.getFinalizeCommand(context);
        assertThat(importer.size(), is(2));
        assertThat(exporter.size(), is(2));
        assertThat(finalizer.size(), is(2));
        assertThat(mode(importer, "testing"), is(WindGateIoProcessor.OPT_BEGIN));
        assertThat(mode(importer, "other"), is(WindGateIoProcessor.OPT_BEGIN));
        assertThat(mode(exporter, "testing"), is(WindGateIoProcessor.OPT_END));
        assertThat(mode(exporter, "other"), is(WindGateIoProcessor.OPT_END));
        assertThat(find(finalizer, "testing"), is(notNullValue()));
        assertThat(find(finalizer, "other"), is(notNullValue()));
    }

    /**
     * Importer script is invalid.
     * @throws Exception if failed
     */
    @Test
    public void invalid_script_importer() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in = flow.createIn("in1", new Import(Simple.class, "testing", null));
        Out<Simple> out = flow.createOut("out1", new Export(Simple.class, "testing", dummy()));

        FlowDescription desc = new IdentityFlow<Simple>(in, out);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, is(nullValue()));
    }

    /**
     * Exporter script is invalid.
     * @throws Exception if failed
     */
    @Test
    public void invalid_script_exporter() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        Out<Simple> out = flow.createOut("out1", new Export(Simple.class, "testing", null));

        FlowDescription desc = new IdentityFlow<Simple>(in, out);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, is(nullValue()));
    }

    /**
     * importer description w/o profile name.
     * @throws Exception if failed
     */
    @Test
    public void importer_wo_profile() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in = flow.createIn("in1", new Import(Simple.class, null, dummy()));
        Out<Simple> out = flow.createOut("out1", new Export(Simple.class, "testing", dummy()));

        FlowDescription desc = new IdentityFlow<Simple>(in, out);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, nullValue());
    }

    /**
     * importer description w/o profile name.
     * @throws Exception if failed
     */
    @Test
    public void importer_w_empty_profile() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in = flow.createIn("in1", new Import(Simple.class, "", dummy()));
        Out<Simple> out = flow.createOut("out1", new Export(Simple.class, "testing", dummy()));

        FlowDescription desc = new IdentityFlow<Simple>(in, out);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, nullValue());
    }

    /**
     * exporter description w/o profile name.
     * @throws Exception if failed
     */
    @Test
    public void exporter_wo_profile() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        Out<Simple> out = flow.createOut("out1", new Export(Simple.class, null, dummy()));

        FlowDescription desc = new IdentityFlow<Simple>(in, out);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, nullValue());
    }

    /**
     * exporter description w/o profile name.
     * @throws Exception if failed
     */
    @Test
    public void exporter_w_empty_profile() throws Exception {
        FlowDescriptionDriver flow = new FlowDescriptionDriver();
        In<Simple> in = flow.createIn("in1", new Import(Simple.class, "testing", dummy()));
        Out<Simple> out = flow.createOut("out1", new Export(Simple.class, "", dummy()));

        FlowDescription desc = new IdentityFlow<Simple>(in, out);

        JobflowInfo info = compile(flow, desc);
        assertThat(info, nullValue());
    }

    JobflowInfo compile(FlowDescriptionDriver flow, FlowDescription desc) {
        try {
            return DirectFlowCompiler.compile(
                    flow.createFlowGraph(desc),
                    "test",
                    "test",
                    "com.example",
                    Location.fromPath("target/testing", '/'),
                    folder.newFolder("build"),
                    Collections.<File>emptyList(),
                    getClass().getClassLoader(),
                    FlowCompilerOptions.load(System.getProperties()));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    private String mode(List<Command> commands, String profile) {
        Command found = find(commands, profile);
        assertThat(profile, found, is(notNullValue()));
        // mode argument
        return found.getCommandTokens().get(2);
    }

    private Command find(List<Command> commands, String profile) {
        for (Command cmd : commands) {
            List<String> tokens = cmd.getCommandTokens();
            // profile argument
            if (tokens.get(1).equals(profile)) {
                return cmd;
            }
        }
        return null;
    }

    private DriverScript dummy() {
        return new DriverScript("example", Collections.<String, String>emptyMap());
    }

    static final class Import extends WindGateImporterDescription {

        private final Class<?> modelType;

        private final String profileName;

        private final DriverScript driverScript;

        Import(Class<?> modelType, String profileName, DriverScript driverScript) {
            this.modelType = modelType;
            this.profileName = profileName;
            this.driverScript = driverScript;
        }

        @Override
        public Class<?> getModelType() {
            return modelType;
        }

        @Override
        public String getProfileName() {
            return profileName;
        }

        @Override
        public DriverScript getDriverScript() {
            return driverScript;
        }
    }

    static final class Export extends WindGateExporterDescription {

        private final Class<?> modelType;

        private final String profileName;

        private final DriverScript driverScript;

        Export(Class<?> modelType, String profileName, DriverScript driverScript) {
            this.modelType = modelType;
            this.profileName = profileName;
            this.driverScript = driverScript;
        }

        @Override
        public Class<?> getModelType() {
            return modelType;
        }

        @Override
        public String getProfileName() {
            return profileName;
        }

        @Override
        public DriverScript getDriverScript() {
            return driverScript;
        }
    }
}
TOP

Related Classes of com.asakusafw.compiler.windgate.WindGateIoProcessorTest

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.