Commit 1072b673 authored by Luis G Garcia's avatar Luis G Garcia Committed by Commit Bot

WebXR: Add camera access instrumentation tests.

Tests:
- Camera image texture is not null after 10 frames.
- Camera image texture is not null after multiple consecutive calls to
getCameraImage().
- No exceptions occur if site deletes camera image texture before API
does.

Bug: 1112356
Change-Id: I0149f47f143f47945312b08164b2064c636c972b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2333306Reviewed-by: default avatarKlaus Weidner <klausw@chromium.org>
Reviewed-by: default avatarPiotr Bialecki <bialpio@chromium.org>
Reviewed-by: default avatarBrian Sheedy <bsheedy@chromium.org>
Commit-Queue: Luis Garcia <luisggarcia@google.com>
Cr-Commit-Position: refs/heads/master@{#795276}
parent a47c7a80
...@@ -1343,6 +1343,7 @@ if (enable_vr || enable_arcore) { ...@@ -1343,6 +1343,7 @@ if (enable_vr || enable_arcore) {
sources = [ sources = [
"javatests/src/org/chromium/chrome/browser/vr/WebXrArAnchorsTest.java", "javatests/src/org/chromium/chrome/browser/vr/WebXrArAnchorsTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrArCameraAccessTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java", "javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java", "javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrArTestFramework.java", "javatests/src/org/chromium/chrome/browser/vr/WebXrArTestFramework.java",
......
// Copyright 2020 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.vr;
import static org.chromium.chrome.browser.vr.WebXrArTestFramework.PAGE_LOAD_TIMEOUT_S;
import static org.chromium.chrome.browser.vr.XrTestFramework.POLL_TIMEOUT_SHORT_MS;
import android.os.Build;
import androidx.test.filters.MediumTest;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
import org.junit.runner.RunWith;
import org.chromium.base.test.params.ParameterAnnotations.ClassParameter;
import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate;
import org.chromium.base.test.params.ParameterSet;
import org.chromium.base.test.params.ParameterizedRunner;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.vr.rules.ArPlaybackFile;
import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
import org.chromium.chrome.browser.vr.util.ArTestRuleUtils;
import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
import java.util.List;
import java.util.concurrent.Callable;
/**
* End-to-end tests for testing WebXR for AR's camera access behavior.
*/
@RunWith(ParameterizedRunner.class)
@UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
"enable-features=WebXRIncubations,LogJsConsoleMessages"})
@MinAndroidSdkLevel(Build.VERSION_CODES.O)
// TODO(https://crbug.com/1112356) Change this to Build.VERSION_CODES.N once N support is added.
public class WebXrArCameraAccessTest {
@ClassParameter
private static List<ParameterSet> sClassParams =
ArTestRuleUtils.generateDefaultTestRuleParameters();
@Rule
public RuleChain mRuleChain;
private ChromeActivityTestRule mTestRule;
private WebXrArTestFramework mWebXrArTestFramework;
public WebXrArCameraAccessTest(Callable<ChromeActivityTestRule> callable) throws Exception {
mTestRule = callable.call();
mRuleChain = ArTestRuleUtils.wrapRuleInActivityRestrictionRule(mTestRule);
}
@Before
public void setUp() {
mWebXrArTestFramework = new WebXrArTestFramework(mTestRule);
}
/**
* Test that getCameraImage(...) returns a valid GLTexture.
*/
@Test
@MediumTest
@XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL})
@ArPlaybackFile("chrome/test/data/xr/ar_playback_datasets/floor_session_12s_30fps.mp4")
public void testCameraAccessImageTextureNotNull() {
mWebXrArTestFramework.loadFileAndAwaitInitialization(
"webxr_test_camera_access", PAGE_LOAD_TIMEOUT_S);
mWebXrArTestFramework.enterSessionWithUserGestureOrFail();
mWebXrArTestFramework.runJavaScriptOrFail(
"stepStartStoringCameraTexture(1)", POLL_TIMEOUT_SHORT_MS);
mWebXrArTestFramework.waitOnJavaScriptStep();
mWebXrArTestFramework.endTest();
}
/**
* Test that multiple consecutive calls to getCameraImage(...) all return a valid GLTexture.
*/
@Test
@MediumTest
@XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL})
@ArPlaybackFile("chrome/test/data/xr/ar_playback_datasets/floor_session_12s_30fps.mp4")
public void testConsecutiveCameraAccessImageTexturesNotNull() {
mWebXrArTestFramework.loadFileAndAwaitInitialization(
"webxr_test_camera_access", PAGE_LOAD_TIMEOUT_S);
mWebXrArTestFramework.enterSessionWithUserGestureOrFail();
mWebXrArTestFramework.runJavaScriptOrFail(
"stepStartStoringCameraTexture(3)", POLL_TIMEOUT_SHORT_MS);
mWebXrArTestFramework.waitOnJavaScriptStep();
mWebXrArTestFramework.endTest();
}
/**
* Test that if a returned WebGL camera image texture is deleted by a site, an exception will
* not be raised when the renderer deletes the texture during OnFrameEnd().
*/
@Test
@MediumTest
@XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL})
@ArPlaybackFile("chrome/test/data/xr/ar_playback_datasets/floor_session_12s_30fps.mp4")
public void testCameraAccessImageTextureCanBeDeleted() {
mWebXrArTestFramework.loadFileAndAwaitInitialization(
"webxr_test_camera_access", PAGE_LOAD_TIMEOUT_S);
mWebXrArTestFramework.enterSessionWithUserGestureOrFail();
mWebXrArTestFramework.runJavaScriptOrFail(
"stepStartStoreAndDeleteCameraTexture()", POLL_TIMEOUT_SHORT_MS);
mWebXrArTestFramework.waitOnJavaScriptStep();
mWebXrArTestFramework.endTest();
}
}
\ No newline at end of file
<!--
Tests that AR camera access returns non-empty GLTexture.
-->
<html>
<head>
<link rel="stylesheet" type="text/css" href="../resources/webxr_e2e.css">
</head>
<body>
<canvas id="webgl-canvas"></canvas>
<script src="../../../../../../third_party/blink/web_tests/resources/testharness.js"></script>
<script src="../resources/webxr_e2e.js"></script>
<script src="../resources/webxr_boilerplate.js"></script>
<script>var shouldAutoCreateNonImmersiveSession = false;</script>
<script>var immersiveArSessionInit = { requiredFeatures: ['camera-access'] };</script>
<script>
setup({single_test: true});
let numPosesFound = 0;
let cameraImageTexture = null;
let ranAtLeastOnce = false;
function stepStartStoringCameraTexture(numCalls) {
const webglCanvas = document.getElementById('webgl-canvas');
const gl = webglCanvas.getContext('webgl', {
xrCompatible: true
});
const sessionInfo = sessionInfos[sessionTypes.AR];
const referenceSpace = sessionInfo.currentRefSpace;
onARFrameCallback = (session, frame) => {
const glBinding = new XRWebGLBinding(session, gl);
const pose = frame.getViewerPose(referenceSpace);
if (pose) {
// Wait several frames to allow the image buffer to be populated by a camera
// texture before attempting to get the camera image texture.
if (numPosesFound >= 10) {
for (let view of pose.cameraViews) {
ranAtLeastOnce = true;
// Used to test that multiple consecutive calls will all return non-null textures.
for (let remainingCalls = numCalls; remainingCalls > 0; remainingCalls--) {
cameraImageTexture = glBinding.getCameraImage(frame, view);
if (cameraImageTexture === null) {
onARFrameCallback = null;
assert_unreached("XRWebGLBinding.getCameraImage(...) returned null texture.");
}
}
}
}
numPosesFound++;
}
if (numPosesFound > 10) {
onARFrameCallback = null;
assert_equals(ranAtLeastOnce, true);
done();
}
};
}
function stepStartStoreAndDeleteCameraTexture() {
const webglCanvas = document.getElementById('webgl-canvas');
const gl = webglCanvas.getContext('webgl', {
xrCompatible: true
});
const sessionInfo = sessionInfos[sessionTypes.AR];
const referenceSpace = sessionInfo.currentRefSpace;
onARFrameCallback = (session, frame) => {
const glBinding = new XRWebGLBinding(session, gl);
const pose = frame.getViewerPose(referenceSpace);
if (pose) {
for (let view of pose.cameraViews) {
ranAtLeastOnce = true;
cameraImageTexture = glBinding.getCameraImage(frame, view);
gl.deleteTexture(cameraImageTexture);
}
numPosesFound++;
}
if (numPosesFound > 10) {
onARFrameCallback = null;
assert_equals(ranAtLeastOnce, true);
done();
}
};
}
</script>
</body>
</html>
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment