1fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar/*
2fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * Copyright (C) 2017 The Android Open Source Project
3fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar *
4fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * you may not use this file except in compliance with the License.
6fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * You may obtain a copy of the License at
7fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar *
8fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar *
10fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * See the License for the specific language governing permissions and
14fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar * limitations under the License.
15fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar */
16fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
17bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.room.integration.testapp.test;
18fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
19fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarimport static org.hamcrest.CoreMatchers.instanceOf;
20fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarimport static org.hamcrest.CoreMatchers.is;
21fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarimport static org.hamcrest.MatcherAssert.assertThat;
227ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Arakiimport static org.junit.Assert.fail;
23fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
247ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Arakiimport android.support.test.InstrumentationRegistry;
257ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Arakiimport android.support.test.filters.SmallTest;
267ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Arakiimport android.support.test.runner.AndroidJUnit4;
277ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Arakiimport android.util.Log;
28fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
29bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Room;
30bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.integration.testapp.TestDatabase;
31bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.integration.testapp.vo.User;
32bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.sqlite.db.SupportSQLiteDatabase;
33bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverette
34fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarimport org.junit.After;
35fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarimport org.junit.Before;
36fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarimport org.junit.Test;
37fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarimport org.junit.runner.RunWith;
38fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
39fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarimport java.io.File;
40fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
41fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar@RunWith(AndroidJUnit4.class)
42fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar@SmallTest
43fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyarpublic class IdentityDetectionTest {
44fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    static final String TAG = "IdentityDetectionTest";
45fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    static final String DB_FILE_NAME = "identity_test_db";
46fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    TestDatabase mTestDatabase;
47fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    @Before
48fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    public void createTestDatabase() {
49fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        deleteDbFile();
50fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    }
51fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
52fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    @Test
53fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    public void reOpenWithoutIssues() {
54fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        openDb();
55fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        mTestDatabase.getUserDao().insert(TestUtil.createUser(3));
56fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        closeDb();
57fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        openDb();
58fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        User[] users = mTestDatabase.getUserDao().loadByIds(3);
59fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        assertThat(users.length, is(1));
60fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    }
61fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
62fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    @Test
63fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    public void reOpenChangedHash() {
64fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        openDb();
65fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        mTestDatabase.getUserDao().insert(TestUtil.createUser(3));
66fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        // change the hash
67fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        SupportSQLiteDatabase db = mTestDatabase.getOpenHelper().getWritableDatabase();
68fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        db.execSQL("UPDATE " + Room.MASTER_TABLE_NAME + " SET `identity_hash` = ?"
69fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar                + " WHERE id = 42", new String[]{"bad hash"});
70fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        closeDb();
71fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        Throwable[] exceptions = new Throwable[1];
72fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        try {
73fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar            openDb();
74fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar            mTestDatabase.getUserDao().loadByIds(3);
75fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        } catch (Throwable t) {
76fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar            exceptions[0] = t;
77fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar            mTestDatabase = null;
78fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        }
79fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        assertThat(exceptions[0], instanceOf(IllegalStateException.class));
80fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    }
81fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
827ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki    @Test
837ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki    public void reOpenMasterTableDropped() {
847ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        openDb();
857ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        mTestDatabase.getUserDao().insert(TestUtil.createUser(3));
867ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        // drop the master table
877ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        SupportSQLiteDatabase db = mTestDatabase.getOpenHelper().getWritableDatabase();
887ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        db.execSQL("DROP TABLE " + Room.MASTER_TABLE_NAME);
897ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        closeDb();
907ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        try {
917ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki            openDb();
927ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki            mTestDatabase.getUserDao().loadByIds(3);
937ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki            fail("Was expecting an exception.");
947ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        } catch (Throwable t) {
957ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki            assertThat(t, instanceOf(IllegalStateException.class));
967ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        }
977ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki    }
987ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki
99fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    private void closeDb() {
1007ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        mTestDatabase.close();
101fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    }
102fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
103fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    private void openDb() {
104fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        mTestDatabase = Room.databaseBuilder(InstrumentationRegistry.getTargetContext(),
105fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar                TestDatabase.class, DB_FILE_NAME).build();
106fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    }
107fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
108fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    @After
109fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    public void clear() {
110fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        try {
111fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar            if (mTestDatabase != null) {
112fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar                closeDb();
113fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar            }
114fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar            deleteDbFile();
1157ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki        } catch (Throwable t) {
1167ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki            Log.e(TAG, "could not close test database", t);
1177ce96deb4511a8106d475e7cf8dfa13d2b05a3b6Yuichi Araki            throw t;
118fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        }
119fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    }
120fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar
121fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    private void deleteDbFile() {
122fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        File testDb = InstrumentationRegistry.getTargetContext().getDatabasePath(DB_FILE_NAME);
123fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar        testDb.delete();
124fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar    }
125fa3905934508aa143d899cb9b62b3b074748c9e9Yigit Boyar}
126