Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTest.java

Issue 2876223004: Convert Vr tests to JUnit4 (Closed)
Patch Set: Rebase again Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser.vr_shell; 5 package org.chromium.chrome.browser.vr_shell;
6 6
7 import static org.chromium.chrome.browser.vr_shell.VrTestRule.PAGE_LOAD_TIMEOUT_ S;
7 import static org.chromium.chrome.browser.vr_shell.VrUtils.POLL_CHECK_INTERVAL_L ONG_MS; 8 import static org.chromium.chrome.browser.vr_shell.VrUtils.POLL_CHECK_INTERVAL_L ONG_MS;
8 import static org.chromium.chrome.browser.vr_shell.VrUtils.POLL_TIMEOUT_LONG_MS; 9 import static org.chromium.chrome.browser.vr_shell.VrUtils.POLL_TIMEOUT_LONG_MS;
9 import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_D EVICE_DAYDREAM; 10 import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_D EVICE_DAYDREAM;
10 import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_D EVICE_NON_DAYDREAM; 11 import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_D EVICE_NON_DAYDREAM;
11 import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_V IEWER_DAYDREAM; 12 import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_V IEWER_DAYDREAM;
12 13
13 import android.content.pm.ActivityInfo; 14 import android.support.test.InstrumentationRegistry;
14 import android.support.test.filters.MediumTest; 15 import android.support.test.filters.MediumTest;
15 import android.support.test.filters.SmallTest; 16 import android.support.test.filters.SmallTest;
16 import android.view.ViewGroup; 17 import android.view.ViewGroup;
17 18
19 import org.junit.Assert;
20 import org.junit.Before;
21 import org.junit.Rule;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24
18 import org.chromium.base.ThreadUtils; 25 import org.chromium.base.ThreadUtils;
19 import org.chromium.base.test.util.CommandLineFlags; 26 import org.chromium.base.test.util.CommandLineFlags;
20 import org.chromium.base.test.util.Feature;
21 import org.chromium.base.test.util.Restriction; 27 import org.chromium.base.test.util.Restriction;
22 import org.chromium.base.test.util.RetryOnFailure; 28 import org.chromium.base.test.util.RetryOnFailure;
23 import org.chromium.chrome.R; 29 import org.chromium.chrome.R;
30 import org.chromium.chrome.browser.ChromeSwitches;
24 import org.chromium.chrome.browser.compositor.CompositorViewHolder; 31 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
25 import org.chromium.chrome.browser.tabmodel.TabModelSelector; 32 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
26 import org.chromium.chrome.test.util.RenderUtils.ViewRenderer; 33 import org.chromium.chrome.test.ChromeActivityTestRule;
34 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
35 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
27 import org.chromium.content.browser.ContentViewCore; 36 import org.chromium.content.browser.ContentViewCore;
28 import org.chromium.content.browser.test.util.Criteria; 37 import org.chromium.content.browser.test.util.Criteria;
29 import org.chromium.content.browser.test.util.CriteriaHelper; 38 import org.chromium.content.browser.test.util.CriteriaHelper;
30 39
31 import java.io.IOException;
32 import java.util.concurrent.Callable; 40 import java.util.concurrent.Callable;
33 import java.util.concurrent.TimeoutException; 41 import java.util.concurrent.TimeoutException;
34 import java.util.concurrent.atomic.AtomicReference; 42 import java.util.concurrent.atomic.AtomicReference;
35 43
36 /** 44 /**
37 * End-to-end tests for VR browsing, aka "VR Shell". This may require 45 * End-to-end tests for VR browsing, aka "VR Shell". This may require
38 * interacting with WebVR in addition to the VR browser, so inherit from 46 * interacting with WebVR in addition to the VR browser, so inherit from
39 * VrTestBase for the WebVR test framework. 47 * VrTestBase for the WebVR test framework.
40 */ 48 */
41 @CommandLineFlags.Add("enable-features=VrShell") 49 @RunWith(ChromeJUnit4ClassRunner.class)
42 public class VrShellTest extends VrTestBase { 50
43 private static final String GOLDEN_DIR = 51 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
44 "chrome/test/data/android/render_tests"; 52 ChromeActivityTestRule.DISABLE_NETWORK_PREDICTION_FLAG, "enable-features =VrShell"})
53 public class VrShellTest {
54 @Rule
55 public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActi vityTestRule();
45 56
46 private VrShellDelegate mDelegate; 57 private VrShellDelegate mDelegate;
47 private ViewRenderer mViewRenderer;
48 58
49 @Override 59 @Before
50 protected void setUp() throws Exception { 60 public void setUp() throws Exception {
51 super.setUp(); 61 mActivityTestRule.startMainActivityOnBlankPage();
52 mDelegate = VrUtils.getVrShellDelegateInstance(); 62 mDelegate = VrUtils.getVrShellDelegateInstance();
53 } 63 }
54 64
55 @Override
56 public void startMainActivity() throws InterruptedException {
57 startMainActivityOnBlankPage();
58 mViewRenderer = new ViewRenderer(getActivity(),
59 GOLDEN_DIR, this.getClass().getSimpleName());
60 }
61
62 private void enterExitVrMode(boolean supported) { 65 private void enterExitVrMode(boolean supported) {
63 MockVrDaydreamApi mockApi = new MockVrDaydreamApi(); 66 MockVrDaydreamApi mockApi = new MockVrDaydreamApi();
64 if (!supported) { 67 if (!supported) {
65 mDelegate.overrideDaydreamApiForTesting(mockApi); 68 mDelegate.overrideDaydreamApiForTesting(mockApi);
66 } 69 }
67 VrUtils.forceEnterVr(); 70 VrUtils.forceEnterVr();
68 if (supported) { 71 if (supported) {
69 VrUtils.waitForVrSupported(POLL_TIMEOUT_LONG_MS); 72 VrUtils.waitForVrSupported(POLL_TIMEOUT_LONG_MS);
70 assertTrue(VrShellDelegate.isInVr()); 73 Assert.assertTrue(VrShellDelegate.isInVr());
71 } else { 74 } else {
72 assertFalse(mockApi.getLaunchInVrCalled()); 75 Assert.assertFalse(mockApi.getLaunchInVrCalled());
73 assertFalse(VrShellDelegate.isInVr()); 76 Assert.assertFalse(VrShellDelegate.isInVr());
74 } 77 }
75 VrUtils.forceExitVr(mDelegate); 78 VrUtils.forceExitVr(mDelegate);
76 assertFalse(VrShellDelegate.isInVr()); 79 Assert.assertFalse(VrShellDelegate.isInVr());
77 }
78
79 private void enterExitVrModeImage(boolean supported) throws IOException {
80 int prevOrientation = getActivity().getRequestedOrientation();
81 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LA NDSCAPE);
82 getInstrumentation().waitForIdleSync();
83 mViewRenderer.renderAndCompare(
84 getActivity().getWindow().getDecorView().getRootView(),
85 "blank_page");
86
87 VrUtils.forceEnterVr();
88 // Currently, screenshots only show the static UI overlay, not the
89 // actual content. Thus, 1:1 pixel checking is reliable until a
90 // way to take screenshots of VR content is added, in which case
91 // % similarity or some other method will need to be used. We're
92 // assuming that if the UI overlay is visible, then the device has
93 // successfully entered VR mode.
94 if (supported) {
95 VrUtils.waitForVrSupported(POLL_TIMEOUT_LONG_MS);
96 mViewRenderer.renderAndCompare(
97 getActivity().getWindow().getDecorView().getRootView(),
98 "vr_entered");
99 } else {
100 // TODO(bsheedy): Find a good way to wait before taking a screenshot
101 // when running on an unsupported device
102 mViewRenderer.renderAndCompare(
103 getActivity().getWindow().getDecorView().getRootView(),
104 "blank_page");
105 }
106
107 VrUtils.forceExitVr(mDelegate);
108 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LA NDSCAPE);
109 getInstrumentation().waitForIdleSync();
110 mViewRenderer.renderAndCompare(
111 getActivity().getWindow().getDecorView().getRootView(),
112 "blank_page");
113
114 getActivity().setRequestedOrientation(prevOrientation);
115 } 80 }
116 81
117 private void enterVrModeNfc(boolean supported) { 82 private void enterVrModeNfc(boolean supported) {
118 getInstrumentation().waitForIdleSync(); 83 InstrumentationRegistry.getInstrumentation().waitForIdleSync();
119 VrUtils.simNfc(getActivity()); 84 VrUtils.simNfc(mActivityTestRule.getActivity());
120 if (supported) { 85 if (supported) {
121 VrUtils.waitForVrSupported(POLL_TIMEOUT_LONG_MS); 86 VrUtils.waitForVrSupported(POLL_TIMEOUT_LONG_MS);
122 assertTrue(VrShellDelegate.isInVr()); 87 Assert.assertTrue(VrShellDelegate.isInVr());
123 } else { 88 } else {
124 assertFalse(VrShellDelegate.isInVr()); 89 Assert.assertFalse(VrShellDelegate.isInVr());
125 } 90 }
126 VrUtils.forceExitVr(mDelegate); 91 VrUtils.forceExitVr(mDelegate);
127 // TODO(bsheedy): Figure out why NFC tests cause the next test to fail 92 // TODO(bsheedy): Figure out why NFC tests cause the next test to fail
128 // to enter VR unless we sleep for some amount of time after exiting VR 93 // to enter VR unless we sleep for some amount of time after exiting VR
129 // in the NFC test 94 // in the NFC test
130 } 95 }
131 96
132 /** 97 /**
133 * Verifies that browser successfully enters VR mode when Daydream headset 98 * Verifies that browser successfully enters VR mode when Daydream headset
134 * NFC tag is scanned on a Daydream-ready device. Requires that the phone 99 * NFC tag is scanned on a Daydream-ready device. Requires that the phone
135 * is unlocked. 100 * is unlocked.
136 */ 101 */
102 @Test
137 @Restriction({RESTRICTION_TYPE_DEVICE_DAYDREAM, RESTRICTION_TYPE_VIEWER_DAYD REAM}) 103 @Restriction({RESTRICTION_TYPE_DEVICE_DAYDREAM, RESTRICTION_TYPE_VIEWER_DAYD REAM})
138 @MediumTest 104 @MediumTest
139 public void testSimNfcSupported() { 105 public void testSimNfcSupported() {
140 enterVrModeNfc(true); 106 enterVrModeNfc(true);
141 } 107 }
142 108
143 /** 109 /**
144 * Verifies that the browser does not enter VR mode on Non-Daydream-ready 110 * Verifies that the browser does not enter VR mode on Non-Daydream-ready
145 * devices when the Daydream headset NFC tag is scanned. 111 * devices when the Daydream headset NFC tag is scanned.
146 */ 112 */
113 @Test
147 @Restriction(RESTRICTION_TYPE_DEVICE_NON_DAYDREAM) 114 @Restriction(RESTRICTION_TYPE_DEVICE_NON_DAYDREAM)
148 @SmallTest 115 @SmallTest
149 public void testSimNfcUnsupported() { 116 public void testSimNfcUnsupported() {
150 enterVrModeNfc(false); 117 enterVrModeNfc(false);
151 } 118 }
152 119
153 /** 120 /**
154 * Verifies that browser successfully enters and exits VR mode when told to 121 * Verifies that browser successfully enters and exits VR mode when told to
155 * on Daydream-ready devices. Requires that the phone is unlocked. 122 * on Daydream-ready devices. Requires that the phone is unlocked.
156 */ 123 */
124 @Test
157 @Restriction(RESTRICTION_TYPE_DEVICE_DAYDREAM) 125 @Restriction(RESTRICTION_TYPE_DEVICE_DAYDREAM)
158 @SmallTest 126 @SmallTest
159 public void testEnterExitVrModeSupported() { 127 public void testEnterExitVrModeSupported() {
160 enterExitVrMode(true); 128 enterExitVrMode(true);
161 } 129 }
162 130
163 /** 131 /**
164 * Verifies that browser does not enter VR mode on Non-Daydream-ready device s. 132 * Verifies that browser does not enter VR mode on Non-Daydream-ready device s.
165 */ 133 */
134 @Test
166 @Restriction(RESTRICTION_TYPE_DEVICE_NON_DAYDREAM) 135 @Restriction(RESTRICTION_TYPE_DEVICE_NON_DAYDREAM)
167 @SmallTest 136 @SmallTest
168 public void testEnterExitVrModeUnsupported() { 137 public void testEnterExitVrModeUnsupported() {
169 enterExitVrMode(false); 138 enterExitVrMode(false);
170 } 139 }
171 140
172 /** 141 /**
173 * Verifies that browser successfully enters and exits VR mode when told to
174 * on Daydream-ready devices via a screendiffing check.
175 * Requires that the phone is unlocked.
176 */
177 @Restriction(RESTRICTION_TYPE_DEVICE_DAYDREAM)
178 @Feature("RenderTest")
179 @MediumTest
180 public void testEnterExitVrModeSupportedImage() throws IOException {
181 enterExitVrModeImage(true);
182 }
183
184 /**
185 * Verifies that browser does not enter VR mode on Non-Daydream-ready device s
186 * via a screendiffing check. Requires that the phone is unlocked.
187 */
188 @Restriction(RESTRICTION_TYPE_DEVICE_NON_DAYDREAM)
189 @Feature("RenderTest")
190 @MediumTest
191 public void testEnterExitVrModeUnsupportedImage() throws IOException {
192 enterExitVrModeImage(false);
193 }
194
195 /**
196 * Verifies that swiping up/down on the Daydream controller's touchpad scrol ls 142 * Verifies that swiping up/down on the Daydream controller's touchpad scrol ls
197 * the webpage while in the VR browser. 143 * the webpage while in the VR browser.
198 */ 144 */
145 @Test
199 @Restriction({RESTRICTION_TYPE_DEVICE_DAYDREAM, RESTRICTION_TYPE_VIEWER_DAYD REAM}) 146 @Restriction({RESTRICTION_TYPE_DEVICE_DAYDREAM, RESTRICTION_TYPE_VIEWER_DAYD REAM})
200 @MediumTest 147 @MediumTest
201 public void testControllerScrolling() throws InterruptedException { 148 public void testControllerScrolling() throws InterruptedException {
202 // Load page in VR and make sure the controller is pointed at the conten t quad 149 // Load page in VR and make sure the controller is pointed at the conten t quad
203 loadUrl("chrome://credits", PAGE_LOAD_TIMEOUT_S); 150 mActivityTestRule.loadUrl("chrome://credits", PAGE_LOAD_TIMEOUT_S);
204 VrUtils.forceEnterVr(); 151 VrUtils.forceEnterVr();
205 VrUtils.waitForVrSupported(POLL_TIMEOUT_LONG_MS); 152 VrUtils.waitForVrSupported(POLL_TIMEOUT_LONG_MS);
206 EmulatedVrController controller = new EmulatedVrController(getActivity() ); 153 EmulatedVrController controller = new EmulatedVrController(mActivityTest Rule.getActivity());
207 final ContentViewCore cvc = getActivity().getActivityTab().getActiveCont entViewCore(); 154 final ContentViewCore cvc =
155 mActivityTestRule.getActivity().getActivityTab().getActiveConten tViewCore();
208 controller.recenterView(); 156 controller.recenterView();
209 157
210 // Wait for the page to be scrollable 158 // Wait for the page to be scrollable
211 CriteriaHelper.pollUiThread(new Criteria() { 159 CriteriaHelper.pollUiThread(new Criteria() {
212 @Override 160 @Override
213 public boolean isSatisfied() { 161 public boolean isSatisfied() {
214 return cvc.computeVerticalScrollRange() > cvc.getContainerView() .getHeight(); 162 return cvc.computeVerticalScrollRange() > cvc.getContainerView() .getHeight();
215 } 163 }
216 }, POLL_TIMEOUT_LONG_MS, POLL_CHECK_INTERVAL_LONG_MS); 164 }, POLL_TIMEOUT_LONG_MS, POLL_CHECK_INTERVAL_LONG_MS);
217 165
218 // Test that scrolling down works 166 // Test that scrolling down works
219 int startScrollY = cvc.getNativeScrollYForTest(); 167 int startScrollY = cvc.getNativeScrollYForTest();
220 // Arbitrary, but valid values to scroll smoothly 168 // Arbitrary, but valid values to scroll smoothly
221 int scrollSteps = 20; 169 int scrollSteps = 20;
222 int scrollSpeed = 60; 170 int scrollSpeed = 60;
223 controller.scrollDown(scrollSteps, scrollSpeed); 171 controller.scrollDown(scrollSteps, scrollSpeed);
224 int endScrollY = cvc.getNativeScrollYForTest(); 172 int endScrollY = cvc.getNativeScrollYForTest();
225 assertTrue("Controller was able to scroll down", startScrollY < endScrol lY); 173 Assert.assertTrue("Controller was able to scroll down", startScrollY < e ndScrollY);
226 174
227 // Test that scrolling up works 175 // Test that scrolling up works
228 startScrollY = endScrollY; 176 startScrollY = endScrollY;
229 controller.scrollUp(scrollSteps, scrollSpeed); 177 controller.scrollUp(scrollSteps, scrollSpeed);
230 endScrollY = cvc.getNativeScrollYForTest(); 178 endScrollY = cvc.getNativeScrollYForTest();
231 assertTrue("Controller was able to scroll up", startScrollY > endScrollY ); 179 Assert.assertTrue("Controller was able to scroll up", startScrollY > end ScrollY);
232 } 180 }
233 181
234 /** 182 /**
235 * Verify that resizing the CompositorViewHolder does not cause the current tab to resize while 183 * Verify that resizing the CompositorViewHolder does not cause the current tab to resize while
236 * the CompositorViewHolder is detached from the TabModelSelector. See crbug .com/680240. 184 * the CompositorViewHolder is detached from the TabModelSelector. See crbug .com/680240.
237 * @throws InterruptedException 185 * @throws InterruptedException
238 * @throws TimeoutException 186 * @throws TimeoutException
239 */ 187 */
188 @Test
240 @SmallTest 189 @SmallTest
241 @RetryOnFailure 190 @RetryOnFailure
242 public void testResizeWithCompositorViewHolderDetached() 191 public void testResizeWithCompositorViewHolderDetached()
243 throws InterruptedException, TimeoutException { 192 throws InterruptedException, TimeoutException {
244 final AtomicReference<TabModelSelector> selector = new AtomicReference<> (); 193 final AtomicReference<TabModelSelector> selector = new AtomicReference<> ();
245 final AtomicReference<Integer> oldWidth = new AtomicReference<>(); 194 final AtomicReference<Integer> oldWidth = new AtomicReference<>();
246 final int testWidth = 123; 195 final int testWidth = 123;
247 final ContentViewCore cvc = getActivity().getActivityTab().getActiveCont entViewCore(); 196 final ContentViewCore cvc =
197 mActivityTestRule.getActivity().getActivityTab().getActiveConten tViewCore();
248 198
249 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 199 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
250 @Override 200 @Override
251 public void run() { 201 public void run() {
252 CompositorViewHolder compositorViewHolder = (CompositorViewHolde r) 202 CompositorViewHolder compositorViewHolder =
253 getActivity().findViewById(R.id.compositor_view_holder); 203 (CompositorViewHolder) mActivityTestRule.getActivity().f indViewById(
204 R.id.compositor_view_holder);
254 selector.set(compositorViewHolder.detachForVr()); 205 selector.set(compositorViewHolder.detachForVr());
255 oldWidth.set(cvc.getViewportWidthPix()); 206 oldWidth.set(cvc.getViewportWidthPix());
256 207
257 ViewGroup.LayoutParams layoutParams = compositorViewHolder.getLa youtParams(); 208 ViewGroup.LayoutParams layoutParams = compositorViewHolder.getLa youtParams();
258 layoutParams.width = testWidth; 209 layoutParams.width = testWidth;
259 layoutParams.height = 456; 210 layoutParams.height = 456;
260 compositorViewHolder.requestLayout(); 211 compositorViewHolder.requestLayout();
261 } 212 }
262 }); 213 });
263 CriteriaHelper.pollUiThread(Criteria.equals(testWidth, new Callable<Inte ger>() { 214 CriteriaHelper.pollUiThread(Criteria.equals(testWidth, new Callable<Inte ger>() {
264 @Override 215 @Override
265 public Integer call() { 216 public Integer call() {
266 return getActivity().findViewById(R.id.compositor_view_holder).g etMeasuredWidth(); 217 return mActivityTestRule.getActivity()
218 .findViewById(R.id.compositor_view_holder)
219 .getMeasuredWidth();
267 } 220 }
268 })); 221 }));
269 222
270 assertEquals("Viewport width should not have changed when resizing a det ached " 223 Assert.assertEquals("Viewport width should not have changed when resizin g a detached "
271 + "CompositorViewHolder", 224 + "CompositorViewHolder",
272 cvc.getViewportWidthPix(), 225 cvc.getViewportWidthPix(), oldWidth.get().intValue());
273 oldWidth.get().intValue());
274 226
275 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 227 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
276 @Override 228 @Override
277 public void run() { 229 public void run() {
278 CompositorViewHolder compositorViewHolder = (CompositorViewHolde r) getActivity() 230 CompositorViewHolder compositorViewHolder =
279 .findViewById(R.id.compositor_view_holder); 231 (CompositorViewHolder) mActivityTestRule.getActivity().f indViewById(
232 R.id.compositor_view_holder);
280 compositorViewHolder.onExitVr(selector.get()); 233 compositorViewHolder.onExitVr(selector.get());
281 } 234 }
282 }); 235 });
283 236
284 CriteriaHelper.pollUiThread(Criteria.equals(testWidth, new Callable<Inte ger>() { 237 CriteriaHelper.pollUiThread(Criteria.equals(testWidth, new Callable<Inte ger>() {
285 @Override 238 @Override
286 public Integer call() { 239 public Integer call() {
287 return cvc.getViewportWidthPix(); 240 return cvc.getViewportWidthPix();
288 } 241 }
289 })); 242 }));
290 } 243 }
291 } 244 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698