| 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());
|
| + }
|
| +}
|
|
|