Home | History | Annotate | Download | only in testtype
      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