• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 package com.android.compatibility.common.util;
17 
18 import com.android.tradefed.util.FileUtil;
19 
20 import junit.framework.TestCase;
21 
22 import java.io.File;
23 import java.io.FileWriter;
24 import java.net.InetAddress;
25 import java.net.UnknownHostException;
26 import java.util.Arrays;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Set;
30 
31 /**
32  * Unit tests for {@link ResultHandler}
33  */
34 public class ResultHandlerTest extends TestCase {
35 
36     private static final String SUITE_NAME = "CTS";
37     private static final String SUITE_VERSION = "5.0";
38     private static final String SUITE_PLAN = "cts";
39     private static final String SUITE_BUILD = "12345";
40     private static final String REPORT_VERSION = "5.0";
41     private static final String OS_NAME = System.getProperty("os.name");
42     private static final String OS_VERSION = System.getProperty("os.version");
43     private static final String OS_ARCH = System.getProperty("os.arch");
44     private static final String JAVA_VENDOR = System.getProperty("java.vendor");
45     private static final String JAVA_VERSION = System.getProperty("java.version");
46     private static final String NAME_A = "ModuleA";
47     private static final String NAME_B = "ModuleB";
48     private static final String DONE_A = "false";
49     private static final String DONE_B = "true";
50     private static final String NOT_EXECUTED_A = "1";
51     private static final String NOT_EXECUTED_B = "0";
52     private static final String ABI = "mips64";
53     private static final String ID_A = AbiUtils.createId(ABI, NAME_A);
54     private static final String ID_B = AbiUtils.createId(ABI, NAME_B);
55 
56     private static final String BUILD_ID = "build_id";
57     private static final String BUILD_PRODUCT = "build_product";
58     private static final String EXAMPLE_BUILD_ID = "XYZ";
59     private static final String EXAMPLE_BUILD_PRODUCT = "wolverine";
60 
61     private static final String DEVICE_A = "device123";
62     private static final String DEVICE_B = "device456";
63     private static final String DEVICES = "device456,device123";
64     private static final String CLASS_A = "android.test.Foor";
65     private static final String CLASS_B = "android.test.Bar";
66     private static final String METHOD_1 = "testBlah1";
67     private static final String METHOD_2 = "testBlah2";
68     private static final String METHOD_3 = "testBlah3";
69     private static final String METHOD_4 = "testBlah4";
70     private static final String SUMMARY_SOURCE = String.format("%s#%s:20", CLASS_B, METHOD_4);
71     private static final String DETAILS_SOURCE = String.format("%s#%s:18", CLASS_B, METHOD_4);
72     private static final String SUMMARY_MESSAGE = "Headline";
73     private static final double SUMMARY_VALUE = 9001;
74     private static final String DETAILS_MESSAGE = "Deats";
75     private static final double DETAILS_VALUE_1 = 14;
76     private static final double DETAILS_VALUE_2 = 18;
77     private static final double DETAILS_VALUE_3 = 17;
78     private static final String MESSAGE = "Something small is not alright";
79     private static final String STACK_TRACE = "Something small is not alright\n " +
80             "at four.big.insects.Marley.sing(Marley.java:10)";
81     private static final String BUG_REPORT = "https://cnsviewer.corp.google.com/cns/bugreport.txt";
82     private static final String LOGCAT = "https://cnsviewer.corp.google.com/cns/logcat.gz";
83     private static final String SCREENSHOT = "https://cnsviewer.corp.google.com/screenshot.png";
84     private static final long START_MS = 1431586801000L;
85     private static final long END_MS = 1431673199000L;
86     private static final String START_DISPLAY = "Fri Aug 20 15:13:03 PDT 2010";
87     private static final String END_DISPLAY = "Fri Aug 20 15:13:04 PDT 2010";
88 
89     private static final String REFERENCE_URL="http://android.com";
90     private static final String LOG_URL ="file:///path/to/logs";
91     private static final String COMMAND_LINE_ARGS = "cts -m CtsMyModuleTestCases";
92     private static final String JOIN = "%s%s";
93     private static final String XML_BASE =
94             "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>" +
95             "<?xml-stylesheet type=\"text/xsl\" href=\"compatibility_result.xsl\"?>\n" +
96             "<Result start=\"%d\" end=\"%d\" start_display=\"%s\"" +
97             "end_display=\"%s\" suite_name=\"%s\" suite_version=\"%s\" " +
98             "suite_plan=\"%s\" suite_build_number=\"%s\" report_version=\"%s\" " +
99             "devices=\"%s\" host_name=\"%s\"" +
100             "os_name=\"%s\" os_version=\"%s\" os_arch=\"%s\" java_vendor=\"%s\"" +
101             "java_version=\"%s\" reference_url=\"%s\" log_url=\"%s\"" +
102             "command_line_args=\"%s\">\n" +
103             "%s%s%s" +
104             "</Result>";
105     private static final String XML_BUILD_INFO =
106             "  <Build build_fingerprint=\"%s\" " + BUILD_ID + "=\"%s\" " +
107                BUILD_PRODUCT + "=\"%s\" />\n";
108     private static final String XML_SUMMARY =
109             "  <Summary pass=\"%d\" failed=\"%d\" not_executed=\"%d\" " +
110             "modules_done=\"1\" modules_total=\"1\" />\n";
111     private static final String XML_MODULE =
112             "  <Module name=\"%s\" abi=\"%s\" device=\"%s\" done=\"%s\" not_executed=\"%s\">\n" +
113             "%s" +
114             "  </Module>\n";
115     private static final String XML_CASE =
116             "    <TestCase name=\"%s\">\n" +
117             "%s" +
118             "    </TestCase>\n";
119     private static final String XML_TEST_PASS =
120             "      <Test result=\"pass\" name=\"%s\"/>\n";
121     private static final String XML_TEST_NOT_EXECUTED =
122             "      <Test result=\"not_executed\" name=\"%s\"/>\n";
123     private static final String XML_TEST_FAIL =
124             "      <Test result=\"fail\" name=\"%s\">\n" +
125             "        <Failure message=\"%s\">\n" +
126             "          <StackTrace>%s</StackTrace>\n" +
127             "        </Failure>\n" +
128             "        <BugReport>%s</BugReport>\n" +
129             "        <Logcat>%s</Logcat>\n" +
130             "        <Screenshot>%s</Screenshot>\n" +
131             "      </Test>\n";
132     private static final String XML_TEST_RESULT =
133             "      <Test result=\"pass\" name=\"%s\">\n" +
134             "        <Summary>\n" +
135             "          <Metric source=\"%s\" message=\"%s\" score_type=\"%s\" score_unit=\"%s\">\n" +
136             "             <Value>%s</Value>\n" +
137             "          </Metric>\n" +
138             "        </Summary>\n" +
139             "      </Test>\n";
140     private File resultsDir = null;
141     private File resultDir = null;
142 
143     @Override
setUp()144     public void setUp() throws Exception {
145         resultsDir = FileUtil.createTempDir("results");
146         resultDir = FileUtil.createTempDir("12345", resultsDir);
147     }
148 
149     @Override
tearDown()150     public void tearDown() throws Exception {
151         if (resultsDir != null) {
152             FileUtil.recursiveDelete(resultsDir);
153         }
154     }
155 
testSerialization()156     public void testSerialization() throws Exception {
157         IInvocationResult result = new InvocationResult();
158         result.setStartTime(START_MS);
159         result.setTestPlan(SUITE_PLAN);
160         result.addDeviceSerial(DEVICE_A);
161         result.addDeviceSerial(DEVICE_B);
162         result.addInvocationInfo(BUILD_ID, EXAMPLE_BUILD_ID);
163         result.addInvocationInfo(BUILD_PRODUCT, EXAMPLE_BUILD_PRODUCT);
164         IModuleResult moduleA = result.getOrCreateModule(ID_A);
165         moduleA.setDone(false);
166         ICaseResult moduleACase = moduleA.getOrCreateResult(CLASS_A);
167         ITestResult moduleATest1 = moduleACase.getOrCreateResult(METHOD_1);
168         moduleATest1.setResultStatus(TestStatus.PASS);
169         ITestResult moduleATest2 = moduleACase.getOrCreateResult(METHOD_2);
170         moduleATest2.setResultStatus(null); // not executed test
171         moduleA.setNotExecuted(1);
172 
173         IModuleResult moduleB = result.getOrCreateModule(ID_B);
174         moduleB.setDone(true);
175         ICaseResult moduleBCase = moduleB.getOrCreateResult(CLASS_B);
176         ITestResult moduleBTest3 = moduleBCase.getOrCreateResult(METHOD_3);
177         moduleBTest3.setResultStatus(TestStatus.FAIL);
178         moduleBTest3.setMessage(MESSAGE);
179         moduleBTest3.setStackTrace(STACK_TRACE);
180         moduleBTest3.setBugReport(BUG_REPORT);
181         moduleBTest3.setLog(LOGCAT);
182         moduleBTest3.setScreenshot(SCREENSHOT);
183         ITestResult moduleBTest4 = moduleBCase.getOrCreateResult(METHOD_4);
184         moduleBTest4.setResultStatus(TestStatus.PASS);
185         ReportLog report = new ReportLog();
186         ReportLog.Metric summary = new ReportLog.Metric(SUMMARY_SOURCE, SUMMARY_MESSAGE,
187                 SUMMARY_VALUE, ResultType.HIGHER_BETTER, ResultUnit.SCORE);
188         report.setSummary(summary);
189         moduleBTest4.setReportLog(report);
190 
191         // Serialize to file
192         ResultHandler.writeResults(SUITE_NAME, SUITE_VERSION, SUITE_PLAN, SUITE_BUILD,
193                 result, resultDir, START_MS, END_MS, REFERENCE_URL, LOG_URL,
194                 COMMAND_LINE_ARGS);
195 
196         // Parse the results and assert correctness
197         checkResult(ResultHandler.getResults(resultsDir), resultDir);
198     }
199 
testParsing()200     public void testParsing() throws Exception {
201         File resultsDir = null;
202         FileWriter writer = null;
203         try {
204             resultsDir = FileUtil.createTempDir("results");
205             File resultDir = FileUtil.createTempDir("12345", resultsDir);
206             // Create the result file
207             File resultFile = new File(resultDir, ResultHandler.TEST_RESULT_FILE_NAME);
208             writer = new FileWriter(resultFile);
209             String buildInfo = String.format(XML_BUILD_INFO, DEVICE_A,
210                     EXAMPLE_BUILD_ID, EXAMPLE_BUILD_PRODUCT);
211             String summary = String.format(XML_SUMMARY, 2, 1, 1);
212             String moduleATest = String.format(XML_TEST_PASS, METHOD_1);
213             String moduleACases = String.format(XML_CASE, CLASS_A, moduleATest);
214             String moduleA = String.format(XML_MODULE, NAME_A, ABI, DEVICE_A, DONE_A,
215                     NOT_EXECUTED_A, moduleACases);
216             String moduleBTest3 = String.format(XML_TEST_FAIL, METHOD_3, MESSAGE, STACK_TRACE,
217                     BUG_REPORT, LOGCAT, SCREENSHOT);
218             String moduleBTest4 = String.format(XML_TEST_RESULT, METHOD_4,
219                     SUMMARY_SOURCE, SUMMARY_MESSAGE, ResultType.HIGHER_BETTER.toReportString(),
220                     ResultUnit.SCORE.toReportString(), Double.toString(SUMMARY_VALUE),
221                     DETAILS_SOURCE, DETAILS_MESSAGE, ResultType.LOWER_BETTER.toReportString(),
222                     ResultUnit.MS.toReportString(), Double.toString(DETAILS_VALUE_1),
223                     Double.toString(DETAILS_VALUE_2), Double.toString(DETAILS_VALUE_3));
224             String moduleBTests = String.format(JOIN, moduleBTest3, moduleBTest4);
225             String moduleBCases = String.format(XML_CASE, CLASS_B, moduleBTests);
226             String moduleB = String.format(XML_MODULE, NAME_B, ABI, DEVICE_B, DONE_B,
227                     NOT_EXECUTED_B, moduleBCases);
228             String modules = String.format(JOIN, moduleA, moduleB);
229             String hostName = "";
230             try {
231                 hostName = InetAddress.getLocalHost().getHostName();
232             } catch (UnknownHostException ignored) {}
233             String output = String.format(XML_BASE, START_MS, END_MS, START_DISPLAY, END_DISPLAY,
234                     SUITE_NAME, SUITE_VERSION, SUITE_PLAN, SUITE_BUILD, REPORT_VERSION, DEVICES,
235                     hostName, OS_NAME, OS_VERSION, OS_ARCH, JAVA_VENDOR,
236                     JAVA_VERSION, REFERENCE_URL, LOG_URL, COMMAND_LINE_ARGS,
237                     buildInfo, summary, modules);
238             writer.write(output);
239             writer.flush();
240 
241             // Parse the results and assert correctness
242             checkResult(ResultHandler.getResults(resultsDir), resultDir);
243         } finally {
244             if (writer != null) {
245                 writer.close();
246             }
247         }
248     }
249 
checkResult(List<IInvocationResult> results, File resultDir)250     private void checkResult(List<IInvocationResult> results, File resultDir) throws Exception {
251         assertEquals("Expected 1 result", 1, results.size());
252         IInvocationResult result = results.get(0);
253         assertEquals("Expected 2 passes", 2, result.countResults(TestStatus.PASS));
254         assertEquals("Expected 1 failure", 1, result.countResults(TestStatus.FAIL));
255         assertEquals("Expected 1 not executed", 1, result.getNotExecuted());
256 
257         Map<String, String> buildInfo = result.getInvocationInfo();
258         assertEquals("Incorrect Build ID", EXAMPLE_BUILD_ID, buildInfo.get(BUILD_ID));
259         assertEquals("Incorrect Build Product",
260             EXAMPLE_BUILD_PRODUCT, buildInfo.get(BUILD_PRODUCT));
261 
262         Set<String> serials = result.getDeviceSerials();
263         assertTrue("Missing device", serials.contains(DEVICE_A));
264         assertTrue("Missing device", serials.contains(DEVICE_B));
265         assertEquals("Expected 2 devices", 2, serials.size());
266         assertTrue("Incorrect devices", serials.contains(DEVICE_A) && serials.contains(DEVICE_B));
267         assertEquals("Incorrect start time", START_MS, result.getStartTime());
268         assertEquals("Incorrect test plan", SUITE_PLAN, result.getTestPlan());
269 
270         List<IModuleResult> modules = result.getModules();
271         assertEquals("Expected 2 modules", 2, modules.size());
272 
273         IModuleResult moduleA = modules.get(0);
274         assertEquals("Expected 1 pass", 1, moduleA.countResults(TestStatus.PASS));
275         assertEquals("Expected 0 failures", 0, moduleA.countResults(TestStatus.FAIL));
276         assertEquals("Incorrect ABI", ABI, moduleA.getAbi());
277         assertEquals("Incorrect name", NAME_A, moduleA.getName());
278         assertEquals("Incorrect ID", ID_A, moduleA.getId());
279         List<ICaseResult> moduleACases = moduleA.getResults();
280         assertEquals("Expected 1 test case", 1, moduleACases.size());
281         ICaseResult moduleACase = moduleACases.get(0);
282         assertEquals("Incorrect name", CLASS_A, moduleACase.getName());
283         List<ITestResult> moduleAResults = moduleACase.getResults();
284         assertEquals("Expected 1 result", 1, moduleAResults.size());
285         ITestResult moduleATest1 = moduleAResults.get(0);
286         assertEquals("Incorrect name", METHOD_1, moduleATest1.getName());
287         assertEquals("Incorrect result", TestStatus.PASS, moduleATest1.getResultStatus());
288         assertNull("Unexpected bugreport", moduleATest1.getBugReport());
289         assertNull("Unexpected log", moduleATest1.getLog());
290         assertNull("Unexpected screenshot", moduleATest1.getScreenshot());
291         assertNull("Unexpected message", moduleATest1.getMessage());
292         assertNull("Unexpected stack trace", moduleATest1.getStackTrace());
293         assertNull("Unexpected report", moduleATest1.getReportLog());
294 
295         IModuleResult moduleB = modules.get(1);
296         assertEquals("Expected 1 pass", 1, moduleB.countResults(TestStatus.PASS));
297         assertEquals("Expected 1 failure", 1, moduleB.countResults(TestStatus.FAIL));
298         assertEquals("Incorrect ABI", ABI, moduleB.getAbi());
299         assertEquals("Incorrect name", NAME_B, moduleB.getName());
300         assertEquals("Incorrect ID", ID_B, moduleB.getId());
301         List<ICaseResult> moduleBCases = moduleB.getResults();
302         assertEquals("Expected 1 test case", 1, moduleBCases.size());
303         ICaseResult moduleBCase = moduleBCases.get(0);
304         assertEquals("Incorrect name", CLASS_B, moduleBCase.getName());
305         List<ITestResult> moduleBResults = moduleBCase.getResults();
306         assertEquals("Expected 2 results", 2, moduleBResults.size());
307         ITestResult moduleBTest3 = moduleBResults.get(0);
308         assertEquals("Incorrect name", METHOD_3, moduleBTest3.getName());
309         assertEquals("Incorrect result", TestStatus.FAIL, moduleBTest3.getResultStatus());
310         assertEquals("Incorrect bugreport", BUG_REPORT, moduleBTest3.getBugReport());
311         assertEquals("Incorrect log", LOGCAT, moduleBTest3.getLog());
312         assertEquals("Incorrect screenshot", SCREENSHOT, moduleBTest3.getScreenshot());
313         assertEquals("Incorrect message", MESSAGE, moduleBTest3.getMessage());
314         assertEquals("Incorrect stack trace", STACK_TRACE, moduleBTest3.getStackTrace());
315         assertNull("Unexpected report", moduleBTest3.getReportLog());
316         ITestResult moduleBTest4 = moduleBResults.get(1);
317         assertEquals("Incorrect name", METHOD_4, moduleBTest4.getName());
318         assertEquals("Incorrect result", TestStatus.PASS, moduleBTest4.getResultStatus());
319         assertNull("Unexpected bugreport", moduleBTest4.getBugReport());
320         assertNull("Unexpected log", moduleBTest4.getLog());
321         assertNull("Unexpected screenshot", moduleBTest4.getScreenshot());
322         assertNull("Unexpected message", moduleBTest4.getMessage());
323         assertNull("Unexpected stack trace", moduleBTest4.getStackTrace());
324         ReportLog report = moduleBTest4.getReportLog();
325         assertNotNull("Expected report", report);
326         ReportLog.Metric summary = report.getSummary();
327         assertNotNull("Expected report summary", summary);
328         assertEquals("Incorrect source", SUMMARY_SOURCE, summary.getSource());
329         assertEquals("Incorrect message", SUMMARY_MESSAGE, summary.getMessage());
330         assertEquals("Incorrect type", ResultType.HIGHER_BETTER, summary.getType());
331         assertEquals("Incorrect unit", ResultUnit.SCORE, summary.getUnit());
332         assertTrue("Incorrect values", Arrays.equals(new double[] { SUMMARY_VALUE },
333                 summary.getValues()));
334     }
335 }
336