Index: chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java |
diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..11a04ab8921babffcbbe53169e1702c550d2f23b |
--- /dev/null |
+++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java |
@@ -0,0 +1,173 @@ |
+// Copyright 2015 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.sync; |
+ |
+import android.test.suitebuilder.annotation.LargeTest; |
+import android.util.Pair; |
+ |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; |
+import org.chromium.content.browser.test.util.Criteria; |
+import org.chromium.content.browser.test.util.CriteriaHelper; |
+import org.chromium.content_public.browser.LoadUrlParams; |
+import org.chromium.sync.internal_api.pub.base.ModelType; |
+import org.chromium.sync.protocol.EntitySpecifics; |
+import org.chromium.sync.protocol.SyncEnums; |
+import org.chromium.sync.protocol.TypedUrlSpecifics; |
+import org.chromium.ui.base.PageTransition; |
+import org.json.JSONException; |
+import org.json.JSONObject; |
+ |
+import java.util.ArrayList; |
+import java.util.List; |
+ |
+/** |
+ * Test suite for the typed URLs sync data type. |
+ */ |
+public class TypedUrlsTest extends SyncTestBase { |
+ private static final String TAG = "TypedUrlsTest"; |
+ |
+ private static final String TYPED_URLS_TYPE = "Typed URLs"; |
+ |
+ // TestHttpServerClient is preferred here but it can't be used. The test server |
+ // serves pages on localhost and Chrome doesn't sync localhost URLs as typed URLs. |
+ // This type of URL requires no external data connection or resources. |
+ private static final String URL = "data:text,testTypedUrl"; |
+ |
+ // A container to store typed URL information for data verification. |
+ private static class TypedUrl { |
+ public final String id; |
+ public final String url; |
+ |
+ public TypedUrl(String id, String url) { |
+ this.id = id; |
+ this.url = url; |
+ } |
+ } |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ setupTestAccountAndSignInToSync(CLIENT_ID); |
+ // Make sure the initial state is clean. |
+ assertClientTypedUrlCount(0); |
+ assertServerTypedUrlCountWithName(0, URL); |
+ } |
+ |
+ // Test syncing a typed URL from client to server. |
+ @LargeTest |
+ @Feature({"Sync"}) |
+ public void testUploadTypedUrl() throws Exception { |
+ loadUrlByTyping(URL); |
+ waitForClientTypedUrlCount(1); |
+ waitForServerTypedUrlCountWithName(1, URL); |
+ } |
+ |
+ // Test syncing a typed URL from server to client. |
+ @LargeTest |
+ @Feature({"Sync"}) |
+ public void testDownloadTypedUrl() throws Exception { |
+ addServerTypedUrl(URL); |
+ SyncTestUtil.triggerSyncAndWaitForCompletion(mContext); |
+ |
+ // Verify data synced to client. |
+ List<TypedUrl> typedUrls = getClientTypedUrls(); |
+ assertEquals("Only the injected typed URL should exist on the client.", |
+ 1, typedUrls.size()); |
+ TypedUrl typedUrl = typedUrls.get(0); |
+ assertEquals("The wrong URL was found for the typed URL.", URL, typedUrl.url); |
+ } |
+ |
+ // Test syncing a typed URL deletion from server to client. |
+ @LargeTest |
+ @Feature({"Sync"}) |
+ public void testDownloadDeletedTypedUrl() throws Exception { |
+ // Add the entity to test deleting. |
+ addServerTypedUrl(URL); |
+ SyncTestUtil.triggerSyncAndWaitForCompletion(mContext); |
+ assertServerTypedUrlCountWithName(1, URL); |
+ assertClientTypedUrlCount(1); |
+ |
+ // Delete on server, sync, and verify deleted locally. |
+ TypedUrl typedUrl = getClientTypedUrls().get(0); |
+ mFakeServerHelper.deleteEntity(typedUrl.id); |
+ waitForServerTypedUrlCountWithName(0, URL); |
+ SyncTestUtil.triggerSyncAndWaitForCompletion(mContext); |
+ waitForClientTypedUrlCount(0); |
+ } |
+ |
+ private void loadUrlByTyping(final String url) { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ LoadUrlParams params = new LoadUrlParams(url, PageTransition.TYPED); |
+ getActivity().getActiveTab().loadUrl(params); |
+ } |
+ }); |
+ } |
+ |
+ private void addServerTypedUrl(String url) throws InterruptedException { |
+ EntitySpecifics specifics = new EntitySpecifics(); |
+ specifics.typedUrl = new TypedUrlSpecifics(); |
+ specifics.typedUrl.url = url; |
+ specifics.typedUrl.title = url; |
+ specifics.typedUrl.visits = new long[]{1L}; |
+ specifics.typedUrl.visitTransitions = new int[]{SyncEnums.TYPED}; |
+ mFakeServerHelper.injectUniqueClientEntity(url /* name */, specifics); |
+ } |
+ |
+ private List<TypedUrl> getClientTypedUrls() throws JSONException { |
+ List<Pair<String, JSONObject>> rawTypedUrls = SyncTestUtil.getLocalData( |
+ mContext, TYPED_URLS_TYPE); |
+ List<TypedUrl> typedUrls = new ArrayList<TypedUrl>(rawTypedUrls.size()); |
+ for (Pair<String, JSONObject> rawTypedUrl : rawTypedUrls) { |
+ String id = rawTypedUrl.first; |
+ typedUrls.add(new TypedUrl(id, rawTypedUrl.second.getString("url"))); |
+ } |
+ return typedUrls; |
+ } |
+ |
+ private void assertClientTypedUrlCount(int count) throws JSONException { |
+ assertEquals("There should be " + count + " local typed URL entities.", |
+ count, SyncTestUtil.getLocalData(mContext, TYPED_URLS_TYPE).size()); |
+ } |
+ |
+ private void assertServerTypedUrlCountWithName(int count, String name) { |
+ assertTrue("Expected " + count + " server typed URLs with name " + name + ".", |
+ mFakeServerHelper.verifyEntityCountByTypeAndName( |
+ count, ModelType.TYPED_URL, name)); |
+ } |
+ |
+ private void waitForClientTypedUrlCount(final int count) throws InterruptedException { |
+ boolean success = CriteriaHelper.pollForCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ try { |
+ return SyncTestUtil.getLocalData(mContext, TYPED_URLS_TYPE).size() == count; |
+ } catch (Exception e) { |
+ throw new RuntimeException(e); |
+ } |
+ } |
+ }, SyncTestUtil.UI_TIMEOUT_MS, SyncTestUtil.CHECK_INTERVAL_MS); |
+ assertTrue("Expected " + count + " local typed URL entities.", success); |
+ } |
+ |
+ private void waitForServerTypedUrlCountWithName(final int count, final String name) |
+ throws InterruptedException { |
+ boolean success = CriteriaHelper.pollForCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ try { |
+ return mFakeServerHelper.verifyEntityCountByTypeAndName( |
+ count, ModelType.TYPED_URL, name); |
+ } catch (Exception e) { |
+ throw new RuntimeException(e); |
+ } |
+ } |
+ }, SyncTestUtil.UI_TIMEOUT_MS, SyncTestUtil.CHECK_INTERVAL_MS); |
+ assertTrue("Expected " + count + " server typed URLs with name " + name + ".", success); |
+ } |
+} |