Index: chrome/android/javatests/src/org/chromium/chrome/browser/bookmarkimport/AndroidBrowserImporterTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarkimport/AndroidBrowserImporterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarkimport/AndroidBrowserImporterTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..96a91b6a5917abb382ba808d2c0b014dbac5b029 |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarkimport/AndroidBrowserImporterTest.java |
@@ -0,0 +1,553 @@ |
+// 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.bookmarkimport; |
+ |
+import android.content.ContentValues; |
+import android.content.Context; |
+import android.database.Cursor; |
+import android.database.MatrixCursor; |
+import android.net.Uri; |
+import android.provider.Browser.BookmarkColumns; |
+import android.test.mock.MockContentProvider; |
+import android.test.mock.MockContentResolver; |
+import android.test.suitebuilder.annotation.MediumTest; |
+import android.util.Log; |
+ |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.chrome.browser.ChromeBrowserProvider; |
+import org.chromium.chrome.test.util.ApplicationData; |
+import org.chromium.chrome.test.util.BookmarkTestUtils; |
+import org.chromium.content.browser.test.NativeLibraryTestBase; |
+import org.chromium.content.browser.test.util.CallbackHelper; |
+ |
+import java.util.HashMap; |
+import java.util.HashSet; |
+import java.util.concurrent.TimeoutException; |
+ |
+/** |
+ * Tests importing bookmarks from Android Browser. |
+ */ |
+public class AndroidBrowserImporterTest extends NativeLibraryTestBase { |
+ private static final String TAG = "BookmarkImporterTest"; |
+ |
+ private static final String PUBLIC_PROVIDER = "browser"; |
+ |
+ private static final String IS_BOOKMARK = "bookmark=1"; |
+ private static final String HAS_URL = "url=?"; |
+ private static final String BOOKMARK_MATCHES = IS_BOOKMARK + " AND " |
+ + BookmarkColumns.URL + "=? AND " + BookmarkColumns.TITLE + "=?"; |
+ |
+ private static final String[] COLUMN_NAMES = new String[] { |
+ BookmarkColumns.BOOKMARK, |
+ BookmarkColumns.URL, |
+ BookmarkColumns.TITLE, |
+ BookmarkColumns.DATE, |
+ BookmarkColumns.CREATED, |
+ BookmarkColumns.VISITS, |
+ BookmarkColumns.FAVICON |
+ }; |
+ |
+ // Bookmark source to mock. |
+ private enum BookmarksSource { |
+ NONE, |
+ PUBLIC_API |
+ } |
+ |
+ // Data of the mock bookmarks used for testing. |
+ private static class MockBookmark { |
+ public boolean isFolder; |
+ public String url; |
+ public String title; |
+ public Long lastVisit; |
+ public Long created; |
+ public Long visits; |
+ public byte[] favicon; |
+ |
+ public MockBookmark() {} |
+ |
+ public MockBookmark(boolean isFolder, String url, String title, Long lastVisit, |
+ Long created, Long visits, byte[] favicon) { |
+ this.isFolder = isFolder; |
+ this.url = url; |
+ this.title = title; |
+ this.lastVisit = lastVisit; |
+ this.created = created; |
+ this.visits = visits; |
+ this.favicon = favicon; |
+ } |
+ } |
+ |
+ private boolean mImportSucceeded; |
+ |
+ @Override |
+ public void tearDown() throws Exception { |
+ super.tearDown(); |
+ ApplicationData.clearAppData(getInstrumentation().getTargetContext()); |
+ } |
+ |
+ @Override |
+ public void setUp() { |
+ loadNativeLibraryAndInitBrowserProcess(); |
+ } |
+ |
+ private AndroidBrowserImporter getBookmarkImporter(MockBookmark[] mockBookmarks, |
+ BookmarksSource source) { |
+ AndroidBrowserImporter importer = |
+ new AndroidBrowserImporter(getInstrumentation().getTargetContext()); |
+ importer.setInputResolver(createMockResolver(mockBookmarks, source)); |
+ if (source != BookmarksSource.NONE) { |
+ importer.setIgnoreAvailableProvidersForTestPurposes(true); |
+ } |
+ return importer; |
+ } |
+ |
+ private boolean importNewBookmarks(MockBookmark[] mockBookmarks, BookmarksSource source) |
+ throws InterruptedException { |
+ BookmarkImporter importer = getBookmarkImporter(mockBookmarks, source); |
+ |
+ // Note: the UI doesn't require any new bookmarks to consider the import as successful. |
+ // For testing purposes we do. |
+ final CallbackHelper importFinishedEvent = new CallbackHelper(); |
+ importer.importBookmarks(new BookmarkImporter.OnBookmarksImportedListener() { |
+ @Override |
+ public void onBookmarksImported(BookmarkImporter.ImportResults results) { |
+ mImportSucceeded = results != null && results.newBookmarks > 0 |
+ && results.numImported == results.newBookmarks; |
+ importFinishedEvent.notifyCalled(); |
+ } |
+ }); |
+ try { |
+ importFinishedEvent.waitForCallback(0); |
+ } catch (TimeoutException e) { |
+ fail("Never received import finished event"); |
+ } |
+ return mImportSucceeded; |
+ } |
+ |
+ private int countImportedNonFolderBookmarks() { |
+ Cursor cursor = getInstrumentation().getTargetContext().getContentResolver().query( |
+ ChromeBrowserProvider.getBookmarksApiUri(getInstrumentation().getTargetContext()), |
+ null, IS_BOOKMARK, null, null); |
+ int count = cursor.getCount(); |
+ cursor.close(); |
+ return count; |
+ } |
+ |
+ // TODO(leandrogracia): add support for hierarchical matching. This is likely to require changes |
+ // in ChromeBrowserProvider that should be addressed by a later patch. |
+ private boolean matchFlattenedImportedBookmarks(MockBookmark[] mockBookmarks) { |
+ Cursor cursor = getInstrumentation().getTargetContext().getContentResolver().query( |
+ ChromeBrowserProvider.getBookmarksApiUri(getInstrumentation().getTargetContext()), |
+ null, IS_BOOKMARK, null, null); |
+ if (mockBookmarks == null && cursor == null) return true; |
+ |
+ // Read all the imports to avoid problems with their order. |
+ HashMap<String, MockBookmark> importedBookmarks = new HashMap<String, MockBookmark>(); |
+ assertTrue(cursor != null); |
+ while (cursor.moveToNext()) { |
+ MockBookmark bookmark = new MockBookmark(); |
+ int index = cursor.getColumnIndex(BookmarkColumns.URL); |
+ if (index != -1 && !cursor.isNull(index)) bookmark.url = cursor.getString(index); |
+ |
+ index = cursor.getColumnIndex(BookmarkColumns.TITLE); |
+ if (index != -1 && !cursor.isNull(index)) bookmark.title = cursor.getString(index); |
+ |
+ index = cursor.getColumnIndex(BookmarkColumns.CREATED); |
+ if (index != -1 && !cursor.isNull(index)) bookmark.created = cursor.getLong(index); |
+ |
+ index = cursor.getColumnIndex(BookmarkColumns.DATE); |
+ if (index != -1 && !cursor.isNull(index)) bookmark.lastVisit = cursor.getLong(index); |
+ |
+ index = cursor.getColumnIndex(BookmarkColumns.VISITS); |
+ if (index != -1 && !cursor.isNull(index)) bookmark.visits = cursor.getLong(index); |
+ |
+ index = cursor.getColumnIndex(BookmarkColumns.FAVICON); |
+ if (index != -1 && !cursor.isNull(index)) bookmark.favicon = cursor.getBlob(index); |
+ |
+ // URLs should be unique in our model. |
+ assertFalse(importedBookmarks.containsKey(bookmark.url)); |
+ importedBookmarks.put(bookmark.url, bookmark); |
+ } |
+ cursor.close(); |
+ |
+ // Auxiliary class to get bookmark mismatch errors. |
+ class BookmarkMatchingException extends Exception { |
+ public BookmarkMatchingException(String message) { |
+ super(message); |
+ } |
+ } |
+ |
+ HashSet<String> matchingBookmarks = new HashSet<String>(); |
+ final long now = System.currentTimeMillis(); |
+ try { |
+ for (MockBookmark expected : mockBookmarks) { |
+ // Folders are not returned by our provider (not part of the public API yet). |
+ if (expected.isFolder) continue; |
+ |
+ // Matching can't be performed if the expectation doesn't have a URL. |
+ if (expected.url == null) { |
+ throw new BookmarkMatchingException("Expected bookmark without a URL found."); |
+ } |
+ |
+ // Get the corresponding imported bookmark by its URL. If multiple entries in the |
+ // mock bookmarks with the same URL are found, all but the first will be skipped. |
+ if (matchingBookmarks.contains(expected.url)) continue; |
+ |
+ MockBookmark imported = importedBookmarks.get(expected.url); |
+ if (imported == null) { |
+ throw new BookmarkMatchingException("Bookmark with URL " + expected.url |
+ + " not found"); |
+ } |
+ |
+ // Imported data must have a valid title despite what the expectation says. |
+ if (imported.title == null) { |
+ throw new BookmarkMatchingException("Bookmark without title found: " |
+ + imported.url); |
+ } else if (!imported.title.equals(expected.title)) { |
+ throw new BookmarkMatchingException("Title doesn't match: " + expected.title |
+ + " != " + imported.title); |
+ } |
+ |
+ // If not explicitely set in the expectations, the creation date should be available |
+ // after importing with a value not in the future. |
+ if (expected.created != null) { |
+ if (!expected.created.equals(imported.created)) { |
+ throw new BookmarkMatchingException("Creation timestamp doesn't match: " |
+ + expected.created.toString() + " != " |
+ + (imported.created != null ? imported.created.toString() |
+ : "null")); |
+ } |
+ } else { |
+ if (imported.created == null) { |
+ throw new BookmarkMatchingException("Creation date not initialised."); |
+ } else if (imported.created.longValue() > now) { |
+ throw new BookmarkMatchingException("Creation set in the future"); |
+ } |
+ } |
+ |
+ // If not explicitely set in the expectations, the last visit should be available |
+ // after importing with a value not in the future. |
+ if (expected.lastVisit != null) { |
+ if (!expected.lastVisit.equals(imported.lastVisit)) { |
+ throw new BookmarkMatchingException("Last visit timestamp doesn't match: " |
+ + expected.lastVisit.toString() + " != " |
+ + (imported.lastVisit != null ? imported.lastVisit.toString() |
+ : "null")); |
+ } |
+ } else { |
+ if (imported.lastVisit == null) { |
+ throw new BookmarkMatchingException("Last visit date not initialised."); |
+ } else if (imported.lastVisit.longValue() > now) { |
+ throw new BookmarkMatchingException("Last visit set in the future"); |
+ } |
+ } |
+ |
+ // Visits should be 1 if not explicitly set in the mock bookmark. |
+ if (expected.visits != null) { |
+ if (!expected.visits.equals(imported.visits)) { |
+ throw new BookmarkMatchingException("Number of visits doesn't match: " |
+ + expected.visits.toString() + " != " |
+ + (imported.visits != null ? imported.visits.toString() : "null")); |
+ } |
+ } else { |
+ if (imported.visits == null) { |
+ throw new BookmarkMatchingException("Visit count not initialised."); |
+ } else if (imported.visits.longValue() != 0) { |
+ throw new BookmarkMatchingException("Invalid visit count initialization"); |
+ } |
+ } |
+ |
+ // If set, the favicons should be binary equals. |
+ if (!BookmarkTestUtils.byteArrayEqual(expected.favicon, imported.favicon)) { |
+ throw new BookmarkMatchingException("Favicon doesn't match"); |
+ } |
+ |
+ matchingBookmarks.add(expected.url); |
+ } |
+ |
+ // At the end the map and the set should have the same size. |
+ if (importedBookmarks.size() != matchingBookmarks.size()) { |
+ throw new BookmarkMatchingException( |
+ "Not match could be found for all imported bookmarks: " |
+ + matchingBookmarks.size() + " matched, should be " |
+ + importedBookmarks.size()); |
+ } |
+ } catch (BookmarkMatchingException e) { |
+ Log.w(TAG, e.getMessage()); |
+ return false; |
+ } |
+ |
+ return true; |
+ } |
+ |
+ private void internalTestBookmarkFields(BookmarksSource source) throws InterruptedException { |
+ // Load a favicon for testing. |
+ byte[] favicon = BookmarkTestUtils.getIcon("chrome/test/data/android/favicon.png"); |
+ assertTrue(favicon != null); |
+ |
+ // Create mock bookmark data to import. Test all non-hierarchy fields. |
+ final long now = System.currentTimeMillis(); |
+ MockBookmark[] mockBookmarks = new MockBookmark[] { |
+ new MockBookmark(false, "http://www.google.com/", "Google", Long.valueOf(now), Long.valueOf(now - 100 * 60 * 60), |
+ Long.valueOf(100), favicon), |
+ new MockBookmark(false, "http://maps.google.com/", "Google Maps", Long.valueOf(now - 10 * 60), Long.valueOf(now - 5 * 60 * 60), |
+ Long.valueOf(20), null), |
+ new MockBookmark(false, "http://mail.google.com/", "Google Mail", null, null, |
+ null, null) |
+ }; |
+ |
+ // Import bookmarks and match the contents. |
+ assertTrue(importNewBookmarks(mockBookmarks, source)); |
+ assertTrue(matchFlattenedImportedBookmarks(mockBookmarks)); |
+ } |
+ |
+ private void internalTestIncompleteBookmarks(BookmarksSource source) |
+ throws InterruptedException { |
+ // Create incomplete mock bookmark data. |
+ MockBookmark[] mockBookmarks = new MockBookmark[] { |
+ new MockBookmark(false, "http://www.google.com/", null, null, null, null, null), |
+ new MockBookmark(false, null, "Google Maps", null, null, null, null) |
+ }; |
+ |
+ // Should fail importing bookmarks. |
+ assertFalse(importNewBookmarks(mockBookmarks, source)); |
+ } |
+ |
+ private void internalTestImportExisting(BookmarksSource source) throws InterruptedException { |
+ // One simple mock bookmark. |
+ MockBookmark[] mockBookmarks = new MockBookmark[] { |
+ new MockBookmark(false, "http://mail.google.com/", "Google Mail", null, null, null, |
+ null) |
+ }; |
+ |
+ // Import bookmarks. There should only be one imported. |
+ assertTrue(importNewBookmarks(mockBookmarks, source)); |
+ assertEquals(1, countImportedNonFolderBookmarks()); |
+ |
+ // Import the same bookmarks again. It should fail becase there aren't any new bookmarks. |
+ assertFalse(importNewBookmarks(mockBookmarks, source)); |
+ assertEquals(1, countImportedNonFolderBookmarks()); |
+ |
+ // Let's try adding something else. |
+ MockBookmark[] mockBookmarksExtra = new MockBookmark[] { |
+ new MockBookmark(false, "http://mail.google.com/", "Google Mail", null, null, null, |
+ null), |
+ new MockBookmark(false, "http://maps.google.com/", "Google Maps", null, null, null, |
+ null) |
+ }; |
+ |
+ // The new bookmark should have been added. |
+ assertTrue(importNewBookmarks(mockBookmarksExtra, source)); |
+ assertEquals(2, countImportedNonFolderBookmarks()); |
+ } |
+ |
+ private void internalTestNoBookmarks(BookmarksSource source) throws InterruptedException { |
+ MockBookmark[] mockBookmarks = new MockBookmark[] {}; |
+ assertFalse(importNewBookmarks(mockBookmarks, source)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testBookmarkFieldsFromPublicAPI() throws InterruptedException { |
+ internalTestBookmarkFields(BookmarksSource.PUBLIC_API); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testIncompleteBookmarksFromPublicAPI() throws InterruptedException { |
+ internalTestIncompleteBookmarks(BookmarksSource.PUBLIC_API); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testImportExistingFromPublicAPI() throws InterruptedException { |
+ internalTestImportExisting(BookmarksSource.PUBLIC_API); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testNoBookmarksInPublicAPI() throws InterruptedException { |
+ internalTestNoBookmarks(BookmarksSource.PUBLIC_API); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testBookmarksAreAccessible() { |
+ MockBookmark[] mockBookmarks = new MockBookmark[] { |
+ new MockBookmark(false, "http://www.google.com/", "Google", null, null, null, null), |
+ }; |
+ |
+ // Should not be accessible if no provider is reachable. |
+ assertFalse(getBookmarkImporter(mockBookmarks, BookmarksSource.NONE) |
+ .areBookmarksAccessible()); |
+ |
+ // Should be accessible in all other cases. |
+ assertTrue(getBookmarkImporter(mockBookmarks, BookmarksSource.PUBLIC_API) |
+ .areBookmarksAccessible()); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testTimestampCorrection() throws InterruptedException { |
+ // Set the past and the future 1 hour away from now. |
+ final long lapse = 3600000; |
+ final Long now = Long.valueOf(System.currentTimeMillis()); |
+ final Long past = Long.valueOf(Math.max(now.longValue() - lapse, 0)); |
+ final Long future = Long.valueOf(now.longValue() + lapse); |
+ |
+ // Setting a maximum of 10 visits. Each visit means a database row |
+ // insertion in the provider, so very high values will make the test |
+ // fail because of the importing event timeout. |
+ final long maxVisits = 10; |
+ final Long pastForVisits = Long.valueOf(now.longValue() - maxVisits); |
+ final Long visitsValue = Long.valueOf(maxVisits * 100); |
+ |
+ MockBookmark[] mockBookmarks = new MockBookmark[] { |
+ // Last visit is in the future. |
+ new MockBookmark(false, "http://www.someweb1.com/", "Foo", future, null, |
+ null, null), |
+ // Creation date is in the future. |
+ new MockBookmark(false, "http://www.someweb2.com/", "Foo", null, future, |
+ null, null), |
+ // Creation date after last visit, both valid. |
+ new MockBookmark(false, "http://www.someweb3.com/", "Foo", past, now, |
+ null, null), |
+ // Invalid number of visits for the lapse between creation and last visit. |
+ new MockBookmark(false, "http://www.someweb4.com/", "Foo", now, pastForVisits, |
+ visitsValue, null), |
+ }; |
+ |
+ // Timestamp correction should be independent to the source. |
+ assertTrue(importNewBookmarks(mockBookmarks, BookmarksSource.PUBLIC_API)); |
+ assertEquals(mockBookmarks.length, countImportedNonFolderBookmarks()); |
+ assertFalse(matchFlattenedImportedBookmarks(mockBookmarks)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testVisitCountZeroAdjustment() throws InterruptedException { |
+ final Long now = Long.valueOf(System.currentTimeMillis()); |
+ |
+ MockBookmark[] mockBookmarks = new MockBookmark[] { |
+ // Visit count is set to zero (required to be supported by the BrowserTest CTS). |
+ new MockBookmark(false, "http://www.zerovisits.com/", "Foo", now, now, |
+ 0L, null), |
+ }; |
+ |
+ assertTrue(importNewBookmarks(mockBookmarks, BookmarksSource.PUBLIC_API)); |
+ assertEquals(mockBookmarks.length, countImportedNonFolderBookmarks()); |
+ // The imported bookmark should differ from mockBookmarks as visit count was ignored. |
+ assertFalse(matchFlattenedImportedBookmarks(mockBookmarks)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testVisitCountOneAdjustment() throws InterruptedException { |
+ final Long now = Long.valueOf(System.currentTimeMillis()); |
+ |
+ MockBookmark[] mockBookmarks = new MockBookmark[] { |
+ // Visit count is set to one (will be ignored). |
+ // See http://crbug.com/149376 for more details. |
+ new MockBookmark(false, "http://www.onevisit.com/", "Foo", now, now, |
+ 1L, null), |
+ }; |
+ |
+ assertTrue(importNewBookmarks(mockBookmarks, BookmarksSource.PUBLIC_API)); |
+ assertEquals(mockBookmarks.length, countImportedNonFolderBookmarks()); |
+ assertTrue(matchFlattenedImportedBookmarks(mockBookmarks)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Bookmarks", "Import"}) |
+ public void testVisitCountTwoAdjustment() throws InterruptedException { |
+ final Long now = Long.valueOf(System.currentTimeMillis()); |
+ |
+ MockBookmark[] mockBookmarks = new MockBookmark[] { |
+ // Visit count is set to one (will be ignored). |
+ // See http://crbug.com/149376 for more details. |
+ new MockBookmark(false, "http://www.onevisit.com/", "Foo", now + 100, now, |
+ 1L, null), |
+ }; |
+ |
+ assertTrue(importNewBookmarks(mockBookmarks, BookmarksSource.PUBLIC_API)); |
+ assertEquals(mockBookmarks.length, countImportedNonFolderBookmarks()); |
+ // The imported bookmark should differ from mockBookmarks as visit count was ignored. |
+ assertFalse(matchFlattenedImportedBookmarks(mockBookmarks)); |
+ } |
+ |
+ private static class ImportMockContentProvider extends MockContentProvider { |
+ private final MockBookmark[] mMockData; |
+ private final boolean mFlatten; |
+ |
+ ImportMockContentProvider(Context context, MockBookmark[] data, boolean flatten) { |
+ super(context); |
+ mMockData = data; |
+ mFlatten = flatten; |
+ } |
+ |
+ @Override |
+ public Cursor query(Uri uri, String[] projection, String selection, |
+ String[] selectionArgs, String sortOrder) { |
+ // Provide a new cursor with the mock data. |
+ MatrixCursor cursor = new MatrixCursor(COLUMN_NAMES); |
+ for (MockBookmark bookmark : mMockData) { |
+ if (mFlatten && bookmark.isFolder) continue; |
+ |
+ // There are 3 kinds of queries performed by the iterators: |
+ // 1. Retrieving all bookmarks. |
+ // 2. Querying a specific URL in history. |
+ // 3. Looking for matching bookmarks (url and title) in the public API. |
+ if (selection.equals(HAS_URL)) { |
+ assertTrue(selectionArgs != null); |
+ assertEquals(1, selectionArgs.length); |
+ if (bookmark.url != null && !bookmark.url.equals(selectionArgs[0])) { |
+ continue; |
+ } |
+ } else if (selection.equals(BOOKMARK_MATCHES)) { |
+ assertTrue(selectionArgs != null); |
+ assertEquals(2, selectionArgs.length); |
+ if ((bookmark.url != null && !bookmark.url.equals(selectionArgs[0])) |
+ || (bookmark.title != null |
+ && !bookmark.title.equals(selectionArgs[1]))) { |
+ continue; |
+ } |
+ } |
+ |
+ cursor.addRow(new Object[] { |
+ 1, bookmark.url, bookmark.title, bookmark.lastVisit, |
+ bookmark.created, bookmark.visits, bookmark.favicon |
+ }); |
+ |
+ // Should there be only one history URL result. No need to look for more. |
+ if (selection.equals(HAS_URL)) break; |
+ } |
+ cursor.move(0); |
+ return cursor; |
+ } |
+ |
+ @Override |
+ public Uri insert(Uri uri, ContentValues values) { |
+ // Proxy to the original content resolver. |
+ return getContext().getContentResolver().insert(uri, values); |
+ } |
+ } |
+ |
+ private MockContentResolver createMockResolver(MockBookmark[] mockBookmarks, |
+ BookmarksSource source) { |
+ MockContentResolver mockResolver = new MockContentResolver(); |
+ switch (source) { |
+ case NONE: |
+ // No provider added. Used to test bookmark availability. |
+ break; |
+ |
+ case PUBLIC_API: |
+ mockResolver.addProvider(PUBLIC_PROVIDER, |
+ new ImportMockContentProvider(getInstrumentation().getTargetContext(), |
+ mockBookmarks, true)); |
+ break; |
+ } |
+ return mockResolver; |
+ } |
+} |