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