ContentViewLocationTest.java revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Copyright 2013 The Chromium Authors. All rights reserved. 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Use of this source code is governed by a BSD-style license that can be 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// found in the LICENSE file. 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpackage org.chromium.content.browser; 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.test.suitebuilder.annotation.MediumTest; 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.chromium.base.test.util.Feature; 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.chromium.content.browser.test.util.Criteria; 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.chromium.content.browser.test.util.CriteriaHelper; 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.chromium.content.browser.test.util.MockLocationProvider; 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.chromium.content.browser.test.util.TestCallbackHelperContainer; 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper; 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.chromium.content_public.browser.LoadUrlParams; 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.chromium.content_shell_apk.ContentShellTestBase; 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/** 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Test suite for ensureing that Geolocation interacts as expected 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * with ContentView APIs - e.g. that it's started and stopped as the 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * ContentView is hidden or shown. 22f24ac5923cbe5e806fac59a0d15e32567553ce8epbos@webrtc.org */ 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic class ContentViewLocationTest extends ContentShellTestBase { 24e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org 25e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org private TestCallbackHelperContainer mTestCallbackHelperContainer; 26c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org private TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper mJavascriptHelper; 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private MockLocationProvider mMockLocationProvider; 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private void hideContentViewOnUiThread() { 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org getInstrumentation().runOnMainSync(new Runnable() { 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @Override 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public void run() { 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org getContentViewCore().onHide(); 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org }); 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private void showContentViewOnUiThread() { 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org getInstrumentation().runOnMainSync(new Runnable() { 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @Override 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public void run() { 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org getContentViewCore().onShow(); 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org }); 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private void pollForPositionCallback() throws Throwable { 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mJavascriptHelper.evaluateJavaScript(getContentViewCore(), 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "positionCount = 0"); 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mJavascriptHelper.waitUntilHasValue(); 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assertEquals(0, Integer.parseInt(mJavascriptHelper.getJsonResultAndClear())); 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @Override 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public boolean isSatisfied() { 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mJavascriptHelper.evaluateJavaScript(getContentViewCore(), "positionCount"); 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org try { 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mJavascriptHelper.waitUntilHasValue(); 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } catch (Exception e) { 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fail(); 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return Integer.parseInt(mJavascriptHelper.getJsonResultAndClear()) > 0; 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org })); 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private void startGeolocationWatchPosition() throws Throwable { 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mJavascriptHelper.evaluateJavaScript(getContentViewCore(), 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "initiate_watchPosition();"); 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mJavascriptHelper.waitUntilHasValue(); 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private void ensureGeolocationRunning(final boolean running) throws Exception { 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @Override 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public boolean isSatisfied() { 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return mMockLocationProvider.isRunning() == running; 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org })); 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @Override 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected void setUp() throws Exception { 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org super.setUp(); 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mMockLocationProvider = new MockLocationProvider(); 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LocationProviderFactory.setLocationProviderImpl(mMockLocationProvider); 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org try { 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org startActivityWithTestUrl("content/geolocation.html"); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } catch (Throwable t) { 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fail(); 93e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org } 94e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org 95e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org mTestCallbackHelperContainer = new TestCallbackHelperContainer(getContentViewCore()); 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mJavascriptHelper = new OnEvaluateJavaScriptResultHelper(); 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 98e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org ensureGeolocationRunning(false); 99e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org } 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @Override 102e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org protected void tearDown() throws Exception { 103e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org mMockLocationProvider.stopUpdates(); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org super.tearDown(); 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 106e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org 107c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org @MediumTest 108c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org @Feature({"Location"}) 109e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org public void testWatchHideShowStop() throws Throwable { 110e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org 111e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org startGeolocationWatchPosition(); 112e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org pollForPositionCallback(); 113e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org ensureGeolocationRunning(true); 114e3d3f0bc3e1705b36b0e53e77452eb0eb5704f94bjornv@webrtc.org 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Now hide the ContentView and ensure that geolocation stops. 116 hideContentViewOnUiThread(); 117 ensureGeolocationRunning(false); 118 119 mJavascriptHelper.evaluateJavaScript(getContentViewCore(), 120 "positionCount = 0"); 121 mJavascriptHelper.waitUntilHasValue(); 122 123 // Show the ContentView again and ensure that geolocation starts again. 124 showContentViewOnUiThread(); 125 pollForPositionCallback(); 126 ensureGeolocationRunning(true); 127 128 // Navigate away and ensure that geolocation stops. 129 loadUrl(getContentViewCore(), mTestCallbackHelperContainer, 130 new LoadUrlParams("about:blank")); 131 ensureGeolocationRunning(false); 132 } 133 134 @MediumTest 135 @Feature({"Location"}) 136 public void testHideWatchResume() throws Throwable { 137 hideContentViewOnUiThread(); 138 startGeolocationWatchPosition(); 139 ensureGeolocationRunning(false); 140 141 showContentViewOnUiThread(); 142 pollForPositionCallback(); 143 ensureGeolocationRunning(true); 144 } 145 146 @MediumTest 147 @Feature({"Location"}) 148 public void testWatchHideNewWatchShow() throws Throwable { 149 startGeolocationWatchPosition(); 150 pollForPositionCallback(); 151 ensureGeolocationRunning(true); 152 153 hideContentViewOnUiThread(); 154 155 // Make sure that when starting a new watch while paused we still don't 156 // start up geolocation until we show the content view again. 157 startGeolocationWatchPosition(); 158 ensureGeolocationRunning(false); 159 160 showContentViewOnUiThread(); 161 pollForPositionCallback(); 162 ensureGeolocationRunning(true); 163 } 164 165 @MediumTest 166 @Feature({"Location"}) 167 public void testHideWatchStopShow() throws Throwable { 168 hideContentViewOnUiThread(); 169 startGeolocationWatchPosition(); 170 ensureGeolocationRunning(false); 171 172 loadUrl(getContentViewCore(), mTestCallbackHelperContainer, 173 new LoadUrlParams("about:blank")); 174 showContentViewOnUiThread(); 175 ensureGeolocationRunning(false); 176 } 177} 178