/*******************************************************************************
* (c) Copyright 2016 Hewlett-Packard Development Company, L.P.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License v2.0 which accompany this distribution.
*
* The Apache License is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package io.cloudslang.lang.tools.build.tester.runconfiguration;
import io.cloudslang.lang.tools.build.SlangBuildMain.TestCaseRunMode;
import io.cloudslang.lang.tools.build.tester.parse.SlangTestCase;
import io.cloudslang.lang.tools.build.tester.runconfiguration.strategy.RunMultipleTestSuiteConflictResolutionStrategy;
import io.cloudslang.lang.tools.build.tester.runconfiguration.strategy.SequentialRunTestSuiteResolutionStrategy;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import java.lang.reflect.Field;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import static com.beust.jcommander.internal.Lists.newArrayList;
import static junit.framework.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@RunWith(MockitoJUnitRunner.class)
public class TestRunInfoServiceImplTest {
private static final String SUITE_GET = "suite_get";
private static final String SUITE_PUT = "suite_put";
@Spy
@InjectMocks
private TestRunInfoServiceImpl testRunInfoService;
@Mock
private ConcurrentMap<String, TestCaseRunMode> runModeMap;
@Test
public void testGetRunModeForTestSuite() {
TestCaseRunMode runModeMock = TestCaseRunMode.SEQUENTIAL;
doReturn(runModeMock).when(runModeMap).get(anyString());
// Tested call
TestCaseRunMode runModeResult = testRunInfoService.getRunModeForTestSuite(SUITE_GET);
verify(runModeMap).get(eq(SUITE_GET));
Assert.assertSame(runModeMock, runModeResult);
}
@Test
public void testSetRunModeForTestSuite() {
TestCaseRunMode runModeMock = TestCaseRunMode.PARALLEL;
doReturn(null).when(runModeMap).put(anyString(), any(TestCaseRunMode.class));
// Tested call
testRunInfoService.setRunModeForTestSuite(SUITE_PUT, runModeMock);
verify(runModeMap).put(eq(SUITE_PUT), eq(runModeMock));
}
@Test
public void testSetRunModeForTestSuites() {
TestCaseRunMode runModeMock = TestCaseRunMode.SEQUENTIAL;
doReturn(null)
.doReturn(null)
.doReturn(null)
.when(runModeMap).put(anyString(), any(TestCaseRunMode.class));
// Tested call
List<String> list = newArrayList("aaa", "bbb", "ccc");
testRunInfoService.setRunModeForTestSuites(list, runModeMock);
verify(runModeMap).put(eq("aaa"), eq(runModeMock));
verify(runModeMap).put(eq("bbb"), eq(runModeMock));
verify(runModeMap).put(eq("ccc"), eq(runModeMock));
}
@Test
public void testGetRunModeForTestCaseEmptySuites() {
SlangTestCase testCase = mock(SlangTestCase.class);
RunMultipleTestSuiteConflictResolutionStrategy multipleTestSuiteConflictResolutionStrategy =
mock(RunMultipleTestSuiteConflictResolutionStrategy.class);
SequentialRunTestSuiteResolutionStrategy sequentialResolutionStrategy =
mock(SequentialRunTestSuiteResolutionStrategy.class);
doReturn(newArrayList()).when(testCase).getTestSuites();
doCallRealMethod().when(sequentialResolutionStrategy).getDefaultWhenUnspecified();
// Tested call
TestCaseRunMode runModeForTestCaseResult = testRunInfoService.getRunModeForTestCase(testCase,
multipleTestSuiteConflictResolutionStrategy, sequentialResolutionStrategy);
assertEquals(TestCaseRunMode.SEQUENTIAL, runModeForTestCaseResult);
verify(sequentialResolutionStrategy).getDefaultWhenUnspecified();
verify(multipleTestSuiteConflictResolutionStrategy, never()).resolve(any(TestCaseRunMode.class),
any(TestCaseRunMode.class));
}
@Test
public void testGetRunModeForTestCaseSomeSuites() {
SlangTestCase testCase = mock(SlangTestCase.class);
RunMultipleTestSuiteConflictResolutionStrategy multipleTestSuiteConflictResolutionStrategy =
mock(RunMultipleTestSuiteConflictResolutionStrategy.class);
SequentialRunTestSuiteResolutionStrategy sequentialResolutionStrategy =
mock(SequentialRunTestSuiteResolutionStrategy.class);
doReturn(newArrayList("aaa", "bbb", "ccc")).when(testCase).getTestSuites();
doCallRealMethod().when(sequentialResolutionStrategy).getDefaultWhenUnspecified();
doCallRealMethod()
.doCallRealMethod()
.doCallRealMethod().when(multipleTestSuiteConflictResolutionStrategy)
.resolve(any(TestCaseRunMode.class), any(TestCaseRunMode.class));
doReturn(TestCaseRunMode.SEQUENTIAL)
.doReturn(TestCaseRunMode.PARALLEL)
.doReturn(TestCaseRunMode.SEQUENTIAL).when(runModeMap).get(anyString());
// Tested call
TestCaseRunMode runModeForTestCaseResult = testRunInfoService
.getRunModeForTestCase(testCase, multipleTestSuiteConflictResolutionStrategy,
sequentialResolutionStrategy);
assertEquals(TestCaseRunMode.SEQUENTIAL, runModeForTestCaseResult);
verify(sequentialResolutionStrategy, never()).getDefaultWhenUnspecified();
verify(multipleTestSuiteConflictResolutionStrategy)
.resolve(eq((TestCaseRunMode) null), eq(TestCaseRunMode.SEQUENTIAL));
verify(multipleTestSuiteConflictResolutionStrategy)
.resolve(eq(TestCaseRunMode.SEQUENTIAL), eq(TestCaseRunMode.PARALLEL));
verify(multipleTestSuiteConflictResolutionStrategy)
.resolve(eq(TestCaseRunMode.SEQUENTIAL), eq(TestCaseRunMode.SEQUENTIAL));
verifyNoMoreInteractions(multipleTestSuiteConflictResolutionStrategy);
}
@Test
public void testInitialize() throws IllegalAccessException, NoSuchFieldException {
TestRunInfoServiceImpl local = new TestRunInfoServiceImpl();
local.initialize();
Class<? extends TestRunInfoServiceImpl> localClass = local.getClass();
Field fieldRunModeMap = localClass.getDeclaredField("runModeMap");
fieldRunModeMap.setAccessible(true);
Object value = fieldRunModeMap.get(local);
Assert.assertNotNull(value);
Assert.assertTrue(value instanceof ConcurrentHashMap);
}
}