1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.chrome.browser.test;
6
7import android.content.ContentValues;
8import android.database.Cursor;
9import android.net.Uri;
10import android.provider.Browser.BookmarkColumns;
11
12import org.chromium.base.test.util.DisabledTest;
13import org.chromium.chrome.browser.ChromeBrowserProvider;
14import org.chromium.chrome.browser.test.util.BookmarkUtils;
15
16import java.util.Date;
17
18/**
19 * Tests the use of the Bookmark URI as part of the Android provider public API.
20 */
21public class ProviderBookmarksUriTest extends ProviderTestBase {
22    private static final String TAG = "ProviderBookmarkUriTest";
23    private static final String ICON_PATH = "chrome/provider/icon1.png";
24
25    private Uri mBookmarksUri;
26
27    @Override
28    protected void setUp() throws Exception {
29        super.setUp();
30        mBookmarksUri = ChromeBrowserProvider.getBookmarksApiUri(getActivity());
31        getContentResolver().delete(mBookmarksUri, null, null);
32    }
33
34    @Override
35    protected void tearDown() throws Exception {
36        getContentResolver().delete(mBookmarksUri, null, null);
37        super.tearDown();
38    }
39
40    private Uri addBookmark(String url, String title, long lastVisitTime, long created, int visits,
41            byte[] icon, int isBookmark) {
42        ContentValues values = new ContentValues();
43        values.put(BookmarkColumns.BOOKMARK, isBookmark);
44        values.put(BookmarkColumns.DATE, lastVisitTime);
45        values.put(BookmarkColumns.CREATED, created);
46        values.put(BookmarkColumns.FAVICON, icon);
47        values.put(BookmarkColumns.URL, url);
48        values.put(BookmarkColumns.VISITS, visits);
49        values.put(BookmarkColumns.TITLE, title);
50        return getContentResolver().insert(mBookmarksUri, values);
51    }
52
53    /**
54     * @MediumTest
55     * @Feature({"Android-ContentProvider"})
56     * BUG 154683
57     */
58    @DisabledTest
59    public void testAddBookmark() {
60        final long lastUpdateTime = System.currentTimeMillis();
61        final long createdTime = lastUpdateTime - 1000 * 60 * 60;
62        final String url = "http://www.google.com/";
63        final int visits = 2;
64        final String title = "Google";
65        ContentValues values = new ContentValues();
66        values.put(BookmarkColumns.BOOKMARK, 0);
67        values.put(BookmarkColumns.DATE, lastUpdateTime);
68        values.put(BookmarkColumns.CREATED, createdTime);
69        values.put(BookmarkColumns.FAVICON, BookmarkUtils.getIcon(ICON_PATH));
70        values.put(BookmarkColumns.URL, url);
71        values.put(BookmarkColumns.VISITS, visits);
72        values.put(BookmarkColumns.TITLE, title);
73        Uri uri = getContentResolver().insert(mBookmarksUri, values);
74        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
75        assertEquals(1, cursor.getCount());
76        assertTrue(cursor.moveToNext());
77        int index = cursor.getColumnIndex(BookmarkColumns.BOOKMARK);
78        assertTrue(-1 != index);
79        assertEquals(0, cursor.getInt(index));
80        index = cursor.getColumnIndex(BookmarkColumns.CREATED);
81        assertTrue(-1 != index);
82        assertEquals(createdTime, cursor.getLong(index));
83        index = cursor.getColumnIndex(BookmarkColumns.DATE);
84        assertTrue(-1 != index);
85        assertEquals(lastUpdateTime, cursor.getLong(index));
86        index = cursor.getColumnIndex(BookmarkColumns.FAVICON);
87        assertTrue(-1 != index);
88        assertTrue(BookmarkUtils.byteArrayEqual(BookmarkUtils.getIcon(ICON_PATH),
89                cursor.getBlob(index)));
90        index = cursor.getColumnIndex(BookmarkColumns.URL);
91        assertTrue(-1 != index);
92        assertEquals(url, cursor.getString(index));
93        index = cursor.getColumnIndex(BookmarkColumns.VISITS);
94        assertTrue(-1 != index);
95        assertEquals(visits, cursor.getInt(index));
96    }
97
98    /**
99     * @MediumTest
100     * @Feature({"Android-ContentProvider"})
101     * BUG 154683
102     */
103    @DisabledTest
104    public void testQueryBookmark() {
105        final long now = System.currentTimeMillis();
106        final long lastUpdateTime[] = { now, now - 1000 * 60 };
107        final long createdTime[] = { now - 1000 * 60 * 60, now - 1000 * 60 * 60 * 60 };
108        final String url[] = { "http://www.google.com/", "http://mail.google.com/" };
109        final int visits[] = { 2, 20 };
110        final String title[] = { "Google", "Mail" };
111        final int isBookmark[] = { 1, 0 };
112        Uri[] uris = new Uri[2];
113        byte[][] icons = { BookmarkUtils.getIcon(ICON_PATH), null };
114        for (int i = 0; i < uris.length; i++) {
115            uris[i] = addBookmark(url[i], title[i], lastUpdateTime[i], createdTime[i], visits[i],
116                    icons[i], isBookmark[i]);
117            assertNotNull(uris[i]);
118        }
119
120        // Query the 1st row.
121        String[] selectionArgs = { url[0], String.valueOf(lastUpdateTime[0]),
122                String.valueOf(visits[0]), String.valueOf(isBookmark[0]) };
123        Cursor cursor = getContentResolver().query(mBookmarksUri, null,
124                "url = ? AND date = ? AND visits = ? AND bookmark = ? AND favicon IS NOT NULL",
125                selectionArgs, null);
126        assertNotNull(cursor);
127        assertEquals(1, cursor.getCount());
128        assertTrue(cursor.moveToNext());
129        int index = cursor.getColumnIndex(BookmarkColumns.BOOKMARK);
130        assertTrue(-1 != index);
131        assertEquals(isBookmark[0], cursor.getInt(index));
132        index = cursor.getColumnIndex(BookmarkColumns.CREATED);
133        assertTrue(-1 != index);
134        assertEquals(createdTime[0], cursor.getLong(index));
135        index = cursor.getColumnIndex(BookmarkColumns.DATE);
136        assertTrue(-1 != index);
137        assertEquals(lastUpdateTime[0], cursor.getLong(index));
138        index = cursor.getColumnIndex(BookmarkColumns.FAVICON);
139        assertTrue(-1 != index);
140        assertTrue(BookmarkUtils.byteArrayEqual(icons[0], cursor.getBlob(index)));
141        index = cursor.getColumnIndex(BookmarkColumns.URL);
142        assertTrue(-1 != index);
143        assertEquals(url[0], cursor.getString(index));
144        index = cursor.getColumnIndex(BookmarkColumns.VISITS);
145        assertTrue(-1 != index);
146        assertEquals(visits[0], cursor.getInt(index));
147
148        // Query the 2nd row.
149        String[] selectionArgs2 = { url[1], String.valueOf(lastUpdateTime[1]),
150                String.valueOf(visits[1]), String.valueOf(isBookmark[1]) };
151        cursor = getContentResolver().query(mBookmarksUri, null,
152                "url = ? AND date = ? AND visits = ? AND bookmark = ? AND favicon IS NULL",
153                selectionArgs2, null);
154        assertNotNull(cursor);
155        assertEquals(1, cursor.getCount());
156        assertTrue(cursor.moveToNext());
157        index = cursor.getColumnIndex(BookmarkColumns.BOOKMARK);
158        assertTrue(-1 != index);
159        assertEquals(isBookmark[1], cursor.getInt(index));
160        index = cursor.getColumnIndex(BookmarkColumns.CREATED);
161        assertTrue(-1 != index);
162        assertEquals(createdTime[1], cursor.getLong(index));
163        index = cursor.getColumnIndex(BookmarkColumns.DATE);
164        assertTrue(-1 != index);
165        assertEquals(lastUpdateTime[1], cursor.getLong(index));
166        index = cursor.getColumnIndex(BookmarkColumns.FAVICON);
167        assertTrue(-1 != index);
168        assertTrue(BookmarkUtils.byteArrayEqual(icons[1], cursor.getBlob(index)));
169        index = cursor.getColumnIndex(BookmarkColumns.URL);
170        assertTrue(-1 != index);
171        assertEquals(url[1], cursor.getString(index));
172        index = cursor.getColumnIndex(BookmarkColumns.VISITS);
173        assertTrue(-1 != index);
174        assertEquals(visits[1], cursor.getInt(index));
175    }
176
177    /**
178     * @MediumTest
179     * @Feature({"Android-ContentProvider"})
180     * BUG 154683
181     */
182    @DisabledTest
183    public void testUpdateBookmark() {
184        final long now = System.currentTimeMillis();
185        final long lastUpdateTime[] = { now, now - 1000 * 60 };
186        final long createdTime[] = { now - 1000 * 60 * 60, now - 1000 * 60 * 60 * 60 };
187        final String url[] = { "http://www.google.com/", "http://mail.google.com/" };
188        final int visits[] = { 2, 20 };
189        final String title[] = { "Google", "Mail" };
190        final int isBookmark[] = { 1, 0 };
191
192        byte[][] icons = { BookmarkUtils.getIcon(ICON_PATH), null };
193        Uri uri = addBookmark(url[0], title[0], lastUpdateTime[0], createdTime[0], visits[0],
194                icons[0], isBookmark[0]);
195        assertNotNull(uri);
196
197        ContentValues values = new ContentValues();
198        values.put(BookmarkColumns.BOOKMARK, isBookmark[1]);
199        values.put(BookmarkColumns.DATE, lastUpdateTime[1]);
200        values.put(BookmarkColumns.URL, url[1]);
201        values.putNull(BookmarkColumns.FAVICON);
202        values.put(BookmarkColumns.TITLE, title[1]);
203        values.put(BookmarkColumns.VISITS, visits[1]);
204        String[] selectionArgs = { String.valueOf(lastUpdateTime[0]),
205                String.valueOf(isBookmark[0]) };
206        getContentResolver().update(uri, values, BookmarkColumns.FAVICON +  " IS NOT NULL AND " +
207                BookmarkColumns.DATE + "= ? AND " + BookmarkColumns.BOOKMARK + " = ?",
208                selectionArgs);
209        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
210        assertEquals(1, cursor.getCount());
211        assertTrue(cursor.moveToNext());
212        int index = cursor.getColumnIndex(BookmarkColumns.BOOKMARK);
213        assertTrue(-1 != index);
214        assertEquals(isBookmark[1], cursor.getInt(index));
215        index = cursor.getColumnIndex(BookmarkColumns.CREATED);
216        assertTrue(-1 != index);
217        assertEquals(createdTime[0], cursor.getLong(index));
218        index = cursor.getColumnIndex(BookmarkColumns.DATE);
219        assertTrue(-1 != index);
220        assertEquals(lastUpdateTime[1], cursor.getLong(index));
221        index = cursor.getColumnIndex(BookmarkColumns.FAVICON);
222        assertTrue(-1 != index);
223        assertTrue(BookmarkUtils.byteArrayEqual(icons[1], cursor.getBlob(index)));
224        index = cursor.getColumnIndex(BookmarkColumns.URL);
225        assertTrue(-1 != index);
226        assertEquals(url[1], cursor.getString(index));
227        index = cursor.getColumnIndex(BookmarkColumns.VISITS);
228        assertTrue(-1 != index);
229        assertEquals(visits[1], cursor.getInt(index));
230    }
231
232    /**
233     * @MediumTest
234     * @Feature({"Android-ContentProvider"})
235     * BUG 154683
236     */
237    @DisabledTest
238    public void testDeleteBookmark() {
239        final long now = System.currentTimeMillis();
240        final long lastUpdateTime[] = { now, now - 1000 * 60 };
241        final long createdTime[] = { now - 1000 * 60 * 60, now - 1000 * 60 * 60 * 60 };
242        final String url[] = { "http://www.google.com/", "http://mail.google.com/" };
243        final int visits[] = { 2, 20 };
244        final String title[] = { "Google", "Mail" };
245        final int isBookmark[] = { 1, 0 };
246        Uri[] uris = new Uri[2];
247        byte[][] icons = { BookmarkUtils.getIcon(ICON_PATH), null };
248        for (int i = 0; i < uris.length; i++) {
249            uris[i] = addBookmark(url[i], title[i], lastUpdateTime[i], createdTime[i], visits[i],
250                    icons[i], isBookmark[i]);
251            assertNotNull(uris[i]);
252        }
253
254        String[] selectionArgs = { String.valueOf(lastUpdateTime[0]),
255                String.valueOf(isBookmark[0]) };
256        getContentResolver().delete(mBookmarksUri, BookmarkColumns.FAVICON +  " IS NOT NULL AND " +
257                BookmarkColumns.DATE + "= ? AND " + BookmarkColumns.BOOKMARK + " = ?",
258                selectionArgs);
259        Cursor cursor = getContentResolver().query(uris[0], null, null, null, null);
260        assertNotNull(cursor);
261        assertEquals(0, cursor.getCount());
262        cursor = getContentResolver().query(uris[1], null, null, null, null);
263        assertNotNull(cursor);
264        assertEquals(1, cursor.getCount());
265        String[] selectionArgs1 = { String.valueOf(lastUpdateTime[1]),
266                String.valueOf(isBookmark[1]) };
267        getContentResolver().delete(mBookmarksUri, BookmarkColumns.FAVICON +  " IS NULL AND " +
268                BookmarkColumns.DATE + "= ? AND " + BookmarkColumns.BOOKMARK + " = ?",
269                selectionArgs1);
270        cursor = getContentResolver().query(uris[1], null, null, null, null);
271        assertNotNull(cursor);
272        assertEquals(0, cursor.getCount());
273    }
274
275    /*
276     * Copied from CTS test with minor adaptations.
277     */
278    /**
279     * @MediumTest
280     * @Feature({"Android-ContentProvider"})
281     * BUG 154683
282     */
283    @DisabledTest
284    public void testBookmarksTable() {
285        final String[] bookmarksProjection = new String[] {
286                BookmarkColumns._ID, BookmarkColumns.URL, BookmarkColumns.VISITS,
287                BookmarkColumns.DATE, BookmarkColumns.CREATED, BookmarkColumns.BOOKMARK,
288                BookmarkColumns.TITLE, BookmarkColumns.FAVICON };
289        final int idIndex = 0;
290        final int urlIndex = 1;
291        final int visitsIndex = 2;
292        final int dataIndex = 3;
293        final int createdIndex = 4;
294        final int bookmarkIndex = 5;
295        final int titleIndex = 6;
296        final int faviconIndex = 7;
297
298        final String insertBookmarkTitle = "bookmark_insert";
299        final String insertBookmarkUrl = "www.bookmark_insert.com";
300
301        final String updateBookmarkTitle = "bookmark_update";
302        final String updateBookmarkUrl = "www.bookmark_update.com";
303
304        // Test: insert.
305        ContentValues value = new ContentValues();
306        long createDate = new Date().getTime();
307        value.put(BookmarkColumns.TITLE, insertBookmarkTitle);
308        value.put(BookmarkColumns.URL, insertBookmarkUrl);
309        value.put(BookmarkColumns.VISITS, 0);
310        value.put(BookmarkColumns.DATE, createDate);
311        value.put(BookmarkColumns.CREATED, createDate);
312        value.put(BookmarkColumns.BOOKMARK, 0);
313
314        Uri insertUri = getContentResolver().insert(mBookmarksUri, value);
315        Cursor cursor = getContentResolver().query(
316                mBookmarksUri,
317                bookmarksProjection,
318                BookmarkColumns.TITLE + " = ?",
319                new String[] { insertBookmarkTitle },
320                BookmarkColumns.DATE);
321        assertTrue(cursor.moveToNext());
322        assertEquals(insertBookmarkTitle, cursor.getString(titleIndex));
323        assertEquals(insertBookmarkUrl, cursor.getString(urlIndex));
324        assertEquals(0, cursor.getInt(visitsIndex));
325        assertEquals(createDate, cursor.getLong(dataIndex));
326        assertEquals(createDate, cursor.getLong(createdIndex));
327        assertEquals(0, cursor.getInt(bookmarkIndex));
328        // TODO(michaelbai): according to the test this should be null instead of an empty byte[].
329        // BUG 6288508
330        // assertTrue(cursor.isNull(FAVICON_INDEX));
331        int Id = cursor.getInt(idIndex);
332        cursor.close();
333
334        // Test: update.
335        value.clear();
336        long updateDate = new Date().getTime();
337        value.put(BookmarkColumns.TITLE, updateBookmarkTitle);
338        value.put(BookmarkColumns.URL, updateBookmarkUrl);
339        value.put(BookmarkColumns.VISITS, 1);
340        value.put(BookmarkColumns.DATE, updateDate);
341
342        getContentResolver().update(mBookmarksUri, value,
343                BookmarkColumns.TITLE + " = ?",
344                new String[] { insertBookmarkTitle });
345        cursor = getContentResolver().query(
346                mBookmarksUri,
347                bookmarksProjection,
348                BookmarkColumns._ID + " = " + Id,
349                null, null);
350        assertTrue(cursor.moveToNext());
351        assertEquals(updateBookmarkTitle, cursor.getString(titleIndex));
352        assertEquals(updateBookmarkUrl, cursor.getString(urlIndex));
353        assertEquals(1, cursor.getInt(visitsIndex));
354        assertEquals(updateDate, cursor.getLong(dataIndex));
355        assertEquals(createDate, cursor.getLong(createdIndex));
356        assertEquals(0, cursor.getInt(bookmarkIndex));
357        // TODO(michaelbai): according to the test this should be null instead of an empty byte[].
358        // BUG 6288508
359        // assertTrue(cursor.isNull(FAVICON_INDEX));
360        assertEquals(Id, cursor.getInt(idIndex));
361
362        // Test: delete.
363        getContentResolver().delete(insertUri, null, null);
364        cursor = getContentResolver().query(
365                mBookmarksUri,
366                bookmarksProjection,
367                BookmarkColumns._ID + " = " + Id,
368                null, null);
369        assertEquals(0, cursor.getCount());
370    }
371}
372