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