OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 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.chrome.browser; |
| 6 |
| 7 import android.support.test.filters.LargeTest; |
| 8 |
| 9 import org.chromium.base.Callback; |
| 10 import org.chromium.base.ThreadUtils; |
| 11 import org.chromium.base.test.util.CallbackHelper; |
| 12 import org.chromium.base.test.util.CommandLineFlags; |
| 13 import org.chromium.base.test.util.Feature; |
| 14 import org.chromium.base.test.util.Restriction; |
| 15 import org.chromium.blink.mojom.document_metadata.Entity; |
| 16 import org.chromium.blink.mojom.document_metadata.Property; |
| 17 import org.chromium.blink.mojom.document_metadata.Values; |
| 18 import org.chromium.blink.mojom.document_metadata.WebPage; |
| 19 import org.chromium.chrome.browser.firstrun.FirstRunStatus; |
| 20 import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
| 21 import org.chromium.chrome.test.util.ChromeTabUtils; |
| 22 import org.chromium.net.test.EmbeddedTestServer; |
| 23 import org.chromium.url.mojom.Url; |
| 24 |
| 25 import java.util.concurrent.TimeoutException; |
| 26 |
| 27 /** |
| 28 * Tests Copyless Paste AppIndexing using instrumented tests. |
| 29 */ |
| 30 @CommandLineFlags.Add("enable-features=CopylessPaste") |
| 31 @Restriction(Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 32 public class CopylessPasteTest extends ChromeTabbedActivityTestBase { |
| 33 // NODATA_PAGE doesn't contain desired metadata. |
| 34 private static final String NODATA_PAGE = "/chrome/test/data/android/about.h
tml"; |
| 35 |
| 36 // DATA_PAGE contains desired metadata. |
| 37 private static final String DATA_PAGE = "/chrome/test/data/android/appindexi
ng/json-ld.html"; |
| 38 |
| 39 private EmbeddedTestServer mTestServer; |
| 40 private CopylessHelper mCallbackHelper; |
| 41 |
| 42 @Override |
| 43 protected void setUp() throws Exception { |
| 44 // We have to set up the test server before starting the activity. |
| 45 mTestServer = EmbeddedTestServer.createAndStartServer(getInstrumentation
().getContext()); |
| 46 |
| 47 mCallbackHelper = new CopylessHelper(); |
| 48 |
| 49 AppIndexingUtil.setCallbackForTesting(new Callback<WebPage>() { |
| 50 @Override |
| 51 public void onResult(WebPage webpage) { |
| 52 mCallbackHelper.notifyCalled(webpage); |
| 53 } |
| 54 }); |
| 55 |
| 56 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 57 @Override |
| 58 public void run() { |
| 59 FirstRunStatus.setFirstRunFlowComplete(true); |
| 60 } |
| 61 }); |
| 62 super.setUp(); |
| 63 } |
| 64 |
| 65 @Override |
| 66 protected void tearDown() throws Exception { |
| 67 mTestServer.stopAndDestroyServer(); |
| 68 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 69 @Override |
| 70 public void run() { |
| 71 FirstRunStatus.setFirstRunFlowComplete(false); |
| 72 } |
| 73 }); |
| 74 AppIndexingUtil.setCallbackForTesting(null); |
| 75 super.tearDown(); |
| 76 } |
| 77 |
| 78 @Override |
| 79 public void startMainActivity() throws InterruptedException { |
| 80 startMainActivityOnBlankPage(); |
| 81 } |
| 82 |
| 83 private static class CopylessHelper extends CallbackHelper { |
| 84 private WebPage mWebPage; |
| 85 |
| 86 public WebPage getWebPage() { |
| 87 return mWebPage; |
| 88 } |
| 89 |
| 90 public void notifyCalled(WebPage page) { |
| 91 mWebPage = page; |
| 92 notifyCalled(); |
| 93 } |
| 94 } |
| 95 |
| 96 /** |
| 97 * Tests that CopylessPaste is disabled in Incognito tabs. |
| 98 */ |
| 99 @LargeTest |
| 100 @Feature({"CopylessPaste"}) |
| 101 public void testIncognito() throws InterruptedException, TimeoutException { |
| 102 // Incognito tabs are ignored. |
| 103 newIncognitoTabsFromMenu(1); |
| 104 loadUrl(mTestServer.getURL(NODATA_PAGE)); |
| 105 loadUrl(mTestServer.getURL(DATA_PAGE)); |
| 106 ChromeTabUtils.closeCurrentTab(getInstrumentation(), getActivity()); |
| 107 assertEquals(0, mCallbackHelper.getCallCount()); |
| 108 } |
| 109 |
| 110 /** |
| 111 * Tests that CopylessPaste skips invalid schemes. |
| 112 */ |
| 113 @LargeTest |
| 114 @Feature({"CopylessPaste"}) |
| 115 public void testInvalidScheme() throws InterruptedException, TimeoutExceptio
n { |
| 116 // CopylessPaste only parses http and https. |
| 117 loadUrl("chrome://newtab"); |
| 118 loadUrl("chrome://about"); |
| 119 assertEquals(0, mCallbackHelper.getCallCount()); |
| 120 } |
| 121 |
| 122 /** |
| 123 * Tests that CopylessPaste works on pages without desired metadata. |
| 124 */ |
| 125 @LargeTest |
| 126 @Feature({"CopylessPaste"}) |
| 127 public void testNoMeta() throws InterruptedException, TimeoutException { |
| 128 loadUrl(mTestServer.getURL(NODATA_PAGE)); |
| 129 mCallbackHelper.waitForCallback(0); |
| 130 assertNull(mCallbackHelper.getWebPage()); |
| 131 } |
| 132 |
| 133 /** |
| 134 * Tests that CopylessPaste works end-to-end. |
| 135 */ |
| 136 @LargeTest |
| 137 @Feature({"CopylessPaste"}) |
| 138 public void testValid() throws InterruptedException, TimeoutException { |
| 139 loadUrl(mTestServer.getURL(DATA_PAGE)); |
| 140 mCallbackHelper.waitForCallback(0); |
| 141 WebPage extracted = mCallbackHelper.getWebPage(); |
| 142 |
| 143 WebPage expected = new WebPage(); |
| 144 expected.url = new Url(); |
| 145 expected.url.url = mTestServer.getURL(DATA_PAGE); |
| 146 expected.title = "JSON-LD for AppIndexing Test"; |
| 147 Entity e = new Entity(); |
| 148 e.type = "Hotel"; |
| 149 e.properties = new Property[2]; |
| 150 e.properties[0] = new Property(); |
| 151 e.properties[0].name = "@context"; |
| 152 e.properties[0].values = new Values(); |
| 153 e.properties[0].values.setStringValues(new String[] {"http://schema.org"
}); |
| 154 e.properties[1] = new Property(); |
| 155 e.properties[1].name = "name"; |
| 156 e.properties[1].values = new Values(); |
| 157 e.properties[1].values.setStringValues(new String[] {"Hotel Name"}); |
| 158 expected.entities = new Entity[1]; |
| 159 expected.entities[0] = e; |
| 160 assertEquals(expected, extracted); |
| 161 } |
| 162 |
| 163 /** |
| 164 * Tests that CopylessPaste skips parsing visited pages. |
| 165 */ |
| 166 @LargeTest |
| 167 @Feature({"CopylessPaste"}) |
| 168 public void testCache() throws InterruptedException, TimeoutException { |
| 169 // The URLs used here should be unique in CopylessPasteTest. |
| 170 String uniqueTag = "#123"; |
| 171 // NODATA_PAGE doesn't contain desired metadata. |
| 172 loadUrl(mTestServer.getURL(NODATA_PAGE + uniqueTag)); |
| 173 mCallbackHelper.waitForCallback(0); |
| 174 // DATA_PAGE contains desired metadata. |
| 175 loadUrl(mTestServer.getURL(DATA_PAGE + uniqueTag)); |
| 176 mCallbackHelper.waitForCallback(1); |
| 177 |
| 178 // Cache hit without entities. Shouldn't parse again. |
| 179 loadUrl(mTestServer.getURL(NODATA_PAGE + uniqueTag)); |
| 180 // Cache hit with entities. Shouldn't parse again. |
| 181 loadUrl(mTestServer.getURL(DATA_PAGE + uniqueTag)); |
| 182 assertEquals(2, mCallbackHelper.getCallCount()); |
| 183 } |
| 184 } |
OLD | NEW |