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    @MediumTest
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testSelectionArgs() throws Exception {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContentValues values = new ContentValues(1);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("data", "don't forget to handled 's");
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.insert("test", "data", values);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.clear();
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("data", "no apostrophes here");
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.insert("test", "data", values);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = mDatabase.query(
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "test", null, "data GLOB ?", new String[]{"*'*"}, null, null, null);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, c.getCount());
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(c.moveToFirst());
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("don't forget to handled 's", c.getString(1));
4279504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        c.deactivate();
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // make sure code should checking null string properly so that
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // it won't crash
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.query("test", new String[]{"_id"},
4339504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori                    "_id=?", new String[]{null}, null, null, null);
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("expected exception not thrown");
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IllegalArgumentException e) {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // expected
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testTokenize() throws Exception {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE tokens (" +
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "token TEXT COLLATE unicode," +
445819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "source INTEGER," +
4465615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "token_index INTEGER," +
4475615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "tag TEXT" +
448819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                ");");
449819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        mDatabase.execSQL("CREATE TABLE tokens_no_index (" +
450819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "token TEXT COLLATE unicode," +
451819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "source INTEGER" +
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ");");
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT _TOKENIZE(NULL, NULL, NULL, NULL)", null));
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT _TOKENIZE('tokens', NULL, NULL, NULL)", null));
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT _TOKENIZE('tokens', 10, NULL, NULL)", null));
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT _TOKENIZE('tokens', 10, 'some string', NULL)", null));
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(3, DatabaseUtils.longForQuery(mDatabase,
4645615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT _TOKENIZE('tokens', 11, 'some string ok', ' ', 1, 'foo')", null));
4655615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(2, DatabaseUtils.longForQuery(mDatabase,
4665615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT _TOKENIZE('tokens', 11, 'second field', ' ', 1, 'bar')", null));
4675615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert
468819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(3, DatabaseUtils.longForQuery(mDatabase,
469819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT _TOKENIZE('tokens_no_index', 20, 'some string ok', ' ')", null));
470819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(3, DatabaseUtils.longForQuery(mDatabase,
471819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT _TOKENIZE('tokens_no_index', 21, 'foo bar baz', ' ', 0)", null));
472819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // test Chinese
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String chinese = new String("\u4eac\u4ec5 \u5c3d\u5f84\u60ca");
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(2, DatabaseUtils.longForQuery(mDatabase,
476819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT _TOKENIZE('tokens', 12,'" + chinese + "', ' ', 1)", null));
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String icustr = new String("Fr\u00e9d\u00e9ric Hj\u00f8nnev\u00e5g");
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(2, DatabaseUtils.longForQuery(mDatabase,
481819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT _TOKENIZE('tokens', 13, '" + icustr + "', ' ', 1)", null));
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4835615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(9, DatabaseUtils.longForQuery(mDatabase,
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens;", null));
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String key = DatabaseUtils.getHexCollationKey("Frederic Hjonneva");
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
489819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(13, DatabaseUtils.longForQuery(mDatabase,
490819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
491819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
492819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("Hjonneva");
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
496819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(13, DatabaseUtils.longForQuery(mDatabase,
497819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
498819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
499819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("some string ok");
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
504819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
505819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
506819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
507819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5085615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("foo", DatabaseUtils.stringForQuery(mDatabase,
5095615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("string");
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
513819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
514819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
515819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
516819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5175615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("foo", DatabaseUtils.stringForQuery(mDatabase,
5185615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("ok");
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
522819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
523819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
524819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(2, DatabaseUtils.longForQuery(mDatabase,
525819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5265615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("foo", DatabaseUtils.stringForQuery(mDatabase,
5275615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5285615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert
5295615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        key = DatabaseUtils.getHexCollationKey("second field");
5305615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5315615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
5325615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
5335615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
5345615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
5355615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5365615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("bar", DatabaseUtils.stringForQuery(mDatabase,
5375615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5385615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        key = DatabaseUtils.getHexCollationKey("field");
5395615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5405615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
5415615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(11, DatabaseUtils.longForQuery(mDatabase,
5425615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
5435615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5445615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5455615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert        Assert.assertEquals("bar", DatabaseUtils.stringForQuery(mDatabase,
5465615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert                "SELECT tag from tokens where token GLOB '" + key + "*'", null));
5475615d35b28119865cd65a79814a69f910e0a3862Bjorn Bringert
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey(chinese);
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] a = new String[1];
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a[0] = key;
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token= ?", a));
553819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
554819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token= ?", a));
555819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
556819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token= ?", a));
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a[0] += "*";
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             "SELECT count(*) from tokens where token GLOB ?", a));
560819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
561819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB ?", a));
562819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
563819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB ?", a));
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token= '" + key + "'", null));
567819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert       Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
568819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert               "SELECT source from tokens where token= '" + key + "'", null));
569819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert       Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
570819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert               "SELECT token_index from tokens where token= '" + key + "'", null));
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
574819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
575819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
576819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
577819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = DatabaseUtils.getHexCollationKey("\u4eac\u4ec5");
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
582819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
583819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
584819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
585819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
587819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        key = DatabaseUtils.getHexCollationKey("\u5c3d\u5f84\u60ca");
588819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Log.d("DatabaseGeneralTest", "key = " + key);
589819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
590819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT count(*) from tokens where token GLOB '" + key + "*'", null));
591819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(12, DatabaseUtils.longForQuery(mDatabase,
592819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens where token GLOB '" + key + "*'", null));
593819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
594819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT token_index from tokens where token GLOB '" + key + "*'", null));
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(0, DatabaseUtils.longForQuery(mDatabase,
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT count(*) from tokens where token GLOB 'ab*'", null));
598819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert
599819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        key = DatabaseUtils.getHexCollationKey("some string ok");
600819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
601819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT count(*) from tokens_no_index where token GLOB '" + key + "*'", null));
602819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(20, DatabaseUtils.longForQuery(mDatabase,
603819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens_no_index where token GLOB '" + key + "*'", null));
604819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert
605819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        key = DatabaseUtils.getHexCollationKey("bar");
606819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(1, DatabaseUtils.longForQuery(mDatabase,
607819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT count(*) from tokens_no_index where token GLOB '" + key + "*'", null));
608819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert        Assert.assertEquals(21, DatabaseUtils.longForQuery(mDatabase,
609819e3f2148da0a47ed90be1f6f8b072a37c9ce1fBjorn Bringert                "SELECT source from tokens_no_index where token GLOB '" + key + "*'", null));
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testTransactions() throws Exception {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE test (num INTEGER);");
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("INSERT INTO test (num) VALUES (0)");
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make sure that things work outside an explicit transaction.
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(1);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test a single-level transaction.
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(1);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test a rolled-back transaction.
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(0);
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should get an error if we end a non-existent transaction.
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertThrowsIllegalState(new Runnable() { public void run() {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.endTransaction();
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }});
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should get an error if a set a non-existent transaction as clean.
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertThrowsIllegalState(new Runnable() { public void run() {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.setTransactionSuccessful();
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }});
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should get an error if we mark a transaction as clean twice.
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertThrowsIllegalState(new Runnable() { public void run() {
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.setTransactionSuccessful();
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }});
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should get an error if we begin a transaction after marking the parent as clean.
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertThrowsIllegalState(new Runnable() { public void run() {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.beginTransaction();
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }});
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test a two-level transaction.
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(1);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test rolling back an inner transaction.
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(0);
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test rolling back an outer transaction.
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(0);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.beginTransaction();
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNum(1);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setTransactionSuccessful();
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.endTransaction();
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkNum(0);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertFalse(mDatabase.isDbLockedByCurrentThread());
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setNum(int num) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("UPDATE test SET num = " + num);
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void checkNum(int num) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                num, DatabaseUtils.longForQuery(mDatabase, "SELECT num FROM test", null));
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void assertThrowsIllegalState(Runnable r) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean ok = false;
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.run();
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IllegalStateException e) {
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ok = true;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(ok);
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Disable these until we can explicitly mark them as stress tests
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void xxtestMem1() throws Exception {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        populateDefaultTable();
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 50000; i++) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query("test", null, null, null, null, null, null);
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.moveToFirst();
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                Log.i("~~~~", "Finished round " + i);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Disable these until we can explicitly mark them as stress tests
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void xxtestMem2() throws Exception {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        populateDefaultTable();
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 50000; i++) {
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query("test", null, null, null, null, null, null);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                Log.i("~~~~", "Finished round " + i);
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Disable these until we can explicitly mark them as stress tests
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void xxtestMem3() throws Exception {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        populateDefaultTable();
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 50000; i++) {
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query("test", null, null, null, null, null, null);
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.deactivate();
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                Log.i("~~~~", "Finished round " + i);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testContentValues() throws Exception {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContentValues values = new ContentValues();
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("string", "value");
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("value", values.getAsString("string"));
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] bytes = new byte[42];
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Arrays.fill(bytes, (byte) 0x28);
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.put("byteArray", bytes);
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(Arrays.equals(bytes, values.getAsByteArray("byteArray")));
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Write the ContentValues to a Parcel and then read them out
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel p = Parcel.obtain();
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values.writeToParcel(p, 0);
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.setDataPosition(0);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        values = ContentValues.CREATOR.createFromParcel(p);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Read the values out again and make sure they're the same
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(Arrays.equals(bytes, values.getAsByteArray("byteArray")));
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("value", values.get("string"));
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testTableInfoPragma() throws Exception {
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE pragma_test (" +
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "i INTEGER DEFAULT 1234, " +
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "j INTEGER, " +
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "s TEXT DEFAULT 'hello', " +
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "t TEXT, " +
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "'select' TEXT DEFAULT \"hello\")");
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cur = mDatabase.rawQuery("PRAGMA table_info(pragma_test)", null);
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals(5, cur.getCount());
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("i",
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("1234",
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("j",
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertNull(cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("s",
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("'hello'",
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("t",
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertNull(cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertTrue(cur.moveToNext());
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("select",
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX));
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertEquals("\"hello\"",
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cur.getString(TABLE_INFO_PRAGMA_DEFAULT_INDEX));
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cur.close();
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Throwable t) {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "If you see this test fail, it's likely that something about " +
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "sqlite's PRAGMA table_info(...) command has changed.", t);
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testInsertHelper() throws Exception {
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor cur;
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContentValues cv;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long row;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE insert_test (" +
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "_id INTEGER PRIMARY KEY, " +
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "s TEXT NOT NULL UNIQUE, " +
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "t TEXT NOT NULL DEFAULT 'hello world', " +
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "i INTEGER, " +
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "j INTEGER NOT NULL DEFAULT 1234, " +
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "'select' TEXT)");
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DatabaseUtils.InsertHelper ih =
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new DatabaseUtils.InsertHelper(mDatabase, "insert_test");
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("s", "one");
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cur = mDatabase.rawQuery("SELECT * FROM insert_test WHERE _id == " + row, null);
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(cur.moveToFirst());
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("one", cur.getString(1));
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("hello world", cur.getString(2));
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertNull(cur.getString(3));
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1234, cur.getLong(4));
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertNull(cur.getString(5));
845e8de28415b4362824a52c180adf10dd882d12eafVasu Nori        cur.close();
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("s", "two");
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("t", "goodbye world");
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cur = mDatabase.rawQuery("SELECT * FROM insert_test WHERE _id == " + row, null);
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(cur.moveToFirst());
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("two", cur.getString(1));
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("goodbye world", cur.getString(2));
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertNull(cur.getString(3));
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(1234, cur.getLong(4));
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertNull(cur.getString(5));
858e8de28415b4362824a52c180adf10dd882d12eafVasu Nori        cur.close();
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("t", "goodbye world");
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(-1, row);
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("s", "three");
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("i", 2345);
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("j", 3456);
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("select", "tricky");
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cur = mDatabase.rawQuery("SELECT * FROM insert_test WHERE _id == " + row, null);
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(cur.moveToFirst());
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("three", cur.getString(1));
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("hello world", cur.getString(2));
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(2345, cur.getLong(3));
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(3456, cur.getLong(4));
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("tricky", cur.getString(5));
878e8de28415b4362824a52c180adf10dd882d12eafVasu Nori        cur.close();
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv = new ContentValues();
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("s", "three");
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cv.put("i", 6789);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.insert(cv);
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(-1, row);
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        row = ih.replace(cv);
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cur = mDatabase.rawQuery("SELECT * FROM insert_test WHERE _id == " + row, null);
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertTrue(cur.moveToFirst());
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("three", cur.getString(1));
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals("hello world", cur.getString(2));
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Assert.assertEquals(6789, cur.getLong(3));
891e8de28415b4362824a52c180adf10dd882d12eafVasu Nori        cur.close();
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ih.close();
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
896e495d1f74af13aec8d5d825e93e4cfe1e4fe7468Vasu Nori    @MediumTest
897d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori    public void testSemicolonsInStatements() throws Exception {
898d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori        mDatabase.execSQL("CREATE TABLE pragma_test (" +
899d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "i INTEGER DEFAULT 1234, " +
900d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "j INTEGER, " +
901d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "s TEXT DEFAULT 'hello', " +
902d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "t TEXT, " +
903d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori                "'select' TEXT DEFAULT \"hello\")");
904d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori        try {
905d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            // ending the sql statement with  semicolons shouldn't be a problem.
906d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            Cursor cur = mDatabase.rawQuery("PRAGMA database_list;", null);
907d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            cur.close();
908d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            // two semicolons in the statement shouldn't be a problem.
909d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            cur = mDatabase.rawQuery("PRAGMA database_list;;", null);
910d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            cur.close();
911d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori        } catch (Throwable t) {
912d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori            fail("unexpected, of course");
913d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori        }
914d606b4bf2c1a2308b40785860853cfb95a77bf58Vasu Nori    }
915b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
916062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori    @MediumTest
917062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori    public void testUnionsWithBindArgs() {
918062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        /* make sure unions with bindargs work http://b/issue?id=1061291 */
919062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("CREATE TABLE A (i int);");
920062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("create table B (k int);");
921062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("create table C (n int);");
922062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into A values(1);");
923062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into A values(2);");
924062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into A values(3);");
925062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into B values(201);");
926062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into B values(202);");
927062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into B values(203);");
928062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into C values(901);");
929062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        mDatabase.execSQL("insert into C values(902);");
930062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        String s = "select i from A where i > 2 " +
931062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori                "UNION select k from B where k > 201 " +
932062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori                "UNION select n from C where n !=900;";
933062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        Cursor c = mDatabase.rawQuery(s, null);
934062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        int n = c.getCount();
935062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        c.close();
936062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        String s1 = "select i from A where i > ? " +
937062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori                "UNION select k from B where k > ? " +
938062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori                "UNION select n from C where n != ?;";
939062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        Cursor c1 = mDatabase.rawQuery(s1, new String[]{"2", "201", "900"});
940062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        assertEquals(n, c1.getCount());
941062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori        c1.close();
942062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori    }
943062fc7ce369758d5a26f83f12b50b11cd88e5defVasu Nori
944b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa    /**
945b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa     * This test is available only when the platform has a locale with the language "ja".
946b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa     * It finishes without failure when it is not available.
947b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa     */
948b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa    @MediumTest
949b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa    public void testCollateLocalizedForJapanese() throws Exception {
950b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        final String testName = "DatabaseGeneralTest#testCollateLocalizedForJapanese()";
951b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        final Locale[] localeArray = Locale.getAvailableLocales();
952b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        final String japanese = Locale.JAPANESE.getLanguage();
953b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        final String english = Locale.ENGLISH.getLanguage();
954b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        Locale japaneseLocale = null;
955b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        Locale englishLocale = null;
956b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        for (Locale locale : localeArray) {
957b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            if (locale != null) {
958b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                final String language = locale.getLanguage();
959b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                if (language == null) {
960b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    continue;
961b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                } else if (language.equals(japanese)) {
962b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    japaneseLocale = locale;
963b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                } else if (language.equals(english)) {
964b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    englishLocale = locale;
965b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                }
966b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            }
967b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
968b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            if (japaneseLocale != null && englishLocale != null) {
969b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                break;
970b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            }
971b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        }
972b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
973b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        if (japaneseLocale == null || englishLocale == null) {
974b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            Log.d(TAG, testName + "n is silently skipped since " +
975b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    (englishLocale == null ?
976b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                            (japaneseLocale == null ?
977b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                                    "Both English and Japanese locales do not exist." :
978b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                                    "English locale does not exist.") :
979b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                            (japaneseLocale == null ?
980b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                                    "Japanese locale does not exist." :
981b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                                    "...why?")));
982b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            return;
983b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        }
984b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
985b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        Locale originalLocale = Locale.getDefault();
986b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        try {
987b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
988b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            final String dbName = "collate_localized_test";
989b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            mDatabase.execSQL("CREATE TABLE " + dbName + " (" +
990b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    "_id INTEGER PRIMARY KEY, " +
991b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    "s TEXT COLLATE LOCALIZED) ");
992b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            DatabaseUtils.InsertHelper ih =
993b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                new DatabaseUtils.InsertHelper(mDatabase, dbName);
994b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            ContentValues cv = new ContentValues();
995b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
996b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv = new ContentValues();  //
997b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv.put("s", "\uFF75\uFF77\uFF85\uFF9C");  // O-ki-na-wa in half-width Katakana
998b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            ih.insert(cv);
999b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1000b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv = new ContentValues();  //
1001b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv.put("s", "\u306B\u307B\u3093");  // Ni-ho-n in Hiragana
1002b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            ih.insert(cv);
1003b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1004b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv = new ContentValues();  //
1005b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            cv.put("s", "\u30A2\u30E1\u30EA\u30AB");  // A-me-ri-ca in hull-width Katakana
1006b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            ih.insert(cv);
1007b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1008b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            // Assume setLocale() does REINDEX and an English locale does not consider
1009b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            // Japanese-specific LOCALIZED order.
1010b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            Locale.setDefault(englishLocale);
1011b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            Locale.setDefault(japaneseLocale);
1012b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa
1013b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            Cursor cur = mDatabase.rawQuery(
1014b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    "SELECT * FROM " + dbName + " ORDER BY s", null);
1015b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertTrue(cur.moveToFirst());
1016b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertEquals("\u30A2\u30E1\u30EA\u30AB", cur.getString(1));
1017b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertTrue(cur.moveToNext());
1018b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertEquals("\uFF75\uFF77\uFF85\uFF9C", cur.getString(1));
1019b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertTrue(cur.moveToNext());
1020b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            assertEquals("\u306B\u307B\u3093", cur.getString(1));
1021b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        } finally {
1022b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            if (originalLocale != null) {
1023b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                try {
1024b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                    Locale.setDefault(originalLocale);
1025b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                } catch (Exception e) {
1026b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa                }
1027b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa            }
1028b945639d0c3fa1850c07a2b80f476c8d242a8bdeDaisuke Miyakawa        }
10299504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori    }
10309504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori
10319504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori    @SmallTest
10329504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori    public void testSetMaxCahesize() {
10339504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        mDatabase.execSQL("CREATE TABLE test (i int, j int);");
10349504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        mDatabase.execSQL("insert into test values(1,1);");
10359504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        // set cache size
10369504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        int N = SQLiteDatabase.MAX_SQL_CACHE_SIZE;
10379504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        mDatabase.setMaxSqlCacheSize(N);
10389504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori
10399504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        // try reduce cachesize
10409504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        try {
10419504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori            mDatabase.setMaxSqlCacheSize(1);
10429504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        } catch (IllegalStateException e) {
10439504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori            assertTrue(e.getMessage().contains("cannot set cacheSize to a value less than"));
10449504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori        }
10459504c70f8862f5ffc55b07bc374e0b18b78a2dc6Vasu Nori    }
104685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
104785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori    @LargeTest
104885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori    public void testDefaultDatabaseErrorHandler() {
104985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        DefaultDatabaseErrorHandler errorHandler = new DefaultDatabaseErrorHandler();
105085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
105185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // close the database. and call corruption handler.
105285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // it should delete the database file.
105385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        File dbfile = new File(mDatabase.getPath());
105485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        mDatabase.close();
105585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertFalse(mDatabase.isOpen());
105685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbfile.exists());
105785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
105885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(mDatabase);
105985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(dbfile.exists());
106085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
106185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
106285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
106385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
106485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // create an in-memory database. and corruption handler shouldn't try to delete it
106585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        SQLiteDatabase memoryDb = SQLiteDatabase.openOrCreateDatabase(":memory:", null);
106685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertNotNull(memoryDb);
106785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        memoryDb.close();
106885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertFalse(memoryDb.isOpen());
106985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
107085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(memoryDb);
107185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
107285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
107385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
107485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
107585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // create a database, keep it open, call corruption handler. database file should be deleted
107685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        SQLiteDatabase dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
107785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbfile.exists());
107885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertNotNull(dbObj);
107985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbObj.isOpen());
108085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
108185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(dbObj);
108285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(dbfile.exists());
108385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
108485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
108585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
108685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
108785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // create a database, attach 2 more databases to it
108885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        //    attached database # 1: ":memory:"
108985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        //    attached database # 2: mDatabase.getPath() + "1";
109085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // call corruption handler. database files including the one for attached database # 2
109185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // should be deleted
109285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        String attachedDb1File = mDatabase.getPath() + "1";
109385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
109485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj.execSQL("ATTACH DATABASE ':memory:' as memoryDb");
109585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj.execSQL("ATTACH DATABASE '" +  attachedDb1File + "' as attachedDb1");
109685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbfile.exists());
109785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(new File(attachedDb1File).exists());
109885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertNotNull(dbObj);
109985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbObj.isOpen());
1100a017edace756956cd4b4789a85316e3681d04a7eVasu Nori        List<Pair<String, String>> attachedDbs = dbObj.getAttachedDbs();
110185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
110285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(dbObj);
110385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(dbfile.exists());
110485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(new File(attachedDb1File).exists());
110585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
110685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
110785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
110885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori
110985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // same as above, except this is a bit of stress testing. attach 5 database files
111085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        // and make sure they are all removed.
111185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        int N = 5;
111285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        ArrayList<String> attachedDbFiles = new ArrayList<String>(N);
111385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        for (int i = 0; i < N; i++) {
111485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            attachedDbFiles.add(mDatabase.getPath() + i);
111585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
111685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
111785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        dbObj.execSQL("ATTACH DATABASE ':memory:' as memoryDb");
111885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        for (int i = 0; i < N; i++) {
111985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            dbObj.execSQL("ATTACH DATABASE '" +  attachedDbFiles.get(i) + "' as attachedDb" + i);
112085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
112185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbfile.exists());
112285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        for (int i = 0; i < N; i++) {
112385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertTrue(new File(attachedDbFiles.get(i)).exists());
112485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
112585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertNotNull(dbObj);
112685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        assertTrue(dbObj.isOpen());
112785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        attachedDbs = dbObj.getAttachedDbs();
112885f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        try {
112985f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            errorHandler.onCorruption(dbObj);
113085f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            assertFalse(dbfile.exists());
113185f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            for (int i = 0; i < N; i++) {
113285f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori                assertFalse(new File(attachedDbFiles.get(i)).exists());
113385f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            }
113485f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        } catch (Exception e) {
113585f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori            fail("unexpected");
113685f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori        }
113785f08f9eaeae6b04c6ce42e5b9dc097ac3e70fc5Vasu Nori    }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1139