152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot/* 252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * Copyright (C) 2012 The Android Open Source Project 352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * 452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * Licensed under the Apache License, Version 2.0 (the "License"); 552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * you may not use this file except in compliance with the License. 652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * You may obtain a copy of the License at 752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * 852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * http://www.apache.org/licenses/LICENSE-2.0 952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * 1052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * Unless required by applicable law or agreed to in writing, software 1152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * distributed under the License is distributed on an "AS IS" BASIS, 1252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * See the License for the specific language governing permissions and 1452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * limitations under the License. 1552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 1652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabotpackage com.android.test.runner.listener; 1752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 1852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabotimport android.app.Instrumentation; 1952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabotimport android.os.Bundle; 2052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 2152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabotimport org.junit.runner.Description; 2252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabotimport org.junit.runner.Result; 2352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabotimport org.junit.runner.notification.Failure; 2452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 2552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot/** 2652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * A {@link RunListener} that sends detailed pass/fail results back as instrumentation status 2752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * bundles. This output appears when running the instrumentation in '-r' or raw mode. 2852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 2952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabotpublic class InstrumentationResultPrinter extends InstrumentationRunListener { 3052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 3152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 3252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * This value, if stored with key {@link android.app.Instrumentation#REPORT_KEY_IDENTIFIER}, 3352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * identifies AndroidJUnitRunner as the source of the report. This is sent with all 3452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * status messages. 3552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 3652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final String REPORT_VALUE_ID = "AndroidJUnitRunner"; 3752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 3852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * If included in the status or final bundle sent to an IInstrumentationWatcher, this key 3952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * identifies the total number of tests that are being run. This is sent with all status 4052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * messages. 4152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 4252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final String REPORT_KEY_NUM_TOTAL = "numtests"; 4352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 4452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * If included in the status or final bundle sent to an IInstrumentationWatcher, this key 4552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * identifies the sequence number of the current test. This is sent with any status message 4652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * describing a specific test being started or completed. 4752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 4852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final String REPORT_KEY_NUM_CURRENT = "current"; 4952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 5052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * If included in the status or final bundle sent to an IInstrumentationWatcher, this key 5152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * identifies the name of the current test class. This is sent with any status message 5252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * describing a specific test being started or completed. 5352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 5452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final String REPORT_KEY_NAME_CLASS = "class"; 5552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 5652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * If included in the status or final bundle sent to an IInstrumentationWatcher, this key 5752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * identifies the name of the current test. This is sent with any status message 5852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * describing a specific test being started or completed. 5952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 6052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final String REPORT_KEY_NAME_TEST = "test"; 6152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 6252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 6352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * The test is starting. 6452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 6552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final int REPORT_VALUE_RESULT_START = 1; 6652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 6752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * The test completed successfully. 6852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 6952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final int REPORT_VALUE_RESULT_OK = 0; 7052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 7152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * The test completed with an error. 7252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 7352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final int REPORT_VALUE_RESULT_ERROR = -1; 7452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 7552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * The test completed with a failure. 7652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 7752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final int REPORT_VALUE_RESULT_FAILURE = -2; 7852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 7952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * The test was ignored. 8052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 8152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final int REPORT_VALUE_RESULT_IGNORED = -3; 8252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 8352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * If included in the status bundle sent to an IInstrumentationWatcher, this key 8452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * identifies a stack trace describing an error or failure. This is sent with any status 8552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * message describing a specific test being completed. 8652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 8752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public static final String REPORT_KEY_STACK = "stack"; 8852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 8952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot private final Bundle mResultTemplate; 9052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot Bundle mTestResult; 9152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot int mTestNum = 0; 9252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot int mTestResultCode = 0; 9352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot String mTestClass = null; 9452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 9552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public InstrumentationResultPrinter(Instrumentation i) { 9652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot super(i); 9752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mResultTemplate = new Bundle(); 9852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 9952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 10052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot @Override 10152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public void testRunStarted(Description description) throws Exception { 10252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mResultTemplate.putString(Instrumentation.REPORT_KEY_IDENTIFIER, REPORT_VALUE_ID); 10352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mResultTemplate.putInt(REPORT_KEY_NUM_TOTAL, description.testCount()); 10452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 10552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 10652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot @Override 10752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public void testRunFinished(Result result) throws Exception { 10852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 10952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 11052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot /** 11152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * send a status for the start of a each test, so long tests can be seen 11252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot * as "running" 11352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot */ 11452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot @Override 11552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public void testStarted(Description description) throws Exception { 11652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot String testClass = description.getClassName(); 11752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot String testName = description.getMethodName(); 11852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult = new Bundle(mResultTemplate); 11952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult.putString(REPORT_KEY_NAME_CLASS, testClass); 12052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult.putString(REPORT_KEY_NAME_TEST, testName); 12152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult.putInt(REPORT_KEY_NUM_CURRENT, ++mTestNum); 12252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot // pretty printing 12352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot if (testClass != null && !testClass.equals(mTestClass)) { 12452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult.putString(Instrumentation.REPORT_KEY_STREAMRESULT, 12552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot String.format("\n%s:", testClass)); 12652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestClass = testClass; 12752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } else { 12852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult.putString(Instrumentation.REPORT_KEY_STREAMRESULT, ""); 12952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 13052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 13152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot sendStatus(REPORT_VALUE_RESULT_START, mTestResult); 13252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResultCode = 0; 13352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 13452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 13552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot @Override 13652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public void testFinished(Description description) throws Exception { 13752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot if (mTestResultCode == 0) { 13852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult.putString(Instrumentation.REPORT_KEY_STREAMRESULT, "."); 13952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 14052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot sendStatus(mTestResultCode, mTestResult); 14152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 14252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 14352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot @Override 14452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public void testFailure(Failure failure) throws Exception { 14552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResultCode = REPORT_VALUE_RESULT_ERROR; 14652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot reportFailure(failure); 14752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 14852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 14952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 15052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot @Override 15152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public void testAssumptionFailure(Failure failure) { 15252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResultCode = REPORT_VALUE_RESULT_FAILURE; 15352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot reportFailure(failure); 15452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 15552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 15652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot private void reportFailure(Failure failure) { 15752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult.putString(REPORT_KEY_STACK, failure.getTrace()); 15852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot // pretty printing 15952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResult.putString(Instrumentation.REPORT_KEY_STREAMRESULT, 16052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot String.format("\nError in %s:\n%s", 16152b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot failure.getDescription().getDisplayName(), failure.getTrace())); 16252b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 16352b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot 16452b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot @Override 16552b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot public void testIgnored(Description description) throws Exception { 16652b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot testStarted(description); 16752b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot mTestResultCode = REPORT_VALUE_RESULT_IGNORED; 16852b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot testFinished(description); 16952b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot } 17052b9cd1de29c41a6407ec0a3aba746dcb9a4395aBrett Chabot} 171