1d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov/* 2d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * Copyright (C) 2017 The Android Open Source Project 3d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * 4d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * Licensed under the Apache License, Version 2.0 (the "License"); 5d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * you may not use this file except in compliance with the License. 6d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * You may obtain a copy of the License at 7d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * 8d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * http://www.apache.org/licenses/LICENSE-2.0 9d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * 10d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * Unless required by applicable law or agreed to in writing, software 11d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * distributed under the License is distributed on an "AS IS" BASIS, 12d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * See the License for the specific language governing permissions and 14d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * limitations under the License 15d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov */ 16d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 17d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovpackage android.database; 18d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 19d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport android.content.ContentValues; 20d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport android.content.Context; 21d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport android.database.sqlite.SQLiteDatabase; 22d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport android.perftests.utils.BenchmarkState; 23d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport android.perftests.utils.PerfStatusReporter; 24d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport android.support.test.InstrumentationRegistry; 25d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport android.support.test.filters.LargeTest; 26d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport android.support.test.runner.AndroidJUnit4; 27d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 28d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport org.junit.After; 29d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport org.junit.Before; 30d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport org.junit.Rule; 31d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport org.junit.Test; 32d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport org.junit.runner.RunWith; 33d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 34d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport java.util.Random; 35d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 36d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport static org.junit.Assert.assertEquals; 37d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovimport static org.junit.Assert.assertTrue; 38d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 39d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov/** 40d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * Performance tests for typical CRUD operations and loading rows into the Cursor 41d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * 42d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov * <p>To run: bit CorePerfTests:android.database.SQLiteDatabasePerfTest 43d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov */ 44d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov@RunWith(AndroidJUnit4.class) 45d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov@LargeTest 46d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolovpublic class SQLiteDatabasePerfTest { 47d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov // TODO b/64262688 Add Concurrency tests to compare WAL vs DELETE read/write 48d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov private static final String DB_NAME = "dbperftest"; 49d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov private static final int DEFAULT_DATASET_SIZE = 1000; 50d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 51d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @Rule 52d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); 53d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov private SQLiteDatabase mDatabase; 54d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov private Context mContext; 55d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 56d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @Before 57d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public void setUp() { 58d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mContext = InstrumentationRegistry.getTargetContext(); 59d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mContext.deleteDatabase(DB_NAME); 60d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase = mContext.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null); 61d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.execSQL("CREATE TABLE T1 " 62d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov + "(_ID INTEGER PRIMARY KEY, COL_A INTEGER, COL_B VARCHAR(100), COL_C REAL)"); 63d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.execSQL("CREATE TABLE T2 (" 64d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov + "_ID INTEGER PRIMARY KEY, COL_A VARCHAR(100), T1_ID INTEGER," 65d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov + "FOREIGN KEY(T1_ID) REFERENCES T1 (_ID))"); 66d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 67d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 68d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @After 69d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public void tearDown() { 70d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.close(); 71d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mContext.deleteDatabase(DB_NAME); 72d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 73d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 74d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @Test 75d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public void testSelect() { 76d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov insertT1TestDataSet(); 77d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 78d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 79d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 80d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov Random rnd = new Random(0); 81d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov while (state.keepRunning()) { 82d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov int index = rnd.nextInt(DEFAULT_DATASET_SIZE); 83d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov try (Cursor cursor = mDatabase.rawQuery("SELECT _ID, COL_A, COL_B, COL_C FROM T1 " 84d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov + "WHERE _ID=?", new String[]{String.valueOf(index)})) { 85d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertTrue(cursor.moveToNext()); 86d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(index, cursor.getInt(0)); 87d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(index, cursor.getInt(1)); 88d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals("T1Value" + index, cursor.getString(2)); 89d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(1.1 * index, cursor.getDouble(3), 0.0000001d); 90d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 91d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 92d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 93d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 94d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @Test 95d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public void testSelectMultipleRows() { 96d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov insertT1TestDataSet(); 97d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 98d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 99d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov Random rnd = new Random(0); 100d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov final int querySize = 50; 101d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov while (state.keepRunning()) { 102d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov int index = rnd.nextInt(DEFAULT_DATASET_SIZE - querySize - 1); 103d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov try (Cursor cursor = mDatabase.rawQuery("SELECT _ID, COL_A, COL_B, COL_C FROM T1 " 104d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov + "WHERE _ID BETWEEN ? and ? ORDER BY _ID", 105d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov new String[]{String.valueOf(index), String.valueOf(index + querySize - 1)})) { 106d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov int i = 0; 107d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov while(cursor.moveToNext()) { 108d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(index, cursor.getInt(0)); 109d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(index, cursor.getInt(1)); 110d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals("T1Value" + index, cursor.getString(2)); 111d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(1.1 * index, cursor.getDouble(3), 0.0000001d); 112d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov index++; 113d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov i++; 114d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 115d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(querySize, i); 116d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 117d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 118d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 119d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 120d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @Test 1215346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov public void testCursorIterateForward() { 1225346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov // A larger dataset is needed to exceed default CursorWindow size 1235346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov int datasetSize = DEFAULT_DATASET_SIZE * 50; 1245346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov insertT1TestDataSet(datasetSize); 1255346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov 1265346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 1275346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov while (state.keepRunning()) { 1285346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov try (Cursor cursor = mDatabase 1295346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov .rawQuery("SELECT _ID, COL_A, COL_B, COL_C FROM T1 ORDER BY _ID", null)) { 1305346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov int i = 0; 1315346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov while(cursor.moveToNext()) { 1325346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals(i, cursor.getInt(0)); 1335346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals(i, cursor.getInt(1)); 1345346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals("T1Value" + i, cursor.getString(2)); 1355346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals(1.1 * i, cursor.getDouble(3), 0.0000001d); 1365346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov i++; 1375346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 1385346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals(datasetSize, i); 1395346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 1405346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 1415346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 1425346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov 1435346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov @Test 1445346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov public void testCursorIterateBackwards() { 1455346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov // A larger dataset is needed to exceed default CursorWindow size 1465346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov int datasetSize = DEFAULT_DATASET_SIZE * 50; 1475346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov insertT1TestDataSet(datasetSize); 1485346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov 1495346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 1505346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov while (state.keepRunning()) { 1515346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov try (Cursor cursor = mDatabase 1525346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov .rawQuery("SELECT _ID, COL_A, COL_B, COL_C FROM T1 ORDER BY _ID", null)) { 1535346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov int i = datasetSize - 1; 1545346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov while(cursor.moveToPosition(i)) { 1555346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals(i, cursor.getInt(0)); 1565346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals(i, cursor.getInt(1)); 1575346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals("T1Value" + i, cursor.getString(2)); 1585346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals(1.1 * i, cursor.getDouble(3), 0.0000001d); 1595346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov i--; 1605346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 1615346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov assertEquals(-1, i); 1625346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 1635346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 1645346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 1655346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov 1665346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov @Test 167d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public void testInnerJoin() { 168d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.setForeignKeyConstraintsEnabled(true); 169d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.beginTransaction(); 170d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov insertT1TestDataSet(); 171d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov insertT2TestDataSet(); 172d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.setTransactionSuccessful(); 173d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.endTransaction(); 174d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 175d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 176d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 177d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov Random rnd = new Random(0); 178d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov while (state.keepRunning()) { 179d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov int index = rnd.nextInt(1000); 180d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov try (Cursor cursor = mDatabase.rawQuery( 181d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov "SELECT T1._ID, T1.COL_A, T1.COL_B, T1.COL_C, T2.COL_A FROM T1 " 182d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov + "INNER JOIN T2 on T2.T1_ID=T1._ID WHERE T1._ID = ?", 183d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov new String[]{String.valueOf(index)})) { 184d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertTrue(cursor.moveToNext()); 185d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(index, cursor.getInt(0)); 186d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(index, cursor.getInt(1)); 187d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals("T1Value" + index, cursor.getString(2)); 188d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(1.1 * index, cursor.getDouble(3), 0.0000001d); 189d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals("T2Value" + index, cursor.getString(4)); 190d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 191d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 192d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 193d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 194d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @Test 195d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public void testInsert() { 196d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov insertT1TestDataSet(); 197d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 198d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 199d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 200d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov ContentValues cv = new ContentValues(); 201d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov cv.put("_ID", DEFAULT_DATASET_SIZE); 202d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov cv.put("COL_B", "NewValue"); 203d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov cv.put("COL_C", 1.1); 204d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov String[] deleteArgs = new String[]{String.valueOf(DEFAULT_DATASET_SIZE)}; 205d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov while (state.keepRunning()) { 206d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(DEFAULT_DATASET_SIZE, mDatabase.insert("T1", null, cv)); 207d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov state.pauseTiming(); 208d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(1, mDatabase.delete("T1", "_ID=?", deleteArgs)); 209d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov state.resumeTiming(); 210d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 211d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 212d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 213d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @Test 214d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public void testDelete() { 215d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov insertT1TestDataSet(); 216d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 217d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov String[] deleteArgs = new String[]{String.valueOf(DEFAULT_DATASET_SIZE)}; 218d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov Object[] insertsArgs = new Object[]{DEFAULT_DATASET_SIZE, DEFAULT_DATASET_SIZE, 219d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov "ValueToDelete", 1.1}; 220d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 221d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov while (state.keepRunning()) { 222d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov state.pauseTiming(); 223d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.execSQL("INSERT INTO T1 VALUES (?, ?, ?, ?)", insertsArgs); 224d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov state.resumeTiming(); 225d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(1, mDatabase.delete("T1", "_ID=?", deleteArgs)); 226d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 227d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 228d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 229d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov @Test 230d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov public void testUpdate() { 231d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov insertT1TestDataSet(); 232d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 233d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 234d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov Random rnd = new Random(0); 235d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov int i = 0; 236d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov ContentValues cv = new ContentValues(); 237d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov String[] argArray = new String[1]; 238d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov while (state.keepRunning()) { 239d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov int id = rnd.nextInt(DEFAULT_DATASET_SIZE); 240d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov cv.put("COL_A", i); 241d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov cv.put("COL_B", "UpdatedValue"); 242d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov cv.put("COL_C", i); 243d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov argArray[0] = String.valueOf(id); 244d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov assertEquals(1, mDatabase.update("T1", cv, "_ID=?", argArray)); 245d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov i++; 246d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 247d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 248d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 249d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov private void insertT1TestDataSet() { 2505346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov insertT1TestDataSet(DEFAULT_DATASET_SIZE); 2515346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov } 2525346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov 2535346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov private void insertT1TestDataSet(int size) { 254d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.beginTransaction(); 2555346f19f9e536e8d08d89e79ef0c6ed16c6b55b7Fyodor Kupolov for (int i = 0; i < size; i++) { 256d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.execSQL("INSERT INTO T1 VALUES (?, ?, ?, ?)", 257d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov new Object[]{i, i, "T1Value" + i, i * 1.1}); 258d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 259d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.setTransactionSuccessful(); 260d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.endTransaction(); 261d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 262d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 263d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov private void insertT2TestDataSet() { 264d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.beginTransaction(); 265d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov for (int i = 0; i < DEFAULT_DATASET_SIZE; i++) { 266d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.execSQL("INSERT INTO T2 VALUES (?, ?, ?)", 267d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov new Object[]{i, "T2Value" + i, i}); 268d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 269d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.setTransactionSuccessful(); 270d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov mDatabase.endTransaction(); 271d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov } 272d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov} 273d41e4f0c340ba04215b5f032dd825f518e322607Fyodor Kupolov 274