1*3c7ae9deSAndroid Build Coastguard Workerversion: 0.1 2*3c7ae9deSAndroid Build Coastguard Worker 3*3c7ae9deSAndroid Build Coastguard Worker# Phases are collection of commands that get executed on Device Farm. 4*3c7ae9deSAndroid Build Coastguard Workerphases: 5*3c7ae9deSAndroid Build Coastguard Worker # The install phase includes commands that install dependencies that your tests use. 6*3c7ae9deSAndroid Build Coastguard Worker # Default dependencies for testing frameworks supported on Device Farm are already installed. 7*3c7ae9deSAndroid Build Coastguard Worker install: 8*3c7ae9deSAndroid Build Coastguard Worker commands: 9*3c7ae9deSAndroid Build Coastguard Worker 10*3c7ae9deSAndroid Build Coastguard Worker # The pre-test phase includes commands that setup your test environment. 11*3c7ae9deSAndroid Build Coastguard Worker pre_test: 12*3c7ae9deSAndroid Build Coastguard Worker commands: 13*3c7ae9deSAndroid Build Coastguard Worker 14*3c7ae9deSAndroid Build Coastguard Worker # The test phase includes commands that run your test suite execution. 15*3c7ae9deSAndroid Build Coastguard Worker test: 16*3c7ae9deSAndroid Build Coastguard Worker commands: 17*3c7ae9deSAndroid Build Coastguard Worker # By default, the following ADB command is used by Device Farm to run your Instrumentation test. 18*3c7ae9deSAndroid Build Coastguard Worker # Alternatively, you may specify a customized command. 19*3c7ae9deSAndroid Build Coastguard Worker # Please refer to Android's documentation (https://developer.android.com/studio/test/command-line#run-tests-with-adb) 20*3c7ae9deSAndroid Build Coastguard Worker # for more options on running instrumentation tests from the command line. 21*3c7ae9deSAndroid Build Coastguard Worker - echo "Start Instrumentation test" 22*3c7ae9deSAndroid Build Coastguard Worker - | 23*3c7ae9deSAndroid Build Coastguard Worker adb -s $DEVICEFARM_DEVICE_UDID shell "am instrument -r -w --no-window-animation \ 24*3c7ae9deSAndroid Build Coastguard Worker $DEVICEFARM_TEST_PACKAGE_NAME/$DEVICEFARM_TEST_PACKAGE_RUNNER 2>&1 || echo \": -1\"" | 25*3c7ae9deSAndroid Build Coastguard Worker tee $DEVICEFARM_LOG_DIR/instrument.log 26*3c7ae9deSAndroid Build Coastguard Worker 27*3c7ae9deSAndroid Build Coastguard Worker # Parse the output of JUnit4 instrumentation tests, and check how many tests experienced each possible status code 28*3c7ae9deSAndroid Build Coastguard Worker # Note that this parsing is designed for the AndroidJUnitRunner, and thus different test runners may require customized 29*3c7ae9deSAndroid Build Coastguard Worker # parsing code specific to those runners specific test reporting output. 30*3c7ae9deSAndroid Build Coastguard Worker # For more information on instrumentation status codes, please see https://android.googlesource.com/platform/tools/base/+/refs/tags/android-mainline-12.0.0_r58/ddmlib/src/main/java/com/android/ddmlib/testrunner/InstrumentationResultParser.java#49 31*3c7ae9deSAndroid Build Coastguard Worker # as well as https://android.googlesource.com/platform/tools/base/+/refs/tags/android-mainline-12.0.0_r58/ddmlib/src/main/java/com/android/ddmlib/testrunner/InstrumentationResultParser.java#100 32*3c7ae9deSAndroid Build Coastguard Worker # Note that tests that give the "Ignored" (-3) and "Assumption Failure" (-4) status coded are treated as "passed" 33*3c7ae9deSAndroid Build Coastguard Worker # but you can change this behavior for your tests by modifying the "if" statement below. 34*3c7ae9deSAndroid Build Coastguard Worker - |- 35*3c7ae9deSAndroid Build Coastguard Worker DID_ANY_TESTS_START=$(grep "INSTRUMENTATION_STATUS_CODE: 1" $DEVICEFARM_LOG_DIR/instrument.log | wc -l); 36*3c7ae9deSAndroid Build Coastguard Worker TESTS_PASSED=$(grep "INSTRUMENTATION_STATUS_CODE: 0" $DEVICEFARM_LOG_DIR/instrument.log | wc -l); 37*3c7ae9deSAndroid Build Coastguard Worker TESTS_ERRORED=$(grep "INSTRUMENTATION_STATUS_CODE: -1" $DEVICEFARM_LOG_DIR/instrument.log | wc -l); 38*3c7ae9deSAndroid Build Coastguard Worker TESTS_FAILED=$(grep "INSTRUMENTATION_STATUS_CODE: -2" $DEVICEFARM_LOG_DIR/instrument.log | wc -l); 39*3c7ae9deSAndroid Build Coastguard Worker TESTS_IGNORED=$(grep "INSTRUMENTATION_STATUS_CODE: -3" $DEVICEFARM_LOG_DIR/instrument.log | wc -l); 40*3c7ae9deSAndroid Build Coastguard Worker TESTS_ASSUMPTION_FAILED=$(grep "INSTRUMENTATION_STATUS_CODE: -4" $DEVICEFARM_LOG_DIR/instrument.log | wc -l); 41*3c7ae9deSAndroid Build Coastguard Worker TESTS_PROCESSES_CRASHED=$(grep "INSTRUMENTATION_RESULT: shortMsg=Process crashed." $DEVICEFARM_LOG_DIR/instrument.log | wc -l); 42*3c7ae9deSAndroid Build Coastguard Worker 43*3c7ae9deSAndroid Build Coastguard Worker - >- 44*3c7ae9deSAndroid Build Coastguard Worker echo "\n\nFrom your instrumentation output, it appears \n 45*3c7ae9deSAndroid Build Coastguard Worker $TESTS_PASSED tests PASSED \n 46*3c7ae9deSAndroid Build Coastguard Worker $TESTS_ASSUMPTION_FAILED tests were SKIPPED \n 47*3c7ae9deSAndroid Build Coastguard Worker $TESTS_FAILED tests FAILED \n 48*3c7ae9deSAndroid Build Coastguard Worker $TESTS_ERRORED tests ERRORED \n 49*3c7ae9deSAndroid Build Coastguard Worker $TESTS_IGNORED tests were IGNORED"; 50*3c7ae9deSAndroid Build Coastguard Worker 51*3c7ae9deSAndroid Build Coastguard Worker echo "These counts are calculated directly from the raw instrumentation output, thus any 52*3c7ae9deSAndroid Build Coastguard Worker redundant lines of output (e.g. a test case that was retried multiple times) could cause 53*3c7ae9deSAndroid Build Coastguard Worker the numbers to not align exactly with your expected number of test cases."; 54*3c7ae9deSAndroid Build Coastguard Worker 55*3c7ae9deSAndroid Build Coastguard Worker - | 56*3c7ae9deSAndroid Build Coastguard Worker if [ $DID_ANY_TESTS_START -eq 0 ]; 57*3c7ae9deSAndroid Build Coastguard Worker then 58*3c7ae9deSAndroid Build Coastguard Worker echo "Marking the test suite as failed because no tests started!"; 59*3c7ae9deSAndroid Build Coastguard Worker false; 60*3c7ae9deSAndroid Build Coastguard Worker elif [ $TESTS_FAILED -ne 0 ]; 61*3c7ae9deSAndroid Build Coastguard Worker then 62*3c7ae9deSAndroid Build Coastguard Worker echo "Marking the test suite as failed because $TESTS_FAILED tests failed!"; 63*3c7ae9deSAndroid Build Coastguard Worker false; 64*3c7ae9deSAndroid Build Coastguard Worker elif [ $TESTS_ERRORED -ne 0 ]; 65*3c7ae9deSAndroid Build Coastguard Worker then 66*3c7ae9deSAndroid Build Coastguard Worker echo "Marking the test suite as failed because $TESTS_ERRORED tests errored!"; 67*3c7ae9deSAndroid Build Coastguard Worker false; 68*3c7ae9deSAndroid Build Coastguard Worker elif [ $TESTS_PROCESSES_CRASHED -ne 0 ]; 69*3c7ae9deSAndroid Build Coastguard Worker then 70*3c7ae9deSAndroid Build Coastguard Worker echo "Marking the test suite as failed because the application-under-test crashed during the test!"; 71*3c7ae9deSAndroid Build Coastguard Worker false; 72*3c7ae9deSAndroid Build Coastguard Worker else 73*3c7ae9deSAndroid Build Coastguard Worker echo "Passed with $TESTS_PASSED tests passed and $TESTS_ASSUMPTION_FAILED tests skipped!"; 74*3c7ae9deSAndroid Build Coastguard Worker fi; 75*3c7ae9deSAndroid Build Coastguard Worker 76*3c7ae9deSAndroid Build Coastguard Worker # # To run your tests using "Android Test Orchestrator", you can use the following commands instead. 77*3c7ae9deSAndroid Build Coastguard Worker # # Note: you will need to include the orchestrator APK and test services APK as auxiliary apps with your ScheduleRun request. 78*3c7ae9deSAndroid Build Coastguard Worker # # For more information, please see the Android Test Orchestrator documentation: https://developer.android.com/training/testing/instrumented-tests/androidx-test-libraries/runner#use-android 79*3c7ae9deSAndroid Build Coastguard Worker # - | 80*3c7ae9deSAndroid Build Coastguard Worker # adb -s $DEVICEFARM_DEVICE_UDID shell "CLASSPATH=\$(pm path androidx.test.services) app_process / \ 81*3c7ae9deSAndroid Build Coastguard Worker # androidx.test.services.shellexecutor.ShellMain am instrument -w --no-window-animation -e clearPackageData true \ 82*3c7ae9deSAndroid Build Coastguard Worker # -e targetInstrumentation $DEVICEFARM_TEST_PACKAGE_NAME/$DEVICEFARM_TEST_PACKAGE_RUNNER \ 83*3c7ae9deSAndroid Build Coastguard Worker # androidx.test.orchestrator/.AndroidTestOrchestrator || echo \"FAILURES...\"" 2>&1 | tee $DEVICEFARM_LOG_DIR/instrument.log 84*3c7ae9deSAndroid Build Coastguard Worker # 85*3c7ae9deSAndroid Build Coastguard Worker # # If Android Test Orchestrator produces any reports on the device, they will be pulled 86*3c7ae9deSAndroid Build Coastguard Worker # # into your customer artifacts directory using the following commands 87*3c7ae9deSAndroid Build Coastguard Worker # - | 88*3c7ae9deSAndroid Build Coastguard Worker # adb -s $DEVICEFARM_DEVICE_UDID pull /sdcard/odo >/dev/null && 89*3c7ae9deSAndroid Build Coastguard Worker # mv odo/* $DEVICEFARM_LOG_DIR || true 90*3c7ae9deSAndroid Build Coastguard Worker # 91*3c7ae9deSAndroid Build Coastguard Worker # # The below command is used to detect if any of the Orchestrator tests have failed 92*3c7ae9deSAndroid Build Coastguard Worker # - | 93*3c7ae9deSAndroid Build Coastguard Worker # if [ $(cat $DEVICEFARM_LOG_DIR/instrument.log | egrep "^(FAILURES...|INSTRUMENTATION_RESULT: shortMsg=Process crashed.)$" | wc -l) -ge 1 ]; 94*3c7ae9deSAndroid Build Coastguard Worker # then 95*3c7ae9deSAndroid Build Coastguard Worker # echo "Marking the test suite as failed because Android Orchestrator found that some of the tests failed"; 96*3c7ae9deSAndroid Build Coastguard Worker # false; 97*3c7ae9deSAndroid Build Coastguard Worker # fi; 98*3c7ae9deSAndroid Build Coastguard Worker 99*3c7ae9deSAndroid Build Coastguard Worker # The post test phase includes are commands that are run after your tests are executed. 100*3c7ae9deSAndroid Build Coastguard Worker post_test: 101*3c7ae9deSAndroid Build Coastguard Worker commands: 102*3c7ae9deSAndroid Build Coastguard Worker 103*3c7ae9deSAndroid Build Coastguard Worker# The artifacts phase lets you specify the location where your tests logs, device logs will be stored. 104*3c7ae9deSAndroid Build Coastguard Worker# And also let you specify the location of your test logs and artifacts which you want to be collected by Device Farm. 105*3c7ae9deSAndroid Build Coastguard Worker# These logs and artifacts will be available through ListArtifacts API in Device Farm. 106*3c7ae9deSAndroid Build Coastguard Workerartifacts: 107*3c7ae9deSAndroid Build Coastguard Worker # By default, Device Farm will collect your artifacts from following directories 108*3c7ae9deSAndroid Build Coastguard Worker - $DEVICEFARM_LOG_DIR