fb4eae6ee1c9af77156b291f68cc922e5ebb3b20
[platform/framework/web/crosswalk.git] / src / xwalk / test / android / core / javatests / src / org / xwalk / core / xwview / test / RendererResponsivenessTest.java
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.
5
6 package org.xwalk.core.xwview.test;
7
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;
13
14 import java.util.concurrent.TimeUnit;
15
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;
21
22 import org.xwalk.core.XWalkView;
23 import org.xwalk.core.internal.XWalkClient;
24 import org.xwalk.core.internal.XWalkViewInternal;
25
26 /**
27  * Renderer responsiveness tests:
28  *
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
32  * user interaction.
33  */
34 public class RendererResponsivenessTest extends XWalkViewTestBase {
35     private OnRendererResponsivenessHelper responsiveHelper = new OnRendererResponsivenessHelper();
36     private OnRendererResponsivenessHelper unresponsiveHelper = new OnRendererResponsivenessHelper();
37
38     @Override
39     public void setUp() throws Exception {
40         super.setUp();
41     }
42
43     //@Feature({"RendererResponsivenessTest"})
44     //@MediumTest
45     @DisabledTest
46     public void testRendererUnresponsive() throws Throwable {
47         setXWalkClient(new XWalkViewTestBase.TestXWalkClient());
48         getXWalkView().setXWalkClient(new XWalkClient(getXWalkView()) {
49             @Override
50             public void onRendererUnresponsive(XWalkViewInternal view) {
51                 unresponsiveHelper.notifyCalled(view);
52             }
53         });
54
55         loadAssetFile("renderHung.html");
56
57         int currentCallCount = unresponsiveHelper.getCallCount();
58         getXWalkView().evaluateJavascript("deadLoopForever();", null);
59
60         /**
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
63          * would be called.
64          */
65         TouchUtils.clickView(this, getXWalkView());
66
67         /**
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
70          * to be called.
71          */
72         unresponsiveHelper.waitForCallback(currentCallCount, 1, 40, TimeUnit.SECONDS);
73         assertEquals(getXWalkView(), unresponsiveHelper.getXWalkView());
74     }
75
76     //@Feature({"RendererResponsivenessTest"})
77     //@MediumTest
78     @DisabledTest
79     public void testRendererResponsiveAgain() throws Throwable {
80         setXWalkClient(new XWalkViewTestBase.TestXWalkClient());
81         getXWalkView().setXWalkClient(new XWalkClient(getXWalkView()) {
82             /**
83              * Called once the renderer become responsive again.
84              */
85             @Override
86             public void onRendererResponsive(XWalkViewInternal view) {
87                 responsiveHelper.notifyCalled(view);
88             }
89         });
90
91         loadAssetFile("renderHung.html");
92
93         int currentCallCount = responsiveHelper.getCallCount();
94         getXWalkView().evaluateJavascript("deadLoopFor40secs();", null);
95
96         /**
97          * Send an input event to start the hung monitor.
98          */
99         TouchUtils.clickView(this, getXWalkView());
100
101         /**
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.
105          */
106         responsiveHelper.waitForCallback(currentCallCount, 1, 50, TimeUnit.SECONDS);
107         assertEquals(getXWalkView(), responsiveHelper.getXWalkView());
108     }
109
110     private final class OnRendererResponsivenessHelper extends CallbackHelper {
111         private XWalkViewInternal mView;
112
113         public void notifyCalled(XWalkViewInternal view) {
114             mView = view;
115             notifyCalled();
116         }
117         public XWalkViewInternal getXWalkView() {
118             assert getCallCount() > 0;
119             return mView;
120         }
121     }
122 }