Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / android_webview / javatests / src / org / chromium / android_webview / test / SaveRestoreStateTest.java
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
5 package org.chromium.android_webview.test;
6
7 import android.os.Bundle;
8 import android.test.suitebuilder.annotation.SmallTest;
9
10 import org.chromium.android_webview.AwContents;
11 import org.chromium.android_webview.test.util.CommonResources;
12 import org.chromium.base.test.util.Feature;
13 import org.chromium.content_public.browser.NavigationController;
14 import org.chromium.content_public.browser.NavigationHistory;
15 import org.chromium.net.test.util.TestWebServer;
16
17 import java.util.concurrent.Callable;
18
19 /**
20  * Tests for the {@link android.webkit.WebView#saveState} and
21  * {@link android.webkit.WebView#restoreState} APIs.
22  */
23 public class SaveRestoreStateTest extends AwTestBase {
24     private static class TestVars {
25         public final TestAwContentsClient contentsClient;
26         public final AwTestContainerView testView;
27         public final AwContents awContents;
28         public final NavigationController navigationController;
29
30         public TestVars(TestAwContentsClient contentsClient,
31                         AwTestContainerView testView) {
32             this.contentsClient = contentsClient;
33             this.testView = testView;
34             this.awContents = testView.getAwContents();
35             this.navigationController = this.awContents.getNavigationController();
36         }
37     }
38
39     private TestVars createNewView() throws Exception {
40         TestAwContentsClient contentsClient = new TestAwContentsClient();
41         AwTestContainerView testView = createAwTestContainerViewOnMainSync(contentsClient);
42         return new TestVars(contentsClient, testView);
43     }
44
45     private TestVars mVars;
46     private TestWebServer mWebServer;
47
48     private static final int NUM_NAVIGATIONS = 3;
49     private static final String TITLES[] = {
50         "page 1 title foo",
51         "page 2 title bar",
52         "page 3 title baz"
53     };
54     private static final String PATHS[] = {
55         "/p1foo.html",
56         "/p2bar.html",
57         "/p3baz.html",
58     };
59
60     private String mUrls[];
61
62     @Override
63     public void setUp() throws Exception {
64         super.setUp();
65         mVars = createNewView();
66         mUrls = new String[NUM_NAVIGATIONS];
67         mWebServer = TestWebServer.start();
68     }
69
70     @Override
71     public void tearDown() throws Exception {
72         if (mWebServer != null) {
73             mWebServer.shutdown();
74         }
75         super.tearDown();
76     }
77
78     private void setServerResponseAndLoad(TestVars vars, int upto) throws Throwable {
79         for (int i = 0; i < upto; ++i) {
80             String html = CommonResources.makeHtmlPageFrom(
81                     "<title>" + TITLES[i] + "</title>",
82                     "");
83             mUrls[i] = mWebServer.setResponse(PATHS[i], html, null);
84
85             loadUrlSync(vars.awContents,
86                         vars.contentsClient.getOnPageFinishedHelper(),
87                         mUrls[i]);
88         }
89     }
90
91     private NavigationHistory getNavigationHistoryOnUiThread(
92             final TestVars vars) throws Throwable {
93         return runTestOnUiThreadAndGetResult(new Callable<NavigationHistory>() {
94             @Override
95             public NavigationHistory call() throws Exception {
96                 return vars.navigationController.getNavigationHistory();
97             }
98         });
99     }
100
101     private void checkHistoryItemList(TestVars vars) throws Throwable {
102         NavigationHistory history = getNavigationHistoryOnUiThread(vars);
103         assertEquals(NUM_NAVIGATIONS, history.getEntryCount());
104         assertEquals(NUM_NAVIGATIONS - 1, history.getCurrentEntryIndex());
105
106         // Note this is not meant to be a thorough test of NavigationHistory,
107         // but is only meant to test enough to make sure state is restored.
108         // See NavigationHistoryTest for more thorough tests.
109         for (int i = 0; i < NUM_NAVIGATIONS; ++i) {
110             assertEquals(mUrls[i], history.getEntryAtIndex(i).getOriginalUrl());
111             assertEquals(mUrls[i], history.getEntryAtIndex(i).getUrl());
112             assertEquals(TITLES[i], history.getEntryAtIndex(i).getTitle());
113         }
114     }
115
116     private TestVars saveAndRestoreStateOnUiThread(final TestVars vars) throws Throwable {
117         final TestVars restoredVars = createNewView();
118         getInstrumentation().runOnMainSync(new Runnable() {
119             @Override
120             public void run() {
121                 Bundle bundle = new Bundle();
122                 boolean result = vars.awContents.saveState(bundle);
123                 assertTrue(result);
124                 result = restoredVars.awContents.restoreState(bundle);
125                 assertTrue(result);
126             }
127         });
128         return restoredVars;
129     }
130
131     @SmallTest
132     @Feature({"AndroidWebView"})
133     public void testSaveRestoreStateWithTitle() throws Throwable {
134         setServerResponseAndLoad(mVars, 1);
135         final TestVars restoredVars = saveAndRestoreStateOnUiThread(mVars);
136         pollOnUiThread(new Callable<Boolean>() {
137             @Override
138             public Boolean call() throws Exception {
139                 return TITLES[0].equals(restoredVars.awContents.getTitle()) &&
140                        TITLES[0].equals(restoredVars.contentsClient.getUpdatedTitle());
141             }
142         });
143     }
144
145     @SmallTest
146     @Feature({"AndroidWebView"})
147     public void testSaveRestoreStateWithHistoryItemList() throws Throwable {
148         setServerResponseAndLoad(mVars, NUM_NAVIGATIONS);
149         TestVars restoredVars = saveAndRestoreStateOnUiThread(mVars);
150         checkHistoryItemList(restoredVars);
151     }
152
153     @SmallTest
154     @Feature({"AndroidWebView"})
155     public void testRestoreFromInvalidStateFails() throws Throwable {
156         final Bundle invalidState = new Bundle();
157         invalidState.putByteArray(AwContents.SAVE_RESTORE_STATE_KEY,
158                                   "invalid state".getBytes());
159         boolean result = runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
160             @Override
161             public Boolean call() throws Exception {
162                 return mVars.awContents.restoreState(invalidState);
163             }
164         });
165         assertFalse(result);
166     }
167
168     @SmallTest
169     @Feature({"AndroidWebView"})
170     public void testSaveStateForNoNavigationFails() throws Throwable {
171         final Bundle state = new Bundle();
172         boolean result = runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
173             @Override
174             public Boolean call() throws Exception {
175                 return mVars.awContents.restoreState(state);
176             }
177         });
178         assertFalse(result);
179     }
180 }