1ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert/*
2ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * Copyright (C) 2010 The Android Open Source Project
3ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert *
4ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
5ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * you may not use this file except in compliance with the License.
6ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * You may obtain a copy of the License at
7ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert *
8ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert *      http://www.apache.org/licenses/LICENSE-2.0
9ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert *
10ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
11ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
12ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * See the License for the specific language governing permissions and
14ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * limitations under the License.
15ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert */
16ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
17ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringertpackage com.android.browser;
18ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
198706008824a86cd28f6911be26dde2602a4b4a6aJohn Reckimport com.android.browser.provider.BrowserProvider;
2057e39f9e46091750c8a07895531446a7f0efdb21John Reckimport com.android.browser.provider.BrowserProvider2;
2157e39f9e46091750c8a07895531446a7f0efdb21John Reckimport com.android.browser.tests.utils.ProviderTestCase3;
2257e39f9e46091750c8a07895531446a7f0efdb21John Reck
23ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringertimport android.app.SearchManager;
24ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringertimport android.content.ContentValues;
25ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringertimport android.database.Cursor;
26ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringertimport android.net.Uri;
2757e39f9e46091750c8a07895531446a7f0efdb21John Reckimport android.provider.BrowserContract;
28ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringertimport android.test.suitebuilder.annotation.MediumTest;
29ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
30ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringertimport java.util.ArrayList;
31ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringertimport java.util.Arrays;
32ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
33ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert/**
34ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert * Unit tests for {@link BrowserProvider}.
35ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert */
36ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert@MediumTest
3757e39f9e46091750c8a07895531446a7f0efdb21John Reckpublic class BrowserProviderTests extends ProviderTestCase3<BrowserProvider2> {
38ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
39ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    private ArrayList<Uri> mDeleteUris;
40ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
4157e39f9e46091750c8a07895531446a7f0efdb21John Reck    public BrowserProviderTests() {
4257e39f9e46091750c8a07895531446a7f0efdb21John Reck        super(BrowserProvider2.class,
4357e39f9e46091750c8a07895531446a7f0efdb21John Reck                BrowserContract.AUTHORITY, BrowserProvider2.LEGACY_AUTHORITY);
4457e39f9e46091750c8a07895531446a7f0efdb21John Reck    }
4557e39f9e46091750c8a07895531446a7f0efdb21John Reck
46ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    @Override
47ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    protected void setUp() throws Exception {
48ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        mDeleteUris = new ArrayList<Uri>();
49ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        super.setUp();
50ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
51ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
52ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    @Override
53ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    protected void tearDown() throws Exception {
54ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        for (Uri uri : mDeleteUris) {
55ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert            deleteUri(uri);
56ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        }
57ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        super.tearDown();
58ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
59ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
60ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    public void testHasDefaultBookmarks() {
61ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        Cursor c = getBookmarksSuggest("");
62ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        try {
63ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert            assertTrue("No default bookmarks", c.getCount() > 0);
64ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        } finally {
65ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert            c.close();
66ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        }
67ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
68ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
69ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    public void testPartialFirstTitleWord() {
70ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertInsertQuery("http://www.example.com/rasdfe", "nfgjra sdfywe", "nfgj");
71ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
72ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
73ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    public void testFullFirstTitleWord() {
74ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertInsertQuery("http://www.example.com/", "nfgjra dfger", "nfgjra");
75ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
76ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
77ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    public void testFullFirstTitleWordPartialSecond() {
78ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertInsertQuery("http://www.example.com/", "nfgjra dfger", "nfgjra df");
79ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
80ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
81ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    public void testFullTitle() {
82ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertInsertQuery("http://www.example.com/", "nfgjra dfger", "nfgjra dfger");
83ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
84ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
85ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert// Not implemented in BrowserProvider
86ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert//    public void testFullSecondTitleWord() {
87ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert//        assertInsertQuery("http://www.example.com/rasdfe", "nfgjra sdfywe", "sdfywe");
88ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert//    }
89ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
90ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    public void testFullTitleJapanese() {
91ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        String title = "\u30ae\u30e3\u30e9\u30ea\u30fc\u30fcGoogle\u691c\u7d22";
92ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertInsertQuery("http://www.example.com/sdaga", title, title);
93ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
94ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
95ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    public void testPartialTitleJapanese() {
96ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        String title = "\u30ae\u30e3\u30e9\u30ea\u30fc\u30fcGoogle\u691c\u7d22";
97ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        String query = "\u30ae\u30e3\u30e9\u30ea\u30fc";
98ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertInsertQuery("http://www.example.com/sdaga", title, query);
99ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
100ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
101ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    // Test for http://b/issue?id=2152749
102ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    public void testSoundmarkTitleJapanese() {
103ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        String title = "\u30ae\u30e3\u30e9\u30ea\u30fc\u30fcGoogle\u691c\u7d22";
104ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        String query = "\u30ad\u30e3\u30e9\u30ea\u30fc";
105ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertInsertQuery("http://www.example.com/sdaga", title, query);
106ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
107ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
108ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    //
109ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    // Utilities
110ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    //
111ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
112ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    private void assertInsertQuery(String url, String title, String query) {
113ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        addBookmark(url, title);
114ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertQueryReturns(url, title, query);
115ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
116ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
117ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    private void assertQueryReturns(String url, String title, String query) {
118ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        Cursor c = getBookmarksSuggest(query);
119ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        try {
120ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert            assertTrue(title + " not matched by " + query, c.getCount() > 0);
121ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert            assertTrue("More than one result for " + query, c.getCount() == 1);
122ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert            while (c.moveToNext()) {
123ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                String text1 = getCol(c, SearchManager.SUGGEST_COLUMN_TEXT_1);
124ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                assertNotNull(text1);
125ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                assertEquals("Bad title", title, text1);
126ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                String text2 = getCol(c, SearchManager.SUGGEST_COLUMN_TEXT_2);
127ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                assertNotNull(text2);
128ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                String data = getCol(c, SearchManager.SUGGEST_COLUMN_INTENT_DATA);
129ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                assertNotNull(data);
130ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                assertEquals("Bad URL", url, data);
131ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert            }
132ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        } finally {
133ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert            c.close();
134ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        }
135ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
136ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
137ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    private Cursor getBookmarksSuggest(String query) {
138ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        Uri suggestUri = Uri.parse("content://browser/bookmarks/search_suggest_query");
139ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        String[] selectionArgs = { query };
14057e39f9e46091750c8a07895531446a7f0efdb21John Reck        Cursor c = getMockContentResolver().query(suggestUri, null, "url LIKE ?",
141ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                selectionArgs, null);
142ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertNotNull(c);
143ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        return c;
144ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
145ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
146ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    private void addBookmark(String url, String title) {
147ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        Uri uri = insertBookmark(url, title);
148ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertNotNull(uri);
149ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertFalse(android.provider.Browser.BOOKMARKS_URI.equals(uri));
150ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        mDeleteUris.add(uri);
151ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
152ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
153ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    private Uri insertBookmark(String url, String title) {
154ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        ContentValues values = new ContentValues();
155ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        values.put("title", title);
156ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        values.put("url", url);
157ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        values.put("visits", 0);
158ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        values.put("date", 0);
159ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        values.put("created", 0);
160ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        values.put("bookmark", 1);
16157e39f9e46091750c8a07895531446a7f0efdb21John Reck        return getMockContentResolver().insert(android.provider.Browser.BOOKMARKS_URI,
162ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                values);
163ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
164ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
165ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    private void deleteUri(Uri uri) {
16657e39f9e46091750c8a07895531446a7f0efdb21John Reck        int count = getMockContentResolver().delete(uri, null, null);
167ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertEquals("Failed to delete " + uri, 1, count);
168ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
169ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert
170ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    private static String getCol(Cursor c, String name) {
171ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        int col = c.getColumnIndex(name);
172ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        String msg = "Column " + name + " not found, columns: "
173ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert                + Arrays.toString(c.getColumnNames());
174ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        assertTrue(msg, col >= 0);
175ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert        return c.getString(col);
176ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert    }
177ab1655e799a3b0a82cea62e05b4017c21ab53881Bjorn Bringert}
178