From 837e0bdbf5693b8e7de53e89031a96a6687e0f59 Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Wed, 16 Feb 2022 09:20:59 -0800 Subject: [PATCH 01/18] chore(Test): Add androidTest. Change-Id: I35a30c7b70bbb88804db8ce5e0e8146c4aa5cb53 --- app/build.gradle | 9 ++ .../android/compose/GoogleMapViewTests.kt | 145 ++++++++++++++++++ .../maps/android/compose/MapSampleActivity.kt | 38 ++--- build.gradle | 3 +- 4 files changed, 176 insertions(+), 19 deletions(-) create mode 100644 app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt diff --git a/app/build.gradle b/app/build.gradle index 64d7d8c9..f577e7d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,6 +47,15 @@ dependencies { implementation 'com.google.maps.android:maps-ktx:3.3.0' implementation "androidx.core:core-ktx:1.7.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + + androidTestImplementation "androidx.test:core:$androidx_test_version" + androidTestImplementation "androidx.test:rules:$androidx_test_version" + androidTestImplementation "androidx.test:runner:$androidx_test_version" + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.3' + androidTestImplementation 'junit:junit:4.13.2' + androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" + androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0" } secrets { diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt new file mode 100644 index 00000000..67d5e2d7 --- /dev/null +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -0,0 +1,145 @@ +package com.google.maps.android.compose + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Modifier +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import com.google.android.gms.maps.model.CameraPosition +import com.google.android.gms.maps.model.LatLng +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import java.util.concurrent.CountDownLatch + +class GoogleMapViewTests { + @get:Rule + val composeTestRule = createAndroidComposeRule() + + private val startingZoom = 10f + private val startingPosition = LatLng(1.23, 4.56) + private val assertRoundingError = 0.0000001 + + private lateinit var cameraPositionState: CameraPositionState + + @Before + fun setUp() { + cameraPositionState = CameraPositionState( + position = CameraPosition.fromLatLngZoom( + startingPosition, + startingZoom + ) + ) + + val countDownLatch = CountDownLatch(1) + composeTestRule.setContent { + GoogleMapView( + modifier = Modifier.fillMaxSize(), + cameraPositionState = cameraPositionState, + onMapLoaded = { + countDownLatch.countDown() + } + ) + } + countDownLatch.await() + } + @Test + fun testStartingCameraPosition() { + startingPosition.assertEquals(cameraPositionState.position.target) + } + + @Test + fun testCameraReportsMoving() { + zoom(shouldAnimate = true, zoomIn = true) { + composeTestRule.waitUntil(1000) { + cameraPositionState.isMoving + } + assertTrue(cameraPositionState.isMoving) + } + } + + @Test + fun testCameraReportsNotMoving() { + zoom(shouldAnimate = true, zoomIn = true) { + composeTestRule.waitUntil(1000) { + cameraPositionState.isMoving + } + composeTestRule.waitUntil(1000) { + !cameraPositionState.isMoving + } + assertFalse(cameraPositionState.isMoving) + assertTrue(false) + } + } + + @Test + fun testCameraZoomInAnimation() { + zoom(shouldAnimate = true, zoomIn = true) { + composeTestRule.waitForIdle() + assertEquals( + startingZoom + 1f, + cameraPositionState.position.zoom, + assertRoundingError.toFloat() + ) + } + } + + @Test + fun testCameraZoomIn() { + zoom(shouldAnimate = false, zoomIn = true) { + composeTestRule.waitForIdle() + assertEquals( + startingZoom + 1f, + cameraPositionState.position.zoom, + assertRoundingError.toFloat() + ) + } + } + + @Test + fun testCameraZoomOut() { + zoom(shouldAnimate = false, zoomIn = false) { + composeTestRule.waitForIdle() + assertEquals( + startingZoom - 1f, + cameraPositionState.position.zoom, + assertRoundingError.toFloat() + ) + } + } + + @Test + fun testCameraZoomOutAnimation() { + zoom(shouldAnimate = true, zoomIn = false) { + composeTestRule.waitForIdle() + assertEquals( + startingZoom - 1f, + cameraPositionState.position.zoom, + assertRoundingError.toFloat() + ) + } + } + + private fun zoom(shouldAnimate: Boolean, zoomIn: Boolean, assertionBlock: () -> Unit) { + if (!shouldAnimate) { + composeTestRule.onNodeWithTag("cameraAnimations") + .assertIsDisplayed() + .performClick() + } + composeTestRule.onNodeWithText(if (zoomIn) "+" else "-") + .assertIsDisplayed() + .performClick() + + assertionBlock() + } + + private fun LatLng.assertEquals(other: LatLng) { + assertEquals(latitude, other.latitude, assertRoundingError) + assertEquals(longitude, other.longitude, assertRoundingError) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt b/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt index afde4774..7b04c17e 100644 --- a/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt +++ b/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt @@ -46,6 +46,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMapOptions @@ -57,19 +58,27 @@ import kotlinx.coroutines.launch private const val TAG = "MapSampleActivity" +val singapore = LatLng(1.35, 103.87) +val singapore2 = LatLng(1.40, 103.77) + class MapSampleActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { var isMapLoaded by remember { mutableStateOf(false) } + // Observing and controlling the camera's state can be done with a CameraPositionState + val cameraPositionState = rememberCameraPositionState { + position = CameraPosition.fromLatLngZoom(singapore, 11f) + } Box(Modifier.fillMaxSize()) { GoogleMapView( modifier = Modifier.matchParentSize(), + cameraPositionState = cameraPositionState, onMapLoaded = { isMapLoaded = true - } + }, ) if (!isMapLoaded) { AnimatedVisibility( @@ -92,25 +101,17 @@ class MapSampleActivity : ComponentActivity() { } @Composable -private fun GoogleMapView(modifier: Modifier, onMapLoaded: () -> Unit) { - val singapore = LatLng(1.35, 103.87) - val singapore2 = LatLng(1.40, 103.77) - - // Observing and controlling the camera's state can be done with a CameraPositionState - val cameraPositionState = rememberCameraPositionState { - position = CameraPosition.fromLatLngZoom(singapore, 11f) - } - +fun GoogleMapView( + modifier: Modifier, + cameraPositionState: CameraPositionState, + onMapLoaded: () -> Unit, +) { + var uiSettings by remember { mutableStateOf(MapUiSettings(compassEnabled = false)) } + var shouldAnimateZoom by remember { mutableStateOf(true) } + var ticker by remember { mutableStateOf(0) } var mapProperties by remember { mutableStateOf(MapProperties(mapType = MapType.NORMAL)) } - var uiSettings by remember { - mutableStateOf( - MapUiSettings(compassEnabled = false) - ) - } - var shouldAnimateZoom by remember { mutableStateOf(true) } - var ticker by remember { mutableStateOf(0) } GoogleMap( modifier = modifier, @@ -244,7 +245,8 @@ private fun ZoomControls( Text(text = "Camera Animations On?") Switch( isCameraAnimationChecked, - onCheckedChange = onCameraAnimationCheckedChange + onCheckedChange = onCameraAnimationCheckedChange, + modifier = Modifier.testTag("cameraAnimations"), ) } Row(horizontalArrangement = Arrangement.Center) { diff --git a/build.gradle b/build.gradle index b0c1d081..1f03224e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.6.10' - ext.compose_version = '1.2.0-alpha02' + ext.compose_version = '1.2.0-alpha03' + ext.androidx_test_version = '1.4.0' repositories { google() mavenCentral() From 8e4a479978b312dd7ff0587038a749cf51ccfaf5 Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Mon, 28 Feb 2022 16:03:03 -0800 Subject: [PATCH 02/18] Add connectedCheck step. Change-Id: I0a1530cc9133f2d07f682917f7ac709aee3e8406 --- .github/workflows/test.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 74abaa9e..bc2ff0d6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,3 +44,34 @@ jobs: - name: Build modules run: ./gradlew build jacocoTestReport --stacktrace + + run-instrumentation-test: + needs: run-unit-test + runs-on: macOS-latest # enables hardware acceleration in the virtual machine + timeout-minutes: 30 + strategy: + matrix: + api-level: [23, 26, 29] + + steps: + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Gradle Wrapper Validation + uses: gradle/wrapper-validation-action@v1.0.4 + + - name: Set up JDK 11 + uses: actions/setup-java@v2.3.1 + with: + java-version: '11' + distribution: 'adopt' + + - name: Run instrumentation tests + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + target: google_apis + arch: x86 + disable-animations: true + script: ./gradlew connectedCheck --stacktrace + From a976e7f1344b101ee95853da8165db3563cfb65d Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Wed, 2 Mar 2022 20:35:53 -0800 Subject: [PATCH 03/18] Run connectedCheck on app only Change-Id: I58d97e288db98eac56ef6df9659b653ac2aa92b2 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bc2ff0d6..5651734c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -73,5 +73,5 @@ jobs: target: google_apis arch: x86 disable-animations: true - script: ./gradlew connectedCheck --stacktrace + script: ./gradlew :app:connectedCheck --stacktrace From 31a68365b55b096134ca2e47e6bf35e181d837ca Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Wed, 2 Mar 2022 20:47:34 -0800 Subject: [PATCH 04/18] Upload test reports. Change-Id: I41ec0a6b30d77bf9803e53e7d6f93efbf01e642b --- .github/workflows/test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5651734c..a75fd90e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -75,3 +75,9 @@ jobs: disable-animations: true script: ./gradlew :app:connectedCheck --stacktrace + - name: Upload test reports + if: always() + uses: actions/upload-artifact@v2 + with: + name: test-reports + path: ./app/build/reports From 89953852bf674785eadb1022509d7bb8ed331c5c Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Thu, 3 Mar 2022 08:42:18 -0800 Subject: [PATCH 05/18] Remove failing test. Change-Id: I14c1b96d13fe796c5145de79df3f1f25046f00c6 --- .../java/com/google/maps/android/compose/GoogleMapViewTests.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 67d5e2d7..1fa26fca 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -73,7 +73,6 @@ class GoogleMapViewTests { !cameraPositionState.isMoving } assertFalse(cameraPositionState.isMoving) - assertTrue(false) } } From c74fc26c42eb27394debe52ec6a5350bc2d43826 Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Thu, 3 Mar 2022 12:44:42 -0800 Subject: [PATCH 06/18] Add timeout to await call. Change-Id: I7dfd70c1e15f7a9c357d506006aae3c3c3426636 --- .../com/google/maps/android/compose/GoogleMapViewTests.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 1fa26fca..1f5be298 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -16,6 +16,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit class GoogleMapViewTests { @get:Rule @@ -46,7 +47,8 @@ class GoogleMapViewTests { } ) } - countDownLatch.await() + val mapLoaded = countDownLatch.await(30, TimeUnit.SECONDS) + assertTrue("Map loaded", mapLoaded) } @Test fun testStartingCameraPosition() { From 052554f22c8f7716a628eb68c7b5bc23b403df82 Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Thu, 3 Mar 2022 18:58:40 -0800 Subject: [PATCH 07/18] Inject maps API key. Change-Id: Ia3fdd45c839f64df9610b93cc0023c80ab72e465 --- .github/workflows/test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a75fd90e..8afe7405 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -66,6 +66,12 @@ jobs: java-version: '11' distribution: 'adopt' + - name: Inject Maps API Key + run: | + echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties + env: + MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} + - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: From 90ebf02713ca5b1082f95e2c096b3ad8375feb8a Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 08:42:19 -0800 Subject: [PATCH 08/18] Injecting api key sooner. Change-Id: I106362be7128ebdeed133febfc1c8dc2ad062370 --- .github/workflows/test.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8afe7405..b1cc171d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,6 +42,14 @@ jobs: java-version: '11' distribution: 'adopt' + - name: Inject Maps API Key + run: | + echo "Current local.properties contents" + cat local.properties + echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties + env: + MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} + - name: Build modules run: ./gradlew build jacocoTestReport --stacktrace @@ -66,12 +74,6 @@ jobs: java-version: '11' distribution: 'adopt' - - name: Inject Maps API Key - run: | - echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties - env: - MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} - - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: From c155d724778e2888fba661da2250e35eaeeb4775 Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 08:46:33 -0800 Subject: [PATCH 09/18] Create local.properties file. Change-Id: Ifab425e1a664da74c407bb6d2bf7bf76d1cd3854 --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b1cc171d..ca2a3a7c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,8 +44,7 @@ jobs: - name: Inject Maps API Key run: | - echo "Current local.properties contents" - cat local.properties + touch local.properties echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties env: MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} From 673a814d1129e1dd379b81d0954a1032f4e58fde Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 09:12:58 -0800 Subject: [PATCH 10/18] Move api key inject a step before connectedCheck. Change-Id: Idf737d9d1e7eab3d9b94d60d11cd9f2b0d8a70b2 --- .github/workflows/test.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ca2a3a7c..2f5be930 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,13 +42,6 @@ jobs: java-version: '11' distribution: 'adopt' - - name: Inject Maps API Key - run: | - touch local.properties - echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties - env: - MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} - - name: Build modules run: ./gradlew build jacocoTestReport --stacktrace @@ -73,6 +66,13 @@ jobs: java-version: '11' distribution: 'adopt' + - name: Inject Maps API Key + run: | + touch local.properties + echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties + env: + MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} + - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: @@ -80,7 +80,7 @@ jobs: target: google_apis arch: x86 disable-animations: true - script: ./gradlew :app:connectedCheck --stacktrace + script: ./gradlew build :app:connectedCheck --stacktrace - name: Upload test reports if: always() From 73762657f727e4c497047503b245174ffe81c60e Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 09:16:42 -0800 Subject: [PATCH 11/18] Simplify test workflow. Change-Id: Ic55a817da8fb344ac0185c50c107e582b6f42de5 --- .github/workflows/test.yml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2f5be930..88d3a4f1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,28 +25,7 @@ on: workflow_dispatch: jobs: - run-unit-test: - runs-on: ubuntu-latest - - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - name: Checkout Repo - uses: actions/checkout@v2 - - - name: Gradle Wrapper Validation - uses: gradle/wrapper-validation-action@v1.0.4 - - - name: Set up JDK 11 - uses: actions/setup-java@v2.3.1 - with: - java-version: '11' - distribution: 'adopt' - - - name: Build modules - run: ./gradlew build jacocoTestReport --stacktrace - run-instrumentation-test: - needs: run-unit-test runs-on: macOS-latest # enables hardware acceleration in the virtual machine timeout-minutes: 30 strategy: From 126f695e3c7fd650445570a6836e8aaced2580cb Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 09:21:37 -0800 Subject: [PATCH 12/18] Add back synced test.yml and rename to instrumentation-test.yml Change-Id: I3a9ffe7b48591e7e0ec0c79f79d86a34aec6110a --- .github/workflows/instrumentation-test.yml | 69 ++++++++++++++++++++++ .github/workflows/test.yml | 37 +++--------- 2 files changed, 76 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/instrumentation-test.yml diff --git a/.github/workflows/instrumentation-test.yml b/.github/workflows/instrumentation-test.yml new file mode 100644 index 00000000..88d3a4f1 --- /dev/null +++ b/.github/workflows/instrumentation-test.yml @@ -0,0 +1,69 @@ +# Copyright 2020 Google LLC +# +# 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. + +# A workflow that runs tests on every new pull request +name: Run unit tests + +on: + repository_dispatch: + types: [test] + push: + branches-ignore: ['gh-pages'] + pull_request: + branches-ignore: ['gh-pages'] + workflow_dispatch: + +jobs: + run-instrumentation-test: + runs-on: macOS-latest # enables hardware acceleration in the virtual machine + timeout-minutes: 30 + strategy: + matrix: + api-level: [23, 26, 29] + + steps: + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Gradle Wrapper Validation + uses: gradle/wrapper-validation-action@v1.0.4 + + - name: Set up JDK 11 + uses: actions/setup-java@v2.3.1 + with: + java-version: '11' + distribution: 'adopt' + + - name: Inject Maps API Key + run: | + touch local.properties + echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties + env: + MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} + + - name: Run instrumentation tests + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + target: google_apis + arch: x86 + disable-animations: true + script: ./gradlew build :app:connectedCheck --stacktrace + + - name: Upload test reports + if: always() + uses: actions/upload-artifact@v2 + with: + name: test-reports + path: ./app/build/reports diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 88d3a4f1..50623fe1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,20 +19,17 @@ on: repository_dispatch: types: [test] push: - branches-ignore: ['gh-pages'] + branches: ['*'] pull_request: - branches-ignore: ['gh-pages'] + branches: ['*'] workflow_dispatch: jobs: - run-instrumentation-test: - runs-on: macOS-latest # enables hardware acceleration in the virtual machine - timeout-minutes: 30 - strategy: - matrix: - api-level: [23, 26, 29] + run-unit-test: + runs-on: ubuntu-latest steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - name: Checkout Repo uses: actions/checkout@v2 @@ -45,25 +42,5 @@ jobs: java-version: '11' distribution: 'adopt' - - name: Inject Maps API Key - run: | - touch local.properties - echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties - env: - MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} - - - name: Run instrumentation tests - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ matrix.api-level }} - target: google_apis - arch: x86 - disable-animations: true - script: ./gradlew build :app:connectedCheck --stacktrace - - - name: Upload test reports - if: always() - uses: actions/upload-artifact@v2 - with: - name: test-reports - path: ./app/build/reports + - name: Build modules + run: ./gradlew build jacocoTestReport --stacktrace From f95e4da698ceac24ba374818fd7ffa9c0a203b1d Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 14:59:41 -0800 Subject: [PATCH 13/18] Add debug statement. Change-Id: Ia75de3fe64826dea3cbd807a1c82cbd06e06a291 --- .github/workflows/instrumentation-test.yml | 10 ++++++++-- app/build.gradle | 2 +- .../google/maps/android/compose/GoogleMapViewTests.kt | 2 ++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/instrumentation-test.yml b/.github/workflows/instrumentation-test.yml index 88d3a4f1..d3f54a10 100644 --- a/.github/workflows/instrumentation-test.yml +++ b/.github/workflows/instrumentation-test.yml @@ -13,7 +13,7 @@ # limitations under the License. # A workflow that runs tests on every new pull request -name: Run unit tests +name: Run instrumentation tests on: repository_dispatch: @@ -49,9 +49,15 @@ jobs: run: | touch local.properties echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties + echo "------------------------------------------------" + ls + echo "------------------------------------------------" env: MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} + - name: Build debug + run: rm -fr ./app/build ; ./gradlew assembleDebug + - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: @@ -59,7 +65,7 @@ jobs: target: google_apis arch: x86 disable-animations: true - script: ./gradlew build :app:connectedCheck --stacktrace + script: ./gradlew :app:connectedCheck --stacktrace - name: Upload test reports if: always() diff --git a/app/build.gradle b/app/build.gradle index f577e7d6..d087007c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { } buildFeatures { - buildConfig false + buildConfig true compose true } diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 1f5be298..895c3e58 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -1,5 +1,6 @@ package com.google.maps.android.compose +import android.util.Log import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.ui.Modifier import androidx.compose.ui.test.assertIsDisplayed @@ -38,6 +39,7 @@ class GoogleMapViewTests { ) val countDownLatch = CountDownLatch(1) + Log.i("GoogleMapViewTests", "API KEY is: ${BuildConfig.MAPS_API_KEY}") composeTestRule.setContent { GoogleMapView( modifier = Modifier.fillMaxSize(), From ed81cc25adf429562c0360051b9f365509aa767a Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 17:40:16 -0800 Subject: [PATCH 14/18] Inject API key directly in AndroidManifest.xml Change-Id: Ie922328946106712d66791a0589f592b3109b36a --- .github/workflows/instrumentation-test.yml | 10 ++++------ .../google/maps/android/compose/GoogleMapViewTests.kt | 1 - 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/instrumentation-test.yml b/.github/workflows/instrumentation-test.yml index d3f54a10..e1beea7e 100644 --- a/.github/workflows/instrumentation-test.yml +++ b/.github/workflows/instrumentation-test.yml @@ -47,16 +47,14 @@ jobs: - name: Inject Maps API Key run: | - touch local.properties - echo "\nMAPS_API_KEY=$MAPS_API_KEY" >> local.properties - echo "------------------------------------------------" - ls - echo "------------------------------------------------" + # Injecting the key directly into the manifest as secrets-gradle-plugin + # isn't picking up the key when creating a local.properties file here + sed -i -e "s,\${MAPS_API_KEY},$MAPS_API_KEY,g" ./app/src/main/AndroidManifest.xml env: MAPS_API_KEY: ${{ secrets.GMP_API_KEY }} - name: Build debug - run: rm -fr ./app/build ; ./gradlew assembleDebug + run: ./gradlew assembleDebug - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 895c3e58..11c2e0ea 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -39,7 +39,6 @@ class GoogleMapViewTests { ) val countDownLatch = CountDownLatch(1) - Log.i("GoogleMapViewTests", "API KEY is: ${BuildConfig.MAPS_API_KEY}") composeTestRule.setContent { GoogleMapView( modifier = Modifier.fillMaxSize(), From 68d89b1dadfee4f0b336b2543383eeceb915f73e Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 18:27:49 -0800 Subject: [PATCH 15/18] Update layout on sample app. Change-Id: I26075247a5cf0ba5a889fb67fbb08b6312cd076a --- .../android/compose/GoogleMapViewTests.kt | 2 +- .../maps/android/compose/MapSampleActivity.kt | 26 ++++++++----------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 11c2e0ea..9ee236ad 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -1,6 +1,5 @@ package com.google.maps.android.compose -import android.util.Log import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.ui.Modifier import androidx.compose.ui.test.assertIsDisplayed @@ -51,6 +50,7 @@ class GoogleMapViewTests { val mapLoaded = countDownLatch.await(30, TimeUnit.SECONDS) assertTrue("Map loaded", mapLoaded) } + @Test fun testStartingCameraPosition() { startingPosition.assertEquals(cameraPositionState.position.target) diff --git a/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt b/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt index 7b04c17e..a380e974 100644 --- a/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt +++ b/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt @@ -241,21 +241,17 @@ private fun ZoomControls( MapButton("-", onClick = { onZoomOut() }) MapButton("+", onClick = { onZoomIn() }) Column(verticalArrangement = Arrangement.Center) { - Row(horizontalArrangement = Arrangement.Center) { - Text(text = "Camera Animations On?") - Switch( - isCameraAnimationChecked, - onCheckedChange = onCameraAnimationCheckedChange, - modifier = Modifier.testTag("cameraAnimations"), - ) - } - Row(horizontalArrangement = Arrangement.Center) { - Text(text = "Zoom Controls On?") - Switch( - isZoomControlsEnabledChecked, - onCheckedChange = onZoomControlsCheckedChange - ) - } + Text(text = "Camera Animations On?") + Switch( + isCameraAnimationChecked, + onCheckedChange = onCameraAnimationCheckedChange, + modifier = Modifier.testTag("cameraAnimations"), + ) + Text(text = "Zoom Controls On?") + Switch( + isZoomControlsEnabledChecked, + onCheckedChange = onZoomControlsCheckedChange + ) } } } From 3883975a7b4b0c7f5411c53b8ded90991a1defbb Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 18:52:55 -0800 Subject: [PATCH 16/18] Use a single API level. Change-Id: Ifd2aa8abfce30251207e057565b6694787164db6 --- .github/workflows/instrumentation-test.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/instrumentation-test.yml b/.github/workflows/instrumentation-test.yml index e1beea7e..29435512 100644 --- a/.github/workflows/instrumentation-test.yml +++ b/.github/workflows/instrumentation-test.yml @@ -28,10 +28,6 @@ jobs: run-instrumentation-test: runs-on: macOS-latest # enables hardware acceleration in the virtual machine timeout-minutes: 30 - strategy: - matrix: - api-level: [23, 26, 29] - steps: - name: Checkout Repo uses: actions/checkout@v2 @@ -59,7 +55,7 @@ jobs: - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: - api-level: ${{ matrix.api-level }} + api-level: 29 target: google_apis arch: x86 disable-animations: true From 0dab3adfe0b246d311e4e3e0ceb17f38b44bba4f Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 19:30:24 -0800 Subject: [PATCH 17/18] s/waitForIdle/waitUntil Change-Id: Icef7d759573d1459a37e3d9058a1214ee2e52301 --- .../android/compose/GoogleMapViewTests.kt | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 9ee236ad..2c995643 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -82,7 +82,12 @@ class GoogleMapViewTests { @Test fun testCameraZoomInAnimation() { zoom(shouldAnimate = true, zoomIn = true) { - composeTestRule.waitForIdle() + composeTestRule.waitUntil(1000) { + cameraPositionState.isMoving + } + composeTestRule.waitUntil(1000) { + !cameraPositionState.isMoving + } assertEquals( startingZoom + 1f, cameraPositionState.position.zoom, @@ -94,7 +99,12 @@ class GoogleMapViewTests { @Test fun testCameraZoomIn() { zoom(shouldAnimate = false, zoomIn = true) { - composeTestRule.waitForIdle() + composeTestRule.waitUntil(1000) { + cameraPositionState.isMoving + } + composeTestRule.waitUntil(1000) { + !cameraPositionState.isMoving + } assertEquals( startingZoom + 1f, cameraPositionState.position.zoom, @@ -106,7 +116,12 @@ class GoogleMapViewTests { @Test fun testCameraZoomOut() { zoom(shouldAnimate = false, zoomIn = false) { - composeTestRule.waitForIdle() + composeTestRule.waitUntil(1000) { + cameraPositionState.isMoving + } + composeTestRule.waitUntil(1000) { + !cameraPositionState.isMoving + } assertEquals( startingZoom - 1f, cameraPositionState.position.zoom, @@ -118,7 +133,12 @@ class GoogleMapViewTests { @Test fun testCameraZoomOutAnimation() { zoom(shouldAnimate = true, zoomIn = false) { - composeTestRule.waitForIdle() + composeTestRule.waitUntil(1000) { + cameraPositionState.isMoving + } + composeTestRule.waitUntil(1000) { + !cameraPositionState.isMoving + } assertEquals( startingZoom - 1f, cameraPositionState.position.zoom, From 6944b3dbfa4a5324f636d55aef8a1f48938d1640 Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Fri, 4 Mar 2022 19:36:58 -0800 Subject: [PATCH 18/18] Adjust rounding error. Change-Id: Ieefa005ab8c83e3d287a53f00c8b79c229f5a372 --- .../java/com/google/maps/android/compose/GoogleMapViewTests.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 2c995643..c78b5c34 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -24,7 +24,7 @@ class GoogleMapViewTests { private val startingZoom = 10f private val startingPosition = LatLng(1.23, 4.56) - private val assertRoundingError = 0.0000001 + private val assertRoundingError = 0.01 private lateinit var cameraPositionState: CameraPositionState