1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
6 package org.xwalk.core.internal.xwview.test;
8 import android.graphics.Bitmap;
9 import android.test.suitebuilder.annotation.MediumTest;
10 import android.util.Log;
11 import android.test.TouchUtils;
12 import android.test.InstrumentationTestCase;
14 import java.util.concurrent.TimeUnit;
16 import org.chromium.content.browser.test.util.CallbackHelper;
17 import org.chromium.base.test.util.DisabledTest;
18 import org.chromium.base.test.util.Feature;
19 import org.chromium.content.browser.ContentView;
20 import org.chromium.content.browser.ContentViewCore;
22 import org.xwalk.core.internal.XWalkClient;
23 import org.xwalk.core.internal.XWalkViewInternal;
26 * Renderer responsiveness tests:
28 * Internally, a hang monitor timer will start for each renderer when there is
29 * an input event sent to the renderer. If the ACK for handling the input event
30 * is not received in 30 seconds, the renderer is deemed to be unresponsive to
33 public class RendererResponsivenessTest extends XWalkViewInternalTestBase {
34 private OnRendererResponsivenessHelper responsiveHelper = new OnRendererResponsivenessHelper();
35 private OnRendererResponsivenessHelper unresponsiveHelper = new OnRendererResponsivenessHelper();
38 public void setUp() throws Exception {
42 //@Feature({"RendererResponsivenessTest"})
45 public void testRendererUnresponsive() throws Throwable {
46 getInstrumentation().runOnMainSync(new Runnable() {
49 getXWalkView().setXWalkClient(new XWalkClient(getXWalkView()) {
51 public void onRendererUnresponsive(XWalkViewInternal view) {
52 unresponsiveHelper.notifyCalled(view);
58 loadAssetFile("renderHung.html");
60 int currentCallCount = unresponsiveHelper.getCallCount();
61 getXWalkView().evaluateJavascript("deadLoopForever();", null);
64 * Send an input event to xwalk view. Internally, if no ACK message is received
65 * for handling this input event in 30 seconds, onRendererUnresponsive callback
68 TouchUtils.clickView(this, getXWalkView());
71 * The timeout for responsiveness checking is 30 seconds, so here the timeout
72 * for callback is set to 40 seconds to ensure the onRendererResponsive
75 unresponsiveHelper.waitForCallback(currentCallCount, 1, 40, TimeUnit.SECONDS);
76 assertEquals(getXWalkView(), unresponsiveHelper.getXWalkView());
79 //@Feature({"RendererResponsivenessTest"})
82 public void testRendererResponsiveAgain() throws Throwable {
83 getInstrumentation().runOnMainSync(new Runnable() {
86 getXWalkView().setXWalkClient(new XWalkClient(getXWalkView()) {
88 public void onRendererResponsive(XWalkViewInternal view) {
89 responsiveHelper.notifyCalled(view);
95 loadAssetFile("renderHung.html");
97 int currentCallCount = responsiveHelper.getCallCount();
98 getXWalkView().evaluateJavascript("deadLoopFor40secs();", null);
101 * Send an input event to start the hung monitor.
103 TouchUtils.clickView(this, getXWalkView());
106 * Wait for onRendererResponsive to called. The dead loop is designed to run
107 * 40 seconds, and here we wait for 50 seconds to ensure it has enough time to
108 * call onRendererResponsive callback.
110 responsiveHelper.waitForCallback(currentCallCount, 1, 50, TimeUnit.SECONDS);
111 assertEquals(getXWalkView(), responsiveHelper.getXWalkView());
114 private final class OnRendererResponsivenessHelper extends CallbackHelper {
115 private XWalkViewInternal mView;
117 public void notifyCalled(XWalkViewInternal view) {
121 public XWalkViewInternal getXWalkView() {
122 assert getCallCount() > 0;