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.XWalkClient;
23 import org.xwalk.core.XWalkContent;
24 import org.xwalk.core.XWalkView;
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 getXWalkView().setXWalkClient(new ResponsivenessTestClient() {
49 public void onRendererUnresponsive(XWalkView view) {
50 unresponsiveHelper.notifyCalled(view);
54 loadAssetFile("renderHung.html");
56 int currentCallCount = unresponsiveHelper.getCallCount();
58 XWalkContent content = getXWalkView().getXWalkViewContentForTest();
59 content.getContentViewCoreForTest().evaluateJavaScript("deadLoopForever();", null);
62 * Send an input event to xwalk view. Internally, if no ACK message is received
63 * for handling this input event in 30 seconds, onRendererUnresponsive callback
66 TouchUtils.clickView(this, getXWalkView());
69 * The timeout for responsiveness checking is 30 seconds, so here the timeout
70 * for callback is set to 40 seconds to ensure the onRendererResponsive
73 unresponsiveHelper.waitForCallback(currentCallCount, 1, 40, TimeUnit.SECONDS);
74 assertEquals(getXWalkView(), unresponsiveHelper.getXWalkView());
77 //@Feature({"RendererResponsivenessTest"})
80 public void testRendererResponsiveAgain() throws Throwable {
81 getXWalkView().setXWalkClient(new ResponsivenessTestClient() {
83 * Called once the renderer become responsive again.
86 public void onRendererResponsive(XWalkView view) {
87 responsiveHelper.notifyCalled(view);
91 loadAssetFile("renderHung.html");
93 int currentCallCount = responsiveHelper.getCallCount();
94 XWalkContent content = getXWalkView().getXWalkViewContentForTest();
95 content.getContentViewCoreForTest().evaluateJavaScript("deadLoopFor40secs();", null);
98 * Send an input event to start the hung monitor.
100 TouchUtils.clickView(this, getXWalkView());
103 * Wait for onRendererResponsive to called. The dead loop is designed to run
104 * 40 seconds, and here we wait for 50 seconds to ensure it has enough time to
105 * call onRendererResponsive callback.
107 responsiveHelper.waitForCallback(currentCallCount, 1, 50, TimeUnit.SECONDS);
108 assertEquals(getXWalkView(), responsiveHelper.getXWalkView());
111 private final class OnRendererResponsivenessHelper extends CallbackHelper {
112 private XWalkView mView;
114 public void notifyCalled(XWalkView view) {
118 public XWalkView getXWalkView() {
119 assert getCallCount() > 0;
124 private class ResponsivenessTestClient extends XWalkClient {
126 public void onPageStarted(XWalkView view, String url, Bitmap favicon) {
127 mTestContentsClient.onPageStarted(url);
131 public void onPageFinished(XWalkView view, String url) {
132 mTestContentsClient.didFinishLoad(url);