// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.responders.run; import fitnesse.FitNesseContext; import fitnesse.testutil.FitNesseUtil; import fitnesse.wiki.*; import static org.mockito.Mockito.*; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentMatcher; import static util.RegexTestCase.assertSubString; import util.TimeMeasurement; import java.util.LinkedList; import java.util.List; import java.util.Map; public class MultipleTestsRunnerTest { private WikiPage root; private WikiPage suite; private WikiPage testPage; private PageCrawler crawler; private String suitePageName; private final String simpleSlimDecisionTable = "!define TEST_SYSTEM {slim}\n" + "|!-DT:fitnesse.slim.test.TestSlim-!|\n" + "|string|get string arg?|\n" + "|wow|wow|\n"; private List<WikiPage> testPages; private FitNesseContext context; @Before public void setUp() throws Exception { suitePageName = "SuitePage"; root = InMemoryPage.makeRoot("RooT"); context = FitNesseUtil.makeTestContext(root); crawler = root.getPageCrawler(); PageData data = root.getData(); data.setContent(classpathWidgets()); root.commit(data); suite = crawler.addPage(root, PathParser.parse(suitePageName), "This is the test suite\n"); testPages = new LinkedList<WikiPage>(); testPage = addTestPage(suite, "TestOne", "My test"); } @Test public void testBuildClassPath() throws Exception { MultipleTestsRunner runner = new MultipleTestsRunner(testPages, context, suite, null); String classpath = runner.buildClassPath(); assertSubString("classes", classpath); assertSubString("dummy.jar", classpath); } @Test public void testGenerateSuiteMapWithMultipleTestSystems() throws Exception { WikiPage slimPage = addTestPage(suite, "SlimTest", simpleSlimDecisionTable); MultipleTestsRunner runner = new MultipleTestsRunner(testPages, context, suite, null); Map<TestSystem.Descriptor, LinkedList<TestPage>> map = runner.makeMapOfPagesByTestSystem(); TestSystem.Descriptor fitDescriptor = TestSystem.getDescriptor(testPage.getData(), context.pageFactory, false); TestSystem.Descriptor slimDescriptor = TestSystem.getDescriptor(slimPage.getData(), context.pageFactory, false); List<TestPage> fitList = map.get(fitDescriptor); List<TestPage> slimList = map.get(slimDescriptor); assertEquals(1, fitList.size()); assertEquals(1, slimList.size()); assertEquals(testPage, fitList.get(0).getSourcePage()); assertEquals(slimPage, slimList.get(0).getSourcePage()); } @Test public void testPagesForTestSystemAreSurroundedBySuiteSetupAndTeardown() throws Exception { WikiPage slimPage = addTestPage(suite, "AaSlimTest", simpleSlimDecisionTable); WikiPage setUp = crawler.addPage(root, PathParser.parse("SuiteSetUp"), "suite set up"); WikiPage tearDown = crawler.addPage(root, PathParser.parse("SuiteTearDown"), "suite tear down"); testPages = new LinkedList<WikiPage>(); testPages.add(setUp); testPages.add(slimPage); testPages.add(testPage); testPages.add(tearDown); MultipleTestsRunner runner = new MultipleTestsRunner(testPages, context, suite, null); Map<TestSystem.Descriptor, LinkedList<TestPage>> map = runner.makeMapOfPagesByTestSystem(); TestSystem.Descriptor fitDescriptor = TestSystem.getDescriptor(testPage.getData(), context.pageFactory, false); TestSystem.Descriptor slimDescriptor = TestSystem.getDescriptor(slimPage.getData(), context.pageFactory, false); List<TestPage> fitList = map.get(fitDescriptor); List<TestPage> slimList = map.get(slimDescriptor); assertEquals(3, fitList.size()); assertEquals(3, slimList.size()); assertEquals(setUp, fitList.get(0).getSourcePage()); assertEquals(testPage, fitList.get(1).getSourcePage()); assertEquals(tearDown, fitList.get(2).getSourcePage()); assertEquals(setUp, slimList.get(0).getSourcePage()); assertEquals(slimPage, slimList.get(1).getSourcePage()); assertEquals(tearDown, slimList.get(2).getSourcePage()); } private WikiPage addTestPage(WikiPage page, String name, String content) throws Exception { WikiPage testPage = crawler.addPage(page, PathParser.parse(name), content); PageData data = testPage.getData(); data.setAttribute("Test"); testPage.commit(data); testPages.add(testPage); return testPage; } private String classpathWidgets() { return "!path classes\n" + "!path lib/dummy.jar\n"; } @Test public void startingNewTestShouldStartTimeMeasurementAndNotifyListener() throws Exception { List<WikiPage> testPagesToRun = mock(List.class); TestPage page = new TestPage(mock(WikiPage.class)); FitNesseContext fitNesseContext = mock(FitNesseContext.class); ResultsListener resultsListener = mock(ResultsListener.class); MultipleTestsRunner runner = new MultipleTestsRunner(testPagesToRun, fitNesseContext, page.getSourcePage(), resultsListener); runner.startingNewTest(page); verify(resultsListener).newTestStarted(same(page), same(runner.currentTestTime)); assertThat(runner.currentTestTime, isAStartedTimeMeasurement()); } private ArgumentMatcher<TimeMeasurement> isAStartedTimeMeasurement() { return new ArgumentMatcher<TimeMeasurement>() { @Override public boolean matches(Object argument) { return ((TimeMeasurement) argument).startedAt() > 0; } }; } @Test public void testCompleteShouldRemoveHeadOfQueueAndNotifyListener() throws Exception { List<WikiPage> testPagesToRun = mock(List.class); TestPage page = new TestPage(mock(WikiPage.class)); FitNesseContext fitNesseContext = mock(FitNesseContext.class); ResultsListener resultsListener = mock(ResultsListener.class); MultipleTestsRunner runner = new MultipleTestsRunner(testPagesToRun, fitNesseContext, page.getSourcePage(), resultsListener); runner.addToProcessingQueue(page); TestSummary testSummary = mock(TestSummary.class); runner.startingNewTest(page); runner.testComplete(testSummary); verify(resultsListener).testComplete(same(page), same(testSummary), same(runner.currentTestTime)); assertThat(runner.currentTestTime, isAStoppedTimeMeasurement()); } private ArgumentMatcher<TimeMeasurement> isAStoppedTimeMeasurement() { return new ArgumentMatcher<TimeMeasurement>() { @Override public boolean matches(Object argument) { return ((TimeMeasurement) argument).stoppedAt() > 0; } }; } @Test public void announceTotalTestsToRunShouldStartTotalTimeMeasurement() throws Exception { List<WikiPage> testPagesToRun = mock(List.class); WikiPage page = mock(WikiPage.class); FitNesseContext fitNesseContext = mock(FitNesseContext.class); ResultsListener resultsListener = mock(ResultsListener.class); MultipleTestsRunner runner = new MultipleTestsRunner(testPagesToRun, fitNesseContext, page, resultsListener); runner.announceTotalTestsToRun(new PagesByTestSystem()); verify(resultsListener).announceNumberTestsToRun(0); assertThat(runner.totalTestTime, isAStartedTimeMeasurement()); } @Test public void allTestingCompleteShouldStopTotalTimeMeasurement() throws Exception { List<WikiPage> testPagesToRun = mock(List.class); WikiPage page = mock(WikiPage.class); FitNesseContext fitNesseContext = mock(FitNesseContext.class); ResultsListener resultsListener = mock(ResultsListener.class); MultipleTestsRunner runner = new MultipleTestsRunner(testPagesToRun, fitNesseContext, page, resultsListener); runner.announceTotalTestsToRun(new PagesByTestSystem()); runner.allTestingComplete(); verify(resultsListener).allTestingComplete(same(runner.totalTestTime)); assertThat(runner.totalTestTime, isAStoppedTimeMeasurement()); } }