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