Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.database.cts;
     18 
     19 
     20 import android.content.ContentValues;
     21 import android.content.Context;
     22 import android.database.Cursor;
     23 import android.database.DatabaseUtils.InsertHelper;
     24 import android.database.sqlite.SQLiteDatabase;
     25 import android.test.AndroidTestCase;
     26 import android.test.MoreAsserts;
     27 
     28 public class DatabaseUtils_InsertHelperTest extends AndroidTestCase {
     29     private static final String TEST_TABLE_NAME = "test";
     30     private static final String DATABASE_NAME = "database_test.db";
     31 
     32     private SQLiteDatabase mDatabase;
     33     private InsertHelper mInsertHelper;
     34 
     35     @Override
     36     protected void setUp() throws Exception {
     37         super.setUp();
     38         getContext().deleteDatabase(DATABASE_NAME);
     39         mDatabase = getContext().openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
     40         assertNotNull(mDatabase);
     41         mInsertHelper = new InsertHelper(mDatabase, TEST_TABLE_NAME);
     42     }
     43 
     44     @Override
     45     protected void tearDown() throws Exception {
     46         mInsertHelper.close();
     47         mDatabase.close();
     48         getContext().deleteDatabase(DATABASE_NAME);
     49         super.tearDown();
     50     }
     51 
     52     public void testConstructor() {
     53         new InsertHelper(mDatabase, TEST_TABLE_NAME);
     54     }
     55 
     56     public void testClose() {
     57         mInsertHelper.close();
     58     }
     59 
     60     public void testGetColumnIndex() {
     61         mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + " (_id INTEGER PRIMARY KEY, " +
     62                 "name TEXT, age INTEGER, address TEXT);");
     63         assertEquals(1, mInsertHelper.getColumnIndex("_id"));
     64         assertEquals(2, mInsertHelper.getColumnIndex("name"));
     65         assertEquals(3, mInsertHelper.getColumnIndex("age"));
     66         assertEquals(4, mInsertHelper.getColumnIndex("address"));
     67         try {
     68             mInsertHelper.getColumnIndex("missing_column");
     69             fail("Should throw exception (column does not exist)");
     70         } catch (IllegalArgumentException expected) {
     71             // expected
     72         }
     73     }
     74 
     75     public void testInsert() {
     76         mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + "(_id INTEGER PRIMARY KEY," +
     77                 " boolean_value INTEGER, int_value INTEGER, long_value INTEGER," +
     78                 " double_value DOUBLE, float_value DOUBLE, string_value TEXT," +
     79                 " blob_value BLOB, null_value TEXT);");
     80         final int booleanValueIndex = 1;
     81         final int intValueIndex     = 2;
     82         final int longValueIndex    = 3;
     83         final int doubleValueIndex  = 4;
     84         final int floatValueIndex   = 5;
     85         final int stringValueIndex  = 6;
     86         final int blobValueIndex    = 7;
     87         final int nullValueIndex    = 8;
     88         final String[] projection = new String[] {
     89             "_id",                    // index 0
     90             "boolean_value",          // index 1
     91             "int_value",              // index 2
     92             "long_value",             // index 3
     93             "double_value",           // index 4
     94             "float_value",            // index 5
     95             "string_value",           // index 6
     96             "blob_value",             // index 7
     97             "null_value"              // index 8
     98         };
     99 
    100         Cursor cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
    101         assertNotNull(cursor);
    102         assertEquals(0, cursor.getCount());
    103         cursor.close();
    104 
    105         try {
    106             mInsertHelper.execute();
    107             fail("Should throw exception (execute without prepare)");
    108         } catch (IllegalStateException expected) {
    109             // expected
    110         }
    111 
    112         mInsertHelper.prepareForInsert();
    113         mInsertHelper.bind(mInsertHelper.getColumnIndex("boolean_value"), true);
    114         mInsertHelper.bind(mInsertHelper.getColumnIndex("int_value"), 10);
    115         mInsertHelper.bind(mInsertHelper.getColumnIndex("long_value"), 1000L);
    116         mInsertHelper.bind(mInsertHelper.getColumnIndex("double_value"), 123.456);
    117         mInsertHelper.bind(mInsertHelper.getColumnIndex("float_value"), 1.0f);
    118         mInsertHelper.bind(mInsertHelper.getColumnIndex("string_value"), "test insert");
    119         byte[] blob = new byte[] { '1', '2', '3' };
    120         mInsertHelper.bind(mInsertHelper.getColumnIndex("blob_value"), blob);
    121         mInsertHelper.bindNull(mInsertHelper.getColumnIndex("null_value"));
    122         long id = mInsertHelper.execute();
    123         assertEquals(1, id);
    124 
    125         cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
    126         assertNotNull(cursor);
    127         assertEquals(1, cursor.getCount());
    128         cursor.moveToFirst();
    129         assertEquals(1, cursor.getInt(booleanValueIndex));
    130         assertEquals(10, cursor.getInt(intValueIndex));
    131         assertEquals(1000L, cursor.getLong(longValueIndex));
    132         assertEquals(123.456, cursor.getDouble(doubleValueIndex));
    133         assertEquals(1.0f, cursor.getFloat(floatValueIndex));
    134         assertEquals("test insert", cursor.getString(stringValueIndex));
    135         byte[] value = cursor.getBlob(blobValueIndex);
    136         MoreAsserts.assertEquals(blob, value);
    137         assertNull(cursor.getString(nullValueIndex));
    138         cursor.close();
    139 
    140         // try inserting a conflicting column -> should return -1
    141         mInsertHelper.prepareForInsert();
    142         mInsertHelper.bind(mInsertHelper.getColumnIndex("_id"), id);
    143         assertEquals(-1, mInsertHelper.execute());
    144 
    145         // subsequent insert() should ignore existing bindings
    146         ContentValues values = new ContentValues();
    147         values.put("boolean_value", false);
    148         values.put("int_value", 123);
    149         values.put("long_value", 987654L);
    150         values.put("double_value", 654.321);
    151         values.put("float_value", 21.1f);
    152         values.put("string_value", "insert another row");
    153         values.put("blob_value", blob);
    154         values.putNull("null_value");
    155         id = mInsertHelper.insert(values);
    156         assertEquals(2, id);
    157         cursor = mDatabase.query(TEST_TABLE_NAME, projection, "_id = " + id,
    158                 null, null, null, null);
    159         assertNotNull(cursor);
    160         cursor.moveToFirst();
    161         assertEquals(0, cursor.getInt(booleanValueIndex));
    162         assertEquals(123, cursor.getInt(intValueIndex));
    163         assertEquals(987654L, cursor.getLong(longValueIndex));
    164         assertEquals(654.321, cursor.getDouble(doubleValueIndex));
    165         assertEquals(21.1f, cursor.getFloat(floatValueIndex));
    166         assertEquals("insert another row", cursor.getString(stringValueIndex));
    167         value = cursor.getBlob(blobValueIndex);
    168         MoreAsserts.assertEquals(blob, value);
    169         assertNull(cursor.getString(nullValueIndex));
    170         cursor.close();
    171 
    172         // try inserting a conflicting column -> should return -1
    173         values.put("_id", id);
    174         assertEquals(-1, mInsertHelper.insert(values));
    175     }
    176 
    177     public void testReplace() {
    178         mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + "(_id INTEGER PRIMARY KEY," +
    179                 " boolean_value INTEGER, int_value INTEGER, long_value INTEGER," +
    180                 " double_value DOUBLE, float_value DOUBLE, string_value TEXT," +
    181                 " blob_value BLOB, null_value TEXT);");
    182         final int booleanValueIndex = 1;
    183         final int intValueIndex     = 2;
    184         final int longValueIndex    = 3;
    185         final int doubleValueIndex  = 4;
    186         final int floatValueIndex   = 5;
    187         final int stringValueIndex  = 6;
    188         final int blobValueIndex    = 7;
    189         final int nullValueIndex    = 8;
    190         final String[] projection = new String[] {
    191             "_id",                    // index 0
    192             "boolean_value",          // index 1
    193             "int_value",              // index 2
    194             "long_value",             // index 3
    195             "double_value",           // index 4
    196             "float_value",            // index 5
    197             "string_value",           // index 6
    198             "blob_value",             // index 7
    199             "null_value"              // index 8
    200         };
    201 
    202         Cursor cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
    203         assertNotNull(cursor);
    204         assertEquals(0, cursor.getCount());
    205         cursor.close();
    206 
    207         // without specifying a key, this becomes an insert
    208         mInsertHelper.prepareForReplace();
    209         mInsertHelper.bind(mInsertHelper.getColumnIndex("boolean_value"), true);
    210         mInsertHelper.bind(mInsertHelper.getColumnIndex("int_value"), 10);
    211         mInsertHelper.bind(mInsertHelper.getColumnIndex("long_value"), 1000L);
    212         mInsertHelper.bind(mInsertHelper.getColumnIndex("double_value"), 123.456);
    213         mInsertHelper.bind(mInsertHelper.getColumnIndex("float_value"), 1.0f);
    214         mInsertHelper.bind(mInsertHelper.getColumnIndex("string_value"), "test insert");
    215         byte[] blob = new byte[] { '1', '2', '3' };
    216         mInsertHelper.bind(mInsertHelper.getColumnIndex("blob_value"), blob);
    217         mInsertHelper.bindNull(mInsertHelper.getColumnIndex("null_value"));
    218         long id = mInsertHelper.execute();
    219         assertEquals(1, id);
    220 
    221         cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
    222         assertNotNull(cursor);
    223         assertEquals(1, cursor.getCount());
    224         cursor.moveToFirst();
    225         assertEquals(1, cursor.getInt(booleanValueIndex));
    226         assertEquals(10, cursor.getInt(intValueIndex));
    227         assertEquals(1000L, cursor.getLong(longValueIndex));
    228         assertEquals(123.456, cursor.getDouble(doubleValueIndex));
    229         assertEquals(1.0f, cursor.getFloat(floatValueIndex));
    230         assertEquals("test insert", cursor.getString(stringValueIndex));
    231         byte[] value = cursor.getBlob(blobValueIndex);
    232         MoreAsserts.assertEquals(blob, value);
    233         assertNull(cursor.getString(nullValueIndex));
    234         cursor.close();
    235 
    236         mInsertHelper.prepareForReplace();
    237         mInsertHelper.bind(mInsertHelper.getColumnIndex("_id"), id);
    238         mInsertHelper.bind(mInsertHelper.getColumnIndex("int_value"), 42);
    239         mInsertHelper.execute();
    240         cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
    241         assertNotNull(cursor);
    242         assertEquals(1, cursor.getCount());
    243         cursor.moveToFirst();
    244         assertEquals(42, cursor.getInt(intValueIndex));
    245         // previous bindings are forgotten
    246         assertNull(cursor.getString(stringValueIndex));
    247         cursor.close();
    248 
    249         // illegal primary key -> should return -1
    250         mInsertHelper.prepareForReplace();
    251         mInsertHelper.bind(mInsertHelper.getColumnIndex("_id"), "illegal_id");
    252         assertEquals(-1, mInsertHelper.execute());
    253 
    254         ContentValues values = new ContentValues();
    255         // will replace row id
    256         values.put("_id", id);
    257         values.put("boolean_value", false);
    258         values.put("int_value", 123);
    259         values.put("long_value", 987654L);
    260         values.put("double_value", 654.321);
    261         values.put("float_value", 21.1f);
    262         values.put("string_value", "replace the row");
    263         values.put("blob_value", blob);
    264         values.putNull("null_value");
    265         id = mInsertHelper.replace(values);
    266         assertEquals(1, id);
    267         cursor = mDatabase.query(TEST_TABLE_NAME, projection, null, null, null, null, null);
    268         assertEquals(1, cursor.getCount());
    269         assertNotNull(cursor);
    270         cursor.moveToFirst();
    271         assertEquals(0, cursor.getInt(booleanValueIndex));
    272         assertEquals(123, cursor.getInt(intValueIndex));
    273         assertEquals(987654L, cursor.getLong(longValueIndex));
    274         assertEquals(654.321, cursor.getDouble(doubleValueIndex));
    275         assertEquals(21.1f, cursor.getFloat(floatValueIndex));
    276         assertEquals("replace the row", cursor.getString(stringValueIndex));
    277         value = cursor.getBlob(blobValueIndex);
    278         MoreAsserts.assertEquals(blob, value);
    279         assertNull(cursor.getString(nullValueIndex));
    280         cursor.close();
    281 
    282         // illegal primary key -> should return -1
    283         values.put("_id", "illegal_id");
    284         assertEquals(-1, mInsertHelper.replace(values));
    285     }
    286 }
    287