Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(680)

Unified Diff: device/geolocation/android/junit/src/org/chromium/device/geolocation/LocationProviderTest.java

Issue 2809813002: GeoLocation: add support for GmsCore location provider (Closed)
Patch Set: reillyg@ nit Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/geolocation/android/junit/src/org/chromium/device/geolocation/LocationProviderTest.java
diff --git a/device/geolocation/android/junit/src/org/chromium/device/geolocation/LocationProviderTest.java b/device/geolocation/android/junit/src/org/chromium/device/geolocation/LocationProviderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b0945996b437cf9255dcc440f4a10ea0fdaabaf
--- /dev/null
+++ b/device/geolocation/android/junit/src/org/chromium/device/geolocation/LocationProviderTest.java
@@ -0,0 +1,194 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.device.geolocation;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doAnswer;
+
+import android.content.Context;
+import android.location.LocationManager;
+
+import com.google.android.gms.common.api.GoogleApiClient;
+import com.google.android.gms.location.FusedLocationProviderApi;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.robolectric.ParameterizedRobolectricTestRunner;
+import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.internal.Shadow;
+import org.robolectric.shadows.ShadowLocationManager;
+import org.robolectric.shadows.ShadowLog; // remove me ?
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.Feature;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+/**
+ * Test suite for Java Geolocation.
+ */
+@RunWith(ParameterizedRobolectricTestRunner.class)
+@Config(sdk = 21, manifest = Config.NONE)
+public class LocationProviderTest {
+ public static enum LocationProviderType { MOCK, ANDROID, GMS_CORE }
+
+ @Parameters
+ public static Collection<Object[]> data() {
+ return Arrays.asList(new Object[][] {{LocationProviderType.MOCK},
+ {LocationProviderType.ANDROID}, {LocationProviderType.GMS_CORE}});
+ }
+
+ @Mock
+ private Context mContext;
+
+ // Member variables for LocationProviderType.GMS_CORE case.
+ @Mock
+ private GoogleApiClient mGoogleApiClient;
+ private boolean mGoogleApiClientIsConnected;
+
+ // Member variables for LocationProviderType.ANDROID case.
+ private LocationManager mLocationManager;
+ private ShadowLocationManager mShadowLocationManager;
+
+ private LocationProviderAdapter mLocationProviderAdapter;
+
+ private final LocationProviderType mApi;
+
+ public LocationProviderTest(LocationProviderType api) {
+ mApi = api;
+ }
+
+ @Before
+ public void setUp() {
+ ShadowLog.stream = System.out;
+ MockitoAnnotations.initMocks(this);
+
+ mContext = Mockito.mock(Context.class);
+ }
+
+ /**
+ * Verify a normal start/stop call pair with the given LocationProvider.
+ */
+ @Test
+ @Feature({"Location"})
+ public void testStartStop() {
+ assertTrue("Should be on UI thread", ThreadUtils.runningOnUiThread());
+
+ setLocationProvider();
+
+ createLocationProviderAdapter();
+ startLocationProviderAdapter(false);
+ stopLocationProviderAdapter();
+ }
+
+ /**
+ * Verify a start/upgrade/stop call sequencewith the given LocationProvider.
+ */
+ @Test
+ @Feature({"Location"})
+ public void testStartUpgradeStop() {
+ assertTrue("Should be on UI thread", ThreadUtils.runningOnUiThread());
+
+ setLocationProvider();
+
+ createLocationProviderAdapter();
+ startLocationProviderAdapter(false);
+ startLocationProviderAdapter(true);
+ stopLocationProviderAdapter();
+ }
+
+ private void createLocationProviderAdapter() {
+ mLocationProviderAdapter = LocationProviderAdapter.create(mContext);
+ assertNotNull("LocationProvider", mLocationProviderAdapter);
+ }
+
+ private void setLocationProvider() {
+ if (mApi == LocationProviderType.MOCK) {
+ setLocationProviderMock();
+ } else if (mApi == LocationProviderType.ANDROID) {
+ setLocationProviderAndroid();
+ } else if (mApi == LocationProviderType.GMS_CORE) {
+ setLocationProviderGmsCore();
+ } else {
+ assert false;
+ }
+ }
+
+ private void setLocationProviderMock() {
+ LocationProviderFactory.setLocationProviderImpl(new MockLocationProvider());
+ }
+
+ private void setLocationProviderAndroid() {
+ LocationProviderAndroid locationProviderAndroid = new LocationProviderAndroid(mContext);
+
+ // Robolectric has a ShadowLocationManager class that mocks the behaviour of the real
+ // class very closely. Use it here.
+ mLocationManager = Shadow.newInstanceOf(LocationManager.class);
+ mShadowLocationManager = Shadows.shadowOf(mLocationManager);
+ locationProviderAndroid.setLocationManagerForTesting(mLocationManager);
+ LocationProviderFactory.setLocationProviderImpl(locationProviderAndroid);
+ }
+
+ private void setLocationProviderGmsCore() {
+ // Robolectric has a ShadowGoogleApiClientBuilder class that mocks the behaviour of the real
+ // class very closely, but it's not available in our build
+ mGoogleApiClient = Mockito.mock(GoogleApiClient.class);
+ mGoogleApiClientIsConnected = false;
+ doAnswer(new Answer<Boolean>() {
+ public Boolean answer(InvocationOnMock invocation) {
+ return mGoogleApiClientIsConnected;
+ }
+ })
+ .when(mGoogleApiClient)
+ .isConnected();
+
+ doAnswer(new Answer<Void>() {
+ public Void answer(InvocationOnMock invocation) {
+ mGoogleApiClientIsConnected = true;
+ return null;
+ }
+ })
+ .when(mGoogleApiClient)
+ .connect();
+
+ doAnswer(new Answer<Void>() {
+ public Void answer(InvocationOnMock invocation) {
+ mGoogleApiClientIsConnected = false;
+ return null;
+ }
+ })
+ .when(mGoogleApiClient)
+ .disconnect();
+
+ FusedLocationProviderApi fusedLocationProviderApi =
+ Mockito.mock(FusedLocationProviderApi.class);
+
+ LocationProviderGmsCore locationProviderGmsCore =
+ new LocationProviderGmsCore(mGoogleApiClient, fusedLocationProviderApi);
+
+ LocationProviderFactory.setLocationProviderImpl(locationProviderGmsCore);
+ }
+
+ private void startLocationProviderAdapter(boolean highResolution) {
+ mLocationProviderAdapter.start(highResolution);
+ assertTrue("Should be running", mLocationProviderAdapter.isRunning());
+ }
+
+ private void stopLocationProviderAdapter() {
+ mLocationProviderAdapter.stop();
+ assertFalse("Should have stopped", mLocationProviderAdapter.isRunning());
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698