1// Copyright 2013 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.content.Context;
8import android.test.suitebuilder.annotation.MediumTest;
9import android.test.suitebuilder.annotation.SmallTest;
10
11import org.chromium.android_webview.AwBrowserProcess;
12import org.chromium.android_webview.AwContents;
13import org.chromium.android_webview.AwCookieManager;
14import org.chromium.android_webview.AwWebResourceResponse;
15import org.chromium.android_webview.test.util.CommonResources;
16import org.chromium.android_webview.test.util.CookieUtils;
17import org.chromium.base.test.util.Feature;
18import org.chromium.content.app.ContentMain;
19import org.chromium.net.test.util.TestWebServer;
20
21
22/**
23 * Tests for CookieManager/Chromium startup ordering weirdness.
24 */
25public class CookieManagerStartupTest extends AwTestBase {
26
27    private TestAwContentsClient mContentsClient;
28    private AwContents mAwContents;
29
30    @Override
31    protected void setUp() throws Exception {
32        super.setUp();
33        ContentMain.initApplicationContext(getActivity().getApplicationContext());
34    }
35
36    @Override
37    protected boolean needsBrowserProcessStarted() {
38        return false;
39    }
40
41    private void startChromium() throws Exception {
42        startChromiumWithClient(new TestAwContentsClient());
43    }
44
45    private void startChromiumWithClient(TestAwContentsClient contentsClient) throws Exception {
46        final Context context = getActivity();
47        getInstrumentation().runOnMainSync(new Runnable() {
48            @Override
49            public void run() {
50                AwBrowserProcess.start(context);
51            }
52        });
53
54        mContentsClient = contentsClient;
55        final AwTestContainerView testContainerView =
56                createAwTestContainerViewOnMainSync(mContentsClient);
57        mAwContents = testContainerView.getAwContents();
58        mAwContents.getSettings().setJavaScriptEnabled(true);
59    }
60
61    @MediumTest
62    @Feature({"AndroidWebView"})
63    public void testStartup() throws Throwable {
64        TestWebServer webServer = null;
65        try {
66            webServer = new TestWebServer(false);
67            String path = "/cookie_test.html";
68            String url = webServer.setResponse(path, CommonResources.ABOUT_HTML, null);
69
70            AwCookieManager cookieManager = new AwCookieManager();
71            assertNotNull(cookieManager);
72
73            CookieUtils.clearCookies(this, cookieManager);
74            assertFalse(cookieManager.hasCookies());
75
76            cookieManager.setAcceptCookie(true);
77            assertTrue(cookieManager.acceptCookie());
78
79            cookieManager.setCookie(url, "count=41");
80
81            startChromium();
82            loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
83            executeJavaScriptAndWaitForResult(
84                    mAwContents,
85                    mContentsClient,
86                    "var c=document.cookie.split('=');document.cookie=c[0]+'='+(1+(+c[1]));");
87
88            assertEquals("count=42", cookieManager.getCookie(url));
89        } finally {
90            if (webServer != null) webServer.shutdown();
91        }
92    }
93
94    @SmallTest
95    @Feature({"AndroidWebView", "Privacy"})
96    public void testAllowFileSchemeCookies() throws Throwable {
97        AwCookieManager cookieManager = new AwCookieManager();
98        assertFalse(cookieManager.allowFileSchemeCookies());
99        cookieManager.setAcceptFileSchemeCookies(true);
100        assertTrue(cookieManager.allowFileSchemeCookies());
101        cookieManager.setAcceptFileSchemeCookies(false);
102        assertFalse(cookieManager.allowFileSchemeCookies());
103    }
104
105    @SmallTest
106    @Feature({"AndroidWebView", "Privacy"})
107    public void testAllowCookies() throws Throwable {
108        AwCookieManager cookieManager = new AwCookieManager();
109        assertTrue(cookieManager.acceptCookie());
110        cookieManager.setAcceptCookie(false);
111        assertFalse(cookieManager.acceptCookie());
112        cookieManager.setAcceptCookie(true);
113        assertTrue(cookieManager.acceptCookie());
114    }
115
116    // https://code.google.com/p/chromium/issues/detail?id=374203
117    @MediumTest
118    @Feature({"AndroidWebView"})
119    public void testShouldInterceptRequestDeadlock() throws Throwable {
120        String url = "http://www.example.com";
121        TestAwContentsClient contentsClient = new TestAwContentsClient() {
122            @Override
123            public AwWebResourceResponse shouldInterceptRequest(
124                    ShouldInterceptRequestParams params) {
125                (new AwCookieManager()).getCookie("www.example.com");
126                return null;
127            }
128        };
129        startChromiumWithClient(contentsClient);
130        loadUrlSync(mAwContents, contentsClient.getOnPageFinishedHelper(), url);
131    }
132}
133