001 // Copyright 2009, 2010 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5.test;
016
017 import com.thoughtworks.selenium.CommandProcessor;
018 import org.testng.ITestContext;
019
020 import java.io.File;
021 import java.io.FileWriter;
022 import java.io.IOException;
023 import java.lang.reflect.Method;
024 import java.util.ArrayList;
025 import java.util.HashSet;
026 import java.util.List;
027 import java.util.Set;
028
029 public class ErrorReporterImpl implements ErrorReporter
030 {
031 private final CommandProcessor commandProcessor;
032
033 private final ITestContext testContext;
034
035 private int uid = 0;
036
037 private final Set<String> previousNames = new HashSet<String>();
038
039 private final List<File> outputPaths = new ArrayList<File>();
040
041 public ErrorReporterImpl(CommandProcessor commandProcessor, ITestContext testContext)
042 {
043 this.commandProcessor = commandProcessor;
044 this.testContext = testContext;
045 }
046
047 public void writeOutputPaths()
048 {
049 if (outputPaths.isEmpty())
050 {
051 return;
052 }
053
054 System.err.println("Page captures written to:");
055
056 for (File file : outputPaths)
057 {
058 try
059 {
060 System.err.println(" " + file.getCanonicalPath());
061 } catch (IOException e)
062 {
063 // Ignored. Like, what's going to happen?
064 }
065 }
066
067 }
068
069 public void writeErrorReport()
070 {
071 String htmlSource = commandProcessor.getString("getHtmlSource", new String[]
072 {});
073
074 File dir = new File(testContext.getOutputDirectory());
075
076 dir.mkdirs();
077
078 Method testMethod = (Method) testContext.getAttribute(TapestryTestConstants.CURRENT_TEST_METHOD_ATTRIBUTE);
079
080 String baseFileName = testMethod == null ? "Unknown-test" : testMethod.getDeclaringClass().getSimpleName()
081 + "." + testMethod.getName();
082
083 if (previousNames.contains(baseFileName))
084 {
085 baseFileName += "-" + uid++;
086 } else
087 {
088 previousNames.add(baseFileName);
089 }
090
091 File report = new File(dir, baseFileName + ".html");
092
093 System.err.println("Writing current page's HTML source to: " + report);
094
095 try
096 {
097 FileWriter fw = new FileWriter(report);
098
099 fw.write(htmlSource);
100
101 outputPaths.add(report);
102
103 fw.close();
104 } catch (IOException ex)
105 {
106 // Ignore.
107 }
108
109 File capture = new File(dir, baseFileName + ".png");
110
111 System.err.println("Writing current page screenshot to: " + capture);
112
113 try
114 {
115 commandProcessor.doCommand("captureEntirePageScreenshot", new String[]
116 {capture.getAbsolutePath(), "background=white"});
117
118 outputPaths.add(capture);
119 } catch (Exception ex)
120 {
121 System.err.println(ex.getMessage());
122 }
123 }
124
125 }