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