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