OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.device.geolocation; |
| 6 |
| 7 import static org.junit.Assert.assertFalse; |
| 8 import static org.junit.Assert.assertNotNull; |
| 9 import static org.junit.Assert.assertTrue; |
| 10 import static org.mockito.Mockito.doAnswer; |
| 11 |
| 12 import android.content.Context; |
| 13 import android.location.LocationManager; |
| 14 |
| 15 import com.google.android.gms.common.api.GoogleApiClient; |
| 16 import com.google.android.gms.location.FusedLocationProviderApi; |
| 17 |
| 18 import org.junit.Before; |
| 19 import org.junit.Test; |
| 20 import org.junit.runner.RunWith; |
| 21 import org.mockito.Mock; |
| 22 import org.mockito.Mockito; |
| 23 import org.mockito.MockitoAnnotations; |
| 24 import org.mockito.invocation.InvocationOnMock; |
| 25 import org.mockito.stubbing.Answer; |
| 26 import org.robolectric.ParameterizedRobolectricTestRunner; |
| 27 import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; |
| 28 import org.robolectric.Shadows; |
| 29 import org.robolectric.annotation.Config; |
| 30 import org.robolectric.internal.Shadow; |
| 31 import org.robolectric.shadows.ShadowLocationManager; |
| 32 import org.robolectric.shadows.ShadowLog; // remove me ? |
| 33 |
| 34 import org.chromium.base.ThreadUtils; |
| 35 import org.chromium.base.test.util.Feature; |
| 36 |
| 37 import java.util.Arrays; |
| 38 import java.util.Collection; |
| 39 |
| 40 /** |
| 41 * Test suite for Java Geolocation. |
| 42 */ |
| 43 @RunWith(ParameterizedRobolectricTestRunner.class) |
| 44 @Config(sdk = 21, manifest = Config.NONE) |
| 45 public class LocationProviderTest { |
| 46 public static enum LocationProviderType { MOCK, ANDROID, GMS_CORE } |
| 47 |
| 48 @Parameters |
| 49 public static Collection<Object[]> data() { |
| 50 return Arrays.asList(new Object[][] {{LocationProviderType.MOCK}, |
| 51 {LocationProviderType.ANDROID}, {LocationProviderType.GMS_CORE}}
); |
| 52 } |
| 53 |
| 54 @Mock |
| 55 private Context mContext; |
| 56 |
| 57 // Member variables for LocationProviderType.GMS_CORE case. |
| 58 @Mock |
| 59 private GoogleApiClient mGoogleApiClient; |
| 60 private boolean mGoogleApiClientIsConnected; |
| 61 |
| 62 // Member variables for LocationProviderType.ANDROID case. |
| 63 private LocationManager mLocationManager; |
| 64 private ShadowLocationManager mShadowLocationManager; |
| 65 |
| 66 private LocationProviderAdapter mLocationProviderAdapter; |
| 67 |
| 68 private final LocationProviderType mApi; |
| 69 |
| 70 public LocationProviderTest(LocationProviderType api) { |
| 71 mApi = api; |
| 72 } |
| 73 |
| 74 @Before |
| 75 public void setUp() { |
| 76 ShadowLog.stream = System.out; |
| 77 MockitoAnnotations.initMocks(this); |
| 78 |
| 79 mContext = Mockito.mock(Context.class); |
| 80 } |
| 81 |
| 82 /** |
| 83 * Verify a normal start/stop call pair with the given LocationProvider. |
| 84 */ |
| 85 @Test |
| 86 @Feature({"Location"}) |
| 87 public void testStartStop() { |
| 88 assertTrue("Should be on UI thread", ThreadUtils.runningOnUiThread()); |
| 89 |
| 90 setLocationProvider(); |
| 91 |
| 92 createLocationProviderAdapter(); |
| 93 startLocationProviderAdapter(false); |
| 94 stopLocationProviderAdapter(); |
| 95 } |
| 96 |
| 97 /** |
| 98 * Verify a start/upgrade/stop call sequencewith the given LocationProvider. |
| 99 */ |
| 100 @Test |
| 101 @Feature({"Location"}) |
| 102 public void testStartUpgradeStop() { |
| 103 assertTrue("Should be on UI thread", ThreadUtils.runningOnUiThread()); |
| 104 |
| 105 setLocationProvider(); |
| 106 |
| 107 createLocationProviderAdapter(); |
| 108 startLocationProviderAdapter(false); |
| 109 startLocationProviderAdapter(true); |
| 110 stopLocationProviderAdapter(); |
| 111 } |
| 112 |
| 113 private void createLocationProviderAdapter() { |
| 114 mLocationProviderAdapter = LocationProviderAdapter.create(mContext); |
| 115 assertNotNull("LocationProvider", mLocationProviderAdapter); |
| 116 } |
| 117 |
| 118 private void setLocationProvider() { |
| 119 if (mApi == LocationProviderType.MOCK) { |
| 120 setLocationProviderMock(); |
| 121 } else if (mApi == LocationProviderType.ANDROID) { |
| 122 setLocationProviderAndroid(); |
| 123 } else if (mApi == LocationProviderType.GMS_CORE) { |
| 124 setLocationProviderGmsCore(); |
| 125 } else { |
| 126 assert false; |
| 127 } |
| 128 } |
| 129 |
| 130 private void setLocationProviderMock() { |
| 131 LocationProviderFactory.setLocationProviderImpl(new MockLocationProvider
()); |
| 132 } |
| 133 |
| 134 private void setLocationProviderAndroid() { |
| 135 LocationProviderAndroid locationProviderAndroid = new LocationProviderAn
droid(mContext); |
| 136 |
| 137 // Robolectric has a ShadowLocationManager class that mocks the behaviou
r of the real |
| 138 // class very closely. Use it here. |
| 139 mLocationManager = Shadow.newInstanceOf(LocationManager.class); |
| 140 mShadowLocationManager = Shadows.shadowOf(mLocationManager); |
| 141 locationProviderAndroid.setLocationManagerForTesting(mLocationManager); |
| 142 LocationProviderFactory.setLocationProviderImpl(locationProviderAndroid)
; |
| 143 } |
| 144 |
| 145 private void setLocationProviderGmsCore() { |
| 146 // Robolectric has a ShadowGoogleApiClientBuilder class that mocks the b
ehaviour of the real |
| 147 // class very closely, but it's not available in our build |
| 148 mGoogleApiClient = Mockito.mock(GoogleApiClient.class); |
| 149 mGoogleApiClientIsConnected = false; |
| 150 doAnswer(new Answer<Boolean>() { |
| 151 public Boolean answer(InvocationOnMock invocation) { |
| 152 return mGoogleApiClientIsConnected; |
| 153 } |
| 154 }) |
| 155 .when(mGoogleApiClient) |
| 156 .isConnected(); |
| 157 |
| 158 doAnswer(new Answer<Void>() { |
| 159 public Void answer(InvocationOnMock invocation) { |
| 160 mGoogleApiClientIsConnected = true; |
| 161 return null; |
| 162 } |
| 163 }) |
| 164 .when(mGoogleApiClient) |
| 165 .connect(); |
| 166 |
| 167 doAnswer(new Answer<Void>() { |
| 168 public Void answer(InvocationOnMock invocation) { |
| 169 mGoogleApiClientIsConnected = false; |
| 170 return null; |
| 171 } |
| 172 }) |
| 173 .when(mGoogleApiClient) |
| 174 .disconnect(); |
| 175 |
| 176 FusedLocationProviderApi fusedLocationProviderApi = |
| 177 Mockito.mock(FusedLocationProviderApi.class); |
| 178 |
| 179 LocationProviderGmsCore locationProviderGmsCore = |
| 180 new LocationProviderGmsCore(mGoogleApiClient, fusedLocationProvi
derApi); |
| 181 |
| 182 LocationProviderFactory.setLocationProviderImpl(locationProviderGmsCore)
; |
| 183 } |
| 184 |
| 185 private void startLocationProviderAdapter(boolean highResolution) { |
| 186 mLocationProviderAdapter.start(highResolution); |
| 187 assertTrue("Should be running", mLocationProviderAdapter.isRunning()); |
| 188 } |
| 189 |
| 190 private void stopLocationProviderAdapter() { |
| 191 mLocationProviderAdapter.stop(); |
| 192 assertFalse("Should have stopped", mLocationProviderAdapter.isRunning())
; |
| 193 } |
| 194 } |
OLD | NEW |