1e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck/* 2e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Copyright (C) 2011 The Android Open Source Project 3e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 4e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * you may not use this file except in compliance with the License. 6e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * You may obtain a copy of the License at 7e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 8e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 10e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Unless required by applicable law or agreed to in writing, software 11e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * See the License for the specific language governing permissions and 14e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * limitations under the License. 15e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 16e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 17e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckpackage com.android.browser.tests.utils; 18e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 19e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport com.android.browser.provider.BrowserProvider2; 20e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 21db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reckimport java.io.File; 22db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reckimport java.io.FilenameFilter; 23db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck 24e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.content.ContentValues; 25e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.database.ContentObserver; 26e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.net.Uri; 27e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.provider.Browser; 28e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.provider.BrowserContract; 29e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.provider.BrowserContract.Bookmarks; 30e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.provider.BrowserContract.History; 31e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.util.Log; 32e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 33e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck/** 34e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * This is a replacement for ProviderTestCase2 that can handle notifyChange testing. 35e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * It also has helper methods specifically for testing BrowserProvider2 36e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 37e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckpublic abstract class BP2TestCaseHelper extends ProviderTestCase3<BrowserProvider2> { 38e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 39e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck // Tag for potential performance impacts 40e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private static final String PERFTAG = "BP2-PerfCheck"; 41e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 42e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private TriggeredObserver mLegacyObserver; 43e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private TriggeredObserver mRootObserver; 44e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private TriggeredObserver mBookmarksObserver; 45e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private TriggeredObserver mHistoryObserver; 46e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private TriggeredObserver mWidgetObserver; 47e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 48e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck @Override 49e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck protected void setUp() throws Exception { 50e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck super.setUp(); 51e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mLegacyObserver = new TriggeredObserver(Browser.BOOKMARKS_URI); 52e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mRootObserver = new TriggeredObserver(BrowserContract.AUTHORITY_URI); 53e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mBookmarksObserver = new TriggeredObserver(Bookmarks.CONTENT_URI); 54e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mHistoryObserver = new TriggeredObserver(History.CONTENT_URI); 55e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mWidgetObserver = new TriggeredObserver(); 56e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck // We don't need to worry about setting this back to null since this 57e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck // is a private instance local to the MockContentResolver 58e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck getProvider().setWidgetObserver(mWidgetObserver); 59e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 60e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 61e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public BP2TestCaseHelper() { 62e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck super(BrowserProvider2.class, 63e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck BrowserContract.AUTHORITY, BrowserProvider2.LEGACY_AUTHORITY); 64e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 65e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 66e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public void perfIdeallyUntriggered(TriggeredObserver... obs) { 67e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck for (TriggeredObserver ob : obs) { 68e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck if (ob.checkTriggered()) { 69e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck // Not ideal, unnecessary notification 70e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck Log.i(PERFTAG, ob.mUri + " onChange called but content unaltered!"); 71e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 72e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 73e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 74e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 75e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public void assertObserversTriggered(boolean triggered, 76e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck TriggeredObserver... observers) { 77e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck for (TriggeredObserver obs : observers) { 78e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertEquals(obs.mUri + ", descendents:" + obs.mNotifyForDescendents, 79e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck triggered, obs.checkTriggered()); 80e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 81e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 82e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 83e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public class TriggeredObserver extends ContentObserver { 84e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private boolean mTriggered; 85e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck Uri mUri; 86e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck boolean mNotifyForDescendents; 87e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 88e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 89e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Creates an unmanaged TriggeredObserver 90e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 91e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public TriggeredObserver() { 92e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck super(null); 93e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 94e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 95e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 96e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Same as TriggeredObserver(uri, true); 97e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 98e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public TriggeredObserver(Uri uri) { 99e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck this(uri, true); 100e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 101e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 102e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 103e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Creates a managed TriggeredObserver that self-registers with the 104e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * mock ContentResolver 105e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 106e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public TriggeredObserver(Uri uri, boolean notifyForDescendents) { 107e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck super(null); 108e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mUri = uri; 109e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mNotifyForDescendents = notifyForDescendents; 110e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck registerContentObserver(uri, notifyForDescendents, this); 111e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 112e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 113e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck @Override 114e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public void onChange(boolean selfChange) { 115e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck super.onChange(selfChange); 116e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mTriggered = true; 117e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 118e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 119e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public boolean checkTriggered() { 120e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck boolean ret = mTriggered; 121e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mTriggered = false; 122e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return ret; 123e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 124e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 125e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 12657e39f9e46091750c8a07895531446a7f0efdb21John Reck Uri mockInsert(Uri uri, ContentValues values) { 127e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(false, mLegacyObserver, mRootObserver); 12857e39f9e46091750c8a07895531446a7f0efdb21John Reck Uri ret = getMockContentResolver().insert(uri, values); 129e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(true, mLegacyObserver, mRootObserver); 130e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return ret; 131e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 132e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 133e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck int mockUpdate(Uri uri, ContentValues values, String where, 134e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck String[] selectionArgs) { 135e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(false, mLegacyObserver, mRootObserver); 136e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck int ret = getMockContentResolver().update(uri, values, where, selectionArgs); 137e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck if (ret > 0) { 138e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(true, mLegacyObserver, mRootObserver); 139e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } else { 140e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck perfIdeallyUntriggered(mLegacyObserver); 141e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck perfIdeallyUntriggered(mRootObserver); 142e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 143e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return ret; 144e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 145e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 146e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public Uri insertBookmark(String url, String title) { 147e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck ContentValues values = new ContentValues(); 148e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.Bookmarks.TITLE, title); 149e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.Bookmarks.URL, url); 150e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.Bookmarks.IS_FOLDER, 0); 15157e39f9e46091750c8a07895531446a7f0efdb21John Reck return insertBookmark(values); 15257e39f9e46091750c8a07895531446a7f0efdb21John Reck } 15357e39f9e46091750c8a07895531446a7f0efdb21John Reck 15457e39f9e46091750c8a07895531446a7f0efdb21John Reck public Uri insertBookmark(ContentValues values) { 155e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(false, mBookmarksObserver, mWidgetObserver); 156e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck Uri ret = mockInsert(Bookmarks.CONTENT_URI, values); 157e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(true, mBookmarksObserver, mWidgetObserver); 158e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck perfIdeallyUntriggered(mHistoryObserver); 159e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return ret; 160e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 161e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 162e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public boolean updateBookmark(Uri uri, String url, String title) { 163e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck ContentValues values = new ContentValues(); 164e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.Bookmarks.TITLE, title); 165e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.Bookmarks.URL, url); 166e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return updateBookmark(uri, values); 167e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 168e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 169e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public boolean updateBookmark(Uri uri, ContentValues values) { 170e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(false, mBookmarksObserver, mWidgetObserver); 171e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck int modifyCount = mockUpdate(uri, values, null, null); 172e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertTrue("UpdatedBookmark modified too much! " + uri, modifyCount <= 1); 173e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck boolean updated = modifyCount == 1; 174e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck if (updated) { 175e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(updated, mBookmarksObserver, mWidgetObserver); 176e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } else { 177e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck perfIdeallyUntriggered(mBookmarksObserver, mWidgetObserver); 178e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 179e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck perfIdeallyUntriggered(mHistoryObserver); 180e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return updated; 181e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 182e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 183e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public Uri insertHistory(String url, String title) { 184e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck ContentValues values = new ContentValues(); 185e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.History.TITLE, title); 186e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.History.URL, url); 187e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(false, mHistoryObserver); 188e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck Uri ret = mockInsert(History.CONTENT_URI, values); 189e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(true, mHistoryObserver); 190e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck perfIdeallyUntriggered(mBookmarksObserver, mWidgetObserver); 191e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return ret; 192e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 193e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 194e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public boolean updateHistory(Uri uri, String url, String title) { 195e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck ContentValues values = new ContentValues(); 196e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.History.TITLE, title); 197e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck values.put(BrowserContract.History.URL, url); 198e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return updateHistory(uri, values); 199e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 200e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 201e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public boolean updateHistory(Uri uri, ContentValues values) { 202e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(false, mHistoryObserver); 203e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck int modifyCount = mockUpdate(uri, values, null, null); 204e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertTrue("UpdatedHistory modified too much! " + uri, modifyCount <= 1); 205e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck boolean updated = modifyCount == 1; 206e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck if (updated) { 207e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertObserversTriggered(updated, mHistoryObserver); 208e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } else { 209e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck perfIdeallyUntriggered(mHistoryObserver); 210e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 211e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck perfIdeallyUntriggered(mBookmarksObserver, mWidgetObserver); 212e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return updated; 213e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 214db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck 215db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck @Override 216db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck protected void tearDown() throws Exception { 217db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck super.tearDown(); 218db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck // Delete the test databases so that subsequent runs have a clean slate 219db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck File f = getMockContext().getDatabasePath("test"); 220db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck File dir = f.getParentFile(); 221db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck File testFiles[] = dir.listFiles(new FilenameFilter() { 222db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck 223db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck @Override 224db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck public boolean accept(File dir, String filename) { 225db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck return filename.startsWith(ProviderTestCase3.FILENAME_PREFIX); 226db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck } 227db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck }); 228db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck for (File testFile : testFiles) { 229db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck testFile.delete(); 230db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck } 231db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck } 232e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck} 233