From eb90ed5fb6873c843da4487912cf1af1dedbd8e2 Mon Sep 17 00:00:00 2001 From: Yuki Hamada Date: Thu, 14 Oct 2021 16:12:16 -0700 Subject: [PATCH 1/2] Add an example project that demonstrates how to use Jacoco test coverage with AndroidX Test Orchestrator --- .../.gitignore | 6 + .../README.md | 30 ++++ .../app/build.gradle | 45 +++++ .../CalculatorAddParameterizedTest.java | 93 ++++++++++ .../CalculatorInstrumentationTest.java | 110 ++++++++++++ .../app/src/main/AndroidManifest.xml | 37 ++++ .../Calculator.java | 57 ++++++ .../CalculatorActivity.java | 138 +++++++++++++++ .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 5035 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3046 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 7042 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 12352 bytes .../main/res/layout/activity_calculator.xml | 82 +++++++++ .../app/src/main/res/values-v14/styles.xml | 20 +++ .../app/src/main/res/values-v21/styles.xml | 20 +++ .../app/src/main/res/values-w820dp/dimens.xml | 23 +++ .../app/src/main/res/values/dimens.xml | 22 +++ .../app/src/main/res/values/strings.xml | 29 ++++ .../app/src/main/res/values/styles.xml | 20 +++ .../build.gradle | 36 ++++ .../gradle.properties | 20 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../gradlew | 164 ++++++++++++++++++ .../gradlew.bat | 90 ++++++++++ .../settings.gradle | 1 + 26 files changed, 1049 insertions(+) create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/.gitignore create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/README.md create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/build.gradle create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/androidTest/java/com/example/android/testing/androidtestorchestratorsample/CalculatorAddParameterizedTest.java create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/androidTest/java/com/example/android/testing/androidtestorchestratorsample/CalculatorInstrumentationTest.java create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/AndroidManifest.xml create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/java/com/example/android/testing/androidtestorchestratorsample/Calculator.java create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/java/com/example/android/testing/androidtestorchestratorsample/CalculatorActivity.java create mode 100755 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-hdpi/ic_launcher.png create mode 100755 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-mdpi/ic_launcher.png create mode 100755 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100755 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/layout/activity_calculator.xml create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/values-v14/styles.xml create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/values-v21/styles.xml create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/values-w820dp/dimens.xml create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/values/dimens.xml create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/values/strings.xml create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/values/styles.xml create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/build.gradle create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/gradle.properties create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/gradle/wrapper/gradle-wrapper.jar create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/gradle/wrapper/gradle-wrapper.properties create mode 100755 runner/AndroidTestOrchestratorWithTestCoverageSample/gradlew create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/gradlew.bat create mode 100644 runner/AndroidTestOrchestratorWithTestCoverageSample/settings.gradle diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/.gitignore b/runner/AndroidTestOrchestratorWithTestCoverageSample/.gitignore new file mode 100644 index 000000000..03eee2ade --- /dev/null +++ b/runner/AndroidTestOrchestratorWithTestCoverageSample/.gitignore @@ -0,0 +1,6 @@ +.gradle +/local.properties +.idea +*.iml +.DS_Store +build diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/README.md b/runner/AndroidTestOrchestratorWithTestCoverageSample/README.md new file mode 100644 index 000000000..153125649 --- /dev/null +++ b/runner/AndroidTestOrchestratorWithTestCoverageSample/README.md @@ -0,0 +1,30 @@ +# AndroidTestOrchestrator with test coverage sample + +The Android Test Orchestrator allows you to run each of your app's tests in isolation, enabling greater reliability. +See https://developer.android.com/training/testing/junit-runner#using-android-test-orchestrator for more background. + +This sample is a subset of the AndroidJUnitRunner sample, but it +illustrates how to enable Jacoco test coverage report with the Android Test Orchestrator in the app/build.gradle file. + +This project uses the Gradle build system. You don't need an IDE to build and execute it but Android Studio is recommended. + +1. Download the project code, preferably using `git clone`. +1. Open the Android SDK Manager (*Tools* Menu | *Android*). +1. In Android Studio, select *File* | *Open...* and point to the top-level `./build.gradle` file. +1. Check out the relevant code: + * The application under test is located in `src/main/java` + * Tests are in `src/androidTest/java` +1. Create the test configuration with a custom runner: `androidx.test.runner.AndroidJUnitRunner` + * Open *Run* menu | *Edit Configurations* + * Add a new *Android Tests* configuration + * Choose a module + * Add a *Specific instrumentation runner*: `androidx.test.runner.AndroidJUnitRunner` +1. Connect a device or start an emulator + * Turn animations off. + (On your device, under Settings->Developer options disable the following 3 settings: "Window animation scale", "Transition animation scale" and "Animator duration scale") +1. Run the newly created configuration + +The application will be started on the device/emulator and a series of actions will be performed automatically. + +If you are using Android Studio, the *Run* window will show the test results. +The test coverage report will be generated in `app/build/reports/coverage/androidTest/debug/index.html`. diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/build.gradle b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/build.gradle new file mode 100644 index 000000000..be82d3fe8 --- /dev/null +++ b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/build.gradle @@ -0,0 +1,45 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 31 + buildToolsVersion rootProject.buildToolsVersion + defaultConfig { + applicationId "com.example.android.testing.androidtestorchestratorsample" + minSdkVersion 14 + targetSdkVersion 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments clearPackageData: 'true' + testInstrumentationRunnerArguments useTestStorageService: 'true' + } + buildTypes { + debug { + testCoverageEnabled true + } + } + + useLibrary 'android.test.runner' + + useLibrary 'android.test.base' + useLibrary 'android.test.mock' + + testOptions { + execution 'ANDROIDX_TEST_ORCHESTRATOR' + } +} + +dependencies { + // App's dependencies, including test + implementation 'androidx.annotation:annotation:' + rootProject.androidxAnnotationVersion + implementation 'com.google.guava:guava:' + rootProject.guavaVersion + + // Testing-only dependencies + androidTestImplementation 'androidx.test:core:' + rootProject.coreVersion + androidTestImplementation 'androidx.test.ext:junit:' + rootProject.extJUnitVersion + androidTestImplementation 'androidx.test:runner:' + rootProject.runnerVersion + androidTestImplementation 'androidx.test.espresso:espresso-core:' + rootProject.espressoVersion + androidTestUtil 'androidx.test:orchestrator:' + rootProject.runnerVersion + androidTestUtil 'androidx.test.services:test-services:' + rootProject.testServicesVersion +} diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/androidTest/java/com/example/android/testing/androidtestorchestratorsample/CalculatorAddParameterizedTest.java b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/androidTest/java/com/example/android/testing/androidtestorchestratorsample/CalculatorAddParameterizedTest.java new file mode 100644 index 000000000..63c9e7146 --- /dev/null +++ b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/androidTest/java/com/example/android/testing/androidtestorchestratorsample/CalculatorAddParameterizedTest.java @@ -0,0 +1,93 @@ +/* + * Copyright 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.testing.androidtestorchestratorsample; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import androidx.test.filters.SmallTest; + +import java.lang.Iterable; +import java.util.Arrays; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.runners.Parameterized.Parameters; + + +/** + * JUnit4 tests for the calculator's add logic. + * + *

