• 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 import com.android.tradefed.util.AbiUtils;
20 
21 import junit.framework.TestCase;
22 
23 import java.io.File;
24 import java.io.FileWriter;
25 import java.io.IOException;
26 import java.net.InetAddress;
27 import java.net.UnknownHostException;
28 import java.util.Arrays;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.Set;
32 
33 /**
34  * Unit tests for {@link ResultHandler}
35  */
36 public class ResultHandlerTest extends TestCase {
37 
38     private static final String SUITE_NAME = "CTS";
39     private static final String SUITE_VERSION = "5.0";
40     private static final String SUITE_PLAN = "cts";
41     private static final String SUITE_BUILD = "12345";
42     private static final String REPORT_VERSION = "5.0";
43     private static final String OS_NAME = System.getProperty("os.name");
44     private static final String OS_VERSION = System.getProperty("os.version");
45     private static final String OS_ARCH = System.getProperty("os.arch");
46     private static final String JAVA_VENDOR = System.getProperty("java.vendor");
47     private static final String JAVA_VERSION = System.getProperty("java.version");
48     private static final String NAME_A = "ModuleA";
49     private static final String NAME_B = "ModuleB";
50     private static final String DONE_A = "false";
51     private static final String DONE_B = "true";
52     private static final String RUNTIME_A = "100";
53     private static final String RUNTIME_B = "200";
54     private static final String ABI = "mips64";
55     private static final String ID_A = AbiUtils.createId(ABI, NAME_A);
56     private static final String ID_B = AbiUtils.createId(ABI, NAME_B);
57 
58     private static final String BUILD_FINGERPRINT = "build_fingerprint";
59     private static final String BUILD_FINGERPRINT_UNALTERED = "build_fingerprint_unaltered";
60     private static final String BUILD_ID = "build_id";
61     private static final String BUILD_PRODUCT = "build_product";
62     private static final String EXAMPLE_BUILD_ID = "XYZ";
63     private static final String EXAMPLE_BUILD_PRODUCT = "wolverine";
64     private static final String EXAMPLE_BUILD_FINGERPRINT = "example_build_fingerprint";
65     private static final String EXAMPLE_BUILD_FINGERPRINT_UNALTERED = "example_build_fingerprint_unaltered";
66 
67     private static final String DEVICE_A = "device123";
68     private static final String DEVICE_B = "device456";
69     private static final String DEVICES = "device456,device123";
70     private static final String CLASS_A = "android.test.Foor";
71     private static final String CLASS_B = "android.test.Bar";
72     private static final String METHOD_1 = "testBlah1";
73     private static final String METHOD_2 = "testBlah2";
74     private static final String METHOD_3 = "testBlah3";
75     private static final String METHOD_4 = "testBlah4";
76     private static final String METHOD_5 = "testBlah5";
77     private static final String SUMMARY_SOURCE = String.format("%s#%s:20", CLASS_B, METHOD_4);
78     private static final String SUMMARY_MESSAGE = "Headline";
79     private static final double SUMMARY_VALUE = 9001;
80     private static final String MESSAGE = "Something small is not alright";
81     private static final String STACK_TRACE = "Something small is not alright\n " +
82             "at four.big.insects.Marley.sing(Marley.java:10)";
83     private static final String BUG_REPORT = "https://cnsviewer.corp.google.com/cns/bugreport.txt";
84     private static final String LOGCAT = "https://cnsviewer.corp.google.com/cns/logcat.gz";
85     private static final String SCREENSHOT = "https://cnsviewer.corp.google.com/screenshot.png";
86     private static final long START_MS = 1431586801000L;
87     private static final long END_MS = 1431673199000L;
88     private static final String START_DISPLAY = "Fri Aug 20 15:13:03 PDT 2010";
89     private static final String END_DISPLAY = "Fri Aug 20 15:13:04 PDT 2010";
90 
91     private static final String REFERENCE_URL="http://android.com";
92     private static final String LOG_URL ="file:///path/to/logs";
93     private static final String COMMAND_LINE_ARGS = "cts -m CtsMyModuleTestCases";
94     private static final String XML_BASE =
95             "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>" +
96             "<?xml-stylesheet type=\"text/xsl\" href=\"compatibility_result.xsl\"?>\n" +
97             "<Result start=\"%d\" end=\"%d\" start_display=\"%s\"" +
98             "end_display=\"%s\" suite_name=\"%s\" suite_version=\"%s\" " +
99             "suite_plan=\"%s\" suite_build_number=\"%s\" report_version=\"%s\" " +
100             "devices=\"%s\" host_name=\"%s\"" +
101             "os_name=\"%s\" os_version=\"%s\" os_arch=\"%s\" java_vendor=\"%s\"" +
102             "java_version=\"%s\" reference_url=\"%s\" log_url=\"%s\"" +
103             "command_line_args=\"%s\">\n" +
104             "%s%s%s" +
105             "</Result>";
106     private static final String XML_BUILD_INFO =
107             "  <Build " +
108                     BUILD_FINGERPRINT + "=\"%s\" " +
109                     BUILD_ID + "=\"%s\" " +
110                     BUILD_PRODUCT + "=\"%s\" " +
111             "  />\n";
112     private static final String XML_BUILD_INFO_WITH_UNALTERED_BUILD_FINGERPRINT =
113             "  <Build " +
114                     BUILD_FINGERPRINT + "=\"%s\" " +
115                     BUILD_FINGERPRINT_UNALTERED + "=\"%s\" " +
116                     BUILD_ID + "=\"%s\" " +
117                     BUILD_PRODUCT + "=\"%s\" " +
118             "  />\n";
119     private static final String XML_SUMMARY =
120             "  <Summary pass=\"%d\" failed=\"%d\" " +
121             "modules_done=\"1\" modules_total=\"1\" />\n";
122     private static final String XML_MODULE =
123             "  <Module name=\"%s\" abi=\"%s\" device=\"%s\" runtime=\"%s\" done=\"%s\">\n" +
124             "%s" +
125             "  </Module>\n";
126     private static final String XML_CASE =
127             "    <TestCase name=\"%s\">\n" +
128             "%s" +
129             "    </TestCase>\n";
130     private static final String XML_TEST_PASS =
131             "      <Test result=\"pass\" name=\"%s\"/>\n";
132     private static final String XML_TEST_SKIP =
133             "      <Test result=\"pass\" name=\"%s\" skipped=\"true\"/>\n";
134     private static final String XML_TEST_FAIL =
135             "      <Test result=\"fail\" name=\"%s\">\n" +
136             "        <Failure message=\"%s\">\n" +
137             "          <StackTrace>%s</StackTrace>\n" +
138             "        </Failure>\n" +
139             "        <BugReport>%s</BugReport>\n" +
140             "        <Logcat>%s</Logcat>\n" +
141             "        <Screenshot>%s</Screenshot>\n" +
142             "      </Test>\n";
143     private static final String XML_TEST_RESULT =
144             "      <Test result=\"pass\" name=\"%s\">\n" +
145             "        <Summary>\n" +
146             "          <Metric source=\"%s\" message=\"%s\" score_type=\"%s\" score_unit=\"%s\">\n" +
147             "             <Value>%s</Value>\n" +
148             "          </Metric>\n" +
149             "        </Summary>\n" +
150             "      </Test>\n";
151     private static final String NEW_XML_TEST_RESULT =
152             "      <Test result=\"pass\" name=\"%s\">\n"
153                     + "        <Metric key=\"%s\">%s</Metric>\n"
154                     + "      </Test>\n";
155 
156     private File resultsDir = null;
157     private File resultDir = null;
158 
159     @Override
setUp()160     public void setUp() throws Exception {
161         resultsDir = FileUtil.createTempDir("results");
162         resultDir = FileUtil.createTempDir("12345", resultsDir);
163     }
164 
165     @Override
tearDown()166     public void tearDown() throws Exception {
167         FileUtil.recursiveDelete(resultsDir);
168     }
169 
testSerialization()170     public void testSerialization() throws Exception {
171         IInvocationResult result = new InvocationResult();
172         result.setStartTime(START_MS);
173         result.setTestPlan(SUITE_PLAN);
174         result.addDeviceSerial(DEVICE_A);
175         result.addDeviceSerial(DEVICE_B);
176         result.addInvocationInfo(BUILD_FINGERPRINT, EXAMPLE_BUILD_FINGERPRINT);
177         result.addInvocationInfo(BUILD_ID, EXAMPLE_BUILD_ID);
178         result.addInvocationInfo(BUILD_PRODUCT, EXAMPLE_BUILD_PRODUCT);
179         // Module A: test1 passes, test2 not executed
180         IModuleResult moduleA = result.getOrCreateModule(ID_A);
181         moduleA.setDone(false);
182         moduleA.addRuntime(Integer.parseInt(RUNTIME_A));
183         ICaseResult moduleACase = moduleA.getOrCreateResult(CLASS_A);
184         ITestResult moduleATest1 = moduleACase.getOrCreateResult(METHOD_1);
185         moduleATest1.setResultStatus(TestStatus.PASS);
186         ITestResult moduleATest2 = moduleACase.getOrCreateResult(METHOD_2);
187         moduleATest2.setResultStatus(null); // not executed test
188         // Module B: test3 fails, test4 passes with report log, test5 passes with skip
189         IModuleResult moduleB = result.getOrCreateModule(ID_B);
190         moduleB.setDone(true);
191         moduleB.addRuntime(Integer.parseInt(RUNTIME_B));
192         ICaseResult moduleBCase = moduleB.getOrCreateResult(CLASS_B);
193         ITestResult moduleBTest3 = moduleBCase.getOrCreateResult(METHOD_3);
194         moduleBTest3.setResultStatus(TestStatus.FAIL);
195         moduleBTest3.setMessage(MESSAGE);
196         moduleBTest3.setStackTrace(STACK_TRACE);
197         moduleBTest3.setBugReport(BUG_REPORT);
198         moduleBTest3.setLog(LOGCAT);
199         moduleBTest3.setScreenshot(SCREENSHOT);
200         ITestResult moduleBTest4 = moduleBCase.getOrCreateResult(METHOD_4);
201         moduleBTest4.setResultStatus(TestStatus.PASS);
202         ReportLog report = new ReportLog();
203         ReportLog.Metric summary = new ReportLog.Metric(SUMMARY_SOURCE, SUMMARY_MESSAGE,
204                 SUMMARY_VALUE, ResultType.HIGHER_BETTER, ResultUnit.SCORE);
205         report.setSummary(summary);
206         moduleBTest4.setReportLog(report);
207         ITestResult moduleBTest5 = moduleBCase.getOrCreateResult(METHOD_5);
208         moduleBTest5.skipped();
209 
210         // Serialize to file
211         ResultHandler.writeResults(SUITE_NAME, SUITE_VERSION, SUITE_PLAN, SUITE_BUILD,
212                 result, resultDir, START_MS, END_MS, REFERENCE_URL, LOG_URL,
213                 COMMAND_LINE_ARGS);
214 
215         // Parse the results and assert correctness
216         checkResult(ResultHandler.getResultFromDir(resultDir), false);
217     }
218 
testParsing()219     public void testParsing() throws Exception {
220         File resultDir = writeResultDir(resultsDir, false);
221         // Parse the results and assert correctness
222         checkResult(ResultHandler.getResultFromDir(resultDir), false);
223     }
224 
testParsing_newTestFormat()225     public void testParsing_newTestFormat() throws Exception {
226         File resultDir = writeResultDir(resultsDir, true);
227         // Parse the results and assert correctness
228         checkResult(ResultHandler.getResultFromDir(resultDir), true);
229     }
230 
testParsing_usesUnalteredBuildFingerprintWhenPresent()231     public void testParsing_usesUnalteredBuildFingerprintWhenPresent() throws Exception {
232         String buildInfo = String.format(XML_BUILD_INFO_WITH_UNALTERED_BUILD_FINGERPRINT,
233                 EXAMPLE_BUILD_FINGERPRINT, EXAMPLE_BUILD_FINGERPRINT_UNALTERED,
234                 EXAMPLE_BUILD_ID, EXAMPLE_BUILD_PRODUCT);
235         File resultDir = writeResultDir(resultsDir, buildInfo, false);
236         checkResult(
237                 ResultHandler.getResultFromDir(resultDir),
238                 EXAMPLE_BUILD_FINGERPRINT_UNALTERED,
239                 false);
240     }
241 
testParsing_whenUnalteredBuildFingerprintIsEmpty_usesRegularBuildFingerprint()242     public void testParsing_whenUnalteredBuildFingerprintIsEmpty_usesRegularBuildFingerprint() throws Exception {
243         String buildInfo = String.format(XML_BUILD_INFO_WITH_UNALTERED_BUILD_FINGERPRINT,
244                 EXAMPLE_BUILD_FINGERPRINT, "", EXAMPLE_BUILD_ID, EXAMPLE_BUILD_PRODUCT);
245         File resultDir = writeResultDir(resultsDir, buildInfo, false);
246         checkResult(ResultHandler.getResultFromDir(resultDir), EXAMPLE_BUILD_FINGERPRINT, false);
247     }
248 
testGetLightResults()249     public void testGetLightResults() throws Exception {
250         File resultDir = writeResultDir(resultsDir, false);
251         List<IInvocationResult> lightResults = ResultHandler.getLightResults(resultsDir);
252         assertEquals("Expected one result", 1, lightResults.size());
253         IInvocationResult lightResult = lightResults.get(0);
254         checkLightResult(lightResult);
255     }
256 
writeResultDir(File resultsDir, boolean newTestFormat)257     static File writeResultDir(File resultsDir, boolean newTestFormat) throws IOException {
258         String buildInfo = String.format(XML_BUILD_INFO, EXAMPLE_BUILD_FINGERPRINT,
259                 EXAMPLE_BUILD_ID, EXAMPLE_BUILD_PRODUCT);
260         return writeResultDir(resultsDir, buildInfo, newTestFormat);
261     }
262 
263     /*
264      * Helper to write a result to the results dir, for testing.
265      * @return the written resultDir
266      */
writeResultDir(File resultsDir, String buildInfo, boolean newTestFormat)267     static File writeResultDir(File resultsDir, String buildInfo, boolean newTestFormat)
268             throws IOException {
269         File resultDir = null;
270         FileWriter writer = null;
271         try {
272             resultDir = FileUtil.createTempDir("12345", resultsDir);
273             // Create the result file
274             File resultFile = new File(resultDir, ResultHandler.TEST_RESULT_FILE_NAME);
275             writer = new FileWriter(resultFile);
276             String summary = String.format(XML_SUMMARY, 2, 1);
277             String moduleATest = String.format(XML_TEST_PASS, METHOD_1);
278             String moduleACases = String.format(XML_CASE, CLASS_A, moduleATest);
279             String moduleA = String.format(XML_MODULE, NAME_A, ABI, DEVICE_A, RUNTIME_A, DONE_A,
280                     moduleACases);
281             String moduleBTest3 = String.format(XML_TEST_FAIL, METHOD_3, MESSAGE, STACK_TRACE,
282                     BUG_REPORT, LOGCAT, SCREENSHOT);
283             String moduleBTest4 = "";
284             if (newTestFormat) {
285                 moduleBTest4 =
286                         String.format(
287                                 NEW_XML_TEST_RESULT,
288                                 METHOD_4,
289                                 SUMMARY_MESSAGE,
290                                 Double.toString(SUMMARY_VALUE));
291             } else {
292                 moduleBTest4 =
293                         String.format(
294                                 XML_TEST_RESULT,
295                                 METHOD_4,
296                                 SUMMARY_SOURCE,
297                                 SUMMARY_MESSAGE,
298                                 ResultType.HIGHER_BETTER.toReportString(),
299                                 ResultUnit.SCORE.toReportString(),
300                                 Double.toString(SUMMARY_VALUE));
301             }
302 
303             String moduleBTest5 = String.format(XML_TEST_SKIP, METHOD_5);
304             String moduleBTests = String.join("", moduleBTest3, moduleBTest4, moduleBTest5);
305             String moduleBCases = String.format(XML_CASE, CLASS_B, moduleBTests);
306             String moduleB = String.format(XML_MODULE, NAME_B, ABI, DEVICE_B, RUNTIME_B, DONE_B,
307                     moduleBCases);
308             String modules = String.join("", moduleA, moduleB);
309             String hostName = "";
310             try {
311                 hostName = InetAddress.getLocalHost().getHostName();
312             } catch (UnknownHostException ignored) {}
313             String output = String.format(XML_BASE, START_MS, END_MS, START_DISPLAY, END_DISPLAY,
314                     SUITE_NAME, SUITE_VERSION, SUITE_PLAN, SUITE_BUILD, REPORT_VERSION, DEVICES,
315                     hostName, OS_NAME, OS_VERSION, OS_ARCH, JAVA_VENDOR,
316                     JAVA_VERSION, REFERENCE_URL, LOG_URL, COMMAND_LINE_ARGS,
317                     buildInfo, summary, modules);
318             writer.write(output);
319             writer.flush();
320         } finally {
321             if (writer != null) {
322                 writer.close();
323             }
324         }
325         return resultDir;
326     }
327 
checkLightResult(IInvocationResult lightResult)328     static void checkLightResult(IInvocationResult lightResult) throws Exception {
329         assertEquals("Expected 3 passes", 3, lightResult.countResults(TestStatus.PASS));
330         assertEquals("Expected 1 failure", 1, lightResult.countResults(TestStatus.FAIL));
331 
332         Map<String, String> buildInfo = lightResult.getInvocationInfo();
333         assertEquals("Incorrect Build ID", EXAMPLE_BUILD_ID, buildInfo.get(BUILD_ID));
334         assertEquals("Incorrect Build Product",
335             EXAMPLE_BUILD_PRODUCT, buildInfo.get(BUILD_PRODUCT));
336 
337         Set<String> serials = lightResult.getDeviceSerials();
338         assertTrue("Missing device", serials.contains(DEVICE_A));
339         assertTrue("Missing device", serials.contains(DEVICE_B));
340         assertEquals("Expected 2 devices", 2, serials.size());
341         assertTrue("Incorrect devices", serials.contains(DEVICE_A) && serials.contains(DEVICE_B));
342         assertEquals("Incorrect start time", START_MS, lightResult.getStartTime());
343         assertEquals("Incorrect test plan", SUITE_PLAN, lightResult.getTestPlan());
344         List<IModuleResult> modules = lightResult.getModules();
345         assertEquals("Expected 1 completed module", 1, lightResult.getModuleCompleteCount());
346         assertEquals("Expected 2 total modules", 2, modules.size());
347     }
348 
checkResult(IInvocationResult result, boolean newTestFormat)349     static void checkResult(IInvocationResult result, boolean newTestFormat) throws Exception {
350         checkResult(result, EXAMPLE_BUILD_FINGERPRINT, newTestFormat);
351     }
352 
checkResult( IInvocationResult result, String expectedBuildFingerprint, boolean newTestFormat)353     static void checkResult(
354             IInvocationResult result, String expectedBuildFingerprint, boolean newTestFormat)
355             throws Exception {
356         assertEquals("Expected 3 passes", 3, result.countResults(TestStatus.PASS));
357         assertEquals("Expected 1 failure", 1, result.countResults(TestStatus.FAIL));
358 
359         Map<String, String> buildInfo = result.getInvocationInfo();
360         assertEquals("Incorrect Build Fingerprint", expectedBuildFingerprint, result.getBuildFingerprint());
361         assertEquals("Incorrect Build ID", EXAMPLE_BUILD_ID, buildInfo.get(BUILD_ID));
362         assertEquals("Incorrect Build Product",
363             EXAMPLE_BUILD_PRODUCT, buildInfo.get(BUILD_PRODUCT));
364 
365         Set<String> serials = result.getDeviceSerials();
366         assertTrue("Missing device", serials.contains(DEVICE_A));
367         assertTrue("Missing device", serials.contains(DEVICE_B));
368         assertEquals("Expected 2 devices", 2, serials.size());
369         assertTrue("Incorrect devices", serials.contains(DEVICE_A) && serials.contains(DEVICE_B));
370         assertEquals("Incorrect start time", START_MS, result.getStartTime());
371         assertEquals("Incorrect test plan", SUITE_PLAN, result.getTestPlan());
372 
373         List<IModuleResult> modules = result.getModules();
374         assertEquals("Expected 2 modules", 2, modules.size());
375 
376         IModuleResult moduleA = modules.get(0);
377         assertEquals("Expected 1 pass", 1, moduleA.countResults(TestStatus.PASS));
378         assertEquals("Expected 0 failures", 0, moduleA.countResults(TestStatus.FAIL));
379         assertEquals("Incorrect ABI", ABI, moduleA.getAbi());
380         assertEquals("Incorrect name", NAME_A, moduleA.getName());
381         assertEquals("Incorrect ID", ID_A, moduleA.getId());
382         assertEquals("Incorrect runtime", Integer.parseInt(RUNTIME_A), moduleA.getRuntime());
383         List<ICaseResult> moduleACases = moduleA.getResults();
384         assertEquals("Expected 1 test case", 1, moduleACases.size());
385         ICaseResult moduleACase = moduleACases.get(0);
386         assertEquals("Incorrect name", CLASS_A, moduleACase.getName());
387         List<ITestResult> moduleAResults = moduleACase.getResults();
388         assertEquals("Expected 1 result", 1, moduleAResults.size());
389         ITestResult moduleATest1 = moduleAResults.get(0);
390         assertEquals("Incorrect name", METHOD_1, moduleATest1.getName());
391         assertEquals("Incorrect result", TestStatus.PASS, moduleATest1.getResultStatus());
392         assertNull("Unexpected bugreport", moduleATest1.getBugReport());
393         assertNull("Unexpected log", moduleATest1.getLog());
394         assertNull("Unexpected screenshot", moduleATest1.getScreenshot());
395         assertNull("Unexpected message", moduleATest1.getMessage());
396         assertNull("Unexpected stack trace", moduleATest1.getStackTrace());
397         assertNull("Unexpected report", moduleATest1.getReportLog());
398 
399         IModuleResult moduleB = modules.get(1);
400         assertEquals("Expected 2 passes", 2, moduleB.countResults(TestStatus.PASS));
401         assertEquals("Expected 1 failure", 1, moduleB.countResults(TestStatus.FAIL));
402         assertEquals("Incorrect ABI", ABI, moduleB.getAbi());
403         assertEquals("Incorrect name", NAME_B, moduleB.getName());
404         assertEquals("Incorrect ID", ID_B, moduleB.getId());
405         assertEquals("Incorrect runtime", Integer.parseInt(RUNTIME_B), moduleB.getRuntime());
406         List<ICaseResult> moduleBCases = moduleB.getResults();
407         assertEquals("Expected 1 test case", 1, moduleBCases.size());
408         ICaseResult moduleBCase = moduleBCases.get(0);
409         assertEquals("Incorrect name", CLASS_B, moduleBCase.getName());
410         List<ITestResult> moduleBResults = moduleBCase.getResults();
411         assertEquals("Expected 3 results", 3, moduleBResults.size());
412         ITestResult moduleBTest3 = moduleBResults.get(0);
413         assertEquals("Incorrect name", METHOD_3, moduleBTest3.getName());
414         assertEquals("Incorrect result", TestStatus.FAIL, moduleBTest3.getResultStatus());
415         assertEquals("Incorrect bugreport", BUG_REPORT, moduleBTest3.getBugReport());
416         assertEquals("Incorrect log", LOGCAT, moduleBTest3.getLog());
417         assertEquals("Incorrect screenshot", SCREENSHOT, moduleBTest3.getScreenshot());
418         assertEquals("Incorrect message", MESSAGE, moduleBTest3.getMessage());
419         assertEquals("Incorrect stack trace", STACK_TRACE, moduleBTest3.getStackTrace());
420         assertNull("Unexpected report", moduleBTest3.getReportLog());
421         ITestResult moduleBTest4 = moduleBResults.get(1);
422         assertEquals("Incorrect name", METHOD_4, moduleBTest4.getName());
423         assertEquals("Incorrect result", TestStatus.PASS, moduleBTest4.getResultStatus());
424         assertNull("Unexpected bugreport", moduleBTest4.getBugReport());
425         assertNull("Unexpected log", moduleBTest4.getLog());
426         assertNull("Unexpected screenshot", moduleBTest4.getScreenshot());
427         assertNull("Unexpected message", moduleBTest4.getMessage());
428         assertNull("Unexpected stack trace", moduleBTest4.getStackTrace());
429         if (!newTestFormat) {
430             ReportLog report = moduleBTest4.getReportLog();
431             assertNotNull("Expected report", report);
432             ReportLog.Metric summary = report.getSummary();
433             assertNotNull("Expected report summary", summary);
434             assertEquals("Incorrect source", SUMMARY_SOURCE, summary.getSource());
435             assertEquals("Incorrect message", SUMMARY_MESSAGE, summary.getMessage());
436             assertEquals("Incorrect type", ResultType.HIGHER_BETTER, summary.getType());
437             assertEquals("Incorrect unit", ResultUnit.SCORE, summary.getUnit());
438             assertTrue(
439                     "Incorrect values",
440                     Arrays.equals(new double[] {SUMMARY_VALUE}, summary.getValues()));
441         }
442         ITestResult moduleBTest5 = moduleBResults.get(2);
443         assertEquals("Incorrect name", METHOD_5, moduleBTest5.getName());
444         assertEquals("Incorrect result", TestStatus.PASS, moduleBTest5.getResultStatus());
445         assertTrue("Expected skipped", moduleBTest5.isSkipped());
446         assertNull("Unexpected bugreport", moduleBTest5.getBugReport());
447         assertNull("Unexpected log", moduleBTest5.getLog());
448         assertNull("Unexpected screenshot", moduleBTest5.getScreenshot());
449         assertNull("Unexpected message", moduleBTest5.getMessage());
450         assertNull("Unexpected stack trace", moduleBTest5.getStackTrace());
451         assertNull("Unexpected report", moduleBTest5.getReportLog());
452     }
453 }
454