17dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck/*
27dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * Copyright (C) 2011 The Android Open Source Project
37dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck *
47dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * Licensed under the Apache License, Version 2.0 (the "License");
57dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * you may not use this file except in compliance with the License.
67dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * You may obtain a copy of the License at
77dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck *
87dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck *      http://www.apache.org/licenses/LICENSE-2.0
97dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck *
107dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * Unless required by applicable law or agreed to in writing, software
117dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * distributed under the License is distributed on an "AS IS" BASIS,
127dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * See the License for the specific language governing permissions and
147dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck * limitations under the License.
157dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck */
167dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck
177dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckpackage com.android.browser.tests;
187dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck
197dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckimport com.android.browser.tests.utils.BP2TestCaseHelper;
207dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck
2157e39f9e46091750c8a07895531446a7f0efdb21John Reckimport android.content.ContentUris;
227dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckimport android.content.ContentValues;
2357e39f9e46091750c8a07895531446a7f0efdb21John Reckimport android.database.Cursor;
247dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckimport android.graphics.Bitmap;
257dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckimport android.graphics.Bitmap.Config;
2657e39f9e46091750c8a07895531446a7f0efdb21John Reckimport android.net.Uri;
2757e39f9e46091750c8a07895531446a7f0efdb21John Reckimport android.provider.BrowserContract;
287dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckimport android.provider.BrowserContract.Images;
297dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckimport android.test.suitebuilder.annotation.SmallTest;
307dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck
317dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckimport java.io.ByteArrayOutputStream;
327dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck
337dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck@SmallTest
347dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reckpublic class BP2ProviderTests extends BP2TestCaseHelper {
357dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck
362bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck    static final String[] PROJECTION = new String[] {
372bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            BrowserContract.Bookmarks.PARENT,
382bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            BrowserContract.Bookmarks.ACCOUNT_NAME,
392bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            BrowserContract.Bookmarks.ACCOUNT_TYPE,
402bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck    };
412bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck    static final int INDEX_PARENT = 0;
422bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck    static final int INDEX_ACCOUNT_NAME = 1;
432bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck    static final int INDEX_ACCOUNT_TYPE = 2;
442bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck
457dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck    public void testUpdateImage() {
467dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        String url = "http://stub1.com";
477dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        insertBookmark(url, "stub 1");
487dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        ContentValues values = new ContentValues();
497dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        values.put(Images.URL, url);
507dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        Bitmap bitmap = Bitmap.createBitmap(1, 1, Config.ARGB_8888);
517dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        ByteArrayOutputStream os = new ByteArrayOutputStream();
527dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
537dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        values.put(Images.THUMBNAIL, os.toByteArray());
547dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        // Use updateBookmarks because the bookmarks URI observer should
557dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        // be triggered, even though we aren't giving it a bookmarks URI
567dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck        assertTrue(updateBookmark(Images.CONTENT_URI, values));
577dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck    }
587dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck
5957e39f9e46091750c8a07895531446a7f0efdb21John Reck    public void testIsValidParentNullAccount() {
6057e39f9e46091750c8a07895531446a7f0efdb21John Reck        doTestIsValidParent(null, null);
6157e39f9e46091750c8a07895531446a7f0efdb21John Reck    }
6257e39f9e46091750c8a07895531446a7f0efdb21John Reck
6357e39f9e46091750c8a07895531446a7f0efdb21John Reck    public void testIsValidParentWithAccount() {
6457e39f9e46091750c8a07895531446a7f0efdb21John Reck        doTestIsValidParent("test@gmail.com", "com.google");
6557e39f9e46091750c8a07895531446a7f0efdb21John Reck    }
6657e39f9e46091750c8a07895531446a7f0efdb21John Reck
6757e39f9e46091750c8a07895531446a7f0efdb21John Reck    private void doTestIsValidParent(String accountName, String accountType) {
682bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck        // Create the folder
6957e39f9e46091750c8a07895531446a7f0efdb21John Reck        ContentValues values = new ContentValues();
7057e39f9e46091750c8a07895531446a7f0efdb21John Reck        values.put(BrowserContract.Bookmarks.TITLE, "New Folder");
7157e39f9e46091750c8a07895531446a7f0efdb21John Reck        values.put(BrowserContract.Bookmarks.IS_FOLDER, 1);
7257e39f9e46091750c8a07895531446a7f0efdb21John Reck        values.put(BrowserContract.Bookmarks.ACCOUNT_NAME, accountName);
7357e39f9e46091750c8a07895531446a7f0efdb21John Reck        values.put(BrowserContract.Bookmarks.ACCOUNT_TYPE, accountType);
7457e39f9e46091750c8a07895531446a7f0efdb21John Reck        Uri folderUri = insertBookmark(values);
7557e39f9e46091750c8a07895531446a7f0efdb21John Reck        assertNotNull(folderUri);
7657e39f9e46091750c8a07895531446a7f0efdb21John Reck        long folderId = ContentUris.parseId(folderUri);
7757e39f9e46091750c8a07895531446a7f0efdb21John Reck        assertTrue("Failed to parse folder id!", folderId > 0);
782bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck        // Insert a bookmark with the same ACCOUNT_* info as parent
7957e39f9e46091750c8a07895531446a7f0efdb21John Reck        values.put(BrowserContract.Bookmarks.TITLE, "google");
8057e39f9e46091750c8a07895531446a7f0efdb21John Reck        values.put(BrowserContract.Bookmarks.URL, "http://google.com");
8157e39f9e46091750c8a07895531446a7f0efdb21John Reck        values.put(BrowserContract.Bookmarks.IS_FOLDER, 0);
8257e39f9e46091750c8a07895531446a7f0efdb21John Reck        values.put(BrowserContract.Bookmarks.PARENT, folderId);
8357e39f9e46091750c8a07895531446a7f0efdb21John Reck        Uri insertedUri = insertBookmark(values);
8457e39f9e46091750c8a07895531446a7f0efdb21John Reck        assertNotNull(insertedUri);
8557e39f9e46091750c8a07895531446a7f0efdb21John Reck        Cursor c = getMockContentResolver().query(insertedUri,
862bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck                PROJECTION, null, null, null);
8757e39f9e46091750c8a07895531446a7f0efdb21John Reck        try {
8857e39f9e46091750c8a07895531446a7f0efdb21John Reck            assertNotNull(c);
8957e39f9e46091750c8a07895531446a7f0efdb21John Reck            assertTrue(c.moveToFirst());
902bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            long insertedParentId = c.getLong(INDEX_PARENT);
912bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            String insertedAccountName = c.getString(INDEX_ACCOUNT_NAME);
922bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            String insertedAccountType = c.getString(INDEX_ACCOUNT_TYPE);
932bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertEquals(folderId, insertedParentId);
942bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertEquals(accountName, insertedAccountName);
952bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertEquals(accountType, insertedAccountType);
962bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck
972bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            // Insert a bookmark with no ACCOUNT_* set, BUT with a valid parent
982bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            // The inserted should end up with the ACCOUNT_* of the parent
992bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            values.remove(BrowserContract.Bookmarks.ACCOUNT_NAME);
1002bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            values.remove(BrowserContract.Bookmarks.ACCOUNT_TYPE);
1012bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            insertedUri = insertBookmark(values);
1022bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertNotNull(insertedUri);
1032bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            c.close();
1042bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            c = getMockContentResolver().query(insertedUri,
1052bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck                    PROJECTION, null, null, null);
1062bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertNotNull(c);
1072bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertTrue(c.moveToFirst());
1082bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            insertedParentId = c.getLong(INDEX_PARENT);
1092bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            insertedAccountName = c.getString(INDEX_ACCOUNT_NAME);
1102bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            insertedAccountType = c.getString(INDEX_ACCOUNT_TYPE);
11157e39f9e46091750c8a07895531446a7f0efdb21John Reck            assertEquals(folderId, insertedParentId);
1122bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertEquals(accountName, insertedAccountName);
1132bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertEquals(accountType, insertedAccountType);
1142bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck
1152bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            // Insert a bookmark with a different ACCOUNT_* than it's parent
1162bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            // ACCOUNT_* should override parent
1172bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            accountName = accountName + "@something.else";
1182bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            accountType = "com.google";
1192bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            values.put(BrowserContract.Bookmarks.ACCOUNT_NAME, accountName);
1202bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            values.put(BrowserContract.Bookmarks.ACCOUNT_TYPE, accountType);
12157e39f9e46091750c8a07895531446a7f0efdb21John Reck            insertedUri = insertBookmark(values);
12257e39f9e46091750c8a07895531446a7f0efdb21John Reck            assertNotNull(insertedUri);
12357e39f9e46091750c8a07895531446a7f0efdb21John Reck            c.close();
12457e39f9e46091750c8a07895531446a7f0efdb21John Reck            c = getMockContentResolver().query(insertedUri,
1252bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck                    PROJECTION, null, null, null);
12657e39f9e46091750c8a07895531446a7f0efdb21John Reck            assertNotNull(c);
12757e39f9e46091750c8a07895531446a7f0efdb21John Reck            assertTrue(c.moveToFirst());
1282bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            insertedParentId = c.getLong(INDEX_PARENT);
1292bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            insertedAccountName = c.getString(INDEX_ACCOUNT_NAME);
1302bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            insertedAccountType = c.getString(INDEX_ACCOUNT_TYPE);
1312bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertNotSame(folderId, insertedParentId);
1322bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertEquals(accountName, insertedAccountName);
1332bc42420fdf7e42cbdcca0a07e73fbefe7edb5bfJohn Reck            assertEquals(accountType, insertedAccountType);
13457e39f9e46091750c8a07895531446a7f0efdb21John Reck        } finally {
13557e39f9e46091750c8a07895531446a7f0efdb21John Reck            c.close();
13657e39f9e46091750c8a07895531446a7f0efdb21John Reck        }
13757e39f9e46091750c8a07895531446a7f0efdb21John Reck    }
1387dd30cb0bd011e5fbd817fa64863b4c266dd76b7John Reck}
139