com.ottogroup.bi.spqr.pipeline.MicroPipelineManagerTest.java Source code

Java tutorial

Introduction

Here is the source code for com.ottogroup.bi.spqr.pipeline.MicroPipelineManagerTest.java

Source

/**
 * Copyright 2015 Otto (GmbH & Co KG)
 *
 * 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.ottogroup.bi.spqr.pipeline;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.commons.lang3.StringUtils;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

import com.ottogroup.bi.spqr.exception.ComponentInitializationFailedException;
import com.ottogroup.bi.spqr.exception.NonUniqueIdentifierException;
import com.ottogroup.bi.spqr.exception.PipelineInstantiationFailedException;
import com.ottogroup.bi.spqr.exception.QueueInitializationFailedException;
import com.ottogroup.bi.spqr.exception.RequiredInputMissingException;
import com.ottogroup.bi.spqr.repository.ComponentRepository;

/**
 * Test case for {@link MicroPipelineManager}
 * @author mnxfst
 * @since Mar 13, 2015
 */
public class MicroPipelineManagerTest {

    private static final ExecutorService executorService = Executors.newCachedThreadPool();

    @AfterClass
    public static void shutdown() {
        if (executorService != null)
            executorService.shutdownNow();
    }

    /**
     * Test case for {@link MicroPipelineManager#MicroPipelineManager(com.ottogroup.bi.spqr.repository.ComponentRepository, int)} being
     * provided null as input to processing node id which must lead to a {@link RequiredInputMissingException}
     */
    @Test
    public void testConstructor_withNullProcessingNodeId() {
        ComponentRepository repo = Mockito.mock(ComponentRepository.class);
        try {
            new MicroPipelineManager(null, repo, 10);
            Assert.fail("Invalid input");
        } catch (RequiredInputMissingException e) {
            // expected
        }
    }

    /**
     * Test case for {@link MicroPipelineManager#MicroPipelineManager(com.ottogroup.bi.spqr.repository.ComponentRepository, int)} being
     * provided null as input which must lead to a {@link RequiredInputMissingException}
     */
    @Test
    public void testConstructor_withNullRepository() {
        ComponentRepository repo = null;
        try {
            new MicroPipelineManager("id", repo, 10);
            Assert.fail("Invalid input");
        } catch (RequiredInputMissingException e) {
            // expected
        }
    }

