1fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov/* 2fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * Copyright (C) 2017 The Android Open Source Project 3fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * 4fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * Licensed under the Apache License, Version 2.0 (the "License"); 5fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * you may not use this file except in compliance with the License. 6fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * You may obtain a copy of the License at 7fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * 8fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * http://www.apache.org/licenses/LICENSE-2.0 9fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * 10fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * Unless required by applicable law or agreed to in writing, software 11fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * distributed under the License is distributed on an "AS IS" BASIS, 12fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * See the License for the specific language governing permissions and 14fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * limitations under the License. 15fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov */ 16fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 17fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovpackage android.database.sqlite; 18fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 19fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport static org.junit.Assert.assertEquals; 20fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport static org.junit.Assert.assertTrue; 21fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 22fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport android.content.Context; 23fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport android.os.HandlerThread; 24fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport android.support.test.InstrumentationRegistry; 25fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport android.support.test.filters.SmallTest; 26fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport android.support.test.runner.AndroidJUnit4; 27fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport android.util.Log; 28fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 29fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport org.junit.After; 30fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport org.junit.Before; 31fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport org.junit.Test; 32fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport org.junit.runner.RunWith; 33fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 34fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovimport java.io.File; 35fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 36fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov/** 37fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * Tests for {@link SQLiteConnectionPool} 38fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * 39fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov * <p>Run with: bit FrameworksCoreTests:android.database.sqlite.SQLiteConnectionPoolTest 40fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov */ 41fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov@RunWith(AndroidJUnit4.class) 42fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov@SmallTest 43fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolovpublic class SQLiteConnectionPoolTest { 44fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov private static final String TAG = "SQLiteConnectionPoolTest"; 45fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 46fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov private Context mContext; 47fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov private File mTestDatabase; 48fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov private SQLiteDatabaseConfiguration mTestConf; 49fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 50fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 51fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov @Before 52fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov public void setup() { 53fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov mContext = InstrumentationRegistry.getContext(); 54fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov SQLiteDatabase db = SQLiteDatabase 55fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov .openOrCreateDatabase(mContext.getDatabasePath("pool_test"), null); 56fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov mTestDatabase = new File(db.getPath()); 57fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov Log.i(TAG, "setup: created " + mTestDatabase); 58fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov db.close(); 59fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov mTestConf = new SQLiteDatabaseConfiguration(mTestDatabase.getPath(), 0); 60fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov } 61fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 62fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov @After 63fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov public void teardown() { 64fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov if (mTestDatabase != null) { 65fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov Log.i(TAG, "teardown: deleting " + mTestDatabase); 66fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov SQLiteDatabase.deleteDatabase(mTestDatabase); 67fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov } 68fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov } 69fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov 70fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov @Test 71fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov public void testCloseIdleConnections() throws InterruptedException { 72fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov HandlerThread thread = new HandlerThread("test-close-idle-connections-thread"); 73fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov Log.i(TAG, "Starting " + thread.getName()); 74fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov thread.start(); 75fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov SQLiteConnectionPool pool = SQLiteConnectionPool.open(mTestConf); 76fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov pool.setupIdleConnectionHandler(thread.getLooper(), 100); 77fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov SQLiteConnection c1 = pool.acquireConnection("pragma user_version", 0, null); 78fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov assertEquals("First connection should be returned", 0, c1.getConnectionId()); 79fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov pool.releaseConnection(c1); 80fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov SQLiteConnection c2 = pool.acquireConnection("pragma user_version", 0, null); 81fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov assertTrue("Returned connection should be the same", c1 == c2); 82fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov pool.releaseConnection(c2); 83fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov Thread.sleep(200); 84fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov SQLiteConnection c3 = pool.acquireConnection("pragma user_version", 0, null); 85fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov assertTrue("New connection should be returned", c1 != c3); 86fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov assertEquals("New connection should be returned", 1, c3.getConnectionId()); 87fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov pool.releaseConnection(c3); 88fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov pool.close(); 89fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov thread.quit(); 90fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov } 91fd9c4a54cf91ce88a200614149efee10dc9a7595Fyodor Kupolov} 92