/** * Copyright 2011-2017 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.repository; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hamcrest.Matcher; import org.junit.Rule; import org.junit.Test; import com.asakusafw.compiler.batch.AbstractWorkDescriptionProcessor; import com.asakusafw.compiler.batch.AbstractWorkflowProcessor; import com.asakusafw.compiler.batch.BatchCompilerEnvironmentProvider; import com.asakusafw.compiler.batch.WorkDescriptionProcessor; import com.asakusafw.compiler.batch.Workflow; import com.asakusafw.compiler.batch.WorkflowProcessor; import com.asakusafw.compiler.flow.example.SimpleJobFlow; import com.asakusafw.utils.collections.Sets; import com.asakusafw.vocabulary.batch.JobFlowWorkDescription; import com.asakusafw.vocabulary.batch.WorkDescription; /** * Test for {@link SpiWorkflowProcessorRepository}. */ public class SpiWorkflowProcessorRepositoryTest { /** * The compiler environment. */ @Rule public BatchCompilerEnvironmentProvider prov = new BatchCompilerEnvironmentProvider(); /** * {@link SpiWorkflowProcessorRepository#findWorkflowProcessors(java.util.Set)} */ @Test public void findWorkflowProcessors_simple() { SpiWorkflowProcessorRepository repo = new SpiWorkflowProcessorRepository() { @Override protected Iterable<? extends WorkflowProcessor> loadServices() { return Arrays.asList(new WorkflowProcessor[] { new MockProc1(), }); } }; repo.initialize(prov.getEnvironment()); Set<WorkflowProcessor> processors = repo.findWorkflowProcessors(set( new MockDesc1())); assertThat(classes(processors), contains((Object) MockProc1.class)); } /** * {@link SpiWorkflowProcessorRepository#findWorkflowProcessors(java.util.Set)} */ @Test public void findWorkflowProcessors_multi() { SpiWorkflowProcessorRepository repo = new SpiWorkflowProcessorRepository() { @Override protected Iterable<? extends WorkflowProcessor> loadServices() { return Arrays.asList(new WorkflowProcessor[] { new MockProc1(), new MockProc2(), }); } }; repo.initialize(prov.getEnvironment()); Set<WorkflowProcessor> processors = repo.findWorkflowProcessors(set( new MockDesc1(), new MockDesc2())); assertThat(classes(processors), contains((Object) MockProc2.class)); } /** * {@link SpiWorkflowProcessorRepository#findWorkflowProcessors(java.util.Set)} */ @Test public void findWorkflowProcessors_super() { SpiWorkflowProcessorRepository repo = new SpiWorkflowProcessorRepository() { @Override protected Iterable<? extends WorkflowProcessor> loadServices() { return Arrays.asList(new WorkflowProcessor[] { new MockProc3(), }); } }; repo.initialize(prov.getEnvironment()); Set<WorkflowProcessor> processors = repo.findWorkflowProcessors(set( new MockDesc1(), new MockDesc2(), new JobFlowWorkDescription(SimpleJobFlow.class))); assertThat(classes(processors), contains((Object) MockProc3.class)); } /** * {@link SpiWorkflowProcessorRepository#findWorkflowProcessors(java.util.Set)} */ @Test public void findWorkflowProcessors_containsUnknown() { SpiWorkflowProcessorRepository repo = new SpiWorkflowProcessorRepository() { @Override protected Iterable<? extends WorkflowProcessor> loadServices() { return Arrays.asList(new WorkflowProcessor[] { new MockProc1(), new MockProc2(), }); } }; repo.initialize(prov.getEnvironment()); Set<WorkflowProcessor> processors = repo.findWorkflowProcessors(set( new MockDesc1(), new JobFlowWorkDescription(SimpleJobFlow.class), new MockDesc2())); assertThat(processors.size(), is(0)); } /** * {@link SpiWorkflowProcessorRepository#findDescriptionProcessor(WorkDescription)}. */ @Test public void findDescriptionProcessor_simple() { SpiWorkflowProcessorRepository repo = new SpiWorkflowProcessorRepository() { @Override protected Iterable<? extends WorkflowProcessor> loadServices() { return Arrays.asList(new WorkflowProcessor[] { new MockProc1(), }); } }; repo.initialize(prov.getEnvironment()); assertThat( repo.findDescriptionProcessor(new MockDesc1()), instanceOf(MockDescProc1.class)); assertThat( repo.findDescriptionProcessor(new MockDesc2()), is(nullValue())); } /** * {@link SpiWorkflowProcessorRepository#findDescriptionProcessor(WorkDescription)}. */ @Test public void findDescriptionProcessor_multi() { SpiWorkflowProcessorRepository repo = new SpiWorkflowProcessorRepository() { @Override protected Iterable<? extends WorkflowProcessor> loadServices() { return Arrays.asList(new WorkflowProcessor[] { new MockProc1(), new MockProc2(), }); } }; repo.initialize(prov.getEnvironment()); assertThat( repo.findDescriptionProcessor(new MockDesc1()), instanceOf(MockDescProc1.class)); assertThat( repo.findDescriptionProcessor(new MockDesc2()), instanceOf(MockDescProc2.class)); } /** * {@link SpiWorkflowProcessorRepository#findDescriptionProcessor(WorkDescription)}. */ @Test public void findDescriptionProcessor_super() { SpiWorkflowProcessorRepository repo = new SpiWorkflowProcessorRepository() { @Override protected Iterable<? extends WorkflowProcessor> loadServices() { return Arrays.asList(new WorkflowProcessor[] { new MockProc3(), }); } }; repo.initialize(prov.getEnvironment()); assertThat( repo.findDescriptionProcessor(new MockDesc1()), instanceOf(MockDescProc3.class)); assertThat( repo.findDescriptionProcessor(new MockDesc2()), instanceOf(MockDescProc3.class)); } private Set<WorkDescription> set(WorkDescription... descriptions) { return Sets.from(descriptions); } private Set<Object> classes(Set<?> instances) { Set<Object> results = new HashSet<>(); for (Object t : instances) { results.add(t.getClass()); } return results; } @SafeVarargs private static <T> Matcher<? super Set<T>> contains(T... values) { Set<T> expect = new HashSet<>(); Collections.addAll(expect, values); return is(expect); } private static class MockProc1 extends AbstractWorkflowProcessor { public MockProc1() { return; } @Override public Collection<Class<? extends WorkDescriptionProcessor<?>>> getDescriptionProcessors() { List<Class<? extends WorkDescriptionProcessor<?>>> results = new ArrayList<>(); results.add(MockDescProc1.class); return results; } @Override public void process(Workflow workflow) throws IOException { return; } } private static class MockProc2 extends AbstractWorkflowProcessor { public MockProc2() { return; } @Override public Collection<Class<? extends WorkDescriptionProcessor<?>>> getDescriptionProcessors() { List<Class<? extends WorkDescriptionProcessor<?>>> results = new ArrayList<>(); results.add(MockDescProc1.class); results.add(MockDescProc2.class); return results; } @Override public void process(Workflow workflow) throws IOException { return; } } private static class MockProc3 extends AbstractWorkflowProcessor { public MockProc3() { return; } @Override public Collection<Class<? extends WorkDescriptionProcessor<?>>> getDescriptionProcessors() { List<Class<? extends WorkDescriptionProcessor<?>>> results = new ArrayList<>(); results.add(MockDescProc3.class); return results; } @Override public void process(Workflow workflow) throws IOException { return; } } private static class MockDescProc1 extends AbstractWorkDescriptionProcessor<MockDesc1> { @SuppressWarnings("unused") public MockDescProc1() { return; } @Override public Object process(MockDesc1 description) throws IOException { return null; } } private static class MockDescProc2 extends AbstractWorkDescriptionProcessor<MockDesc2> { @SuppressWarnings("unused") public MockDescProc2() { return; } @Override public Object process(MockDesc2 description) throws IOException { return null; } } private static class MockDescProc3 extends AbstractWorkDescriptionProcessor<WorkDescription> { @SuppressWarnings("unused") public MockDescProc3() { return; } @Override public Object process(WorkDescription description) throws IOException { return null; } } private static class MockDesc1 extends WorkDescription { public MockDesc1() { return; } @Override public String getName() { return "mockdesc1"; } } private static class MockDesc2 extends WorkDescription { public MockDesc2() { return; } @Override public String getName() { return "mockdesc2"; } } }