1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Copyright (c) 2013 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.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.XWalkView;
23 import org.xwalk.core.internal.XWalkClient;
24 import org.xwalk.core.internal.XWalkViewInternal;
27 * Renderer responsiveness tests:
29 * Internally, a hang monitor timer will start for each renderer when there is
30 * an input event sent to the renderer. If the ACK for handling the input event
31 * is not received in 30 seconds, the renderer is deemed to be unresponsive to
34 public class RendererResponsivenessTest extends XWalkViewTestBase {
35 private OnRendererResponsivenessHelper responsiveHelper = new OnRendererResponsivenessHelper();
36 private OnRendererResponsivenessHelper unresponsiveHelper = new OnRendererResponsivenessHelper();
39 public void setUp() throws Exception {
43 //@Feature({"RendererResponsivenessTest"})
46 public void testRendererUnresponsive() throws Throwable {
47 setXWalkClient(new XWalkViewTestBase.TestXWalkClient());
48 getXWalkView().setXWalkClient(new XWalkClient(getXWalkView()) {
50 public void onRendererUnresponsive(XWalkViewInternal view) {
51 unresponsiveHelper.notifyCalled(view);
55 loadAssetFile("renderHung.html");
57 int currentCallCount = unresponsiveHelper.getCallCount();
58 getXWalkView().evaluateJavascript("deadLoopForever();", null);
61 * Send an input event to xwalk view. Internally, if no ACK message is received
62 * for handling this input event in 30 seconds, onRendererUnresponsive callback
65 TouchUtils.clickView(this, getXWalkView());
68 * The timeout for responsiveness checking is 30 seconds, so here the timeout
69 * for callback is set to 40 seconds to ensure the onRendererResponsive
72 unresponsiveHelper.waitForCallback(currentCallCount, 1, 40, TimeUnit.SECONDS);
73 assertEquals(getXWalkView(), unresponsiveHelper.getXWalkView());
76 //@Feature({"RendererResponsivenessTest"})
79 public void testRendererResponsiveAgain() throws Throwable {
80 setXWalkClient(new XWalkViewTestBase.TestXWalkClient());
81 getXWalkView().setXWalkClient(new XWalkClient(getXWalkView()) {
83 * Called once the renderer become responsive again.
86 public void onRendererResponsive(XWalkViewInternal view) {
87 responsiveHelper.notifyCalled(view);
91 loadAssetFile("renderHung.html");
93 int currentCallCount = responsiveHelper.getCallCount();
94 getXWalkView().evaluateJavascript("deadLoopFor40secs();", null);
97 * Send an input event to start the hung monitor.
99 TouchUtils.clickView(this, getXWalkView());
102 * Wait for onRendererResponsive to called. The dead loop is designed to run
103 * 40 seconds, and here we wait for 50 seconds to ensure it has enough time to
104 * call onRendererResponsive callback.
106 responsiveHelper.waitForCallback(currentCallCount, 1, 50, TimeUnit.SECONDS);
107 assertEquals(getXWalkView(), responsiveHelper.getXWalkView());
110 private final class OnRendererResponsivenessHelper extends CallbackHelper {
111 private XWalkViewInternal mView;
113 public void notifyCalled(XWalkViewInternal view) {
117 public XWalkViewInternal getXWalkView() {
118 assert getCallCount() > 0;