OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / cts / tests / tests / database / src / android / database / cts / DatabaseUtils_InsertHelperTest.java
diff --git a/cts/tests/tests/database/src/android/database/cts/DatabaseUtils_InsertHelperTest.java b/cts/tests/tests/database/src/android/database/cts/DatabaseUtils_InsertHelperTest.java
new file mode 100644 (file)
index 0000000..b918ff9
--- /dev/null
@@ -0,0 +1,424 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.database.cts;
+
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.DatabaseUtils.InsertHelper;
+import android.database.sqlite.SQLiteDatabase;
+import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+
+@TestTargetClass(InsertHelper.class)
+public class DatabaseUtils_InsertHelperTest extends AndroidTestCase {
+    private static final String TEST_TABLE_NAME = "test";
+    private static final String DATABASE_NAME = "database_test.db";
+
+    private SQLiteDatabase mDatabase;
+    private InsertHelper mInsertHelper;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        getContext().deleteDatabase(DATABASE_NAME);
+        mDatabase = getContext().openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
+        assertNotNull(mDatabase);
+        mInsertHelper = new InsertHelper(mDatabase, TEST_TABLE_NAME);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mInsertHelper.close();
+        mDatabase.close();
+        getContext().deleteDatabase(DATABASE_NAME);
+        super.tearDown();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "InsertHelper",
+        args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String.class}
+    )
+    public void testConstructor() {
+        new InsertHelper(mDatabase, TEST_TABLE_NAME);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.SUFFICIENT,
+        method = "close",
+        args = {}
+    )
+    public void testClose() {
+        mInsertHelper.close();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getColumnIndex",
+        args = {String.class}
+    )
+    @ToBeFixed(bug = "1695243", explanation = "Javadoc does not specify exceptions thrown.")
+    public void testGetColumnIndex() {
+        mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + " (_id INTEGER PRIMARY KEY, " +
+                "name TEXT, age INTEGER, address TEXT);");
+        assertEquals(1, mInsertHelper.getColumnIndex("_id"));
+        assertEquals(2, mInsertHelper.getColumnIndex("name"));
+        assertEquals(3, mInsertHelper.getColumnIndex("age"));
+        assertEquals(4, mInsertHelper.getColumnIndex("address"));
+        try {
+            mInsertHelper.getColumnIndex("missing_column");
+            fail("Should throw exception (column does not exist)");
+        } catch (IllegalArgumentException expected) {
+            // expected
+        }
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "prepareForInsert",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "execute",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, boolean.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, long.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, double.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, float.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, java.lang.String.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, byte[].class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bindNull",
+            args = {int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "insert",
+            args = {android.content.ContentValues.class}
+        )
+    })
+    @ToBeFixed(bug = "1695243", explanation = "Javadoc does not specify exceptions thrown.")
+    public void testInsert() {
+        mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + "(_id INTEGER PRIMARY KEY," +
+                " boolean_value INTEGER, int_value INTEGER, long_value INTEGER," +
+                " double_value DOUBLE, float_value DOUBLE, string_value TEXT," +
+                " blob_value BLOB, null_value TEXT);");
+        final int booleanValueIndex = 1;
+        final int intValueIndex     = 2;
+        final int longValueIndex    = 3;
+        final int doubleValueIndex  = 4;
+        final int floatValueIndex   = 5;
+        final int stringValueIndex  = 6;
+        final int blobValueIndex    = 7;
+        final int nullValueIndex    = 8;
+        final String[] projection = new String[] {
+            "_id",                    // index 0
+            "boolean_value",          // index 1
+            "int_value",              // index 2
+            "long_value",             // index 3
+            "double_value",           // index 4
+            "float_value",            // index 5
+            "string_value",           // index 6
+            "blob_value",             // index 7
+            "null_value"              // index 8
+        };
+
+        Cursor cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
+        assertNotNull(cursor);
+        assertEquals(0, cursor.getCount());
+        cursor.close();
+
+        try {
+            mInsertHelper.execute();
+            fail("Should throw exception (execute without prepare)");
+        } catch (IllegalStateException expected) {
+            // expected
+        }
+
+        mInsertHelper.prepareForInsert();
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("boolean_value"), true);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("int_value"), 10);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("long_value"), 1000L);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("double_value"), 123.456);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("float_value"), 1.0f);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("string_value"), "test insert");
+        byte[] blob = new byte[] { '1', '2', '3' };
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("blob_value"), blob);
+        mInsertHelper.bindNull(mInsertHelper.getColumnIndex("null_value"));
+        long id = mInsertHelper.execute();
+        assertEquals(1, id);
+
+        cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
+        assertNotNull(cursor);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        assertEquals(1, cursor.getInt(booleanValueIndex));
+        assertEquals(10, cursor.getInt(intValueIndex));
+        assertEquals(1000L, cursor.getLong(longValueIndex));
+        assertEquals(123.456, cursor.getDouble(doubleValueIndex));
+        assertEquals(1.0f, cursor.getFloat(floatValueIndex));
+        assertEquals("test insert", cursor.getString(stringValueIndex));
+        byte[] value = cursor.getBlob(blobValueIndex);
+        MoreAsserts.assertEquals(blob, value);
+        assertNull(cursor.getString(nullValueIndex));
+        cursor.close();
+
+        // try inserting a conflicting column -> should return -1
+        mInsertHelper.prepareForInsert();
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("_id"), id);
+        assertEquals(-1, mInsertHelper.execute());
+
+        // subsequent insert() should ignore existing bindings
+        ContentValues values = new ContentValues();
+        values.put("boolean_value", false);
+        values.put("int_value", 123);
+        values.put("long_value", 987654L);
+        values.put("double_value", 654.321);
+        values.put("float_value", 21.1f);
+        values.put("string_value", "insert another row");
+        values.put("blob_value", blob);
+        values.putNull("null_value");
+        id = mInsertHelper.insert(values);
+        assertEquals(2, id);
+        cursor = mDatabase.query(TEST_TABLE_NAME, projection, "_id = " + id,
+                null, null, null, null);
+        assertNotNull(cursor);
+        cursor.moveToFirst();
+        assertEquals(0, cursor.getInt(booleanValueIndex));
+        assertEquals(123, cursor.getInt(intValueIndex));
+        assertEquals(987654L, cursor.getLong(longValueIndex));
+        assertEquals(654.321, cursor.getDouble(doubleValueIndex));
+        assertEquals(21.1f, cursor.getFloat(floatValueIndex));
+        assertEquals("insert another row", cursor.getString(stringValueIndex));
+        value = cursor.getBlob(blobValueIndex);
+        MoreAsserts.assertEquals(blob, value);
+        assertNull(cursor.getString(nullValueIndex));
+        cursor.close();
+
+        // try inserting a conflicting column -> should return -1
+        values.put("_id", id);
+        assertEquals(-1, mInsertHelper.insert(values));
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "prepareForReplace",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "execute",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, boolean.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, long.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, double.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, float.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, java.lang.String.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bind",
+            args = {int.class, byte[].class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "bindNull",
+            args = {int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.SUFFICIENT,
+            method = "replace",
+            args = {android.content.ContentValues.class}
+        )
+    })
+    @ToBeFixed(bug = "1695243", explanation = "Javadoc does not specify exceptions thrown.")
+    public void testReplace() {
+        mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + "(_id INTEGER PRIMARY KEY," +
+                " boolean_value INTEGER, int_value INTEGER, long_value INTEGER," +
+                " double_value DOUBLE, float_value DOUBLE, string_value TEXT," +
+                " blob_value BLOB, null_value TEXT);");
+        final int booleanValueIndex = 1;
+        final int intValueIndex     = 2;
+        final int longValueIndex    = 3;
+        final int doubleValueIndex  = 4;
+        final int floatValueIndex   = 5;
+        final int stringValueIndex  = 6;
+        final int blobValueIndex    = 7;
+        final int nullValueIndex    = 8;
+        final String[] projection = new String[] {
+            "_id",                    // index 0
+            "boolean_value",          // index 1
+            "int_value",              // index 2
+            "long_value",             // index 3
+            "double_value",           // index 4
+            "float_value",            // index 5
+            "string_value",           // index 6
+            "blob_value",             // index 7
+            "null_value"              // index 8
+        };
+
+        Cursor cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
+        assertNotNull(cursor);
+        assertEquals(0, cursor.getCount());
+        cursor.close();
+
+        // without specifying a key, this becomes an insert
+        mInsertHelper.prepareForReplace();
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("boolean_value"), true);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("int_value"), 10);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("long_value"), 1000L);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("double_value"), 123.456);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("float_value"), 1.0f);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("string_value"), "test insert");
+        byte[] blob = new byte[] { '1', '2', '3' };
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("blob_value"), blob);
+        mInsertHelper.bindNull(mInsertHelper.getColumnIndex("null_value"));
+        long id = mInsertHelper.execute();
+        assertEquals(1, id);
+
+        cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
+        assertNotNull(cursor);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        assertEquals(1, cursor.getInt(booleanValueIndex));
+        assertEquals(10, cursor.getInt(intValueIndex));
+        assertEquals(1000L, cursor.getLong(longValueIndex));
+        assertEquals(123.456, cursor.getDouble(doubleValueIndex));
+        assertEquals(1.0f, cursor.getFloat(floatValueIndex));
+        assertEquals("test insert", cursor.getString(stringValueIndex));
+        byte[] value = cursor.getBlob(blobValueIndex);
+        MoreAsserts.assertEquals(blob, value);
+        assertNull(cursor.getString(nullValueIndex));
+        cursor.close();
+
+        mInsertHelper.prepareForReplace();
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("_id"), id);
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("int_value"), 42);
+        mInsertHelper.execute();
+        cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
+        assertNotNull(cursor);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        assertEquals(42, cursor.getInt(intValueIndex));
+        // previous bindings are forgotten
+        assertNull(cursor.getString(stringValueIndex));
+        cursor.close();
+
+        // illegal primary key -> should return -1
+        mInsertHelper.prepareForReplace();
+        mInsertHelper.bind(mInsertHelper.getColumnIndex("_id"), "illegal_id");
+        assertEquals(-1, mInsertHelper.execute());
+
+        ContentValues values = new ContentValues();
+        // will replace row id
+        values.put("_id", id);
+        values.put("boolean_value", false);
+        values.put("int_value", 123);
+        values.put("long_value", 987654L);
+        values.put("double_value", 654.321);
+        values.put("float_value", 21.1f);
+        values.put("string_value", "replace the row");
+        values.put("blob_value", blob);
+        values.putNull("null_value");
+        id = mInsertHelper.replace(values);
+        assertEquals(1, id);
+        cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
+        assertEquals(1, cursor.getCount());
+        assertNotNull(cursor);
+        cursor.moveToFirst();
+        assertEquals(0, cursor.getInt(booleanValueIndex));
+        assertEquals(123, cursor.getInt(intValueIndex));
+        assertEquals(987654L, cursor.getLong(longValueIndex));
+        assertEquals(654.321, cursor.getDouble(doubleValueIndex));
+        assertEquals(21.1f, cursor.getFloat(floatValueIndex));
+        assertEquals("replace the row", cursor.getString(stringValueIndex));
+        value = cursor.getBlob(blobValueIndex);
+        MoreAsserts.assertEquals(blob, value);
+        assertNull(cursor.getString(nullValueIndex));
+        cursor.close();
+
+        // illegal primary key -> should return -1
+        values.put("_id", "illegal_id");
+        assertEquals(-1, mInsertHelper.replace(values));
+    }
+}