1d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov/* 2d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * Copyright (C) 2017 The Android Open Source Project 3d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * 4d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * you may not use this file except in compliance with the License. 6d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * You may obtain a copy of the License at 7d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * 8d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * http://www.apache.org/licenses/LICENSE-2.0 9d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * 10d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * Unless required by applicable law or agreed to in writing, software 11d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * distributed under the License is distributed on an "AS IS" BASIS, 12d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * See the License for the specific language governing permissions and 14d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * limitations under the License. 15d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov */ 16d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 17d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovpackage android.database; 18d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 1913a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolovimport static org.junit.Assert.assertEquals; 20d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport static org.junit.Assert.assertNotNull; 21d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport static org.junit.Assert.assertTrue; 22d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport static org.junit.Assert.fail; 23d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 24d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.content.Context; 25d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.database.sqlite.SQLiteDatabase; 26d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.database.sqlite.SQLiteDatabaseConfiguration; 27d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.database.sqlite.SQLiteDebug; 28d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.database.sqlite.SQLiteOpenHelper; 29d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.support.test.InstrumentationRegistry; 30d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.support.test.filters.SmallTest; 31d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.support.test.runner.AndroidJUnit4; 32d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport android.util.Log; 33d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 34d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport org.junit.After; 35d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport org.junit.Before; 36d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport org.junit.Test; 37d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport org.junit.runner.RunWith; 38d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 39d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport java.util.ArrayList; 40d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovimport java.util.List; 41d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 42d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov/** 43d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * Tests for {@link SQLiteOpenHelper} 44d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * 45d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov * <p>Run with: bit FrameworksCoreTests:android.database.SQLiteOpenHelperTest 46d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov */ 47d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov@RunWith(AndroidJUnit4.class) 48d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov@SmallTest 49d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolovpublic class SQLiteOpenHelperTest { 50d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov private static final String TAG = "SQLiteOpenHelperTest"; 51d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 52d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov private TestHelper mTestHelper; 53d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov private Context mContext; 54d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov private List<SQLiteOpenHelper> mHelpersToClose; 55d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 56d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov private static class TestHelper extends SQLiteOpenHelper { 57d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov TestHelper(Context context) { // In-memory 58d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov super(context, null, null, 1); 59d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 60d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 61d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov TestHelper(Context context, String name) { 62d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov super(context, name, null, 1); 63d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 64d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 6513a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov TestHelper(Context context, String name, int version, SQLiteDatabase.OpenParams params) { 6613a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov super(context, name, version, params); 6713a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov } 6813a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov 69d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @Override 70d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void onCreate(SQLiteDatabase db) { 71d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 72d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 73d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @Override 74d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 75d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 76d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 77d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 78d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @Before 79d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void setup() { 80d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mContext = InstrumentationRegistry.getContext(); 81d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mTestHelper = new TestHelper(mContext, "openhelper_test"); 82d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mHelpersToClose = new ArrayList<>(); 83d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mHelpersToClose.add(mTestHelper); 84d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 85d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 86d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @After 87d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void teardown() { 88d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov for (SQLiteOpenHelper helper : mHelpersToClose) { 89d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov try { 90d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov helper.close(); 91d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov if (mTestHelper.getDatabaseName() != null) { 92d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov SQLiteDatabase.deleteDatabase( 93d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mContext.getDatabasePath(mTestHelper.getDatabaseName())); 94d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 95d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } catch (RuntimeException ex) { 96d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov Log.w(TAG, "Error occured when closing db helper " + helper, ex); 97d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 98d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 99d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 100d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 101d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @Test 102d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void testLookasideDefault() throws Exception { 103d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov assertNotNull(mTestHelper.getWritableDatabase()); 104d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov verifyLookasideStats(false); 105d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 106d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 107d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @Test 108d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void testLookasideDisabled() throws Exception { 109d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mTestHelper.setLookasideConfig(0, 0); 110d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov assertNotNull(mTestHelper.getWritableDatabase()); 111d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov verifyLookasideStats(true); 112d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 113d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 114d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @Test 115d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void testInMemoryLookasideDisabled() throws Exception { 116d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov TestHelper memHelper = new TestHelper(mContext); 117d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mHelpersToClose.add(memHelper); 118d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov memHelper.setLookasideConfig(0, 0); 119d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov assertNotNull(memHelper.getWritableDatabase()); 120d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov verifyLookasideStats(SQLiteDatabaseConfiguration.MEMORY_DB_PATH, true); 121d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 122d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 123d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @Test 124d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void testInMemoryLookasideDefault() throws Exception { 125d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov TestHelper memHelper = new TestHelper(mContext); 126d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mHelpersToClose.add(memHelper); 127d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov assertNotNull(memHelper.getWritableDatabase()); 128d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov verifyLookasideStats(SQLiteDatabaseConfiguration.MEMORY_DB_PATH, false); 129d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 130d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 131d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov @Test 132d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov public void testSetLookasideConfigValidation() { 133d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov try { 134d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mTestHelper.setLookasideConfig(-1, 0); 135d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov fail("Negative slot size should be rejected"); 136d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } catch (IllegalArgumentException expected) { 137d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 138d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov try { 139d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mTestHelper.setLookasideConfig(0, -10); 140d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov fail("Negative slot count should be rejected"); 141d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } catch (IllegalArgumentException expected) { 142d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 143d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov try { 144d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mTestHelper.setLookasideConfig(1, 0); 145d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov fail("Illegal config should be rejected"); 146d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } catch (IllegalArgumentException expected) { 147d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 148d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov try { 149d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov mTestHelper.setLookasideConfig(0, 1); 150d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov fail("Illegal config should be rejected"); 151d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } catch (IllegalArgumentException expected) { 152d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 153d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 154d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 155d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov private void verifyLookasideStats(boolean expectDisabled) { 156d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov verifyLookasideStats(mTestHelper.getDatabaseName(), expectDisabled); 157d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 158d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov 159d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov private static void verifyLookasideStats(String dbName, boolean expectDisabled) { 160d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov boolean dbStatFound = false; 161d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov SQLiteDebug.PagerStats info = SQLiteDebug.getDatabaseInfo(); 162d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov for (SQLiteDebug.DbStats dbStat : info.dbStats) { 163d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov if (dbStat.dbName.endsWith(dbName)) { 164d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov dbStatFound = true; 165d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov Log.i(TAG, "Lookaside for " + dbStat.dbName + " " + dbStat.lookaside); 166d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov if (expectDisabled) { 167d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov assertTrue("lookaside slots count should be zero", dbStat.lookaside == 0); 168d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } else { 169d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov assertTrue("lookaside slots count should be greater than zero", 170d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov dbStat.lookaside > 0); 171d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 172d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 173d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 174d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov assertTrue("No dbstat found for " + dbName, dbStatFound); 175d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov } 17613a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov 17713a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov @Test 17813a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov public void testOpenParamsConstructor() { 17913a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov SQLiteDatabase.OpenParams params = new SQLiteDatabase.OpenParams.Builder() 18013a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov .setJournalMode("DELETE") 18113a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov .setSynchronousMode("OFF") 18213a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov .build(); 18313a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov 18413a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov TestHelper helper = new TestHelper(mContext, "openhelper_test_constructor", 1, params); 18513a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov mHelpersToClose.add(helper); 18613a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov 18713a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov String journalMode = DatabaseUtils 18813a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov .stringForQuery(helper.getReadableDatabase(), "PRAGMA journal_mode", null); 18913a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov 19013a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov assertEquals("DELETE", journalMode.toUpperCase()); 19113a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov String syncMode = DatabaseUtils 19213a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov .stringForQuery(helper.getReadableDatabase(), "PRAGMA synchronous", null); 19313a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov 19413a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov assertEquals("0", syncMode); 19513a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov } 19613a4b37e87c0a66d5b6b3eec3fa3df088abc696cFyodor Kupolov 197d3b0c7e7e23c4f1d8db5a084befe4653dcb5e1d5Fyodor Kupolov} 198