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.responders.run;
004:
005: import fitnesse.html.*;
006: import fitnesse.wiki.*;
007: import fitnesse.components.*;
008: import fit.*;
009: import java.util.*;
010:
011: public class SuiteResponder extends TestResponder implements
012: FitClientListener {
013: public static final String SUITE_SETUP_NAME = "SuiteSetUp";
014: public static final String SUITE_TEARDOWN_NAME = "SuiteTearDown";
015:
016: private LinkedList<WikiPage> processingQueue = new LinkedList<WikiPage>();
017: private WikiPage currentTest = null;
018: private SuiteHtmlFormatter suiteFormatter;
019: private List testPages;
020:
021: protected HtmlTag addSummaryPlaceHolder() {
022: HtmlTag testSummaryDiv = new HtmlTag("div", "Running Tests ...");
023: testSummaryDiv.addAttribute("id", "test-summary");
024:
025: return testSummaryDiv;
026: }
027:
028: protected void finishSending() throws Exception {
029: }
030:
031: protected void performExecution() throws Exception {
032: processTestPages(testPages);
033:
034: client.done();
035: client.join();
036:
037: completeResponse();
038: }
039:
040: protected void prepareForExecution() throws Exception {
041: testPages = makePageList();
042:
043: classPath = buildClassPath(testPages, page);
044: }
045:
046: private void processTestPages(List testPages) throws Exception {
047: for (Iterator iterator = testPages.iterator(); iterator
048: .hasNext();) {
049: WikiPage testPage = (WikiPage) iterator.next();
050: processingQueue.addLast(testPage);
051: String testableHtml = HtmlUtil.testableHtml(testPage
052: .getData());
053: if (testableHtml.length() > 0)
054: client.send(testableHtml);
055: else
056: client.send(emptyPageContent);
057: }
058: }
059:
060: protected void close() throws Exception {
061: response.add(suiteFormatter.testOutput());
062: response.add(suiteFormatter.tail());
063: response.closeChunks();
064: response.addTrailingHeader("Exit-Code", String
065: .valueOf(exitCode()));
066: response.closeTrailer();
067: response.close();
068: }
069:
070: public void acceptOutput(String output) throws Exception {
071: WikiPage firstInLine = processingQueue.isEmpty() ? null
072: : (WikiPage) processingQueue.getFirst();
073: if (firstInLine != null && firstInLine != currentTest) {
074: PageCrawler pageCrawler = page.getPageCrawler();
075: String relativeName = pageCrawler.getRelativeName(page,
076: firstInLine);
077: WikiPagePath fullPath = pageCrawler
078: .getFullPath(firstInLine);
079: String fullPathName = PathParser.render(fullPath);
080: suiteFormatter.startOutputForNewTest(relativeName,
081: fullPathName);
082: currentTest = firstInLine;
083: }
084: suiteFormatter.acceptOutput(output);
085: }
086:
087: public void acceptResults(Counts counts) throws Exception {
088: super .acceptResults(counts);
089:
090: PageCrawler pageCrawler = page.getPageCrawler();
091: WikiPage testPage = (WikiPage) processingQueue.removeFirst();
092: String relativeName = pageCrawler.getRelativeName(page,
093: testPage);
094: addToResponse(suiteFormatter
095: .acceptResults(relativeName, counts));
096: }
097:
098: protected void makeFormatter() throws Exception {
099: suiteFormatter = new SuiteHtmlFormatter(html);
100: formatter = suiteFormatter;
101: }
102:
103: protected String pageType() {
104: return "Suite Results";
105: }
106:
107: public static String buildClassPath(List testPages, WikiPage page)
108: throws Exception {
109: final ClassPathBuilder classPathBuilder = new ClassPathBuilder();
110: final String pathSeparator = classPathBuilder
111: .getPathSeparator(page);
112: List classPathElements = new ArrayList();
113: Set visitedPages = new HashSet();
114:
115: for (Iterator iterator = testPages.iterator(); iterator
116: .hasNext();) {
117: WikiPage testPage = (WikiPage) iterator.next();
118: addClassPathElements(testPage, classPathElements,
119: visitedPages);
120: }
121: return classPathBuilder.createClassPathString(
122: classPathElements, pathSeparator);
123: }
124:
125: private static void addClassPathElements(WikiPage page,
126: List classPathElements, Set visitedPages) throws Exception {
127: List pathElements = new ClassPathBuilder()
128: .getInheritedPathElements(page, visitedPages);
129: classPathElements.addAll(pathElements);
130: }
131:
132: public List makePageList() throws Exception {
133: String suite = request != null ? (String) request
134: .getInput("suiteFilter") : null;
135: return makePageList(page, root, suite);
136: }
137:
138: public static List makePageList(WikiPage page, WikiPage root,
139: String suite) throws Exception {
140: LinkedList pages = getAllTestPagesUnder(page, suite);
141: List referencedPages = gatherCrossReferencedTestPages(page,
142: root);
143: pages.addAll(referencedPages);
144:
145: WikiPage suiteSetUp = PageCrawlerImpl.getInheritedPage(
146: SUITE_SETUP_NAME, page);
147: if (suiteSetUp != null) {
148: if (pages.contains(suiteSetUp))
149: pages.remove(suiteSetUp);
150: pages.addFirst(suiteSetUp);
151: }
152: WikiPage suiteTearDown = PageCrawlerImpl.getInheritedPage(
153: SUITE_TEARDOWN_NAME, page);
154: if (suiteTearDown != null) {
155: if (pages.contains(suiteTearDown))
156: pages.remove(suiteTearDown);
157: pages.addLast(suiteTearDown);
158: }
159:
160: if (pages.isEmpty()) {
161: String name = new WikiPagePath(page).toString();
162: WikiPageDummy dummy = new WikiPageDummy("",
163: "|Comment|\n|No test found with suite filter '"
164: + suite + "' in subwiki !-" + name
165: + "-!!|\n");
166: dummy.setParent(root);
167: pages.add(dummy);
168: }
169: return pages;
170: }
171:
172: public static LinkedList getAllTestPagesUnder(WikiPage suiteRoot)
173: throws Exception {
174: return getAllTestPagesUnder(suiteRoot, null);
175: }
176:
177: public static LinkedList getAllTestPagesUnder(WikiPage suiteRoot,
178: String suite) throws Exception {
179: LinkedList testPages = new LinkedList();
180: addTestPagesToList(testPages, suiteRoot, suite);
181:
182: Collections.sort(testPages, new Comparator() {
183: public int compare(Object o, Object o1) {
184: try {
185: PageCrawler crawler = ((WikiPage) o)
186: .getPageCrawler();
187: WikiPagePath path1 = crawler
188: .getFullPath((WikiPage) o);
189: WikiPagePath path2 = crawler
190: .getFullPath((WikiPage) o1);
191:
192: return path1.compareTo(path2);
193: } catch (Exception e) {
194: e.printStackTrace();
195: return 0;
196: }
197: }
198: });
199:
200: return testPages;
201: }
202:
203: private static void addTestPagesToList(List testPages,
204: WikiPage context, String suite) throws Exception {
205: if (context.getData().hasAttribute("Test")) {
206: if (belongsToSuite(context, suite)) {
207: testPages.add(context);
208: }
209: }
210:
211: ArrayList children = new ArrayList();
212: children.addAll(context.getChildren());
213: if (context.hasExtension(VirtualCouplingExtension.NAME)) {
214: VirtualCouplingExtension extension = (VirtualCouplingExtension) context
215: .getExtension(VirtualCouplingExtension.NAME);
216: children.addAll(extension.getVirtualCoupling()
217: .getChildren());
218: }
219: for (Iterator iterator = children.iterator(); iterator
220: .hasNext();) {
221: WikiPage page = (WikiPage) iterator.next();
222: addTestPagesToList(testPages, page, suite);
223: }
224: }
225:
226: private static boolean belongsToSuite(WikiPage context, String suite) {
227: if ((suite == null) || (suite.trim().length() == 0)) {
228: return true;
229: }
230: try {
231: String suitesStr = context.getData().getAttribute("Suites");
232: if (suitesStr != null) {
233: StringTokenizer t = new StringTokenizer(suitesStr, ",");
234: while (t.hasMoreTokens()) {
235: if (t.nextToken().trim().equalsIgnoreCase(suite)) {
236: return true;
237: }
238: }
239: }
240: } catch (Exception e) {
241: e.printStackTrace();
242: }
243: return false;
244: }
245:
246: public static List gatherCrossReferencedTestPages(
247: WikiPage testPage, WikiPage root) throws Exception {
248: LinkedList pages = new LinkedList();
249: PageData data = testPage.getData();
250: List pageReferences = data.getXrefPages();
251: PageCrawler crawler = testPage.getPageCrawler();
252: WikiPagePath testPagePath = crawler.getFullPath(testPage);
253: WikiPage parent = crawler.getPage(root, testPagePath
254: .parentPath());
255: for (Iterator i = pageReferences.iterator(); i.hasNext();) {
256: WikiPagePath path = PathParser.parse((String) i.next());
257: WikiPage referencedPage = crawler.getPage(parent, path);
258: if (referencedPage != null)
259: pages.add(referencedPage);
260: }
261: return pages;
262: }
263: }
|