1 /* 2 * Copyright (C) 2010 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.tradefed.testtype; 17 18 import com.android.tradefed.metrics.proto.MetricMeasurement.Metric; 19 import com.android.tradefed.result.ITestInvocationListener; 20 import com.android.tradefed.result.TestDescription; 21 22 import org.easymock.EasyMock; 23 24 import java.util.HashMap; 25 26 27 /** 28 * Unit tests for {@link GTestResultParserTest}. 29 */ 30 public class GTestResultParserTest extends GTestParserTestBase { 31 32 /** 33 * Tests the parser for a simple test run output with 11 tests. 34 */ 35 @SuppressWarnings("unchecked") 36 public void testParseSimpleFile() throws Exception { 37 String[] contents = readInFile(GTEST_OUTPUT_FILE_1); 38 ITestInvocationListener mockRunListener = 39 EasyMock.createMock(ITestInvocationListener.class); 40 mockRunListener.testRunStarted(TEST_MODULE_NAME, 11); 41 // 11 passing test cases in this run 42 for (int i=0; i<11; ++i) { 43 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 44 mockRunListener.testEnded( 45 (TestDescription) EasyMock.anyObject(), 46 (HashMap<String, Metric>) EasyMock.anyObject()); 47 } 48 // TODO: validate param values 49 mockRunListener.testRunEnded( 50 EasyMock.anyLong(), (HashMap<String, Metric>) EasyMock.anyObject()); 51 EasyMock.replay(mockRunListener); 52 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 53 resultParser.processNewLines(contents); 54 resultParser.flush(); 55 EasyMock.verify(mockRunListener); 56 } 57 58 /** 59 * Tests the parser for a simple test run output with 53 tests and no times. 60 */ 61 @SuppressWarnings("unchecked") 62 public void testParseSimpleFileNoTimes() throws Exception { 63 String[] contents = readInFile(GTEST_OUTPUT_FILE_2); 64 ITestInvocationListener mockRunListener = 65 EasyMock.createMock(ITestInvocationListener.class); 66 mockRunListener.testRunStarted(TEST_MODULE_NAME, 53); 67 // 53 passing test cases in this run 68 for (int i=0; i<53; ++i) { 69 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 70 mockRunListener.testEnded( 71 (TestDescription) EasyMock.anyObject(), 72 (HashMap<String, Metric>) EasyMock.anyObject()); 73 } 74 // TODO: validate param values 75 mockRunListener.testRunEnded( 76 EasyMock.anyLong(), (HashMap<String, Metric>) EasyMock.anyObject()); 77 EasyMock.replay(mockRunListener); 78 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 79 resultParser.processNewLines(contents); 80 resultParser.flush(); 81 EasyMock.verify(mockRunListener); 82 } 83 84 /** 85 * Tests the parser for a simple test run output with 0 tests and no times. 86 */ 87 public void testParseNoTests() throws Exception { 88 String[] contents = readInFile(GTEST_OUTPUT_FILE_3); 89 HashMap<String, Metric> expected = new HashMap<>(); 90 ITestInvocationListener mockRunListener = 91 EasyMock.createMock(ITestInvocationListener.class); 92 mockRunListener.testRunStarted(TEST_MODULE_NAME, 0); 93 mockRunListener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(expected)); 94 EasyMock.replay(mockRunListener); 95 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 96 resultParser.processNewLines(contents); 97 resultParser.flush(); 98 EasyMock.verify(mockRunListener); 99 } 100 101 /** 102 * Tests the parser for a run with 268 tests. 103 */ 104 @SuppressWarnings("unchecked") 105 public void testParseLargerFile() throws Exception { 106 String[] contents = readInFile(GTEST_OUTPUT_FILE_4); 107 ITestInvocationListener mockRunListener = 108 EasyMock.createMock(ITestInvocationListener.class); 109 mockRunListener.testRunStarted(TEST_MODULE_NAME, 268); 110 // 268 passing test cases in this run 111 for (int i=0; i<268; ++i) { 112 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 113 mockRunListener.testEnded( 114 (TestDescription) EasyMock.anyObject(), 115 (HashMap<String, Metric>) EasyMock.anyObject()); 116 } 117 // TODO: validate param values 118 mockRunListener.testRunEnded( 119 EasyMock.anyLong(), (HashMap<String, Metric>) EasyMock.anyObject()); 120 EasyMock.replay(mockRunListener); 121 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 122 resultParser.processNewLines(contents); 123 resultParser.flush(); 124 EasyMock.verify(mockRunListener); 125 } 126 127 /** 128 * Tests the parser for a run with test failures. 129 */ 130 @SuppressWarnings("unchecked") 131 public void testParseWithFailures() throws Exception { 132 String MESSAGE_OUTPUT = 133 "This is some random text that should get captured by the parser."; 134 String[] contents = readInFile(GTEST_OUTPUT_FILE_5); 135 ITestInvocationListener mockRunListener = 136 EasyMock.createMock(ITestInvocationListener.class); 137 // 13 test cases in this run 138 mockRunListener.testRunStarted(TEST_MODULE_NAME, 13); 139 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 140 mockRunListener.testEnded( 141 (TestDescription) EasyMock.anyObject(), 142 (HashMap<String, Metric>) EasyMock.anyObject()); 143 // test failure 144 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 145 mockRunListener.testFailed( 146 (TestDescription) EasyMock.anyObject(), (String) EasyMock.anyObject()); 147 mockRunListener.testEnded( 148 (TestDescription) EasyMock.anyObject(), 149 (HashMap<String, Metric>) EasyMock.anyObject()); 150 // 4 passing tests 151 for (int i=0; i<4; ++i) { 152 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 153 mockRunListener.testEnded( 154 (TestDescription) EasyMock.anyObject(), 155 (HashMap<String, Metric>) EasyMock.anyObject()); 156 } 157 // 2 consecutive test failures 158 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 159 mockRunListener.testFailed( 160 (TestDescription) EasyMock.anyObject(), (String) EasyMock.anyObject()); 161 mockRunListener.testEnded( 162 (TestDescription) EasyMock.anyObject(), 163 (HashMap<String, Metric>) EasyMock.anyObject()); 164 165 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 166 mockRunListener.testFailed( 167 (TestDescription) EasyMock.anyObject(), EasyMock.matches(MESSAGE_OUTPUT)); 168 mockRunListener.testEnded( 169 (TestDescription) EasyMock.anyObject(), 170 (HashMap<String, Metric>) EasyMock.anyObject()); 171 172 // 5 passing tests 173 for (int i=0; i<5; ++i) { 174 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 175 mockRunListener.testEnded( 176 (TestDescription) EasyMock.anyObject(), 177 (HashMap<String, Metric>) EasyMock.anyObject()); 178 } 179 180 // TODO: validate param values 181 mockRunListener.testRunEnded( 182 EasyMock.anyLong(), (HashMap<String, Metric>) EasyMock.anyObject()); 183 EasyMock.replay(mockRunListener); 184 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 185 resultParser.processNewLines(contents); 186 resultParser.flush(); 187 EasyMock.verify(mockRunListener); 188 } 189 190 /** 191 * Tests the parser for a run with test errors. 192 */ 193 @SuppressWarnings("unchecked") 194 public void testParseWithErrors() throws Exception { 195 String[] contents = readInFile(GTEST_OUTPUT_FILE_6); 196 ITestInvocationListener mockRunListener = 197 EasyMock.createMock(ITestInvocationListener.class); 198 // 10 test cases in this run 199 mockRunListener.testRunStarted(TEST_MODULE_NAME, 10); 200 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 201 mockRunListener.testEnded( 202 (TestDescription) EasyMock.anyObject(), 203 (HashMap<String, Metric>) EasyMock.anyObject()); 204 // test failure 205 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 206 mockRunListener.testFailed( 207 (TestDescription) EasyMock.anyObject(), (String) EasyMock.anyObject()); 208 mockRunListener.testEnded( 209 (TestDescription) EasyMock.anyObject(), 210 (HashMap<String, Metric>) EasyMock.anyObject()); 211 // 5 passing tests 212 for (int i=0; i<5; ++i) { 213 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 214 mockRunListener.testEnded( 215 (TestDescription) EasyMock.anyObject(), 216 (HashMap<String, Metric>) EasyMock.anyObject()); 217 } 218 // another test error 219 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 220 mockRunListener.testFailed( 221 (TestDescription) EasyMock.anyObject(), (String) EasyMock.anyObject()); 222 mockRunListener.testEnded( 223 (TestDescription) EasyMock.anyObject(), 224 (HashMap<String, Metric>) EasyMock.anyObject()); 225 // 2 passing tests 226 for (int i=0; i<2; ++i) { 227 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 228 mockRunListener.testEnded( 229 (TestDescription) EasyMock.anyObject(), 230 (HashMap<String, Metric>) EasyMock.anyObject()); 231 } 232 233 // TODO: validate param values 234 mockRunListener.testRunEnded( 235 EasyMock.anyLong(), (HashMap<String, Metric>) EasyMock.anyObject()); 236 EasyMock.replay(mockRunListener); 237 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 238 resultParser.processNewLines(contents); 239 resultParser.flush(); 240 EasyMock.verify(mockRunListener); 241 } 242 243 /** 244 * Tests the parser for a run with 11 tests. 245 */ 246 @SuppressWarnings("unchecked") 247 public void testParseNonAlignedTag() throws Exception { 248 String[] contents = readInFile(GTEST_OUTPUT_FILE_7); 249 ITestInvocationListener mockRunListener = 250 EasyMock.createMock(ITestInvocationListener.class); 251 mockRunListener.testRunStarted(TEST_MODULE_NAME, 11); 252 // 11 passing test cases in this run 253 for (int i=0; i<11; ++i) { 254 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 255 mockRunListener.testEnded( 256 (TestDescription) EasyMock.anyObject(), 257 (HashMap<String, Metric>) EasyMock.anyObject()); 258 } 259 mockRunListener.testRunEnded( 260 EasyMock.anyLong(), (HashMap<String, Metric>) EasyMock.anyObject()); 261 EasyMock.replay(mockRunListener); 262 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 263 resultParser.processNewLines(contents); 264 resultParser.flush(); 265 EasyMock.verify(mockRunListener); 266 } 267 268 /** 269 * Tests the parser for a simple test run output with 18 tests with Non GTest format 270 * Should not crash. 271 */ 272 @SuppressWarnings("unchecked") 273 public void testParseSimpleFile_AltFormat() throws Exception { 274 String[] contents = readInFile(GTEST_OUTPUT_FILE_8); 275 ITestInvocationListener mockRunListener = 276 EasyMock.createMock(ITestInvocationListener.class); 277 mockRunListener.testRunStarted(TEST_MODULE_NAME, 18); 278 // 14 passing tests 279 for (int i=0; i<14; ++i) { 280 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 281 mockRunListener.testEnded( 282 (TestDescription) EasyMock.anyObject(), 283 (HashMap<String, Metric>) EasyMock.anyObject()); 284 } 285 // 3 consecutive test failures 286 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 287 mockRunListener.testFailed( 288 (TestDescription) EasyMock.anyObject(), (String) EasyMock.anyObject()); 289 mockRunListener.testEnded( 290 (TestDescription) EasyMock.anyObject(), 291 (HashMap<String, Metric>) EasyMock.anyObject()); 292 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 293 mockRunListener.testFailed( 294 (TestDescription) EasyMock.anyObject(), (String) EasyMock.anyObject()); 295 mockRunListener.testEnded( 296 (TestDescription) EasyMock.anyObject(), 297 (HashMap<String, Metric>) EasyMock.anyObject()); 298 299 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 300 mockRunListener.testFailed( 301 (TestDescription) EasyMock.anyObject(), (String) EasyMock.anyObject()); 302 mockRunListener.testEnded( 303 (TestDescription) EasyMock.anyObject(), 304 (HashMap<String, Metric>) EasyMock.anyObject()); 305 // 1 passing test 306 mockRunListener.testStarted((TestDescription) EasyMock.anyObject()); 307 mockRunListener.testEnded( 308 (TestDescription) EasyMock.anyObject(), 309 (HashMap<String, Metric>) EasyMock.anyObject()); 310 311 mockRunListener.testRunEnded( 312 EasyMock.anyLong(), (HashMap<String, Metric>) EasyMock.anyObject()); 313 EasyMock.replay(mockRunListener); 314 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 315 resultParser.processNewLines(contents); 316 resultParser.flush(); 317 EasyMock.verify(mockRunListener); 318 } 319 320 /** Tests the parser for a simple test run output with a link error. */ 321 public void testParseSimpleFile_LinkError() throws Exception { 322 String[] contents = readInFile(GTEST_OUTPUT_FILE_9); 323 ITestInvocationListener mockRunListener = 324 EasyMock.createMock(ITestInvocationListener.class); 325 mockRunListener.testRunStarted(TEST_MODULE_NAME, 0); 326 mockRunListener.testRunFailed( 327 "CANNOT LINK EXECUTABLE \"/data/installd_cache_test\": " 328 + "library \"liblogwrap.so\" not found"); 329 mockRunListener.testRunEnded( 330 EasyMock.anyLong(), (HashMap<String, Metric>) EasyMock.anyObject()); 331 EasyMock.replay(mockRunListener); 332 GTestResultParser resultParser = new GTestResultParser(TEST_MODULE_NAME, mockRunListener); 333 resultParser.processNewLines(contents); 334 resultParser.flush(); 335 EasyMock.verify(mockRunListener); 336 } 337 } 338