Home | History | Annotate | Download | only in util
      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 File resultsDir = null;
    152     private File resultDir = null;
    153 
    154     @Override
    155     public void setUp() throws Exception {
    156         resultsDir = FileUtil.createTempDir("results");
    157         resultDir = FileUtil.createTempDir("12345", resultsDir);
    158     }
    159 
    160     @Override
    161     public void tearDown() throws Exception {
    162         FileUtil.recursiveDelete(resultsDir);
    163     }
    164 
    165     public void testSerialization() throws Exception {
    166         IInvocationResult result = new InvocationResult();
    167         result.setStartTime(START_MS);
    168         result.setTestPlan(SUITE_PLAN);
    169         result.addDeviceSerial(DEVICE_A);
    170         result.addDeviceSerial(DEVICE_B);
    171         result.addInvocationInfo(BUILD_FINGERPRINT, EXAMPLE_BUILD_FINGERPRINT);
    172         result.addInvocationInfo(BUILD_ID, EXAMPLE_BUILD_ID);
    173         result.addInvocationInfo(BUILD_PRODUCT, EXAMPLE_BUILD_PRODUCT);
    174         // Module A: test1 passes, test2 not executed
    175         IModuleResult moduleA = result.getOrCreateModule(ID_A);
    176         moduleA.setDone(false);
    177         moduleA.addRuntime(Integer.parseInt(RUNTIME_A));
    178         ICaseResult moduleACase = moduleA.getOrCreateResult(CLASS_A);
    179         ITestResult moduleATest1 = moduleACase.getOrCreateResult(METHOD_1);
    180         moduleATest1.setResultStatus(TestStatus.PASS);
    181         ITestResult moduleATest2 = moduleACase.getOrCreateResult(METHOD_2);
    182         moduleATest2.setResultStatus(null); // not executed test
    183         // Module B: test3 fails, test4 passes with report log, test5 passes with skip
    184         IModuleResult moduleB = result.getOrCreateModule(ID_B);
    185         moduleB.setDone(true);
    186         moduleB.addRuntime(Integer.parseInt(RUNTIME_B));
    187         ICaseResult moduleBCase = moduleB.getOrCreateResult(CLASS_B);
    188         ITestResult moduleBTest3 = moduleBCase.getOrCreateResult(METHOD_3);
    189         moduleBTest3.setResultStatus(TestStatus.FAIL);
    190         moduleBTest3.setMessage(MESSAGE);
    191         moduleBTest3.setStackTrace(STACK_TRACE);
    192         moduleBTest3.setBugReport(BUG_REPORT);
    193         moduleBTest3.setLog(LOGCAT);
    194         moduleBTest3.setScreenshot(SCREENSHOT);
    195         ITestResult moduleBTest4 = moduleBCase.getOrCreateResult(METHOD_4);
    196         moduleBTest4.setResultStatus(TestStatus.PASS);
    197         ReportLog report = new ReportLog();
    198         ReportLog.Metric summary = new ReportLog.Metric(SUMMARY_SOURCE, SUMMARY_MESSAGE,
    199                 SUMMARY_VALUE, ResultType.HIGHER_BETTER, ResultUnit.SCORE);
    200         report.setSummary(summary);
    201         moduleBTest4.setReportLog(report);
    202         ITestResult moduleBTest5 = moduleBCase.getOrCreateResult(METHOD_5);
    203         moduleBTest5.skipped();
    204 
    205         // Serialize to file
    206         ResultHandler.writeResults(SUITE_NAME, SUITE_VERSION, SUITE_PLAN, SUITE_BUILD,
    207                 result, resultDir, START_MS, END_MS, REFERENCE_URL, LOG_URL,
    208                 COMMAND_LINE_ARGS);
    209 
    210         // Parse the results and assert correctness
    211         checkResult(ResultHandler.getResultFromDir(resultDir));
    212     }
    213 
    214     public void testParsing() throws Exception {
    215         File resultDir = writeResultDir(resultsDir);
    216         // Parse the results and assert correctness
    217         checkResult(ResultHandler.getResultFromDir(resultDir));
    218     }
    219 
    220     public void testParsing_usesUnalteredBuildFingerprintWhenPresent() throws Exception {
    221         String buildInfo = String.format(XML_BUILD_INFO_WITH_UNALTERED_BUILD_FINGERPRINT,
    222                 EXAMPLE_BUILD_FINGERPRINT, EXAMPLE_BUILD_FINGERPRINT_UNALTERED,
    223                 EXAMPLE_BUILD_ID, EXAMPLE_BUILD_PRODUCT);
    224         File resultDir = writeResultDir(resultsDir, buildInfo);
    225         checkResult(ResultHandler.getResultFromDir(resultDir), EXAMPLE_BUILD_FINGERPRINT_UNALTERED);
    226     }
    227 
    228     public void testParsing_whenUnalteredBuildFingerprintIsEmpty_usesRegularBuildFingerprint() throws Exception {
    229         String buildInfo = String.format(XML_BUILD_INFO_WITH_UNALTERED_BUILD_FINGERPRINT,
    230                 EXAMPLE_BUILD_FINGERPRINT, "", EXAMPLE_BUILD_ID, EXAMPLE_BUILD_PRODUCT);
    231         File resultDir = writeResultDir(resultsDir, buildInfo);
    232         checkResult(ResultHandler.getResultFromDir(resultDir), EXAMPLE_BUILD_FINGERPRINT);
    233     }
    234 
    235     public void testGetLightResults() throws Exception {
    236         File resultDir = writeResultDir(resultsDir);
    237         List<IInvocationResult> lightResults = ResultHandler.getLightResults(resultsDir);
    238         assertEquals("Expected one result", 1, lightResults.size());
    239         IInvocationResult lightResult = lightResults.get(0);
    240         checkLightResult(lightResult);
    241     }
    242 
    243     static File writeResultDir(File resultsDir) throws IOException {
    244         String buildInfo = String.format(XML_BUILD_INFO, EXAMPLE_BUILD_FINGERPRINT,
    245                 EXAMPLE_BUILD_ID, EXAMPLE_BUILD_PRODUCT);
    246         return writeResultDir(resultsDir, buildInfo);
    247     }
    248 
    249     /*
    250      * Helper to write a result to the results dir, for testing.
    251      * @return the written resultDir
    252      */
    253     static File writeResultDir(File resultsDir, String buildInfo) throws IOException {
    254         File resultDir = null;
    255         FileWriter writer = null;
    256         try {
    257             resultDir = FileUtil.createTempDir("12345", resultsDir);
    258             // Create the result file
    259             File resultFile = new File(resultDir, ResultHandler.TEST_RESULT_FILE_NAME);
    260             writer = new FileWriter(resultFile);
    261             String summary = String.format(XML_SUMMARY, 2, 1);
    262             String moduleATest = String.format(XML_TEST_PASS, METHOD_1);
    263             String moduleACases = String.format(XML_CASE, CLASS_A, moduleATest);
    264             String moduleA = String.format(XML_MODULE, NAME_A, ABI, DEVICE_A, RUNTIME_A, DONE_A,
    265                     moduleACases);
    266             String moduleBTest3 = String.format(XML_TEST_FAIL, METHOD_3, MESSAGE, STACK_TRACE,
    267                     BUG_REPORT, LOGCAT, SCREENSHOT);
    268             String moduleBTest4 = String.format(XML_TEST_RESULT, METHOD_4, SUMMARY_SOURCE,
    269                     SUMMARY_MESSAGE, ResultType.HIGHER_BETTER.toReportString(),
    270                     ResultUnit.SCORE.toReportString(), Double.toString(SUMMARY_VALUE));
    271             String moduleBTest5 = String.format(XML_TEST_SKIP, METHOD_5);
    272             String moduleBTests = String.join("", moduleBTest3, moduleBTest4, moduleBTest5);
    273             String moduleBCases = String.format(XML_CASE, CLASS_B, moduleBTests);
    274             String moduleB = String.format(XML_MODULE, NAME_B, ABI, DEVICE_B, RUNTIME_B, DONE_B,
    275                     moduleBCases);
    276             String modules = String.join("", moduleA, moduleB);
    277             String hostName = "";
    278             try {
    279                 hostName = InetAddress.getLocalHost().getHostName();
    280             } catch (UnknownHostException ignored) {}
    281             String output = String.format(XML_BASE, START_MS, END_MS, START_DISPLAY, END_DISPLAY,
    282                     SUITE_NAME, SUITE_VERSION, SUITE_PLAN, SUITE_BUILD, REPORT_VERSION, DEVICES,
    283                     hostName, OS_NAME, OS_VERSION, OS_ARCH, JAVA_VENDOR,
    284                     JAVA_VERSION, REFERENCE_URL, LOG_URL, COMMAND_LINE_ARGS,
    285                     buildInfo, summary, modules);
    286             writer.write(output);
    287             writer.flush();
    288         } finally {
    289             if (writer != null) {
    290                 writer.close();
    291             }
    292         }
    293         return resultDir;
    294     }
    295 
    296     static void checkLightResult(IInvocationResult lightResult) throws Exception {
    297         assertEquals("Expected 3 passes", 3, lightResult.countResults(TestStatus.PASS));
    298         assertEquals("Expected 1 failure", 1, lightResult.countResults(TestStatus.FAIL));
    299 
    300         Map<String, String> buildInfo = lightResult.getInvocationInfo();
    301         assertEquals("Incorrect Build ID", EXAMPLE_BUILD_ID, buildInfo.get(BUILD_ID));
    302         assertEquals("Incorrect Build Product",
    303             EXAMPLE_BUILD_PRODUCT, buildInfo.get(BUILD_PRODUCT));
    304 
    305         Set<String> serials = lightResult.getDeviceSerials();
    306         assertTrue("Missing device", serials.contains(DEVICE_A));
    307         assertTrue("Missing device", serials.contains(DEVICE_B));
    308         assertEquals("Expected 2 devices", 2, serials.size());
    309         assertTrue("Incorrect devices", serials.contains(DEVICE_A) && serials.contains(DEVICE_B));
    310         assertEquals("Incorrect start time", START_MS, lightResult.getStartTime());
    311         assertEquals("Incorrect test plan", SUITE_PLAN, lightResult.getTestPlan());
    312         List<IModuleResult> modules = lightResult.getModules();
    313         assertEquals("Expected 1 completed module", 1, lightResult.getModuleCompleteCount());
    314         assertEquals("Expected 2 total modules", 2, modules.size());
    315     }
    316 
    317     static void checkResult(IInvocationResult result) throws Exception {
    318         checkResult(result, EXAMPLE_BUILD_FINGERPRINT);
    319     }
    320 
    321     static void checkResult(IInvocationResult result, String expectedBuildFingerprint) throws Exception {
    322         assertEquals("Expected 3 passes", 3, result.countResults(TestStatus.PASS));
    323         assertEquals("Expected 1 failure", 1, result.countResults(TestStatus.FAIL));
    324 
    325         Map<String, String> buildInfo = result.getInvocationInfo();
    326         assertEquals("Incorrect Build Fingerprint", expectedBuildFingerprint, result.getBuildFingerprint());
    327         assertEquals("Incorrect Build ID", EXAMPLE_BUILD_ID, buildInfo.get(BUILD_ID));
    328         assertEquals("Incorrect Build Product",
    329             EXAMPLE_BUILD_PRODUCT, buildInfo.get(BUILD_PRODUCT));
    330 
    331         Set<String> serials = result.getDeviceSerials();
    332         assertTrue("Missing device", serials.contains(DEVICE_A));
    333         assertTrue("Missing device", serials.contains(DEVICE_B));
    334         assertEquals("Expected 2 devices", 2, serials.size());
    335         assertTrue("Incorrect devices", serials.contains(DEVICE_A) && serials.contains(DEVICE_B));
    336         assertEquals("Incorrect start time", START_MS, result.getStartTime());
    337         assertEquals("Incorrect test plan", SUITE_PLAN, result.getTestPlan());
    338 
    339         List<IModuleResult> modules = result.getModules();
    340         assertEquals("Expected 2 modules", 2, modules.size());
    341 
    342         IModuleResult moduleA = modules.get(0);
    343         assertEquals("Expected 1 pass", 1, moduleA.countResults(TestStatus.PASS));
    344         assertEquals("Expected 0 failures", 0, moduleA.countResults(TestStatus.FAIL));
    345         assertEquals("Incorrect ABI", ABI, moduleA.getAbi());
    346         assertEquals("Incorrect name", NAME_A, moduleA.getName());
    347         assertEquals("Incorrect ID", ID_A, moduleA.getId());
    348         assertEquals("Incorrect runtime", Integer.parseInt(RUNTIME_A), moduleA.getRuntime());
    349         List<ICaseResult> moduleACases = moduleA.getResults();
    350         assertEquals("Expected 1 test case", 1, moduleACases.size());
    351         ICaseResult moduleACase = moduleACases.get(0);
    352         assertEquals("Incorrect name", CLASS_A, moduleACase.getName());
    353         List<ITestResult> moduleAResults = moduleACase.getResults();
    354         assertEquals("Expected 1 result", 1, moduleAResults.size());
    355         ITestResult moduleATest1 = moduleAResults.get(0);
    356         assertEquals("Incorrect name", METHOD_1, moduleATest1.getName());
    357         assertEquals("Incorrect result", TestStatus.PASS, moduleATest1.getResultStatus());
    358         assertNull("Unexpected bugreport", moduleATest1.getBugReport());
    359         assertNull("Unexpected log", moduleATest1.getLog());
    360         assertNull("Unexpected screenshot", moduleATest1.getScreenshot());
    361         assertNull("Unexpected message", moduleATest1.getMessage());
    362         assertNull("Unexpected stack trace", moduleATest1.getStackTrace());
    363         assertNull("Unexpected report", moduleATest1.getReportLog());
    364 
    365         IModuleResult moduleB = modules.get(1);
    366         assertEquals("Expected 2 passes", 2, moduleB.countResults(TestStatus.PASS));
    367         assertEquals("Expected 1 failure", 1, moduleB.countResults(TestStatus.FAIL));
    368         assertEquals("Incorrect ABI", ABI, moduleB.getAbi());
    369         assertEquals("Incorrect name", NAME_B, moduleB.getName());
    370         assertEquals("Incorrect ID", ID_B, moduleB.getId());
    371         assertEquals("Incorrect runtime", Integer.parseInt(RUNTIME_B), moduleB.getRuntime());
    372         List<ICaseResult> moduleBCases = moduleB.getResults();
    373         assertEquals("Expected 1 test case", 1, moduleBCases.size());
    374         ICaseResult moduleBCase = moduleBCases.get(0);
    375         assertEquals("Incorrect name", CLASS_B, moduleBCase.getName());
    376         List<ITestResult> moduleBResults = moduleBCase.getResults();
    377         assertEquals("Expected 3 results", 3, moduleBResults.size());
    378         ITestResult moduleBTest3 = moduleBResults.get(0);
    379         assertEquals("Incorrect name", METHOD_3, moduleBTest3.getName());
    380         assertEquals("Incorrect result", TestStatus.FAIL, moduleBTest3.getResultStatus());
    381         assertEquals("Incorrect bugreport", BUG_REPORT, moduleBTest3.getBugReport());
    382         assertEquals("Incorrect log", LOGCAT, moduleBTest3.getLog());
    383         assertEquals("Incorrect screenshot", SCREENSHOT, moduleBTest3.getScreenshot());
    384         assertEquals("Incorrect message", MESSAGE, moduleBTest3.getMessage());
    385         assertEquals("Incorrect stack trace", STACK_TRACE, moduleBTest3.getStackTrace());
    386         assertNull("Unexpected report", moduleBTest3.getReportLog());
    387         ITestResult moduleBTest4 = moduleBResults.get(1);
    388         assertEquals("Incorrect name", METHOD_4, moduleBTest4.getName());
    389         assertEquals("Incorrect result", TestStatus.PASS, moduleBTest4.getResultStatus());
    390         assertNull("Unexpected bugreport", moduleBTest4.getBugReport());
    391         assertNull("Unexpected log", moduleBTest4.getLog());
    392         assertNull("Unexpected screenshot", moduleBTest4.getScreenshot());
    393         assertNull("Unexpected message", moduleBTest4.getMessage());
    394         assertNull("Unexpected stack trace", moduleBTest4.getStackTrace());
    395         ReportLog report = moduleBTest4.getReportLog();
    396         assertNotNull("Expected report", report);
    397         ReportLog.Metric summary = report.getSummary();
    398         assertNotNull("Expected report summary", summary);
    399         assertEquals("Incorrect source", SUMMARY_SOURCE, summary.getSource());
    400         assertEquals("Incorrect message", SUMMARY_MESSAGE, summary.getMessage());
    401         assertEquals("Incorrect type", ResultType.HIGHER_BETTER, summary.getType());
    402         assertEquals("Incorrect unit", ResultUnit.SCORE, summary.getUnit());
    403         assertTrue("Incorrect values", Arrays.equals(new double[] { SUMMARY_VALUE },
    404                 summary.getValues()));
    405         ITestResult moduleBTest5 = moduleBResults.get(2);
    406         assertEquals("Incorrect name", METHOD_5, moduleBTest5.getName());
    407         assertEquals("Incorrect result", TestStatus.PASS, moduleBTest5.getResultStatus());
    408         assertTrue("Expected skipped", moduleBTest5.isSkipped());
    409         assertNull("Unexpected bugreport", moduleBTest5.getBugReport());
    410         assertNull("Unexpected log", moduleBTest5.getLog());
    411         assertNull("Unexpected screenshot", moduleBTest5.getScreenshot());
    412         assertNull("Unexpected message", moduleBTest5.getMessage());
    413         assertNull("Unexpected stack trace", moduleBTest5.getStackTrace());
    414         assertNull("Unexpected report", moduleBTest5.getReportLog());
    415     }
    416 }
    417