This test uses a Junit4s Parameterized tests features which uses annotations to pass + * parameters into a unit test. The way this works is that you have to use the {@link Parameterized} + * runner to run your tests. + *

+ */ +@RunWith(Parameterized.class) +@SmallTest +public class CalculatorAddParameterizedTest { + + /** + * @return {@link Iterable} that contains the values that should be passed to the constructor. + * In this example we are going to use three parameters: operand one, operand two and the + * expected result. + */ + @Parameters + public static Iterable data() { + return Arrays.asList(new Object[][]{ + {0, 0, 0}, + {0, -1, -1}, + {2, 2, 4}, + {8, 8, 16}, + {16, 16, 32}, + {32, 0, 32}, + {64, 64, 128}}); + } + + private final double mOperandOne; + private final double mOperandTwo; + private final double mExpectedResult; + + private Calculator mCalculator; + + /** + * Constructor that takes in the values specified in + * {@link CalculatorAddParameterizedTest#data()}. The values need to be saved to fields in order + * to reuse them in your tests. + */ + public CalculatorAddParameterizedTest(double operandOne, double operandTwo, + double expectedResult) { + + mOperandOne = operandOne; + mOperandTwo = operandTwo; + mExpectedResult = expectedResult; + } + + @Before + public void setUp() { + mCalculator = new Calculator(); + } + + @Test + public void testAdd_TwoNumbers() { + double resultAdd = mCalculator.add(mOperandOne, mOperandTwo); + assertThat(resultAdd, is(equalTo(mExpectedResult))); + } +} \ No newline at end of file diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/androidTest/java/com/example/android/testing/androidtestorchestratorsample/CalculatorInstrumentationTest.java b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/androidTest/java/com/example/android/testing/androidtestorchestratorsample/CalculatorInstrumentationTest.java new file mode 100644 index 000000000..80b31bae5 --- /dev/null +++ b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/androidTest/java/com/example/android/testing/androidtestorchestratorsample/CalculatorInstrumentationTest.java @@ -0,0 +1,110 @@ +/* + * Copyright 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.testing.androidtestorchestratorsample; + +import junit.framework.TestSuite; + +import org.junit.Before; +import org.junit.Test; +import org.junit.internal.builders.AllDefaultPossibilitiesBuilder; +import org.junit.runner.RunWith; + +import androidx.test.core.app.ActivityScenario; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnitRunner; + +import static androidx.test.core.app.ApplicationProvider.getApplicationContext; +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard; +import static androidx.test.espresso.action.ViewActions.typeText; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withText; + +/** + * JUnit4 Ui Tests for {@link CalculatorActivity} using the {@link AndroidJUnitRunner} with the + * Android Test Orchestrator. + * This class uses the JUnit4 syntax for tests. + *

+ * With the new AndroidJUnit runner you can run both JUnit3 and JUnit4 tests in a single test + * suite. The {@link AndroidRunnerBuilder} which extends JUnit's + * {@link AllDefaultPossibilitiesBuilder} will create a single {@link + * TestSuite} from all tests and run them. + */ +@RunWith(AndroidJUnit4.class) +@LargeTest +public class CalculatorInstrumentationTest { + + /** + * Use {@link ActivityScenario} to create and launch of the activity. + */ + @Before + public void launchActivity() { + ActivityScenario.launch(CalculatorActivity.class); + } + + @Test + public void noOperandShowsComputationError() { + final String expectedResult = getApplicationContext().getString(R.string.computationError); + onView(withId(R.id.operation_add_btn)).perform(click()); + onView(withId(R.id.operation_result_text_view)).check(matches(withText(expectedResult))); + } + + @Test + public void typeOperandsAndPerformAddOperation() { + performOperation(R.id.operation_add_btn, "16.0", "16.0", "32.0"); + } + + @Test + public void typeOperandsAndPerformSubOperation() { + performOperation(R.id.operation_sub_btn, "32.0", "16.0", "16.0"); + } + + @Test + public void typeOperandsAndPerformDivOperation() { + performOperation(R.id.operation_div_btn, "128.0", "16.0", "8.0"); + } + + @Test + public void divZeroForOperandTwoShowsError() { + final String expectedResult = getApplicationContext().getString(R.string.computationError); + performOperation(R.id.operation_div_btn, "128.0", "0.0", expectedResult); + } + + @Test + public void typeOperandsAndPerformMulOperation() { + performOperation(R.id.operation_mul_btn, "16.0", "16.0", "256.0"); + } + + private void performOperation(int btnOperationResId, String operandOne, + String operandTwo, String expectedResult) { + // Type the two operands in the EditText fields + onView(withId(R.id.operand_one_edit_text)).perform(typeText(operandOne), + closeSoftKeyboard()); + onView(withId(R.id.operand_two_edit_text)).perform(typeText(operandTwo), + closeSoftKeyboard()); + + // Click on a given operation button + onView(withId(btnOperationResId)).perform(click()); + + // Check the expected test is displayed in the Ui + onView(withId(R.id.operation_result_text_view)).check(matches(withText(expectedResult))); + } + +} diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/AndroidManifest.xml b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..f3b473cae --- /dev/null +++ b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/java/com/example/android/testing/androidtestorchestratorsample/Calculator.java b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/java/com/example/android/testing/androidtestorchestratorsample/Calculator.java new file mode 100644 index 000000000..b7a17d12e --- /dev/null +++ b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/java/com/example/android/testing/androidtestorchestratorsample/Calculator.java @@ -0,0 +1,57 @@ +/* + * Copyright 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.testing.androidtestorchestratorsample; + +import static com.google.common.base.Preconditions.checkArgument; + +/** + * A simple calculator with a basic set of operations. + */ +public class Calculator { + + public enum Operator {ADD, SUB, DIV, MUL} + + /** + * Addition operation + */ + public double add(double firstOperand, double secondOperand) { + return firstOperand + secondOperand; + } + + /** + * Substract operation + */ + public double sub(double firstOperand, double secondOperand) { + return firstOperand - secondOperand; + } + + /** + * Divide operation + */ + public double div(double firstOperand, double secondOperand) { + checkArgument(secondOperand != 0, "secondOperand must be != 0, you cannot divide by zero"); + return firstOperand / secondOperand; + } + + /** + * Multiply operation + */ + public double mul(double firstOperand, double secondOperand) { + + return firstOperand * secondOperand; + } +} diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/java/com/example/android/testing/androidtestorchestratorsample/CalculatorActivity.java b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/java/com/example/android/testing/androidtestorchestratorsample/CalculatorActivity.java new file mode 100644 index 000000000..d745a3210 --- /dev/null +++ b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/java/com/example/android/testing/androidtestorchestratorsample/CalculatorActivity.java @@ -0,0 +1,138 @@ +/* + * Copyright 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.testing.androidtestorchestratorsample; + +import android.app.Activity; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +/** + * {@link android.app.Activity} which contains a simple calculator. Numbers can be entered in the + * two {@link EditText} fields and result can be obtained by pressing one of the + * operation {@link Button}s at the bottom. + */ +public class CalculatorActivity extends Activity { + + private static final String TAG = "CalculatorActivity"; + + private Calculator mCalculator; + + private EditText mOperandOneEditText; + private EditText mOperandTwoEditText; + + private TextView mResultTextView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_calculator); + mCalculator = new Calculator(); + mResultTextView = (TextView) findViewById(R.id.operation_result_text_view); + mOperandOneEditText = (EditText) findViewById(R.id.operand_one_edit_text); + mOperandTwoEditText = (EditText) findViewById(R.id.operand_two_edit_text); + } + + /** + * OnClick method that is called when the add {@link Button} is pressed. + */ + public void onAdd(View view) { + compute(Calculator.Operator.ADD); + } + + /** + * OnClick method that is called when the substract {@link Button} is pressed. + */ + public void onSub(View view) { + compute(Calculator.Operator.SUB); + } + + /** + * OnClick method that is called when the divide {@link Button} is pressed. + */ + public void onDiv(View view) { + try { + compute(Calculator.Operator.DIV); + } catch (IllegalArgumentException iae) { + Log.e(TAG, "IllegalArgumentException", iae); + mResultTextView.setText(getString(R.string.computationError)); + } + } + + /** + * OnClick method that is called when the multiply {@link Button} is pressed. + */ + public void onMul(View view) { + compute(Calculator.Operator.MUL); + } + + private void compute(Calculator.Operator operator) { + double operandOne; + double operandTwo; + try { + operandOne = getOperand(mOperandOneEditText); + operandTwo = getOperand(mOperandTwoEditText); + } catch (NumberFormatException nfe) { + Log.e(TAG, "NumberFormatException", nfe); + mResultTextView.setText(getString(R.string.computationError)); + return; + } + + String result; + switch (operator) { + case ADD: + result = String.valueOf(mCalculator.add(operandOne, operandTwo)); + break; + case SUB: + result = String.valueOf(mCalculator.sub(operandOne, operandTwo)); + break; + case DIV: + result = String.valueOf(mCalculator.div(operandOne, operandTwo)); + break; + case MUL: + result = String.valueOf(mCalculator.mul(operandOne, operandTwo)); + break; + default: + result = getString(R.string.computationError); + break; + } + mResultTextView.setText(result); + } + + /** + * @return the operand value which was entered in an {@link EditText} as a double + */ + private static Double getOperand(EditText operandEditText) { + String operandText = getOperandText(operandEditText); + return Double.valueOf(operandText); + } + + /** + * @return the operand text which was entered in an {@link EditText}. + */ + private static String getOperandText(EditText operandEditText) { + String operandText = operandEditText.getText().toString(); + if (TextUtils.isEmpty(operandText)) { + throw new NumberFormatException("operand cannot be empty!"); + } + return operandText; + } +} diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-hdpi/ic_launcher.png b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..965ac96247326d9ff525c4ac155a1210a5fb70eb GIT binary patch literal 5035 zcmV;c6IASpP)5^uK}_G&}Sci785wonQOP%M_r1h*X`~;*51){ zLs~{!h3LP^AjgSQpxa%|E9{M|+SRDhiI_4U;@n{B|Q43OLH zc7=t7MIr_bW`JTUuw2UEh`tZSg4>m5fZ_`a3y=Bx`v+ahAh}$wmZYR4(%@1vK+(8k zEG|QE@mu>&{3~REHn4-uW(T($w`>l!4YX~?ZFbCo$G~t5uns%MEExZ%bF^#W53I|7 z^9JxWT|*Z}&G6kIcDextlvTnls*Ri4nzm^l{kHM_-R>^B4Q_X_W8K{-Cx&CZp12m( zUvX>2op|9+T&i#>z~xIbKmoWT43~kltotDTI0r-kL7n0qr~SO+4z^9;5eTe49_O7m z0!pA!Vdt`b<2iN$TZcs=Bz96KyEzbaN$Lnk(+CE?2nUMlQ0Hw32;Zi2v~3110;7RL z$M`kfujkAV8;*9E47(?eGFpO24Wdzca zj4wj)>dh($y#n;|XCs<~2^pCr86}RZYi=~iECh|2B?FJMiSu4HG2ui##jDc1I0HCq z2wC>ji6I&Yw5CoA775dmYYwQoU$9H;zk6bdHGnqeCm}#wbBt@LJvuNw>IeITfT2!uGvfNAn2Ns5&5OWdYfXcUYf~MqZq~SBs{keI3{sgy zo#h&2Tni8-7y?{rmO`HdSd8PuDl#J_B-6#2fu({Xw;50-U?gZlTev3Ces%2$xC;VE z1;R6%1iMtTGqTRe9>FN?9SI!4Bmt7@x!AVJbE&|nfEbvgo0Dg@Fby&RH}A?KYYf_y zKN3aSY+hzSR4->TJ>9G%lel0DaJ-nArr15ri<=lXHDO)?fSwwoYmULpyaU!pfYi>L zbV&~bxTn*#M(kJgN5)5jJrX3rCczqRS|Y~LOiPP*BtT|hg#PgOhnbS9Nlb5)V?wKN zeUSk2B;rDIyfI1(8co5YG&N0}JqCqlVOBe9W|b<`Do|eufP7(+W@?5=+a^7i9w~b= zEpNTesxVbq4MnFgG{&WYBnQ^a}Q5y%l1`@tPOlOw%4#B_rXF7XZ*Q4WLI%0QCf> z&v6g|WFBh?z$Om;1;mHlZ0PI1s{aJ1&uvkL6`VQ#wjgA~vk>4nh}CcFtbx*o?a<~r z3xR%75bK-{f&P?X!5k-=-2U=Mu}&={h2OzUm=`ymAAvxp>-Q{c_z+FVrHOhsw79CE zxNdU~fVQ5Tj^|vINZRvQ%+C=BHz#d}0S>1DpxV{~*jM(DQHPK{Lqe{C)XP?C-E_kz zrOTnYvr>i7gSuf##$W}P`*w*>|Tj)Fl0`7BYvm+PRU{yhVWqJt+xTFg)N zC!cp_HPo~mmSZrV2CHs}Kyg>ElUtkx9o-s(lxR7Q0raTCpzHNFLdmO& z#+_(J+tJ0BD;`bF3GrNzYGQ+tL1{6M=|KOz_zn(`DfJQOyvYF2dnc~zkqa{ChUoYF zai^^@hy!FCHpGNn0~v|WYEP#bwinKVuz|@4zy`hZyx|SpMZqhrio0mSCccTfWKzhv2^g16F&t)dwQ-f~8dvVPpH~-#=X-XXADM!Sk z@A=~_Cd^(xLMc}n|B#tY82SW^2)~Wpyu2|N_Lr?>xuKgb--4cqa{d5^tA5MaAroYL zU>fWn3!@?zLv-*YtYyp~c6PU*2l@+qQNL9iu^SmgfDH~zh4i71OMr?p*@G}A(Bhmk z6o8uHT?EMN#XO}+=8v z6y3%E68RzlR6GNSd%Mmq0_YkgN$+8-rX}((0H8zzK;*8c4SQK{U|!`@*gza2AQX{- zDR6njJk88p@ImoyNdG1SNMia&rdsW+)5#I@(M(6m>z>I*kpIa#PDSX@U<@`X{u1SH zMc?gVV#JI%=S}NlSr#9lDTcm0KIlNUJ+?Om~+K$2+|_n^Fc(zh5hBLnE725 zy9T0yC$Lja)x8Br&#uQUKGnn6g!(i(a;Y9V)VAisC*?opw_rIT&LkSHOp0Bt-}B?sfE> zvK`(1Xc!TZ$?9}y` zp!ArZ>#+{GW@?<6k``t-&_9w5LHKx$i+FkChiGC+7zRAgCK{{D`XD~_Ei(DZ^~ zsPlS=3gQf-a_G!cc-~I_L(!oq0x0g+dcEx@XCcr$4w9Y>0ScRiV*Ybhk5V8-wVO4F z6~MJ*TuJ@A%&E{d?o2&n6`&ZVL6}{ETSo1}91gwk0C4Q=1~`0Xt&)3|Q_|NCdjX#` zA2O6T=K^pFmo-b>R)W#h+iu=1ChsEUK!%m~D*;?^ht-3;wrG(*g1 zPsKcYLfE$q-p<>-Xg>wDCu?8T0IISE&?|>7V3tKb6rk8?RAZ zV`p*BSTrdrWM1@?yWH&zr0~EoaK+$7c)dwIfFjc?s(TZewFUi+Hvg_MNN5nXdhVJ`#|;UCW*fX+?*OfU6Ez4B-u153FRcOe@}X#EVl;a9w})sh+YYWy zj6In4D6^(o3Y9#PzavzOqHRoT_=^N$78TPUc-$FqIc5XGSVoc36wMu9Xlf%_!?!dI z!j99hhfGp1g))V5#4mKk%}m*0$M-M1%%`c-Mx>*i-L338ccoTa1t?0_AnEQoQv^5? zBo#0<887OK*I@WsMAC9L)%)DMI+4iDNtupjQ#*3@)ogC6K8aY!$T+EAcaN{J3Q(jH z2N{9k4qDE)iy%5Cj3yx&#QDVE_8{-WEl`{BFzJw*$5!>p zn9J7Y+_Xu^yT{jB1L&o^2;I&1#uWACD4|6X7~=~H!qobYK^l8>pg5z18F~gs6?JKv zi^kVk1L(!PaLvTLu}9r6O-TSI*(A+MH7O33D80S@LQFBnL?T8~!I0)fbyc9efo9yl zX#6>=01cu@P&1|Tfn<8kj+vGj7J?;N>daaxl#fc|_i z1T{#wXZe<@D#S+bCCyBlk0(=8z%l5MXP7u3f;FninO(kFu(?T@fl~!sJ+?Tl#VSBS znwvL+WClV+(q=XpJs5+f-x#E^NgvQ!F*nb^-J9NO4WJDN0#Sp^fu3MePtc?Z3ZMuO zXeUX(6f66Y8u2rl6s*EcFzb|nx*R5 zl<3*3FsrU!n3Vv|n_z36$q-$eJ)87qMxj@ua5vmPwcRIxsFjqj2wk(ozgBo6JA0Q| zj;D;~A|vLWuHCFR0tCM1Z`}7@*z3QF21%jzu1ji!t=1R%!}zAXpe~~GM`pTcUW#TS z`TN9LF-L3kI>q1v2M#>B?bPIj1d7P-2osW#vzZmb} zwtrh&8|>S+??qfThlGTXt?Q+=wKZ`1^y%MEOH0cnfQ}wLy6ye<-~WA3P!LgFFHKEN zp_3<1&YU)F+9G5)G&VN6cI?=(1fO~#>YrKJErGmq=T7>7j_!xkE=-G<_?d-(ev@hO z#B$%tfVZ$DBqU77Z?K@Gq@;M>ym_c=K(CRh^UQRY(5Ih%`pJxpj3rd};K73%mn~cN zAnvD}s#?g?jNH6=^Q$AUbaZq;Sy|Z!nVFe1E5M$39}5XIQP`tM_wm|>({0Z^_uQNb z6DDjS57^Su;(q3tXI5<5wCN43MPKrn?Z}D8v!_g%avuSdmzS5bbm`I`Vm(S5s)Zh2 z3<8q*@WT(UL1x;To0}m&KmS&&|E}7x{_2bcSK|9E(HjJ1XJ_X{M@NrD^MON$4(-7X zP_mlX)8msP+~+Gm)ChVpa^(8;>(@=3IB_bu>#C}%6OTRi*m(5529xx?#olXP41nw? z@{f!fH7c8Kd+yx1_LVDF-m`!I{#^V?U-5~+Ms1Z9fJiH&k)6}lu3h_5czAdKv8br1 z=*J5eE~IG>PuIU-toj`wWJ+vSR#t)2=^TWn1-o|bdSlh9RZn0GPvJse^m!^)0HX8h ztH|N2SFe72#*7(rDL};sQHR=eC7O2m1*75N#Qp}z@69*gT#p~cF2cBisDBopYF2G+ z?E$=ZT`wA86(DMNctk`*INahr@>t&%mGyii?YnpNa8*xATD7UYrzW}mNnl$N-v17;Ppa%m4sT-N|qwU+b)08Z^b!EELW0ReW7cb6E zO-;QIgFyl}=lSQK_vGfyCsVu@Gi%nYTONGy!9U=6_N`mDl4)lllPILhlH2^}9 zOplL`Uw{Dp3n~5!qjkM-dW{LEnpt ziW+_F*s<4eOh=xR9#Ef3e=&&S68hkR2D%g}(;rEp&iU#|$Rp8fvaz^On<(8-jf=12 zD>{b;+VqYNMcM=m{fP;0ahK1a^%p>NL+T`@Ovt3jgZN@vqM_6dI-h{1LLH;9z*m6j z95OXx60Hf?-olFi3P3*J^na;he=_KQsoy@g_20HgP7IC-AA0}*002ovPDHLkV1j~p BiQE7H literal 0 HcmV?d00001 diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-mdpi/ic_launcher.png b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..df52c527841706f13b793466d9843940b3286dd7 GIT binary patch literal 3046 zcmV|L2^0_b!iRu``Xi%;DZW_w{}M z|NZ}e&bcc1fp4lGIDU`_&|Zg4kIn57C)J1eda#+W*(3ssCj4MvIScaXSYNkxW2yLpi-$ck1}`(o6Tmk1P2F?#ozT3fso3|%4&^9^GI7? zB4Dvt%u!KMk@)+*L|_#D2*nosr_aN`QmNc9I5eO}hp6!wq+_*~sgC;aKd9As&PIE5 z9QLcEy&PJ0f7-wXpu+!F3)@@S-irG^JcD~1N}Kif;xV2B3+tm}8y?%l@w(J|DP(zU z_po(J1l0Hg(SiTI3y}sD#xa3ZBVZ!I2w)#6Ov6a1*)b7N<2k_pL|COlGD3wm#4Bwo z@fHTgW@UhYKodwJK!A~q1;Nv?6(~-L0G%g7M3Tt#LC#DANv9cGFFmAx8uk0=o0w*a z0C|EDVHOvA;T5HqICyMC1WC{y5h=on?2o`1c-nKTI$D<#QG#X1%<^^u8I!90@xd*! zary-<5{PYf1gs!IWP~U9H3Xc_6L{_c2A=JS05t-S?vTNA4{&b~FacUvUIIKAc&c8URaySqCuLK-pVKD7K;skg``W`(n zFo@kXqd}{|Qh~X#&uSEb>lgzXl@><1M}nK$3(S@_=;>>cV?d+Uu`Ja;3-PQ&%?zf# z7WNMEn5pjpdr$uiIP=|dmR*zq9p*g;;`~>FPU9QIFX5%&H1(HgD=VbU%*xL+EUB@{v_TC47&nYlQKLL6z9Z*vHI|v%}1dP_jF%Np{ z#-pbq&_m7aIn-yew7|{Azrup(qe#F{5GdsNf24KbNO?4`10oZ}_@%?tkT+#>Rk!{V zt~czG^Z#Rkzk&##h0xG-3Cint@*xJ^`_#C1LGKoT*S-(+T^ATol1GehIz;&{#p^G^ z)q8I{)Pn`lpD+SMx~_v0=uaYJQjPO0bfi40SprWMo)eji7MuZh+dqeKqn{NrdY;LM z&QA!)W`H_Om2j!AI`8mRDmol(0dZUj};Nd6ZQNTsFL=@PGxLjs1)hxVsL6_>7Q`a(rZg zm6Hw53H;O{XRZZ{vsc2EqZ0psF5@b!2c zzQtNV-jfD(3I17FGgiR;&LSkR!C{P)7WV}sP*n44B#=MIsMP|QQyQET$oo13C8Wlp z@-a##8E!T1!SwhJpTJ;?^mz`6{Q+gs3|~|%hH*Y=m}cK#7OKTe)oH$qH6Q`Pyyr2i zp0D{Ow3+V6gSv!(m(Vz?kidDCE~QZ^UAr*8fDvfG_~dEkRPb1gIH}q`mv9!zXc62i(Aaeu1N*0#PFI76TcE5pV{Zf8 zXnda)H@;CCwXtB256FajonK+Fz9uBZXK0J!3PG<87^qk5Asm#MelfLqI069}13I*X zA0t4ikxd!dIG+!j`8hY70``c!&x_Y+T@=QH516cN=!qKU0SUac*QoRuBRU-G^kAiK zcbKWsn2QIyG<%cg4OZysZ2^m|2ePIAT31@RC$R)s>s|6!;|Pw z#tPXSl!2=xLBJ$0NXJU>LlclPk(~s|giDE&P#*Ku3;QI96U&)qa!w%kiVi(s*SDj! zmEd{M+5?z}t}8*z;z15%DX51cVP8)o;yKgILlU63`|mpE-slL7AoAry8(UVCWX1bs zz)U(y*$kABoRb`4Lc{_sxnNU?Wk>E6Wya#iug>kGVnZu)Z0%2a3#|`&&!0bk;@nrx z;@T*;v=S_zMp8gaK<&E6C3y$yiy#(;HCyLay{!7FI!YgVQVB0(}QbCnvv+;9ECu-n^)yqT)7T6t53EapJ@c1PsfTEqfgMXmm!KHYO$}e(Tn)ClUCV z^XJcR+_`gSE?LtR!;x$VxM=bxCKvCOFH_H$F(YF8_U)I@`T_a*`8zgk+O!kT%E5)l z5v8T2)n>C9Qc_arV?>R(nRSBy|&lrjTop(p##(26 zY$V&m5YVh%y?T09R@OPpB-*^ZyfwMGxkvG(ZP=7Lc1D2S>ywj{^K%5g8_D+`K74r2 z-o1M-35mGO;b92)96x^iSa^8&k1?RmW#Wc!Ghk!EtJs_opv&mn)mQ|6C?O$X4rZ4# z>FMb-(I!K1z!YapK45@P*_-~ z3}PiPs(?W##~ntaaaCpEYaNzc3cQEiNvmWk1ShE^Q+v;DJx2u?W=)dI^>D zp$d@n>6U=7PohI0A`ITxXplxZ9>-!}bO}9PG*SX|J%Oh^pNS8>NuO@%3ie5Km}}{| oWDIFA@~ literal 0 HcmV?d00001 diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-xhdpi/ic_launcher.png b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..3d479bfe732ba0be4a130fe14ad257cacba654e3 GIT binary patch literal 7042 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 literal 0 HcmV?d00001 diff --git a/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/runner/AndroidTestOrchestratorWithTestCoverageSample/app/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..c85d90b05f51ff4b23891035fa8a6301770e379f GIT binary patch literal 12352 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 + + + + + + + + + + +