19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.database;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawaimport static android.database.DatabaseUtils.InsertHelper.TABLE_INFO_PRAGMA_COLUMNNAME_INDEX;
20b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawaimport static android.database.DatabaseUtils.InsertHelper.TABLE_INFO_PRAGMA_DEFAULT_INDEX;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
22ad8d0d1b4d4b8cde73c30e9facad6514e492bf11Vasu Noriimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
24fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Noriimport android.database.sqlite.SQLiteException;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
27ad8d0d1b4d4b8cde73c30e9facad6514e492bf11Vasu Noriimport android.test.AndroidTestCase;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.PerformanceTestCase;
2985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Noriimport android.test.suitebuilder.annotation.LargeTest;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
3385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Noriimport android.util.Pair;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.Assert;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawaimport java.io.File;
389504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Noriimport java.util.ArrayList;
39b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawaimport java.util.Arrays;
40a017edace756956cd4b4789a85316e3681d04a7eVasu Noriimport java.util.List;
41b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawaimport java.util.Locale;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43ad8d0d1b4d4b8cde73c30e9facad6514e492bf11Vasu Noripublic class DatabaseGeneralTest extends AndroidTestCase implements PerformanceTestCase {
44b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa    private static final String TAG = "DatabaseGeneralTest";
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String sString1 = "this is a test";
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String sString2 = "and yet another test";
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String sString3 = "this string is a little longer, but still a test";
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PHONE_NUMBER = "16175551212";
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int CURRENT_DATABASE_VERSION = 42;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SQLiteDatabase mDatabase;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabaseFile;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
58ad8d0d1b4d4b8cde73c30e9facad6514e492bf11Vasu Nori        File dbDir = getContext().getDir(this.getClass().getName(), Context.MODE_PRIVATE);
59ad8d0d1b4d4b8cde73c30e9facad6514e492bf11Vasu Nori        mDatabaseFile = new File(dbDir, "database_test.db");
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabaseFile.exists()) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabaseFile.delete();
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(mDatabase);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setVersion(CURRENT_DATABASE_VERSION);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void tearDown() throws Exception {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.close();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabaseFile.delete();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.tearDown();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isPerformanceOnly() {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These test can only be run once.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int startPerformance(Intermediates intermediates) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void populateDefaultTable() {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString1 + "');");
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString2 + "');");
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString3 + "');");
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testVersion() throws Exception {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(CURRENT_DATABASE_VERSION, mDatabase.getVersion());
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setVersion(11);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(11, mDatabase.getVersion());
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testUpdate() throws Exception {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        populateDefaultTable();
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContentValues values = new ContentValues(1);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("data", "this is an updated test");
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, mDatabase.update("test", values, "_id=1", null));
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = mDatabase.query("test", null, "_id=1", null, null, null, null);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String value = c.getString(c.getColumnIndexOrThrow("data"));
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("this is an updated test", value);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPhoneNumbersEqual() throws Exception {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE phones (num TEXT);");
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO phones (num) VALUES ('911');");
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO phones (num) VALUES ('5555');");
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO phones (num) VALUES ('+" + PHONE_NUMBER + "');");
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String number;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '504-555-7683')", null, null, null, null);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(c == null || c.getCount() == 0);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '911')", null, null, null, null);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = c.getString(c.getColumnIndexOrThrow("num"));
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("911", number);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '5555')", null, null, null, null);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = c.getString(c.getColumnIndexOrThrow("num"));
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("5555", number);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '180055555555')", null, null, null, null);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(c == null || c.getCount() == 0);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '+" + PHONE_NUMBER + "')", null, null, null, null);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = c.getString(c.getColumnIndexOrThrow("num"));
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("+" + PHONE_NUMBER, number);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '+1 (617).555-1212')", null, null, null, null);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = c.getString(c.getColumnIndexOrThrow("num"));
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("+" + PHONE_NUMBER, number);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '" + PHONE_NUMBER + "')", null, null, null, null);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = c.getString(c.getColumnIndexOrThrow("num"));
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("+" + PHONE_NUMBER, number);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17940336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        /*
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '5551212')", null, null, null, null);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = c.getString(c.getColumnIndexOrThrow("num"));
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("+" + PHONE_NUMBER, number);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
18840336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        */
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '011" + PHONE_NUMBER + "')", null, null, null, null);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = c.getString(c.getColumnIndexOrThrow("num"));
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("+" + PHONE_NUMBER, number);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.query("phones", null,
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "PHONE_NUMBERS_EQUAL(num, '00" + PHONE_NUMBER + "')", null, null, null, null);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(c);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = c.getString(c.getColumnIndexOrThrow("num"));
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("+" + PHONE_NUMBER, number);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2086a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa
2096a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa    private void phoneNumberCompare(String phone1, String phone2, boolean equal,
2106a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa            boolean useStrictComparation) {
21140336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        String[] temporalPhoneNumbers = new String[2];
21240336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        temporalPhoneNumbers[0] = phone1;
21340336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        temporalPhoneNumbers[1] = phone2;
21440336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa
21540336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        Cursor cursor = mDatabase.rawQuery(
2166a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa                String.format(
2176a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa                        "SELECT CASE WHEN PHONE_NUMBERS_EQUAL(?, ?, %d) " +
2186a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa                        "THEN 'equal' ELSE 'not equal' END",
2196a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa                        (useStrictComparation ? 1 : 0)),
22040336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa                temporalPhoneNumbers);
22140336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        try {
22240336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa            assertNotNull(cursor);
22340336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa            assertTrue(cursor.moveToFirst());
22440336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa            if (equal) {
22540336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa                assertEquals(String.format("Unexpectedly, \"%s != %s\".", phone1, phone2),
22640336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa                        "equal", cursor.getString(0));
22740336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa            } else {
22840336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa                assertEquals(String.format("Unexpectedly, \"%s\" == \"%s\".", phone1, phone2),
22940336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa                        "not equal", cursor.getString(0));
23040336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa            }
23140336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        } finally {
23240336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa            if (cursor != null) {
23340336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa                cursor.close();
23440336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa            }
23540336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        }
23640336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa    }
23740336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa
23840336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa    private void assertPhoneNumberEqual(String phone1, String phone2) throws Exception {
2396a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberEqual(phone1, phone2, true);
2406a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberEqual(phone1, phone2, false);
2416a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa    }
2426a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa
2436a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa    private void assertPhoneNumberEqual(String phone1, String phone2, boolean useStrict)
2446a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa            throws Exception {
2456a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        phoneNumberCompare(phone1, phone2, true, useStrict);
24640336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa    }
24740336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa
24840336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa    private void assertPhoneNumberNotEqual(String phone1, String phone2) throws Exception {
2496a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberNotEqual(phone1, phone2, true);
2506a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberNotEqual(phone1, phone2, false);
2516a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa    }
2526a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa
2536a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa    private void assertPhoneNumberNotEqual(String phone1, String phone2, boolean useStrict)
2546a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa            throws Exception {
2556a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        phoneNumberCompare(phone1, phone2, false, useStrict);
25640336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa    }
25740336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tests international matching issues for the PHONE_NUMBERS_EQUAL function.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws Exception
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26340336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa    @SmallTest
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPhoneNumbersEqualInternationl() throws Exception {
26540336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("1", "1");
26640336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("123123", "123123");
26740336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberNotEqual("123123", "923123");
26840336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberNotEqual("123123", "123129");
26940336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberNotEqual("123123", "1231234");
270409308617fa24abbe8b5cded69dae1ae01b6ffa8Wei Huang        assertPhoneNumberNotEqual("123123", "0123123", false);
2716a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberNotEqual("123123", "0123123", true);
27240336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("650-253-0000", "6502530000");
27340336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("650-253-0000", "650 253 0000");
27440336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("650 253 0000", "6502530000");
27540336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("+1 650-253-0000", "6502530000");
27640336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("001 650-253-0000", "6502530000");
27740336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("0111 650-253-0000", "6502530000");
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Russian trunk digit
28040336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("+79161234567", "89161234567");
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // French trunk digit
28340336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("+33123456789", "0123456789");
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Trunk digit for city codes in the Netherlands
28640336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("+31771234567", "0771234567");
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test broken caller ID seen on call from Thailand to the US
28940336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("+66811234567", "166811234567");
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test the same in-country number with different country codes
29240336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberNotEqual("+33123456789", "+1123456789");
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test one number with country code and the other without
29540336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("5125551212", "+15125551212");
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test two NANP numbers that only differ in the area code
29840336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberNotEqual("5125551212", "6505551212");
29940336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa
30040336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        // Japanese phone numbers
30140336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("090-1234-5678", "+819012345678");
30240336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("090(1234)5678", "+819012345678");
30340336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("090-1234-5678", "+81-90-1234-5678");
30440336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa
30540336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        // Equador
30640336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("+593(800)123-1234", "8001231234");
30740336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        assertPhoneNumberEqual("+593-2-1234-123", "21234123");
30840336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa
30940336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa        // Two continuous 0 at the beginning of the phone string should not be
3106a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        // treated as trunk prefix in the strict comparation.
3116a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberEqual("008001231234", "8001231234", false);
3126a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberNotEqual("008001231234", "8001231234", true);
31340336782eaa797bca3d1487784af113ba3b143ffDaisuke Miyakawa
3146a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        // Confirm that the bug found before does not re-appear in the strict compalation
3156a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberEqual("080-1234-5678", "+819012345678", false);
3166a857d957e7998d99d664fbf88fb1590b9decf77Daisuke Miyakawa        assertPhoneNumberNotEqual("080-1234-5678", "+819012345678", true);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testCopyString() throws Exception {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE guess (numi INTEGER, numf FLOAT, str TEXT);");
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL(
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "INSERT INTO guess (numi,numf,str) VALUES (0,0.0,'ZoomZoomZoomZoom');");
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO guess (numi,numf,str) VALUES (2000000000,3.1415926535,'');");
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String chinese = "\u4eac\u4ec5 \u5c3d\u5f84\u60ca";
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] arr = new String[1];
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        arr[0] = chinese;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO guess (numi,numf,str) VALUES (-32768,-1.0,?)", arr);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c = mDatabase.rawQuery("SELECT * FROM guess", null);
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToFirst();
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharArrayBuffer buf = new CharArrayBuffer(14);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String compareTo = c.getString(c.getColumnIndexOrThrow("numi"));
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numiIdx = c.getColumnIndexOrThrow("numi");
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numfIdx = c.getColumnIndexOrThrow("numf");
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int strIdx = c.getColumnIndexOrThrow("str");
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.copyStringToBuffer(numiIdx, buf);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, buf.sizeCopied);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(compareTo, new String(buf.data, 0, buf.sizeCopied));
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.copyStringToBuffer(strIdx, buf);
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("ZoomZoomZoomZoom", new String(buf.data, 0, buf.sizeCopied));
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToNext();
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        compareTo = c.getString(numfIdx);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.copyStringToBuffer(numfIdx, buf);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(compareTo, new String(buf.data, 0, buf.sizeCopied));
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.copyStringToBuffer(strIdx, buf);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0, buf.sizeCopied);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.moveToNext();
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.copyStringToBuffer(numfIdx, buf);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(-1.0, Double.valueOf(
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new String(buf.data, 0, buf.sizeCopied)).doubleValue());
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.copyStringToBuffer(strIdx, buf);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        compareTo = c.getString(strIdx);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(chinese, compareTo);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(chinese, new String(buf.data, 0, buf.sizeCopied));
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.close();
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testSchemaChange1() throws Exception {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteDatabase db1 = mDatabase;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor cursor;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db1.execSQL("CREATE TABLE db1 (_id INTEGER PRIMARY KEY, data TEXT);");
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cursor = db1.query("db1", null, null, null, null, null, null);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull("Cursor is null", cursor);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db1.execSQL("CREATE TABLE db2 (_id INTEGER PRIMARY KEY, data TEXT);");
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0, cursor.getCount());
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cursor.deactivate();
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testSchemaChange2() throws Exception {
389fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        mDatabase.execSQL("CREATE TABLE db1 (_id INTEGER PRIMARY KEY, data TEXT);");
390fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        Cursor cursor = mDatabase.query("db1", null, null, null, null, null, null);
391fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        assertNotNull(cursor);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0, cursor.getCount());
393fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        cursor.close();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testSchemaChange3() throws Exception {
398fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        mDatabase.execSQL("CREATE TABLE db1 (_id INTEGER PRIMARY KEY, data TEXT);");
399fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        mDatabase.execSQL("INSERT INTO db1 (data) VALUES ('test');");
400fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        mDatabase.execSQL("ALTER TABLE db1 ADD COLUMN blah int;");
401fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        Cursor c = null;
402fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        try {
403fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori            c = mDatabase.rawQuery("select blah from db1", null);
404fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        } catch (SQLiteException e) {
405fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori            fail("unexpected exception: " + e.getMessage());
406fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        } finally {
407fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori            if (c != null) {
408fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori                c.close();
409fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori            }
410fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori        }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class ChangeObserver extends ContentObserver {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mCursorNotificationCount = 0;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mNotificationCount = 0;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getCursorNotificationCount() {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCursorNotificationCount;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getNotificationCount() {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mNotificationCount;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ChangeObserver(boolean cursor) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(new Handler());
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCursor = cursor;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean deliverSelfNotifications() {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onChange(boolean selfChange) {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCursor) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCursorNotificationCount++;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNotificationCount++;
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mCursor;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testSelectionArgs() throws Exception {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContentValues values = new ContentValues(1);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("data", "don't forget to handled 's");
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.insert("test", "data", values);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.clear();
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("data", "no apostrophes here");
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.insert("test", "data", values);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = mDatabase.query(
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "test", null, "data GLOB ?", new String[]{"*'*"}, null, null, null);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(c.moveToFirst());
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("don't forget to handled 's", c.getString(1));
4619504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        c.deactivate();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // make sure code should checking null string properly so that
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // it won't crash
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.query("test", new String[]{"_id"},
4679504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori                    "_id=?", new String[]{null}, null, null, null);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("expected exception not thrown");
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IllegalArgumentException e) {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // expected
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testTokenize() throws Exception {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c;
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE tokens (" +
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "token TEXT COLLATE unicode," +
479819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "source INTEGER," +
4805615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "token_index INTEGER," +
4815615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "tag TEXT" +
482819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                ");");
483819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        mDatabase.execSQL("CREATE TABLE tokens_no_index (" +
484819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "token TEXT COLLATE unicode," +
485819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "source INTEGER" +
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ");");
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT _TOKENIZE(NULL, NULL, NULL, NULL)", null));
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT _TOKENIZE('tokens', NULL, NULL, NULL)", null));
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT _TOKENIZE('tokens', 10, NULL, NULL)", null));
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT _TOKENIZE('tokens', 10, 'some string', NULL)", null));
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(3, DatabaseUtils.longForQuery(mDatabase,
4985615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT _TOKENIZE('tokens', 11, 'some string ok', ' ', 1, 'foo')", null));
4995615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(2, DatabaseUtils.longForQuery(mDatabase,
5005615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT _TOKENIZE('tokens', 11, 'second field', ' ', 1, 'bar')", null));
5015615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert
502819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(3, DatabaseUtils.longForQuery(mDatabase,
503819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT _TOKENIZE('tokens_no_index', 20, 'some string ok', ' ')", null));
504819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(3, DatabaseUtils.longForQuery(mDatabase,
505819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT _TOKENIZE('tokens_no_index', 21, 'foo bar baz', ' ', 0)", null));
506819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // test Chinese
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String chinese = new String("\u4eac\u4ec5 \u5c3d\u5f84\u60ca");
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(2, DatabaseUtils.longForQuery(mDatabase,
510819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT _TOKENIZE('tokens', 12,'" + chinese + "', ' ', 1)", null));
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String icustr = new String("Fr\u00e9d\u00e9ric Hj\u00f8nnev\u00e5g");
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(2, DatabaseUtils.longForQuery(mDatabase,
515819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT _TOKENIZE('tokens', 13, '" + icustr + "', ' ', 1)", null));
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5175615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(9, DatabaseUtils.longForQuery(mDatabase,
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens;", null));
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String key = DatabaseUtils.getHexCollationKey("Frederic Hjonneva");
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
523819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(13, DatabaseUtils.longForQuery(mDatabase,
524819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
525819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
526819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("Hjonneva");
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
530819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(13, DatabaseUtils.longForQuery(mDatabase,
531819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
532819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
533819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("some string ok");
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
538819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
539819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
540819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
541819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5425615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("foo", DatabaseUtils.stringForQuery(mDatabase,
5435615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("string");
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
547819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
548819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
549819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
550819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5515615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("foo", DatabaseUtils.stringForQuery(mDatabase,
5525615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("ok");
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
556819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
557819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
558819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(2, DatabaseUtils.longForQuery(mDatabase,
559819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5605615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("foo", DatabaseUtils.stringForQuery(mDatabase,
5615615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5625615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert
5635615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        key = DatabaseUtils.getHexCollationKey("second field");
5645615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5655615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
5665615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
5675615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
5685615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
5695615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5705615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("bar", DatabaseUtils.stringForQuery(mDatabase,
5715615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5725615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        key = DatabaseUtils.getHexCollationKey("field");
5735615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5745615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
5755615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
5765615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
5775615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5785615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5795615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("bar", DatabaseUtils.stringForQuery(mDatabase,
5805615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5815615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey(chinese);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] a = new String[1];
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a[0] = key;
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token= ?", a));
587819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
588819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token= ?", a));
589819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
590819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token= ?", a));
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a[0] += "*";
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             "SELECT count(*) from tokens where token GLOB ?", a));
594819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
595819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB ?", a));
596819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
597819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB ?", a));
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token= '" + key + "'", null));
601819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert       Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
602819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert               "SELECT source from tokens where token= '" + key + "'", null));
603819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert       Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
604819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert               "SELECT token_index from tokens where token= '" + key + "'", null));
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
608819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
609819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
610819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
611819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("\u4eac\u4ec5");
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
616819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
617819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
618819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
619819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
621819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        key = DatabaseUtils.getHexCollationKey("\u5c3d\u5f84\u60ca");
622819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Log.d("DatabaseGeneralTest", "key = " + key);
623819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
624819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
625819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
626819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
627819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
628819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB 'ab*'", null));
632819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert
633819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        key = DatabaseUtils.getHexCollationKey("some string ok");
634819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
635819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT count(*) from tokens_no_index where token GLOB '" + key + "*'", null));
636819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(20, DatabaseUtils.longForQuery(mDatabase,
637819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens_no_index where token GLOB '" + key + "*'", null));
638819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert
639819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        key = DatabaseUtils.getHexCollationKey("bar");
640819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
641819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT count(*) from tokens_no_index where token GLOB '" + key + "*'", null));
642819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(21, DatabaseUtils.longForQuery(mDatabase,
643819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens_no_index where token GLOB '" + key + "*'", null));
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testTransactions() throws Exception {
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE test (num INTEGER);");
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO test (num) VALUES (0)");
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make sure that things work outside an explicit transaction.
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(1);
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test a single-level transaction.
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(1);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test a rolled-back transaction.
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(0);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should get an error if we end a non-existent transaction.
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertThrowsIllegalState(new Runnable() { public void run() {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.endTransaction();
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }});
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should get an error if a set a non-existent transaction as clean.
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertThrowsIllegalState(new Runnable() { public void run() {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.setTransactionSuccessful();
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }});
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should get an error if we mark a transaction as clean twice.
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertThrowsIllegalState(new Runnable() { public void run() {
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.setTransactionSuccessful();
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }});
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should get an error if we begin a transaction after marking the parent as clean.
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertThrowsIllegalState(new Runnable() { public void run() {
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.beginTransaction();
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }});
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test a two-level transaction.
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(1);
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test rolling back an inner transaction.
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(0);
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test rolling back an outer transaction.
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(0);
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setNum(int num) {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("UPDATE test SET num = " + num);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void checkNum(int num) {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                num, DatabaseUtils.longForQuery(mDatabase, "SELECT num FROM test", null));
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void assertThrowsIllegalState(Runnable r) {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean ok = false;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.run();
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IllegalStateException e) {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ok = true;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(ok);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Disable these until we can explicitly mark them as stress tests
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void xxtestMem1() throws Exception {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        populateDefaultTable();
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 50000; i++) {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query("test", null, null, null, null, null, null);
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.moveToFirst();
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                Log.i("~~~~", "Finished round " + i);
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Disable these until we can explicitly mark them as stress tests
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void xxtestMem2() throws Exception {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        populateDefaultTable();
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 50000; i++) {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query("test", null, null, null, null, null, null);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                Log.i("~~~~", "Finished round " + i);
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Disable these until we can explicitly mark them as stress tests
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void xxtestMem3() throws Exception {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        populateDefaultTable();
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 50000; i++) {
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query("test", null, null, null, null, null, null);
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.deactivate();
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                Log.i("~~~~", "Finished round " + i);
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testContentValues() throws Exception {
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContentValues values = new ContentValues();
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("string", "value");
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("value", values.getAsString("string"));
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] bytes = new byte[42];
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Arrays.fill(bytes, (byte) 0x28);
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("byteArray", bytes);
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(Arrays.equals(bytes, values.getAsByteArray("byteArray")));
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Write the ContentValues to a Parcel and then read them out
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel p = Parcel.obtain();
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.writeToParcel(p, 0);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.setDataPosition(0);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values = ContentValues.CREATOR.createFromParcel(p);
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Read the values out again and make sure they're the same
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(Arrays.equals(bytes, values.getAsByteArray("byteArray")));
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("value", values.get("string"));
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testTableInfoPragma() throws Exception {
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE pragma_test (" +
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "i INTEGER DEFAULT 1234, " +
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "j INTEGER, " +
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "s TEXT DEFAULT 'hello', " +
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "t TEXT, " +
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "'select' TEXT DEFAULT \"hello\")");
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cur = mDatabase.rawQuery("PRAGMA table_info(pragma_test)", null);
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals(5, cur.getCount());
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("i",
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("1234",
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("j",
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertNull(cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("s",
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("'hello'",
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("t",
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertNull(cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("select",
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("\"hello\"",
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cur.close();
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Throwable t) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "If you see this test fail, it's likely that something about " +
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "sqlite's PRAGMA table_info(...) command has changed.", t);
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testInsertHelper() throws Exception {
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor cur;
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContentValues cv;
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long row;
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE insert_test (" +
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "_id INTEGER PRIMARY KEY, " +
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "s TEXT NOT NULL UNIQUE, " +
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "t TEXT NOT NULL DEFAULT 'hello world', " +
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "i INTEGER, " +
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "j INTEGER NOT NULL DEFAULT 1234, " +
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "'select' TEXT)");
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DatabaseUtils.InsertHelper ih =
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new DatabaseUtils.InsertHelper(mDatabase, "insert_test");
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("s", "one");
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cur = mDatabase.rawQuery("SELECT * FROM insert_test WHERE _id == " + row, null);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(cur.moveToFirst());
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("one", cur.getString(1));
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("hello world", cur.getString(2));
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertNull(cur.getString(3));
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1234, cur.getLong(4));
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertNull(cur.getString(5));
879e8de28415b4362824a52c180adf10dd882d12eafVasu Nori        cur.close();
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("s", "two");
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("t", "goodbye world");
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cur = mDatabase.rawQuery("SELECT * FROM insert_test WHERE _id == " + row, null);
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(cur.moveToFirst());
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("two", cur.getString(1));
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("goodbye world", cur.getString(2));
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertNull(cur.getString(3));
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1234, cur.getLong(4));
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertNull(cur.getString(5));
892e8de28415b4362824a52c180adf10dd882d12eafVasu Nori        cur.close();
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("t", "goodbye world");
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(-1, row);
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("s", "three");
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("i", 2345);
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("j", 3456);
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("select", "tricky");
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cur = mDatabase.rawQuery("SELECT * FROM insert_test WHERE _id == " + row, null);
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(cur.moveToFirst());
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("three", cur.getString(1));
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("hello world", cur.getString(2));
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(2345, cur.getLong(3));
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(3456, cur.getLong(4));
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("tricky", cur.getString(5));
912e8de28415b4362824a52c180adf10dd882d12eafVasu Nori        cur.close();
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("s", "three");
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("i", 6789);
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(-1, row);
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.replace(cv);
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cur = mDatabase.rawQuery("SELECT * FROM insert_test WHERE _id == " + row, null);
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(cur.moveToFirst());
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("three", cur.getString(1));
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("hello world", cur.getString(2));
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(6789, cur.getLong(3));
925e8de28415b4362824a52c180adf10dd882d12eafVasu Nori        cur.close();
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ih.close();
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
930e495d1f74af13aec8d5d825e93e4cfe1e4fe7468Vasu Nori    @MediumTest
931d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori    public void testSemicolonsInStatements() throws Exception {
932d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori        mDatabase.execSQL("CREATE TABLE pragma_test (" +
933d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "i INTEGER DEFAULT 1234, " +
934d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "j INTEGER, " +
935d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "s TEXT DEFAULT 'hello', " +
936d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "t TEXT, " +
937d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "'select' TEXT DEFAULT \"hello\")");
938d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori        try {
939d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            // ending the sql statement with  semicolons shouldn't be a problem.
940d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            Cursor cur = mDatabase.rawQuery("PRAGMA database_list;", null);
941d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            cur.close();
942d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            // two semicolons in the statement shouldn't be a problem.
943d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            cur = mDatabase.rawQuery("PRAGMA database_list;;", null);
944d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            cur.close();
945d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori        } catch (Throwable t) {
946d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            fail("unexpected, of course");
947d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori        }
948d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori    }
949b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
950062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori    @MediumTest
951062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori    public void testUnionsWithBindArgs() {
952062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        /* make sure unions with bindargs work http://b/issue?id=1061291 */
953062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("CREATE TABLE A (i int);");
954062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("create table B (k int);");
955062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("create table C (n int);");
956062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into A values(1);");
957062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into A values(2);");
958062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into A values(3);");
959062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into B values(201);");
960062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into B values(202);");
961062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into B values(203);");
962062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into C values(901);");
963062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into C values(902);");
964062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        String s = "select i from A where i > 2 " +
965062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori                "UNION select k from B where k > 201 " +
966062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori                "UNION select n from C where n !=900;";
967062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        Cursor c = mDatabase.rawQuery(s, null);
968062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        int n = c.getCount();
969062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        c.close();
970062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        String s1 = "select i from A where i > ? " +
971062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori                "UNION select k from B where k > ? " +
972062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori                "UNION select n from C where n != ?;";
973062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        Cursor c1 = mDatabase.rawQuery(s1, new String[]{"2", "201", "900"});
974062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        assertEquals(n, c1.getCount());
975062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        c1.close();
976062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori    }
977062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori
978b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa    /**
979b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa     * This test is available only when the platform has a locale with the language "ja".
980b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa     * It finishes without failure when it is not available.
981b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa     */
982b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa    @MediumTest
983b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa    public void testCollateLocalizedForJapanese() throws Exception {
984b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        final String testName = "DatabaseGeneralTest#testCollateLocalizedForJapanese()";
985b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        final Locale[] localeArray = Locale.getAvailableLocales();
986b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        final String japanese = Locale.JAPANESE.getLanguage();
987b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        final String english = Locale.ENGLISH.getLanguage();
988b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        Locale japaneseLocale = null;
989b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        Locale englishLocale = null;
990b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        for (Locale locale : localeArray) {
991b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            if (locale != null) {
992b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                final String language = locale.getLanguage();
993b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                if (language == null) {
994b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    continue;
995b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                } else if (language.equals(japanese)) {
996b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    japaneseLocale = locale;
997b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                } else if (language.equals(english)) {
998b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    englishLocale = locale;
999b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                }
1000b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            }
1001b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1002b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            if (japaneseLocale != null && englishLocale != null) {
1003b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                break;
1004b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            }
1005b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        }
1006b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1007b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        if (japaneseLocale == null || englishLocale == null) {
1008b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            Log.d(TAG, testName + "n is silently skipped since " +
1009b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    (englishLocale == null ?
1010b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                            (japaneseLocale == null ?
1011b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                                    "Both English and Japanese locales do not exist." :
1012b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                                    "English locale does not exist.") :
1013b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                            (japaneseLocale == null ?
1014b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                                    "Japanese locale does not exist." :
1015b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                                    "...why?")));
1016b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            return;
1017b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        }
1018b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1019b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        Locale originalLocale = Locale.getDefault();
1020b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        try {
1021b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1022b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            final String dbName = "collate_localized_test";
1023b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            mDatabase.execSQL("CREATE TABLE " + dbName + " (" +
1024b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    "_id INTEGER PRIMARY KEY, " +
1025b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    "s TEXT COLLATE LOCALIZED) ");
1026b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            DatabaseUtils.InsertHelper ih =
1027b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                new DatabaseUtils.InsertHelper(mDatabase, dbName);
1028b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            ContentValues cv = new ContentValues();
1029b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1030b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv = new ContentValues();  //
1031b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv.put("s", "\uFF75\uFF77\uFF85\uFF9C");  // O-ki-na-wa in half-width Katakana
1032b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            ih.insert(cv);
1033b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1034b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv = new ContentValues();  //
1035b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv.put("s", "\u306B\u307B\u3093");  // Ni-ho-n in Hiragana
1036b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            ih.insert(cv);
1037b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1038b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv = new ContentValues();  //
1039b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv.put("s", "\u30A2\u30E1\u30EA\u30AB");  // A-me-ri-ca in hull-width Katakana
1040b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            ih.insert(cv);
1041b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1042b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            // Assume setLocale() does REINDEX and an English locale does not consider
1043b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            // Japanese-specific LOCALIZED order.
1044b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            Locale.setDefault(englishLocale);
1045b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            Locale.setDefault(japaneseLocale);
1046b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1047b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            Cursor cur = mDatabase.rawQuery(
1048b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    "SELECT * FROM " + dbName + " ORDER BY s", null);
1049b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertTrue(cur.moveToFirst());
1050b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertEquals("\u30A2\u30E1\u30EA\u30AB", cur.getString(1));
1051b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertTrue(cur.moveToNext());
1052b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertEquals("\uFF75\uFF77\uFF85\uFF9C", cur.getString(1));
1053b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertTrue(cur.moveToNext());
1054b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertEquals("\u306B\u307B\u3093", cur.getString(1));
1055b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        } finally {
1056b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            if (originalLocale != null) {
1057b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                try {
1058b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    Locale.setDefault(originalLocale);
1059b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                } catch (Exception e) {
1060b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                }
1061b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            }
1062b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        }
10639504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori    }
10649504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori
10659504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori    @SmallTest
10669504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori    public void testSetMaxCahesize() {
10679504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        mDatabase.execSQL("CREATE TABLE test (i int, j int);");
10689504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        mDatabase.execSQL("insert into test values(1,1);");
10699504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        // set cache size
10709504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        int N = SQLiteDatabase.MAX_SQL_CACHE_SIZE;
10719504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        mDatabase.setMaxSqlCacheSize(N);
10729504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori
10739504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        // try reduce cachesize
10749504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        try {
10759504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori            mDatabase.setMaxSqlCacheSize(1);
10769504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        } catch (IllegalStateException e) {
10779504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori            assertTrue(e.getMessage().contains("cannot set cacheSize to a value less than"));
10789504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        }
10799504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori    }
108085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
108185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori    @LargeTest
108285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori    public void testDefaultDatabaseErrorHandler() {
108385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        DefaultDatabaseErrorHandler errorHandler = new DefaultDatabaseErrorHandler();
108485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
108585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // close the database. and call corruption handler.
108685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // it should delete the database file.
108785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        File dbfile = new File(mDatabase.getPath());
108885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        mDatabase.close();
108985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertFalse(mDatabase.isOpen());
109085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbfile.exists());
109185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
109285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(mDatabase);
109385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(dbfile.exists());
109485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
109585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
109685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
109785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
109885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // create an in-memory database. and corruption handler shouldn't try to delete it
109985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        SQLiteDatabase memoryDb = SQLiteDatabase.openOrCreateDatabase(":memory:", null);
110085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertNotNull(memoryDb);
110185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        memoryDb.close();
110285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertFalse(memoryDb.isOpen());
110385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
110485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(memoryDb);
110585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
110685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
110785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
110885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
110985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // create a database, keep it open, call corruption handler. database file should be deleted
111085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        SQLiteDatabase dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
111185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbfile.exists());
111285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertNotNull(dbObj);
111385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbObj.isOpen());
111485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
111585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(dbObj);
111685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(dbfile.exists());
111785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
111885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
111985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
112085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
112185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // create a database, attach 2 more databases to it
112285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        //    attached database # 1: ":memory:"
112385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        //    attached database # 2: mDatabase.getPath() + "1";
112485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // call corruption handler. database files including the one for attached database # 2
112585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // should be deleted
112685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        String attachedDb1File = mDatabase.getPath() + "1";
112785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
112885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj.execSQL("ATTACH DATABASE ':memory:' as memoryDb");
112985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj.execSQL("ATTACH DATABASE '" +  attachedDb1File + "' as attachedDb1");
113085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbfile.exists());
113185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(new File(attachedDb1File).exists());
113285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertNotNull(dbObj);
113385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbObj.isOpen());
1134a017edace756956cd4b4789a85316e3681d04a7eVasu Nori        List<Pair<String, String>> attachedDbs = dbObj.getAttachedDbs();
113585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
113685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(dbObj);
113785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(dbfile.exists());
113885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(new File(attachedDb1File).exists());
113985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
114085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
114185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
114285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
114385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // same as above, except this is a bit of stress testing. attach 5 database files
114485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // and make sure they are all removed.
114585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        int N = 5;
114685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        ArrayList<String> attachedDbFiles = new ArrayList<String>(N);
114785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        for (int i = 0; i < N; i++) {
114885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            attachedDbFiles.add(mDatabase.getPath() + i);
114985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
115085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
115185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj.execSQL("ATTACH DATABASE ':memory:' as memoryDb");
115285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        for (int i = 0; i < N; i++) {
115385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            dbObj.execSQL("ATTACH DATABASE '" +  attachedDbFiles.get(i) + "' as attachedDb" + i);
115485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
115585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbfile.exists());
115685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        for (int i = 0; i < N; i++) {
115785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertTrue(new File(attachedDbFiles.get(i)).exists());
115885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
115985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertNotNull(dbObj);
116085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbObj.isOpen());
116185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        attachedDbs = dbObj.getAttachedDbs();
116285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
116385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(dbObj);
116485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(dbfile.exists());
116585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            for (int i = 0; i < N; i++) {
116685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori                assertFalse(new File(attachedDbFiles.get(i)).exists());
116785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            }
116885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
116985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
117085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
117185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori    }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1173