001: // Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
002: // Released under the terms of the GNU General Public License version 2 or later.
003: package fitnesse.runner;
004:
005: import fitnesse.wiki.*;
006: import fitnesse.testutil.*;
007: import fitnesse.responders.run.FitClientResponderTest;
008: import fitnesse.responders.run.SuiteResponder;
009: import fitnesse.util.FileUtil;
010: import java.util.List;
011: import java.io.*;
012: import java.net.*;
013: import fit.Counts;
014:
015: public class TestRunnerTest extends RegexTest {
016: private int port;
017: private WikiPage root;
018: private TestRunner runner;
019: private MockResultFormatter mockHandler;
020:
021: public void setUp() throws Exception {
022: root = InMemoryPage.makeRoot("RooT");
023: FitClientResponderTest.buildSuite(root);
024:
025: FitNesseUtil.startFitnesse(root);
026: port = FitNesseUtil.port;
027:
028: runner = new TestRunner(new PrintStream(
029: new ByteArrayOutputStream()));
030: mockHandler = new MockResultFormatter();
031: }
032:
033: public void tearDown() throws Exception {
034: FitNesseUtil.stopFitnesse();
035: FileUtil.deleteFile("testFile.txt");
036: }
037:
038: public void testOnePassingTest() throws Exception {
039: testPageResults("SuitePage.TestPassing",
040: new Counts(1, 0, 0, 0), 0);
041: }
042:
043: public void testOneFailingTest() throws Exception {
044: testPageResults("SuitePage.TestFailing",
045: new Counts(0, 1, 0, 0), 1);
046: }
047:
048: public void testOneErrorTest() throws Exception {
049: testPageResults("SuitePage.TestError", new Counts(0, 0, 0, 1),
050: 1);
051: }
052:
053: public void testOneIgnoreTest() throws Exception {
054: testPageResults("SuitePage.TestIgnore", new Counts(0, 0, 1, 0),
055: 0);
056: }
057:
058: public void testSuite() throws Exception {
059: testPageResults("SuitePage", new Counts(1, 1, 1, 1), 2);
060: }
061:
062: public void testResultContentWithOneTest() throws Exception {
063: runner.handler.addHandler(mockHandler);
064: runPage("SuitePage.TestPassing");
065: List results = mockHandler.results;
066: assertEquals(1, results.size());
067: Object result1 = results.get(0);
068: assertTrue(result1 instanceof PageResult);
069: PageResult pageResult = (PageResult) result1;
070: assertSubString("PassFixture", pageResult.content());
071: assertEquals("", pageResult.title());
072: assertEquals(new Counts(1, 0, 0, 0), pageResult.counts());
073: }
074:
075: public void testResultContentWithSuite() throws Exception {
076: runner.handler.addHandler(mockHandler);
077: runPage("SuitePage");
078: List results = mockHandler.results;
079: assertEquals(4, results.size());
080:
081: checkResult(results, 0, "TestError", new Counts(0, 0, 0, 1),
082: "ErrorFixture");
083: checkResult(results, 1, "TestFailing", new Counts(0, 1, 0, 0),
084: "FailFixture");
085: checkResult(results, 2, "TestIgnore", new Counts(0, 0, 1, 0),
086: "IgnoreFixture");
087: checkResult(results, 3, "TestPassing", new Counts(1, 0, 0, 0),
088: "PassFixture");
089: }
090:
091: public void testKeepResultFile() throws Exception {
092: runPage("-results testFile.txt", "SuitePage");
093: assertTrue(new File("testFile.txt").exists());
094: String content = FileUtil.getFileContent("testFile.txt");
095: assertSubString("TestError", content);
096: assertSubString("TestPassing", content);
097: assertSubString("TestFailing", content);
098: assertSubString("TestIgnore", content);
099: }
100:
101: public void testSuiteSetUpAndTearDownIsCalledIfSingleTestIsRun()
102: throws Exception {
103: addSuiteSetUpTearDown();
104: runner.handler.addHandler(mockHandler);
105:
106: runPage("SuitePage.TestPassing");
107:
108: List results = mockHandler.results;
109: assertEquals(1, results.size());
110: checkResult(results, 0, "", new Counts(3, 0, 0, 0),
111: "PassFixture");
112: PageResult result = (PageResult) results.get(0);
113: String content = result.content();
114: assertSubString("SuiteSetUp", content);
115: assertSubString("SuiteTearDown", content);
116: }
117:
118: private void addSuiteSetUpTearDown() throws Exception {
119: PageCrawler crawler = root.getPageCrawler();
120: WikiPage suitePage = crawler.getPage(root, PathParser
121: .parse("SuitePage"));
122: crawler.addPage(suitePage, PathParser
123: .parse(SuiteResponder.SUITE_SETUP_NAME),
124: "!|fitnesse.testutil.PassFixture|\n");
125: crawler.addPage(suitePage, PathParser
126: .parse(SuiteResponder.SUITE_TEARDOWN_NAME),
127: "!|fitnesse.testutil.PassFixture|\n");
128: }
129:
130: private void checkResult(List results, int i, String s,
131: Counts counts, String content) {
132: PageResult result = (PageResult) results.get(i);
133: assertEquals(s, result.title());
134: assertEquals(counts, result.counts());
135: assertSubString(content, result.content());
136: }
137:
138: private void testPageResults(String pageName,
139: Counts expectedCounts, int exitCode) throws Exception {
140: runPage(pageName);
141: Counts counts = runner.getCounts();
142: assertEquals(expectedCounts, counts);
143: assertEquals(exitCode, runner.exitCode());
144: }
145:
146: private void runPage(String pageName) throws Exception {
147: runPage("", pageName);
148: }
149:
150: private void runPage(String options, String pageName)
151: throws Exception {
152: options += " localhost " + port + " " + pageName;
153: String[] args = options.trim().split(" ");
154: runner.run(args);
155: }
156:
157: public void testAcceptResults() throws Exception {
158: PageResult result = new PageResult("SomePage");
159: result.setCounts(new Counts(5, 0, 0, 0));
160: }
161:
162: public void testHtmlOption() throws Exception {
163: runner.args(new String[] { "-html", "stdout", "blah", "80",
164: "blah" });
165: assertEquals(1, runner.formatters.size());
166: FormattingOption option = (FormattingOption) runner.formatters
167: .get(0);
168: assertEquals("html", option.format);
169: }
170:
171: public void testVerboseOption() throws Exception {
172: runner.args(new String[] { "-v", "blah", "80", "blah" });
173: assertEquals(1, runner.handler.subHandlers.size());
174: Object o = runner.handler.subHandlers.get(0);
175: assertTrue(o instanceof StandardResultHandler);
176: assertTrue(runner.verbose);
177: }
178:
179: public void testNoPathOption() throws Exception {
180: assertTrue(runner.usingDownloadedPaths);
181: String request = runner.makeHttpRequest();
182: assertSubString("includePaths", request);
183:
184: runner.args(new String[] { "-nopath", "blah", "80", "blah" });
185: assertFalse(runner.usingDownloadedPaths);
186: request = runner.makeHttpRequest();
187: assertNotSubString("includePaths", request);
188: }
189:
190: public void testAddUrlToClasspath() throws Exception {
191: ClassLoader systemClassLoader = ClassLoader
192: .getSystemClassLoader();
193: assertTrue(systemClassLoader instanceof URLClassLoader);
194: URLClassLoader classLoader = (URLClassLoader) systemClassLoader;
195:
196: URL sampleUrl = new File("src").toURL();
197:
198: String classpath = classpathAsString(classLoader);
199: assertNotSubString(sampleUrl.toString(), classpath);
200:
201: TestRunner.addUrlToClasspath(sampleUrl);
202: classpath = classpathAsString(classLoader);
203: assertSubString(sampleUrl.toString(), classpath);
204: }
205:
206: public void testAddMultipleUrlsToClasspath() throws Exception {
207: String separator = System.getProperty("path.separator");
208: String paths = "/blah/blah" + separator + "C"
209: + otherSeperator(separator) + "\\foo\\bar";
210: TestRunner.addItemsToClasspath(paths);
211: URLClassLoader classLoader = (URLClassLoader) ClassLoader
212: .getSystemClassLoader();
213: String classpath = classpathAsString(classLoader);
214: assertSubString("/blah/blah", classpath);
215: assertMatches("[C" + otherSeperator(separator) + "?foo?bar]",
216: classpath);
217: }
218:
219: private String otherSeperator(String separator) {
220: return separator.equals(";") ? ":" : ";";
221: }
222:
223: private String classpathAsString(URLClassLoader classLoader) {
224: URL[] urls = classLoader.getURLs();
225: StringBuffer urlString = new StringBuffer();
226: for (int i = 0; i < urls.length; i++)
227: urlString.append(urls[i].toString()).append(":");
228: return urlString.toString();
229: }
230:
231: public void testNonMatchingSuiteFilter() throws Exception {
232: runPage("-results testFile.txt -suiteFilter xxx", "SuitePage");
233: assertTrue(new File("testFile.txt").exists());
234: String content = FileUtil.getFileContent("testFile.txt");
235: assertDoesntHaveRegexp(".*TestPassing.*", content);
236: assertDoesntHaveRegexp(".*TestFailing.*", content);
237: assertDoesntHaveRegexp(".*TestError.*", content);
238: assertDoesntHaveRegexp(".*TestIgnore.*", content);
239: }
240:
241: public void testSimpleMatchingSuiteFilter() throws Exception {
242: runPage("-results testFile.txt -suiteFilter foo", "SuitePage");
243: assertTrue(new File("testFile.txt").exists());
244: String content = FileUtil.getFileContent("testFile.txt");
245: assertHasRegexp(".*TestPassing.*", content);
246: assertDoesntHaveRegexp(".*TestError.*", content);
247: assertDoesntHaveRegexp(".*TestError.*", content);
248: assertDoesntHaveRegexp(".*TestIgnore.*", content);
249: }
250:
251: public void testSecondMatchingSuiteFilter() throws Exception {
252: runPage("-results testFile.txt -suiteFilter smoke", "SuitePage");
253: assertTrue(new File("testFile.txt").exists());
254: String content = FileUtil.getFileContent("testFile.txt");
255: assertDoesntHaveRegexp(".*TestPassing.*", content);
256: assertHasRegexp(".*TestFailing.*", content);
257: assertDoesntHaveRegexp(".*TestError.*", content);
258: assertDoesntHaveRegexp(".*TestIgnore.*", content);
259: }
260: }
|