Home | History | Annotate | Download | only in suite
      1 /*
      2  * Copyright (C) 2016 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.suite;
     17 
     18 import com.android.tradefed.device.DeviceNotAvailableException;
     19 import com.android.tradefed.device.ITestDevice;
     20 import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
     21 import com.android.tradefed.result.ByteArrayInputStreamSource;
     22 import com.android.tradefed.result.ITestInvocationListener;
     23 import com.android.tradefed.result.InputStreamSource;
     24 import com.android.tradefed.result.LogDataType;
     25 import com.android.tradefed.result.TestDescription;
     26 import com.android.tradefed.util.IRunUtil;
     27 
     28 import org.easymock.EasyMock;
     29 import org.junit.Before;
     30 import org.junit.Test;
     31 import org.junit.runner.RunWith;
     32 import org.junit.runners.JUnit4;
     33 
     34 import java.util.ArrayList;
     35 import java.util.HashMap;
     36 import java.util.List;
     37 
     38 /** Unit tests for {@link com.android.tradefed.testtype.suite.TestFailureListener} */
     39 @RunWith(JUnit4.class)
     40 public class TestFailureListenerTest {
     41 
     42     private TestFailureListener mFailureListener;
     43     private ITestInvocationListener mMockListener;
     44     private ITestDevice mMockDevice;
     45     private List<ITestDevice> mListDevice;
     46 
     47     @Before
     48     public void setUp() {
     49         mMockListener = EasyMock.createMock(ITestInvocationListener.class);
     50         mMockDevice = EasyMock.createStrictMock(ITestDevice.class);
     51         mListDevice = new ArrayList<>();
     52         mListDevice.add(mMockDevice);
     53         EasyMock.expect(mMockDevice.getSerialNumber()).andStubReturn("SERIAL");
     54         // Create base failure listener with all option ON and default logcat size.
     55         mFailureListener = new TestFailureListener(mListDevice, true, true, true, true, -1);
     56         mFailureListener.setLogger(mMockListener);
     57     }
     58 
     59     /** Test that on testFailed all the collection are triggered. */
     60     @Test
     61     @SuppressWarnings("MustBeClosedChecker")
     62     public void testTestFailed() throws Exception {
     63         TestDescription testId = new TestDescription("com.fake", "methodfake");
     64         final String trace = "oups it failed";
     65         final long startDate = 1479917040l; // Wed Nov 23 16:04:00 GMT 2016
     66         final byte[] fakeData = "fakeData".getBytes();
     67         InputStreamSource fakeSource = new ByteArrayInputStreamSource(fakeData);
     68         EasyMock.expect(mMockDevice.getDeviceDate()).andReturn(startDate);
     69         // Screenshot routine
     70         EasyMock.expect(mMockDevice.getScreenshot()).andReturn(fakeSource);
     71         mMockListener.testLog(
     72                 EasyMock.eq(testId.toString() + "-SERIAL-screenshot"),
     73                 EasyMock.eq(LogDataType.PNG),
     74                 EasyMock.eq(fakeSource));
     75         // Bugreport routine - testLog is internal to it.
     76         EasyMock.expect(mMockDevice.logBugreport(EasyMock.anyObject(), EasyMock.anyObject()))
     77                 .andReturn(true);
     78         // logcat routine
     79         EasyMock.expect(mMockDevice.getLogcatSince(EasyMock.eq(startDate))).andReturn(fakeSource);
     80         mMockListener.testLog(
     81                 EasyMock.eq(testId.toString() + "-SERIAL-logcat"),
     82                 EasyMock.eq(LogDataType.LOGCAT),
     83                 EasyMock.eq(fakeSource));
     84         // Reboot routine
     85         EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.build.type")))
     86                 .andReturn("userdebug");
     87         mMockDevice.reboot();
     88         EasyMock.replay(mMockListener, mMockDevice);
     89         mFailureListener.testStarted(testId);
     90         mFailureListener.testFailed(testId, trace);
     91         mFailureListener.testEnded(testId, new HashMap<String, Metric>());
     92         EasyMock.verify(mMockListener, mMockDevice);
     93     }
     94 
     95     /**
     96      * Test that testFailed behave properly when device is unavailable: collection is attempted and
     97      * properly handled.
     98      */
     99     @Test
    100     @SuppressWarnings("MustBeClosedChecker")
    101     public void testTestFailed_notAvailable() throws Exception {
    102         mFailureListener =
    103                 new TestFailureListener(mListDevice, false, true, true, true, -1) {
    104                     @Override
    105                     IRunUtil getRunUtil() {
    106                         return EasyMock.createMock(IRunUtil.class);
    107                     }
    108                 };
    109         mFailureListener.setLogger(mMockListener);
    110         TestDescription testId = new TestDescription("com.fake", "methodfake");
    111         final String trace = "oups it failed";
    112         final byte[] fakeData = "fakeData".getBytes();
    113         InputStreamSource fakeSource = new ByteArrayInputStreamSource(fakeData);
    114         DeviceNotAvailableException dnae = new DeviceNotAvailableException();
    115         EasyMock.expect(mMockDevice.getDeviceDate()).andThrow(dnae);
    116         // Screenshot routine
    117         EasyMock.expect(mMockDevice.getScreenshot()).andThrow(dnae);
    118         // logcat routine
    119         EasyMock.expect(mMockDevice.getLogcat(EasyMock.anyInt())).andReturn(fakeSource);
    120         mMockListener.testLog(
    121                 EasyMock.eq(testId.toString() + "-SERIAL-logcat"),
    122                 EasyMock.eq(LogDataType.LOGCAT),
    123                 EasyMock.eq(fakeSource));
    124         // Reboot routine
    125         EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.build.type")))
    126                 .andReturn("userdebug");
    127         mMockDevice.reboot();
    128         EasyMock.expectLastCall().andThrow(dnae);
    129         EasyMock.replay(mMockListener, mMockDevice);
    130         mFailureListener.testStarted(testId);
    131         mFailureListener.testFailed(testId, trace);
    132         mFailureListener.testEnded(testId, new HashMap<String, Metric>());
    133         EasyMock.verify(mMockListener, mMockDevice);
    134     }
    135 
    136     /**
    137      * Test when a test failure occurs and it is a user build, no reboot is attempted.
    138      */
    139     @Test
    140     public void testTestFailed_userBuild() throws Exception {
    141         mFailureListener = new TestFailureListener(mListDevice, false, false, false, true, -1);
    142         mFailureListener.setLogger(mMockListener);
    143         final String trace = "oups it failed";
    144         TestDescription testId = new TestDescription("com.fake", "methodfake");
    145         EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.build.type"))).andReturn("user");
    146         EasyMock.replay(mMockListener, mMockDevice);
    147         mFailureListener.testStarted(testId);
    148         mFailureListener.testFailed(testId, trace);
    149         mFailureListener.testEnded(testId, new HashMap<String, Metric>());
    150         EasyMock.verify(mMockListener, mMockDevice);
    151     }
    152 
    153     /**
    154      * Test when a test failure occurs during a multi device run. Each device should capture the
    155      * logs.
    156      */
    157     @Test
    158     public void testFailed_multiDevice() throws Exception {
    159         ITestDevice device2 = EasyMock.createMock(ITestDevice.class);
    160         mListDevice.add(device2);
    161         mFailureListener = new TestFailureListener(mListDevice, false, false, false, true, -1);
    162         mFailureListener.setLogger(mMockListener);
    163         final String trace = "oups it failed";
    164         TestDescription testId = new TestDescription("com.fake", "methodfake");
    165         EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.build.type"))).andReturn("debug");
    166         mMockDevice.reboot();
    167         EasyMock.expect(device2.getSerialNumber()).andStubReturn("SERIAL2");
    168         EasyMock.expect(device2.getProperty(EasyMock.eq("ro.build.type"))).andReturn("debug");
    169         device2.reboot();
    170 
    171         EasyMock.replay(mMockListener, mMockDevice, device2);
    172         mFailureListener.testStarted(testId);
    173         mFailureListener.testFailed(testId, trace);
    174         mFailureListener.testEnded(testId, new HashMap<String, Metric>());
    175         EasyMock.verify(mMockListener, mMockDevice, device2);
    176     }
    177 }
    178