Index: chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..da770467024d041c3ed4287a8a40c122475371f1 |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java |
@@ -0,0 +1,195 @@ |
+// Copyright 2015 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.chrome.browser; |
+ |
+import android.location.Location; |
+import android.test.FlakyTest; |
+ |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.chrome.browser.infobar.InfoBar; |
+import org.chromium.chrome.browser.infobar.InfoBarContainer; |
+import org.chromium.chrome.test.ChromeActivityTestCaseBase; |
+import org.chromium.chrome.test.util.InfoBarTestAnimationListener; |
+import org.chromium.chrome.test.util.InfoBarUtil; |
+import org.chromium.chrome.test.util.TestHttpServerClient; |
+import org.chromium.content.browser.LocationProviderAdapter; |
+import org.chromium.content.browser.LocationProviderFactory; |
+import org.chromium.content.browser.LocationProviderFactory.LocationProvider; |
+import org.chromium.content.browser.test.util.CallbackHelper; |
+ |
+import java.util.List; |
+ |
+/** |
+ * Test suite for Geo-Location functionality. |
+ * |
+ * These tests rely on the device being specially setup (which the bots do automatically): |
+ * - Global location is enabled. |
+ * - Google location is enabled. |
+ */ |
+public class GeolocationTest extends ChromeActivityTestCaseBase<ChromeActivity> { |
+ private static final String LOCATION_PROVIDER_MOCK = "locationProviderMock"; |
+ private static final double LATITUDE = 51.01; |
+ private static final double LONGITUDE = 0.23; |
+ private static final float ACCURACY = 10; |
+ |
+ private InfoBarTestAnimationListener mListener; |
+ |
+ public GeolocationTest() { |
+ super(ChromeActivity.class); |
+ } |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ |
+ InfoBarContainer container = |
+ getActivity().getTabModelSelector().getCurrentTab().getInfoBarContainer(); |
+ mListener = new InfoBarTestAnimationListener(); |
+ container.setAnimationListener(mListener); |
+ |
+ LocationProviderFactory.setLocationProviderImpl(new LocationProvider() { |
+ private boolean mIsRunning; |
+ |
+ @Override |
+ public boolean isRunning() { |
+ return mIsRunning; |
+ } |
+ |
+ @Override |
+ public void start(boolean gpsEnabled) { |
+ mIsRunning = true; |
+ } |
+ |
+ @Override |
+ public void stop() { |
+ mIsRunning = false; |
+ } |
+ }); |
+ } |
+ |
+ /** |
+ * Verify Geolocation creates an InfoBar and receives a mock location. |
+ * |
+ * Fails frequently. |
+ * Bug 141518 |
+ * @Smoke |
+ * @MediumTest |
+ * @Feature({"Location", "Main"}) |
+ * |
+ * @throws Exception |
+ */ |
+ @FlakyTest |
+ public void testGeolocationPlumbing() throws Exception { |
+ final String url = TestHttpServerClient.getUrl( |
+ "chrome/test/data/geolocation/geolocation_on_load.html"); |
+ |
+ Tab tab = getActivity().getActivityTab(); |
+ final CallbackHelper loadCallback = new CallbackHelper(); |
+ TabObserver observer = new EmptyTabObserver() { |
+ @Override |
+ public void onLoadStopped(Tab tab) { |
+ // If the device has a cached non-mock location, we won't get back our |
+ // lat/long, so checking that it has "#pass" is sufficient. |
+ if (tab.getUrl().startsWith(url + "#pass|")) { |
+ loadCallback.notifyCalled(); |
+ } |
+ } |
+ }; |
+ tab.addObserver(observer); |
+ loadUrl(url); |
+ assertTrue("InfoBar not added.", mListener.addInfoBarAnimationFinished()); |
+ List<InfoBar> infoBars = getActivity().getActivityTab().getInfoBarContainer().getInfoBars(); |
+ assertTrue("OK button wasn't found", InfoBarUtil.clickPrimaryButton(infoBars.get(0))); |
+ |
+ sendLocation(createMockLocation(LATITUDE, LONGITUDE, ACCURACY)); |
+ loadCallback.waitForCallback(0); |
+ tab.removeObserver(observer); |
+ } |
+ |
+ /** |
+ * Verify Geolocation creates an InfoBar and receives multiple locations. |
+ * |
+ * Bug 141518 |
+ * @MediumTest |
+ * @Feature({"Location"}) |
+ * |
+ * @throws Exception |
+ */ |
+ @FlakyTest |
+ public void testGeolocationWatch() throws Exception { |
+ final String url = TestHttpServerClient.getUrl( |
+ "chrome/test/data/geolocation/geolocation_on_load.html"); |
+ |
+ Tab tab = getActivity().getActivityTab(); |
+ final CallbackHelper loadCallback0 = new CallbackHelper(); |
+ TabObserver observer = new EmptyTabObserver() { |
+ @Override |
+ public void onLoadStopped(Tab tab) { |
+ // If the device has a cached non-mock location, we won't get back our |
+ // lat/long, so checking that it has "#pass" is sufficient. |
+ if (tab.getUrl().startsWith(url + "#pass|0|")) { |
+ loadCallback0.notifyCalled(); |
+ } |
+ } |
+ }; |
+ tab.addObserver(observer); |
+ loadUrl(url); |
+ assertTrue("InfoBar not added.", mListener.addInfoBarAnimationFinished()); |
+ |
+ List<InfoBar> infoBars = getActivity().getActivityTab().getInfoBarContainer().getInfoBars(); |
+ assertTrue("OK button wasn't found", InfoBarUtil.clickPrimaryButton(infoBars.get(0))); |
+ |
+ sendLocation(createMockLocation(LATITUDE, LONGITUDE, ACCURACY)); |
+ |
+ loadCallback0.waitForCallback(0); |
+ tab.removeObserver(observer); |
+ |
+ // Send another location: it'll update the URL again, so increase the count. |
+ final CallbackHelper loadCallback1 = new CallbackHelper(); |
+ observer = new EmptyTabObserver() { |
+ @Override |
+ public void onLoadStopped(Tab tab) { |
+ // If the device has a cached non-mock location, we won't get back our |
+ // lat/long, so checking that it has "#pass" is sufficient. |
+ if (tab.getUrl().startsWith(url + "#pass|1|")) { |
+ loadCallback1.notifyCalled(); |
+ } |
+ } |
+ }; |
+ tab.addObserver(observer); |
+ sendLocation(createMockLocation(LATITUDE + 1, LONGITUDE - 1, ACCURACY - 1)); |
+ loadCallback1.waitForCallback(0); |
+ tab.removeObserver(observer); |
+ } |
+ |
+ @Override |
+ public void startMainActivity() throws InterruptedException { |
+ startMainActivityOnBlankPage(); |
+ } |
+ |
+ private Location createMockLocation(double latitude, double longitude, float accuracy) { |
+ Location mockLocation = new Location(LOCATION_PROVIDER_MOCK); |
+ mockLocation.setLatitude(latitude); |
+ mockLocation.setLongitude(longitude); |
+ mockLocation.setAccuracy(accuracy); |
+ mockLocation.setTime(System.currentTimeMillis()); |
+ return mockLocation; |
+ } |
+ |
+ private void sendLocation(final Location location) { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ LocationProviderAdapter.newLocationAvailable( |
+ location.getLatitude(), location.getLongitude(), |
+ location.getTime() / 1000.0, |
+ location.hasAltitude(), location.getAltitude(), |
+ location.hasAccuracy(), location.getAccuracy(), |
+ location.hasBearing(), location.getBearing(), |
+ location.hasSpeed(), location.getSpeed()); |
+ } |
+ }); |
+ } |
+} |