Chromium Code Reviews| Index: chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java |
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..732fafab3586faefccf6c331bae6dac7335a3e5c |
| --- /dev/null |
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java |
| @@ -0,0 +1,143 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.chrome.browser; |
| + |
| +import android.support.test.filters.LargeTest; |
| + |
| +import org.chromium.base.Callback; |
| +import org.chromium.base.ThreadUtils; |
| +import org.chromium.base.test.util.CallbackHelper; |
| +import org.chromium.base.test.util.CommandLineFlags; |
| +import org.chromium.base.test.util.Feature; |
| +import org.chromium.base.test.util.Restriction; |
| +import org.chromium.blink.mojom.document_metadata.Entity; |
| +import org.chromium.blink.mojom.document_metadata.Property; |
| +import org.chromium.blink.mojom.document_metadata.Values; |
| +import org.chromium.blink.mojom.document_metadata.WebPage; |
| +import org.chromium.chrome.browser.firstrun.FirstRunStatus; |
| +import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
| +import org.chromium.chrome.test.util.ChromeTabUtils; |
| +import org.chromium.net.test.EmbeddedTestServer; |
| +import org.chromium.url.mojom.Url; |
| + |
| +import java.util.concurrent.TimeoutException; |
| + |
| +/** |
| + * Tests Copyless Paste AppIndexing using instrumented tests. |
| + */ |
| +@CommandLineFlags.Add("enable-features=CopylessPaste") |
| +@Restriction(Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| +public class CopylessPasteTest extends ChromeTabbedActivityTestBase { |
| + private static final String NODATA_PAGE = "/chrome/test/data/android/about.html"; |
| + private static final String DATA_PAGE = "/chrome/test/data/android/appindexing/json-ld.html"; |
| + |
| + private EmbeddedTestServer mTestServer; |
| + |
| + @Override |
| + protected void setUp() throws Exception { |
| + // We have to set up the test server before starting the activity. |
| + mTestServer = EmbeddedTestServer.createAndStartServer(getInstrumentation().getContext()); |
| + |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + FirstRunStatus.setFirstRunFlowComplete(true); |
| + } |
| + }); |
| + super.setUp(); |
| + } |
| + |
| + @Override |
| + protected void tearDown() throws Exception { |
| + mTestServer.stopAndDestroyServer(); |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + FirstRunStatus.setFirstRunFlowComplete(false); |
| + } |
| + }); |
| + super.tearDown(); |
| + } |
| + |
| + @Override |
| + public void startMainActivity() throws InterruptedException { |
| + startMainActivityOnBlankPage(); |
| + } |
| + |
| + private static class CopylessHelper extends CallbackHelper { |
| + private WebPage mWebPage; |
| + |
| + public WebPage getWebPage() { |
| + return mWebPage; |
| + } |
| + |
| + public void notifyCalled(WebPage page) { |
| + mWebPage = page; |
| + notifyCalled(); |
| + } |
| + } |
| + |
| + /** |
| + * Tests that CopylessPaste works end-to-end. |
| + */ |
| + @LargeTest |
| + @Feature({"CopylessPaste"}) |
| + public void testValid() throws InterruptedException, TimeoutException { |
| + final CopylessHelper callbackHelper = new CopylessHelper(); |
| + |
| + AppIndexingUtil.setCallbackForTesting(new Callback<WebPage>() { |
| + @Override |
| + public void onResult(WebPage webpage) { |
| + callbackHelper.notifyCalled(webpage); |
| + } |
| + }); |
| + |
| + // Incognito tabs are ignored. |
| + newIncognitoTabsFromMenu(1); |
| + loadUrl(mTestServer.getURL(DATA_PAGE)); |
| + ChromeTabUtils.closeCurrentTab(getInstrumentation(), getActivity()); |
| + assertEquals(0, callbackHelper.getCallCount()); |
|
Maria
2017/04/18 00:01:48
Seems like these ought to be separate test cases (
wychen
2017/04/18 22:19:05
Done.
|
| + |
| + // Only parse http and https. |
| + loadUrl("chrome://newtab"); |
| + assertEquals(0, callbackHelper.getCallCount()); |
| + |
| + // NODATA_PAGE doesn't contain desired metadata. |
| + loadUrl(mTestServer.getURL(NODATA_PAGE)); |
| + callbackHelper.waitForCallback(0); |
| + assertNull(callbackHelper.getWebPage()); |
| + |
| + // DATA_PAGE contains desired metadata. |
| + loadUrl(mTestServer.getURL(DATA_PAGE)); |
| + callbackHelper.waitForCallback(1); |
| + WebPage extracted = callbackHelper.getWebPage(); |
| + |
| + WebPage expected = new WebPage(); |
| + expected.url = new Url(); |
| + expected.url.url = mTestServer.getURL(DATA_PAGE); |
| + expected.title = "JSON-LD for AppIndexing Test"; |
| + Entity e = new Entity(); |
| + e.type = "Hotel"; |
| + e.properties = new Property[2]; |
| + e.properties[0] = new Property(); |
| + e.properties[0].name = "@context"; |
| + e.properties[0].values = new Values(); |
| + e.properties[0].values.setStringValues(new String[] {"http://schema.org"}); |
| + e.properties[1] = new Property(); |
| + e.properties[1].name = "name"; |
| + e.properties[1].values = new Values(); |
| + e.properties[1].values.setStringValues(new String[] {"Hotel Name"}); |
| + expected.entities = new Entity[1]; |
| + expected.entities[0] = e; |
| + assertEquals(expected, extracted); |
| + |
| + int callCount = callbackHelper.getCallCount(); |
| + // Cache hit without entities. Shouldn't parse again. |
| + loadUrl(mTestServer.getURL(NODATA_PAGE)); |
| + // Cache hit with entities. Shouldn't parse again. |
| + loadUrl(mTestServer.getURL(DATA_PAGE)); |
| + assertEquals(callCount, callbackHelper.getCallCount()); |
| + } |
| +} |