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