1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.android_webview.test;
6
7import android.test.suitebuilder.annotation.SmallTest;
8import android.util.Log;
9
10import org.chromium.android_webview.AwContents;
11import org.chromium.android_webview.AwWebContentsDelegate;
12import org.chromium.base.test.util.Feature;
13
14/**
15 * Tests for the ContentViewClient.addMessageToConsole() method.
16 */
17public class ClientAddMessageToConsoleTest extends AwTestBase {
18
19    // Line number at which the console message is logged in the page returned by the
20    // getLogMessageJavaScriptData method.
21    private static final int LOG_MESSAGE_JAVASCRIPT_DATA_LINE_NUMBER = 4;
22
23    private static final String TEST_MESSAGE_ONE = "Test message one.";
24    private static final String TEST_MESSAGE_TWO = "The second test message.";
25
26    private TestAwContentsClient mContentsClient;
27    private AwContents mAwContents;
28
29    @Override
30    public void setUp() throws Exception {
31        super.setUp();
32        mContentsClient = new TestAwContentsClient();
33        final AwTestContainerView testContainerView =
34                createAwTestContainerViewOnMainSync(mContentsClient);
35        mAwContents = testContainerView.getAwContents();
36
37        getInstrumentation().runOnMainSync(new Runnable() {
38            @Override
39            public void run() {
40                mAwContents.getSettings().setJavaScriptEnabled(true);
41            }
42        });
43    }
44
45    private static String getLogMessageJavaScriptData(String consoleLogMethod, String message) {
46        // The %0A sequence is an encoded newline and is needed to test the source line number.
47        return "<html>%0A" +
48                  "<body>%0A" +
49                    "<script>%0A" +
50                      "console." + consoleLogMethod + "('" + message + "');%0A" +
51                    "</script>%0A" +
52                    "<div>%0A" +
53                      "Logging the message [" + message + "] using console." + consoleLogMethod +
54                      " method. " +
55                    "</div>%0A" +
56                 "</body>%0A" +
57               "</html>";
58    }
59
60    @SmallTest
61    @Feature({"AndroidWebView"})
62    public void testAddMessageToConsoleCalledWithCorrectLevel() throws Throwable {
63        TestAwContentsClient.AddMessageToConsoleHelper addMessageToConsoleHelper =
64                mContentsClient.getAddMessageToConsoleHelper();
65
66        int callCount = addMessageToConsoleHelper.getCallCount();
67        loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
68                     getLogMessageJavaScriptData("error", "msg"),
69                     "text/html", false);
70        addMessageToConsoleHelper.waitForCallback(callCount);
71        assertEquals(AwWebContentsDelegate.LOG_LEVEL_ERROR ,
72                addMessageToConsoleHelper.getLevel());
73
74        callCount = addMessageToConsoleHelper.getCallCount();
75        loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
76                     getLogMessageJavaScriptData("warn", "msg"),
77                     "text/html", false);
78        addMessageToConsoleHelper.waitForCallback(callCount);
79        assertEquals(AwWebContentsDelegate.LOG_LEVEL_WARNING ,
80                addMessageToConsoleHelper.getLevel());
81
82        callCount = addMessageToConsoleHelper.getCallCount();
83        loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
84                     getLogMessageJavaScriptData("log", "msg"),
85                     "text/html", false);
86        addMessageToConsoleHelper.waitForCallback(callCount);
87        assertEquals(AwWebContentsDelegate.LOG_LEVEL_LOG ,
88                addMessageToConsoleHelper.getLevel());
89
90        // Can't test LOG_LEVEL_TIP as there's no way to generate a message at that log level
91        // directly using JavaScript.
92    }
93
94    @SmallTest
95    @Feature({"AndroidWebView"})
96    public void testAddMessageToConsoleCalledWithCorrectMessage() throws Throwable {
97        TestAwContentsClient.AddMessageToConsoleHelper addMessageToConsoleHelper =
98                mContentsClient.getAddMessageToConsoleHelper();
99
100        int callCount = addMessageToConsoleHelper.getCallCount();
101        loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
102                     getLogMessageJavaScriptData("log", TEST_MESSAGE_ONE),
103                     "text/html", false);
104        Log.w("test", getLogMessageJavaScriptData("log", TEST_MESSAGE_ONE));
105        addMessageToConsoleHelper.waitForCallback(callCount);
106        assertEquals(TEST_MESSAGE_ONE, addMessageToConsoleHelper.getMessage());
107
108        callCount = addMessageToConsoleHelper.getCallCount();
109        loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
110                     getLogMessageJavaScriptData("log", TEST_MESSAGE_TWO),
111                     "text/html", false);
112        addMessageToConsoleHelper.waitForCallback(callCount);
113        assertEquals(TEST_MESSAGE_TWO, addMessageToConsoleHelper.getMessage());
114    }
115
116    @SmallTest
117    @Feature({"AndroidWebView"})
118    public void testAddMessageToConsoleCalledWithCorrectLineAndSource() throws Throwable {
119        TestAwContentsClient.AddMessageToConsoleHelper addMessageToConsoleHelper =
120                mContentsClient.getAddMessageToConsoleHelper();
121
122        int callCount = addMessageToConsoleHelper.getCallCount();
123        String data = getLogMessageJavaScriptData("log", TEST_MESSAGE_ONE);
124        loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
125                     data, "text/html", false);
126        addMessageToConsoleHelper.waitForCallback(callCount);
127        assertTrue("Url [" + addMessageToConsoleHelper.getSourceId() + "] expected to end with [" +
128                   data + "].", addMessageToConsoleHelper.getSourceId().endsWith(data));
129        assertEquals(LOG_MESSAGE_JAVASCRIPT_DATA_LINE_NUMBER,
130                     addMessageToConsoleHelper.getLineNumber());
131    }
132}
133