1 /* 2 * Copyright (C) 2014 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.cts.tradefed.testtype; 17 18 import com.android.cts.tradefed.build.StubCtsBuildHelper; 19 import com.android.cts.tradefed.UnitTests; 20 import com.android.cts.util.AbiUtils; 21 import com.android.ddmlib.IShellOutputReceiver; 22 import com.android.ddmlib.testrunner.ITestRunListener; 23 import com.android.ddmlib.testrunner.TestIdentifier; 24 import com.android.tradefed.device.ITestDevice; 25 import com.android.tradefed.result.ITestInvocationListener; 26 import com.android.tradefed.testtype.IAbi; 27 28 import junit.framework.TestCase; 29 30 import org.easymock.EasyMock; 31 import org.easymock.IAnswer; 32 33 import java.io.File; 34 import java.util.ArrayList; 35 import java.util.Collection; 36 import java.util.Map; 37 38 /** 39 * Unit tests for {@link DeqpTestRunner}. 40 */ 41 public class DeqpTestRunnerTest extends TestCase { 42 private static final String NAME = "dEQP-GLES3"; 43 private static final String ID = AbiUtils.createId(UnitTests.ABI.getName(), NAME); 44 private static final String CASE_LIST_FILE_NAME = "/sdcard/dEQP-TestCaseList.txt"; 45 private static final String LOG_FILE_NAME = "/sdcard/TestLog.qpa"; 46 private static final String INSTRUMENTATION_NAME = 47 "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation"; 48 private static final String DEQP_ONDEVICE_APK = "com.drawelements.deqp.apk"; 49 private static final String DEQP_ONDEVICE_PKG = "com.drawelements.deqp"; 50 51 /** 52 * {@inheritDoc} 53 */ 54 @Override 55 protected void setUp() throws Exception { 56 super.setUp(); 57 } 58 59 /** 60 * Test version of OpenGL ES. 61 */ 62 private void testGlesVersion(int requiredMajorVersion, int requiredMinorVersion, int majorVersion, int minorVersion) throws Exception { 63 final TestIdentifier testId = new TestIdentifier("dEQP-GLES" 64 + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion) 65 + ".info", "version"); 66 67 final String testPath = "dEQP-GLES" 68 + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion) 69 +".info.version"; 70 71 final String testTrie = "{dEQP-GLES" 72 + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion) 73 + "{info{version}}}"; 74 75 final String resultCode = "Pass"; 76 77 /* MultiLineReceiver expects "\r\n" line ending. */ 78 final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n" 79 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 80 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n" 81 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 82 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n" 83 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 84 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n" 85 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 86 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n" 87 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 88 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n" 89 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 90 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n" 91 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 92 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n" 93 + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n" 94 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 95 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=" + resultCode + "\r\n" 96 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Detail" + resultCode + "\r\n" 97 + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n" 98 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 99 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n" 100 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 101 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n" 102 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 103 + "INSTRUMENTATION_CODE: 0\r\n"; 104 105 ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class); 106 ITestInvocationListener mockListener 107 = EasyMock.createStrictMock(ITestInvocationListener.class); 108 Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>(); 109 110 tests.add(testId); 111 112 DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, 113 "dEQP-GLES" + Integer.toString(requiredMajorVersion) 114 + (requiredMinorVersion > 0 ? Integer.toString(requiredMinorVersion) : ""), 115 tests); 116 deqpTest.setAbi(UnitTests.ABI); 117 118 int version = (majorVersion << 16) | minorVersion; 119 EasyMock.expect(mockDevice.getProperty("ro.opengles.version")) 120 .andReturn(Integer.toString(version)).atLeastOnce(); 121 122 if (majorVersion > requiredMajorVersion 123 || (majorVersion == requiredMajorVersion && minorVersion >= requiredMinorVersion)) { 124 125 EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))) 126 .andReturn("").once(); 127 EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(), 128 EasyMock.eq(true), 129 EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))) 130 .andReturn(null).once(); 131 132 EasyMock.expect(mockDevice.executeShellCommand( 133 EasyMock.eq("rm " + CASE_LIST_FILE_NAME))).andReturn("").once(); 134 135 EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME))) 136 .andReturn("").once(); 137 138 EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME)) 139 .andReturn(true).once(); 140 141 String command = String.format( 142 "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \"" 143 + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" " 144 + "-e deqpLogData \"%s\" %s", 145 AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME, 146 CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME); 147 148 mockDevice.executeShellCommand(EasyMock.eq(command), 149 EasyMock.<IShellOutputReceiver>notNull()); 150 151 EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() { 152 @Override 153 public Object answer() { 154 IShellOutputReceiver receiver 155 = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1]; 156 157 receiver.addOutput(output.getBytes(), 0, output.length()); 158 receiver.flush(); 159 160 return null; 161 } 162 }); 163 164 EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))) 165 .andReturn("").once(); 166 } 167 168 mockListener.testRunStarted(ID, 1); 169 EasyMock.expectLastCall().once(); 170 171 mockListener.testStarted(EasyMock.eq(testId)); 172 EasyMock.expectLastCall().once(); 173 174 mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull()); 175 EasyMock.expectLastCall().once(); 176 177 mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull()); 178 EasyMock.expectLastCall().once(); 179 180 EasyMock.replay(mockDevice); 181 EasyMock.replay(mockListener); 182 183 deqpTest.setDevice(mockDevice); 184 deqpTest.setBuildHelper(new StubCtsBuildHelper()); 185 deqpTest.run(mockListener); 186 187 EasyMock.verify(mockListener); 188 EasyMock.verify(mockDevice); 189 } 190 191 /** 192 * Test that result code produces correctly pass or fail. 193 */ 194 private void testResultCode(final String resultCode, boolean pass) throws Exception { 195 final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.info", "version"); 196 final String testPath = "dEQP-GLES3.info.version"; 197 final String testTrie = "{dEQP-GLES3{info{version}}}"; 198 199 /* MultiLineReceiver expects "\r\n" line ending. */ 200 final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n" 201 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 202 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n" 203 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 204 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n" 205 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 206 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n" 207 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 208 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n" 209 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 210 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n" 211 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 212 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n" 213 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 214 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n" 215 + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n" 216 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 217 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=" + resultCode + "\r\n" 218 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Detail" + resultCode + "\r\n" 219 + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n" 220 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 221 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n" 222 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 223 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n" 224 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 225 + "INSTRUMENTATION_CODE: 0\r\n"; 226 227 ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class); 228 ITestInvocationListener mockListener 229 = EasyMock.createStrictMock(ITestInvocationListener.class); 230 Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>(); 231 232 tests.add(testId); 233 234 DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests); 235 deqpTest.setAbi(UnitTests.ABI); 236 237 int version = 3 << 16; 238 EasyMock.expect(mockDevice.getProperty("ro.opengles.version")) 239 .andReturn(Integer.toString(version)).atLeastOnce(); 240 241 EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("") 242 .once(); 243 244 EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(), 245 EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))) 246 .andReturn(null).once(); 247 248 EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME))) 249 .andReturn("").once(); 250 251 EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME))) 252 .andReturn("").once(); 253 254 EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME)).andReturn(true) 255 .once(); 256 257 String command = String.format( 258 "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \"" 259 + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" " 260 + "-e deqpLogData \"%s\" %s", 261 AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME, 262 CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME); 263 264 mockDevice.executeShellCommand(EasyMock.eq(command), 265 EasyMock.<IShellOutputReceiver>notNull()); 266 267 EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() { 268 @Override 269 public Object answer() { 270 IShellOutputReceiver receiver 271 = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1]; 272 273 receiver.addOutput(output.getBytes(), 0, output.length()); 274 receiver.flush(); 275 276 return null; 277 } 278 }); 279 280 mockListener.testRunStarted(ID, 1); 281 EasyMock.expectLastCall().once(); 282 283 mockListener.testStarted(EasyMock.eq(testId)); 284 EasyMock.expectLastCall().once(); 285 286 if (!pass) { 287 mockListener.testFailed(testId, 288 resultCode + ": Detail" + resultCode); 289 290 EasyMock.expectLastCall().once(); 291 } 292 293 mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull()); 294 EasyMock.expectLastCall().once(); 295 296 mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull()); 297 EasyMock.expectLastCall().once(); 298 299 EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("") 300 .once(); 301 302 EasyMock.replay(mockDevice); 303 EasyMock.replay(mockListener); 304 305 deqpTest.setDevice(mockDevice); 306 deqpTest.setBuildHelper(new StubCtsBuildHelper()); 307 deqpTest.run(mockListener); 308 309 EasyMock.verify(mockListener); 310 EasyMock.verify(mockDevice); 311 } 312 313 /** 314 * Test running multiple test cases. 315 */ 316 public void testRun_multipleTests() throws Exception { 317 /* MultiLineReceiver expects "\r\n" line ending. */ 318 final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n" 319 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 320 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n" 321 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 322 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n" 323 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 324 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n" 325 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 326 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n" 327 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n" 328 + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n" 329 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 330 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n" 331 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 332 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n" 333 + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.info.vendor\r\n" 334 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 335 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n" 336 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n" 337 + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n" 338 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 339 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n" 340 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 341 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n" 342 + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.info.renderer\r\n" 343 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 344 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n" 345 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n" 346 + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n" 347 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 348 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n" 349 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 350 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n" 351 + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.info.version\r\n" 352 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 353 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n" 354 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n" 355 + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n" 356 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 357 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n" 358 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 359 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n" 360 + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.info.shading_language_version\r\n" 361 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 362 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n" 363 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n" 364 + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n" 365 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 366 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n" 367 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 368 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n" 369 + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.info.extensions\r\n" 370 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 371 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n" 372 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n" 373 + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n" 374 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 375 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n" 376 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 377 + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n" 378 + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.info.render_target\r\n" 379 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 380 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n" 381 + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n" 382 + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n" 383 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 384 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n" 385 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 386 + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n" 387 + "INSTRUMENTATION_STATUS_CODE: 0\r\n" 388 + "INSTRUMENTATION_CODE: 0\r\n"; 389 390 final TestIdentifier[] testIds = { 391 new TestIdentifier("dEQP-GLES3.info", "vendor"), 392 new TestIdentifier("dEQP-GLES3.info", "renderer"), 393 new TestIdentifier("dEQP-GLES3.info", "version"), 394 new TestIdentifier("dEQP-GLES3.info", "shading_language_version"), 395 new TestIdentifier("dEQP-GLES3.info", "extensions"), 396 new TestIdentifier("dEQP-GLES3.info", "render_target") 397 }; 398 399 final String[] testPaths = { 400 "dEQP-GLES3.info.vendor", 401 "dEQP-GLES3.info.renderer", 402 "dEQP-GLES3.info.version", 403 "dEQP-GLES3.info.shading_language_version", 404 "dEQP-GLES3.info.extensions", 405 "dEQP-GLES3.info.render_target" 406 }; 407 408 final String testTrie 409 = "{dEQP-GLES3{info{vendor,renderer,version,shading_language_version,extensions,render_target}}}"; 410 411 ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class); 412 ITestInvocationListener mockListener 413 = EasyMock.createStrictMock(ITestInvocationListener.class); 414 Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>(); 415 416 for (TestIdentifier id : testIds) { 417 tests.add(id); 418 } 419 420 DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests); 421 deqpTest.setAbi(UnitTests.ABI); 422 423 int version = 3 << 16; 424 EasyMock.expect(mockDevice.getProperty("ro.opengles.version")) 425 .andReturn(Integer.toString(version)).atLeastOnce(); 426 427 EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("") 428 .once(); 429 EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(), 430 EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))) 431 .andReturn(null).once(); 432 433 EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME))) 434 .andReturn("").once(); 435 436 EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME))) 437 .andReturn("").once(); 438 439 EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME)) 440 .andReturn(true).once(); 441 442 String command = String.format( 443 "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \"" 444 + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" " 445 + "-e deqpLogData \"%s\" %s", 446 AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME, 447 CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME); 448 449 mockDevice.executeShellCommand(EasyMock.eq(command), 450 EasyMock.<IShellOutputReceiver>notNull()); 451 452 EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() { 453 @Override 454 public Object answer() { 455 IShellOutputReceiver receiver 456 = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1]; 457 458 receiver.addOutput(output.getBytes(), 0, output.length()); 459 receiver.flush(); 460 461 return null; 462 } 463 }); 464 465 mockListener.testRunStarted(ID, testPaths.length); 466 EasyMock.expectLastCall().once(); 467 468 for (int i = 0; i < testPaths.length; i++) { 469 mockListener.testStarted(EasyMock.eq(testIds[i])); 470 EasyMock.expectLastCall().once(); 471 472 mockListener.testEnded(EasyMock.eq(testIds[i]), 473 EasyMock.<Map<String, String>>notNull()); 474 475 EasyMock.expectLastCall().once(); 476 } 477 478 mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull()); 479 EasyMock.expectLastCall().once(); 480 481 EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("") 482 .once(); 483 484 EasyMock.replay(mockDevice); 485 EasyMock.replay(mockListener); 486 487 deqpTest.setDevice(mockDevice); 488 deqpTest.setBuildHelper(new StubCtsBuildHelper()); 489 deqpTest.run(mockListener); 490 491 EasyMock.verify(mockListener); 492 EasyMock.verify(mockDevice); 493 } 494 495 /** 496 * Test OpeGL ES3 tests on device with OpenGL ES2. 497 */ 498 public void testRun_require30DeviceVersion20() throws Exception { 499 testGlesVersion(3, 0, 2, 0); 500 } 501 502 /** 503 * Test OpeGL ES3.1 tests on device with OpenGL ES2. 504 */ 505 public void testRun_require31DeviceVersion20() throws Exception { 506 testGlesVersion(3, 1, 2, 0); 507 } 508 509 /** 510 * Test OpeGL ES3 tests on device with OpenGL ES3. 511 */ 512 public void testRun_require30DeviceVersion30() throws Exception { 513 testGlesVersion(3, 0, 3, 0); 514 } 515 516 /** 517 * Test OpeGL ES3.1 tests on device with OpenGL ES3. 518 */ 519 public void testRun_require31DeviceVersion30() throws Exception { 520 testGlesVersion(3, 1, 3, 0); 521 } 522 523 /** 524 * Test OpeGL ES3 tests on device with OpenGL ES3.1. 525 */ 526 public void testRun_require30DeviceVersion31() throws Exception { 527 testGlesVersion(3, 0, 3, 1); 528 } 529 530 /** 531 * Test OpeGL ES3.1 tests on device with OpenGL ES3.1. 532 */ 533 public void testRun_require31DeviceVersion31() throws Exception { 534 testGlesVersion(3, 1, 3, 1); 535 } 536 537 /** 538 * Test dEQP Pass result code. 539 */ 540 public void testRun_resultPass() throws Exception { 541 testResultCode("Pass", true); 542 } 543 544 /** 545 * Test dEQP Fail result code. 546 */ 547 public void testRun_resultFail() throws Exception { 548 testResultCode("Fail", false); 549 } 550 551 /** 552 * Test dEQP NotSupported result code. 553 */ 554 public void testRun_resultNotSupported() throws Exception { 555 testResultCode("NotSupported", true); 556 } 557 558 /** 559 * Test dEQP QualityWarning result code. 560 */ 561 public void testRun_resultQualityWarning() throws Exception { 562 testResultCode("QualityWarning", true); 563 } 564 565 /** 566 * Test dEQP CompatibilityWarning result code. 567 */ 568 public void testRun_resultCompatibilityWarning() throws Exception { 569 testResultCode("CompatibilityWarning", true); 570 } 571 572 /** 573 * Test dEQP ResourceError result code. 574 */ 575 public void testRun_resultResourceError() throws Exception { 576 testResultCode("ResourceError", false); 577 } 578 579 /** 580 * Test dEQP InternalError result code. 581 */ 582 public void testRun_resultInternalError() throws Exception { 583 testResultCode("InternalError", false); 584 } 585 586 /** 587 * Test dEQP Crash result code. 588 */ 589 public void testRun_resultCrash() throws Exception { 590 testResultCode("Crash", false); 591 } 592 593 /** 594 * Test dEQP Timeout result code. 595 */ 596 public void testRun_resultTimeout() throws Exception { 597 testResultCode("Timeout", false); 598 } 599 } 600