11a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen/*
21a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * Copyright (C) 2007 The Android Open Source Project
31a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen *
41a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * Licensed under the Apache License, Version 2.0 (the "License");
51a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * you may not use this file except in compliance with the License.
61a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * You may obtain a copy of the License at
71a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen *
81a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen *      http://www.apache.org/licenses/LICENSE-2.0
91a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen *
101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * Unless required by applicable law or agreed to in writing, software
111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * distributed under the License is distributed on an "AS IS" BASIS,
121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * See the License for the specific language governing permissions and
141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * limitations under the License.
151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen */
161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.database;
181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.content.ContentValues;
201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.content.Context;
211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.Cursor;
221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.CursorIndexOutOfBoundsException;
231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.DataSetObserver;
241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.DatabaseUtils;
251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.sqlite.SQLiteCursor;
261a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.sqlite.SQLiteCursorDriver;
271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.sqlite.SQLiteDatabase;
281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.sqlite.SQLiteQuery;
291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.os.Looper;
301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.test.AndroidTestCase;
311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.test.PerformanceTestCase;
321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.test.suitebuilder.annotation.LargeTest;
331a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.test.suitebuilder.annotation.MediumTest;
34f90177629a5b69ca3a80466c0ab55abfeb6d26b2Abodunrinwa Tokiimport android.test.suitebuilder.annotation.Suppress;
351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.util.Log;
361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport java.io.File;
386141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Noriimport java.util.ArrayList;
391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport java.util.Arrays;
401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport java.util.Random;
411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpublic class DatabaseCursorTest extends AndroidTestCase implements PerformanceTestCase {
431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    private static final String sString1 = "this is a test";
451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    private static final String sString2 = "and yet another test";
461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    private static final String sString3 = "this string is a little longer, but still a test";
471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    private static final int CURRENT_DATABASE_VERSION = 42;
491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    private SQLiteDatabase mDatabase;
501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    private File mDatabaseFile;
511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @Override
531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    protected void setUp() throws Exception {
541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        super.setUp();
558a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock        File dbDir = getContext().getDir("tests", Context.MODE_PRIVATE);
568a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock        mDatabaseFile = new File(dbDir, "database_test.db");
571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        if (mDatabaseFile.exists()) {
591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            mDatabaseFile.delete();
601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null);
621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(mDatabase);
631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.setVersion(CURRENT_DATABASE_VERSION);
641a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @Override
671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    protected void tearDown() throws Exception {
681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.close();
691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabaseFile.delete();
701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        super.tearDown();
711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public boolean isPerformanceOnly() {
741a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        return false;
751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    // These test can only be run once.
781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public int startPerformance(Intermediates intermediates) {
791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        return 1;
801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
811a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
821a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    private void populateDefaultTable() {
831a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
841a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
851a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString1 + "');");
861a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString2 + "');");
871a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString3 + "');");
881a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
891a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
901a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
911a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testBlob() throws Exception {
921a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // create table
931a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL(
941a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            "CREATE TABLE test (_id INTEGER PRIMARY KEY, s TEXT, d REAL, l INTEGER, b BLOB);");
951a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // insert blob
961a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Object[] args = new Object[4];
971a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
981a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        byte[] blob = new byte[1000];
991a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        byte value = 99;
1001a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Arrays.fill(blob, value);
1011a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        args[3] = blob;
1021a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1031a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        String s = new String("text");
1041a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        args[0] = s;
1051a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Double d = 99.9;
1061a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        args[1] = d;
1071a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Long l = (long)1000;
1081a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        args[2] = l;
1091a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        String sql = "INSERT INTO test (s, d, l, b) VALUES (?,?,?,?)";
1111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL(sql, args);
1121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // use cursor to access blob
1131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.query("test", null, null, null, null, null, null);
1141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.moveToNext();
1151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        ContentValues cv = new ContentValues();
1161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        DatabaseUtils.cursorRowToContentValues(c, cv);
1171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int bCol = c.getColumnIndexOrThrow("b");
1191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int sCol = c.getColumnIndexOrThrow("s");
1201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int dCol = c.getColumnIndexOrThrow("d");
1211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int lCol = c.getColumnIndexOrThrow("l");
1221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        byte[] cBlob =  c.getBlob(bCol);
1231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(Arrays.equals(blob, cBlob));
1241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(s, c.getString(sCol));
1251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals((double)d, c.getDouble(dCol));
1267cd51efcbd2d083bf577696591ef1769034f7e2fJeff Hamilton        assertEquals((long)l, c.getLong(lCol));
1271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
1281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
1301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testRealColumns() throws Exception {
1311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data REAL);");
1321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        ContentValues values = new ContentValues();
1331a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        values.put("data", 42.11);
1341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        long id = mDatabase.insert("test", "data", values);
1351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(id > 0);
1361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.rawQuery("SELECT data FROM test", null);
1371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
1381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToFirst());
1391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(42.11, c.getDouble(0));
1401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
1411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
1421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
1441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testCursor1() throws Exception {
1451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        populateDefaultTable();
1461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.query("test", null, null, null, null, null, null);
1481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int dataColumn = c.getColumnIndexOrThrow("data");
1501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // The cursor should ignore text before the last period when looking for a column. (This
1521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // is a temporary hack in all implementations of getColumnIndex.)
1531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int dataColumn2 = c.getColumnIndexOrThrow("junk.data");
1541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(dataColumn, dataColumn2);
1551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertSame(3, c.getCount());
1571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.isBeforeFirst());
1591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        try {
1611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            c.getInt(0);
1621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            fail("CursorIndexOutOfBoundsException expected");
1631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        } catch (CursorIndexOutOfBoundsException ex) {
1641a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            // expected
1651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
1661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.moveToNext();
1681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(1, c.getInt(0));
1691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        String s = c.getString(dataColumn);
1711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString1, s);
1721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.moveToNext();
1741a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        s = c.getString(dataColumn);
1751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString2, s);
1761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.moveToNext();
1781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        s = c.getString(dataColumn);
1791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString3, s);
1801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1811a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.moveToPosition(-1);
1821a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.moveToNext();
1831a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        s = c.getString(dataColumn);
1841a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString1, s);
1851a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1861a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.moveToPosition(2);
1871a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        s = c.getString(dataColumn);
1881a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString3, s);
1891a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1901a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int i;
1911a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1921a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        for (c.moveToFirst(), i = 0; !c.isAfterLast(); c.moveToNext(), i++) {
1931a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            c.getInt(0);
1941a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
1951a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1961a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(3, i);
1971a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
1981a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        try {
1991a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            c.getInt(0);
2001a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            fail("CursorIndexOutOfBoundsException expected");
2011a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        } catch (CursorIndexOutOfBoundsException ex) {
2021a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            // expected
2031a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
2041a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
2051a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
2061a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2071a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
2081a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testCursor2() throws Exception {
2091a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        populateDefaultTable();
2101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.query("test", null, "_id > 1000", null, null, null, null);
2121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(0, c.getCount());
2131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.isBeforeFirst());
2141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        try {
2161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            c.getInt(0);
2171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            fail("CursorIndexOutOfBoundsException expected");
2181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        } catch (CursorIndexOutOfBoundsException ex) {
2191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            // expected
2201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
2211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int i;
2231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        for (c.moveToFirst(), i = 0; !c.isAfterLast(); c.moveToNext(), i++) {
2241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            c.getInt(0);
2251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
2261a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(0, i);
2271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        try {
2281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            c.getInt(0);
2291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            fail("CursorIndexOutOfBoundsException expected");
2301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        } catch (CursorIndexOutOfBoundsException ex) {
2311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            // expected
2321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
2331a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
2341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
2351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
2371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testLargeField() throws Exception {
2381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
2391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        StringBuilder sql = new StringBuilder(2100);
2411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        sql.append("INSERT INTO test (data) VALUES ('");
2421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Random random = new Random(System.currentTimeMillis());
2431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        StringBuilder randomString = new StringBuilder(1979);
2441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        for (int i = 0; i < 1979; i++) {
2451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            randomString.append((random.nextInt() & 0xf) % 10);
2461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
2471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        sql.append(randomString);
2481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        sql.append("');");
2491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL(sql.toString());
2501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.query("test", null, null, null, null, null, null);
2521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
2531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(1, c.getCount());
2541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToFirst());
2561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(0, c.getPosition());
2571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        String largeString = c.getString(c.getColumnIndexOrThrow("data"));
2581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(largeString);
2591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(randomString.toString(), largeString);
2601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
2611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
2621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    class TestObserver extends DataSetObserver {
2641a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int total;
2651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        SQLiteCursor c;
2661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        boolean quit = false;
2671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        public TestObserver(int total_, SQLiteCursor cursor) {
2681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            c = cursor;
2691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            total = total_;
2701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
2711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        @Override
2731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        public void onChanged() {
2741a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            int count = c.getCount();
2751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            if (total == count) {
2761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                int i = 0;
2771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                while (c.moveToNext()) {
2781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                    assertEquals(i, c.getInt(1));
2791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                    i++;
2801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                }
2811a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                assertEquals(count, i);
2821a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                quit = true;
2831a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                Looper.myLooper().quit();
2841a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            }
2851a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
2861a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2871a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        @Override
2881a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        public void onInvalidated() {
2891a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
2901a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
2911a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2921a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @LargeTest
2931a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testManyRowsLong() throws Exception {
2941a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data INT);");
2951a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
2961a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        final int count = 36799;
2975793a17366997060b34d1877380980683bacb965Vasu Nori        mDatabase.execSQL("BEGIN Transaction;");
2981a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        for (int i = 0; i < count; i++) {
2991a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            mDatabase.execSQL("INSERT INTO test (data) VALUES (" + i + ");");
3001a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
3015793a17366997060b34d1877380980683bacb965Vasu Nori        mDatabase.execSQL("COMMIT;");
3021a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3031a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.query("test", new String[]{"data"}, null, null, null, null, null);
3041a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
3051a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3061a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int i = 0;
3071a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        while (c.moveToNext()) {
3081a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            assertEquals(i, c.getInt(0));
3091a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            i++;
3101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
3111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(count, i);
3121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(count, c.getCount());
3131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Log.d("testManyRows", "count " + Integer.toString(i));
3151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
3161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
3171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @LargeTest
3191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testManyRowsTxt() throws Exception {
3201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
3211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        StringBuilder sql = new StringBuilder(2100);
3221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        sql.append("INSERT INTO test (data) VALUES ('");
3231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Random random = new Random(System.currentTimeMillis());
3241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        StringBuilder randomString = new StringBuilder(1979);
3251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        for (int i = 0; i < 1979; i++) {
3261a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            randomString.append((random.nextInt() & 0xf) % 10);
3271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
3281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        sql.append(randomString);
3291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        sql.append("');");
3301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // if cursor window size changed, adjust this value too
3321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        final int count = 600; // more than two fillWindow needed
3335793a17366997060b34d1877380980683bacb965Vasu Nori        mDatabase.execSQL("BEGIN Transaction;");
3341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        for (int i = 0; i < count; i++) {
3351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            mDatabase.execSQL(sql.toString());
3361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
3375793a17366997060b34d1877380980683bacb965Vasu Nori        mDatabase.execSQL("COMMIT;");
3381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.query("test", new String[]{"data"}, null, null, null, null, null);
3401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
3411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int i = 0;
3431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        while (c.moveToNext()) {
3441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            assertEquals(randomString.toString(), c.getString(0));
3451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            i++;
3461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
3471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(count, i);
3481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(count, c.getCount());
3491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
3501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
3511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @LargeTest
3531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testManyRowsTxtLong() throws Exception {
3541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, txt TEXT, data INT);");
3551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Random random = new Random(System.currentTimeMillis());
3571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        StringBuilder randomString = new StringBuilder(1979);
3581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        for (int i = 0; i < 1979; i++) {
3591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            randomString.append((random.nextInt() & 0xf) % 10);
3601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
3611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // if cursor window size changed, adjust this value too
3631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        final int count = 600;
3645793a17366997060b34d1877380980683bacb965Vasu Nori        mDatabase.execSQL("BEGIN Transaction;");
3651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        for (int i = 0; i < count; i++) {
3661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            StringBuilder sql = new StringBuilder(2100);
3671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            sql.append("INSERT INTO test (txt, data) VALUES ('");
3681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            sql.append(randomString);
3691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            sql.append("','");
3701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            sql.append(i);
3711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            sql.append("');");
3721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            mDatabase.execSQL(sql.toString());
3731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
3745793a17366997060b34d1877380980683bacb965Vasu Nori        mDatabase.execSQL("COMMIT;");
3751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.query("test", new String[]{"txt", "data"}, null, null, null, null, null);
3771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
3781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        int i = 0;
3801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        while (c.moveToNext()) {
3811a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            assertEquals(randomString.toString(), c.getString(0));
3821a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            assertEquals(i, c.getInt(1));
3831a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            i++;
3841a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        }
3851a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(count, i);
3861a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(count, c.getCount());
3871a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
3881a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
3891a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3901a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
3911a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testRequery() throws Exception {
3921a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        populateDefaultTable();
3931a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
3941a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.rawQuery("SELECT * FROM test", null);
3951a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
3961a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(3, c.getCount());
3971a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.deactivate();
3981a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.requery();
3991a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(3, c.getCount());
4001a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
4011a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
4021a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4031a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
4041a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testRequeryWithSelection() throws Exception {
4051a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        populateDefaultTable();
4061a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4071a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.rawQuery("SELECT data FROM test WHERE data = '" + sString1 + "'",
4081a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                null);
4091a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
4101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(1, c.getCount());
4111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToFirst());
4121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString1, c.getString(0));
4131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.deactivate();
4141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.requery();
4151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(1, c.getCount());
4161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToFirst());
4171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString1, c.getString(0));
4181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
4191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
4201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
4221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testRequeryWithSelectionArgs() throws Exception {
4231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        populateDefaultTable();
4241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.rawQuery("SELECT data FROM test WHERE data = ?",
4261a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                new String[]{sString1});
4271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
4281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(1, c.getCount());
4291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToFirst());
4301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString1, c.getString(0));
4311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.deactivate();
4321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.requery();
4331a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(1, c.getCount());
4341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToFirst());
4351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString1, c.getString(0));
4361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.close();
4371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
4381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    @MediumTest
4401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    public void testRequeryWithAlteredSelectionArgs() throws Exception {
4411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        /**
4421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen         * Test the ability of a subclass of SQLiteCursor to change its query arguments.
4431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen         */
4441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        populateDefaultTable();
4451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        SQLiteDatabase.CursorFactory factory = new SQLiteDatabase.CursorFactory() {
4471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            public Cursor newCursor(
4481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                    SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable,
4491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                    SQLiteQuery query) {
4501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                return new SQLiteCursor(db, masterQuery, editTable, query) {
4511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                    @Override
4521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                    public boolean requery() {
4531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                        setSelectionArguments(new String[]{"2"});
4541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                        return super.requery();
4551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                    }
4561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                };
4571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen            }
4581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        };
4591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        Cursor c = mDatabase.rawQueryWithFactory(
4601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                factory, "SELECT data FROM test WHERE _id <= ?", new String[]{"1"},
4611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen                null);
4621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertNotNull(c);
4631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(1, c.getCount());
4641a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToFirst());
4651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString1, c.getString(0));
4661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // Our hacked requery() changes the query arguments in the cursor.
4681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.requery();
4691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(2, c.getCount());
4711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToFirst());
4721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString1, c.getString(0));
4731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertTrue(c.moveToNext());
4741a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        assertEquals(sString2, c.getString(0));
4751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
4761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        // Test that setting query args on a deactivated cursor also works.
4771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.deactivate();
4781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen        c.requery();
4791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen    }
4806141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    /**
4816141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori     * sometimes CursorWindow creation fails due to non-availability of memory create
4826141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori     * another CursorWindow object. One of the scenarios of its occurrence is when
4836141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori     * there are too many CursorWindow objects already opened by the process.
4846141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori     * This test is for that scenario.
4856141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori     */
4866141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    @LargeTest
487f90177629a5b69ca3a80466c0ab55abfeb6d26b2Abodunrinwa Toki    @Suppress  // Failing.
4886141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    public void testCursorWindowFailureWhenTooManyCursorWindowsLeftOpen() {
4896141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
4906141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        mDatabase.execSQL("INSERT INTO test values(1, 'test');");
4916141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        int N = 1024;
4926141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        ArrayList<Cursor> cursorList = new ArrayList<Cursor>();
4936141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        // open many cursors until a failure occurs
4946141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        for (int i = 0; i < N; i++) {
4956141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            try {
4966141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                Cursor cursor = mDatabase.rawQuery("select * from test", null);
4976141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                cursor.getCount();
4986141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                cursorList.add(cursor);
4996141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            } catch (CursorWindowAllocationException e) {
5006141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                // got the exception we wanted
5016141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                break;
5026141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            } catch (Exception e) {
5036141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                fail("unexpected exception: " + e.getMessage());
5046141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                e.printStackTrace();
5056141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                break;
5066141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            }
5076141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        }
5086141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        for (Cursor c : cursorList) {
5096141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            c.close();
5106141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        }
5116141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    }
5121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen}
513