    /**
     * Test case for {@link MicroPipelineManager#executePipeline(MicroPipelineConfiguration)} being provided null as
     * input which must lead to a  {@link RequiredInputMissingException}
     */
    @Test
    public void testExecutePipeline_withNullInput() throws RequiredInputMissingException,
            QueueInitializationFailedException, ComponentInitializationFailedException,
            PipelineInstantiationFailedException, NonUniqueIdentifierException {
        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);
        try {
            manager.executePipeline(null);
            Assert.fail("Invalid input");
        } catch (RequiredInputMissingException e) {
            // expected
        }
    }

    /**
     * Test case for {@link MicroPipelineManager#executePipeline(MicroPipelineConfiguration)} being provided a
     * configuration which leads to an exception inside the factory that must be thrown to caller 
     */
    @Test
    public void testExecutePipeline_withConfigurationLeadingToFactoryException() throws Exception {
        MicroPipelineConfiguration cfg = new MicroPipelineConfiguration();
        cfg.setId("testExecutePipeline_withConfigurationLeadingToFactoryException");

        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        Mockito.when(factory.instantiatePipeline(cfg, executorService))
                .thenThrow(new ComponentInitializationFailedException("Failed to initialize component"));

        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);

        try {
            manager.executePipeline(cfg);
            Assert.fail("Invalid input");
        } catch (ComponentInitializationFailedException e) {
            // expected
        }

        Mockito.verify(factory).instantiatePipeline(cfg, executorService);
    }

    /**
     * Test case for {@link MicroPipelineManager#executePipeline(MicroPipelineConfiguration)} being provided a
     * configuration which leads to factory returning null what must be thrown to caller as an {@link PipelineInstantiationFailedException}
     */
    @Test
    public void testExecutePipeline_withConfigurationLeadingFactoryReturnNull() throws Exception {
        MicroPipelineConfiguration cfg = new MicroPipelineConfiguration();
        cfg.setId("testExecutePipeline_withConfigurationLeadingFactoryReturnNull");

        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        Mockito.when(factory.instantiatePipeline(cfg, executorService)).thenReturn(null);

        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);

        try {
            manager.executePipeline(cfg);
            Assert.fail("Invalid input");
        } catch (PipelineInstantiationFailedException e) {
            // expected
        }

        Mockito.verify(factory).instantiatePipeline(cfg, executorService);
    }

    /**
     * Test case for {@link MicroPipelineManager#executePipeline(MicroPipelineConfiguration)} being provided a
     * valid configuration twice which leads to a {@link NonUniqueIdentifierException}
     */
    @Test
    public void testExecutePipeline_withValidConfigurationTwice() throws Exception {
        MicroPipelineConfiguration cfg = new MicroPipelineConfiguration();
        cfg.setId("testExecutePipeline_withValidConfiguration");

        MicroPipeline pipeline = Mockito.mock(MicroPipeline.class);
        Mockito.when(pipeline.getId()).thenReturn(cfg.getId());

        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        Mockito.when(factory.instantiatePipeline(cfg, executorService)).thenReturn(pipeline);

        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);

        Assert.assertEquals("Values must be equal", StringUtils.lowerCase(StringUtils.trim(cfg.getId())),
                manager.executePipeline(cfg));
        Assert.assertEquals("Values must be equal", 1, manager.getNumOfRegisteredPipelines());

        Mockito.verify(factory).instantiatePipeline(cfg, executorService);

        try {
            manager.executePipeline(cfg);
            Assert.fail("A pipeline for that identifier already exists");
        } catch (NonUniqueIdentifierException e) {
            // expected
        }
    }

    /**
     * Test case for {@link MicroPipelineManager#executePipeline(MicroPipelineConfiguration)} being provided a
     * valid configuration which leads to a registered {@link MicroPipeline} instance
     */
    @Test
    public void testExecutePipeline_withValidConfiguration() throws Exception {
        MicroPipelineConfiguration cfg = new MicroPipelineConfiguration();
        cfg.setId("testExecutePipeline_withValidConfiguration");

        MicroPipeline pipeline = Mockito.mock(MicroPipeline.class);
        Mockito.when(pipeline.getId()).thenReturn(cfg.getId());

        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        Mockito.when(factory.instantiatePipeline(cfg, executorService)).thenReturn(pipeline);

        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);

        Assert.assertEquals("Values must be equal", StringUtils.lowerCase(StringUtils.trim(cfg.getId())),
                manager.executePipeline(cfg));
        Assert.assertEquals("Values must be equal", 1, manager.getNumOfRegisteredPipelines());

        Mockito.verify(factory).instantiatePipeline(cfg, executorService);
    }

    /**
     * Test case for {@link MicroPipelineManager#getPipelineIds()} with previously registered {@link MicroPipeline} instance
     */
    @Test
    public void testGetPipelineIds_withExistingConfiguration() throws Exception {
        MicroPipelineConfiguration cfg = new MicroPipelineConfiguration();
        cfg.setId("testExecutePipeline_withValidConfiguration");

        MicroPipeline pipeline = Mockito.mock(MicroPipeline.class);
        Mockito.when(pipeline.getId()).thenReturn(cfg.getId());

        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        Mockito.when(factory.instantiatePipeline(cfg, executorService)).thenReturn(pipeline);

        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);
        Assert.assertTrue("The result must be empty", manager.getPipelineIds().isEmpty());

        Assert.assertEquals("Values must be equal", StringUtils.lowerCase(StringUtils.trim(cfg.getId())),
                manager.executePipeline(cfg));
        Assert.assertEquals("Values must be equal", 1, manager.getNumOfRegisteredPipelines());
        Assert.assertEquals("The set must contain 1 element", 1, manager.getPipelineIds().size());
        Assert.assertTrue("The set must contain the identifier",
                manager.getPipelineIds().contains(StringUtils.lowerCase(StringUtils.trim(cfg.getId()))));

        Mockito.verify(factory).instantiatePipeline(cfg, executorService);
    }

    /**
     * Test case for {@link MicroPipelineManager#hasPipeline(String)} with existing identifier 
     */
    @Test
    public void testHasPipeline_withExistingId() throws Exception {
        MicroPipelineConfiguration cfg = new MicroPipelineConfiguration();
        cfg.setId("testExecutePipeline_withValidConfiguration");

        MicroPipeline pipeline = Mockito.mock(MicroPipeline.class);
        Mockito.when(pipeline.getId()).thenReturn(cfg.getId());

        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        Mockito.when(factory.instantiatePipeline(cfg, executorService)).thenReturn(pipeline);

        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);

        Assert.assertEquals("Values must be equal", StringUtils.lowerCase(StringUtils.trim(cfg.getId())),
                manager.executePipeline(cfg));
        Assert.assertEquals("Values must be equal", 1, manager.getNumOfRegisteredPipelines());

        Mockito.verify(factory).instantiatePipeline(cfg, executorService);

        Assert.assertTrue("Pipeline exists", manager.hasPipeline(cfg.getId()));
    }

    /**
     * Test case for {@link MicroPipelineManager#hasPipeline(String)} with non-existing identifier
     * @throws Exception
     */
    @Test
    public void testHasPipeline_withNonExistingId() throws Exception {
        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);

        Assert.assertFalse("Pipeline does not exist",
                new MicroPipelineManager("id", factory, executorService).hasPipeline("unknown-id"));
    }

    /**
     * Test case for {@link MicroPipelineManager#shutdownPipeline(String)} being provided
     * null as input which must not change the number of registered pipelines
     */
    @Test
    public void testShutdownPipeline_withNullInput() throws Exception {
        MicroPipelineConfiguration cfg = new MicroPipelineConfiguration();
        cfg.setId("testExecutePipeline_withValidConfiguration");

        MicroPipeline pipeline = Mockito.mock(MicroPipeline.class);
        Mockito.when(pipeline.getId()).thenReturn(cfg.getId());

        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        Mockito.when(factory.instantiatePipeline(cfg, executorService)).thenReturn(pipeline);

        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);

        Assert.assertEquals("Values must be equal", StringUtils.lowerCase(StringUtils.trim(cfg.getId())),
                manager.executePipeline(cfg));
        Assert.assertEquals("Values must be equal", 1, manager.getNumOfRegisteredPipelines());

        Mockito.verify(factory).instantiatePipeline(cfg, executorService);

        manager.shutdownPipeline(null);
        Assert.assertEquals("Values must be equal", 1, manager.getNumOfRegisteredPipelines());
    }

    /**
     * Test case for {@link MicroPipelineManager#shutdownPipeline(String)} being provided
     * valid id as input which must reduce the number of registered pipelines as well as 
     * {@link MicroPipeline#shutdown()} must be called
     */
    @Test
    public void testShutdownPipeline_withValidInput() throws Exception {
        MicroPipelineConfiguration cfg = new MicroPipelineConfiguration();
        cfg.setId("testExecutePipeline_withValidConfiguration");

        MicroPipeline pipeline = Mockito.mock(MicroPipeline.class);
        Mockito.when(pipeline.getId()).thenReturn(cfg.getId());

        MicroPipelineFactory factory = Mockito.mock(MicroPipelineFactory.class);
        Mockito.when(factory.instantiatePipeline(cfg, executorService)).thenReturn(pipeline);

        MicroPipelineManager manager = new MicroPipelineManager("id", factory, executorService);

        Assert.assertEquals("Values must be equal", StringUtils.lowerCase(StringUtils.trim(cfg.getId())),
                manager.executePipeline(cfg));
        Assert.assertEquals("Values must be equal", 1, manager.getNumOfRegisteredPipelines());

        Mockito.verify(factory).instantiatePipeline(cfg, executorService);

        manager.shutdownPipeline(cfg.getId());
        Assert.assertEquals("Values must be equal", 0, manager.getNumOfRegisteredPipelines());
        Mockito.verify(pipeline).shutdown();
    }

}