package com.xtremelabs.robolectric.shadows; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import com.xtremelabs.robolectric.WithTestDefaultsRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertThat; @RunWith(WithTestDefaultsRunner.class) public class SQLiteOpenHelperTest { private TestOpenHelper helper; @Before public void setUp() throws Exception { helper = new TestOpenHelper(null, "path", null, 1); } @Test public void testInitialGetReadableDatabase() throws Exception { SQLiteDatabase database = helper.getReadableDatabase(); assertInitialDB(database); } @Test public void testSubsequentGetReadableDatabase() throws Exception { SQLiteDatabase database = helper.getReadableDatabase(); helper.reset(); database = helper.getReadableDatabase(); assertSubsequentDB(database); } @Test public void testSameDBInstanceSubsequentGetReadableDatabase() throws Exception { SQLiteDatabase db1 = helper.getReadableDatabase(); SQLiteDatabase db2 = helper.getReadableDatabase(); assertThat(db1, sameInstance(db2)); } @Test public void testInitialGetWritableDatabase() throws Exception { SQLiteDatabase database = helper.getWritableDatabase(); assertInitialDB(database); } @Test public void testSubsequentGetWritableDatabase() throws Exception { helper.getWritableDatabase(); helper.reset(); assertSubsequentDB(helper.getWritableDatabase()); } @Test public void testSameDBInstanceSubsequentGetWritableDatabase() throws Exception { SQLiteDatabase db1 = helper.getWritableDatabase(); SQLiteDatabase db2 = helper.getWritableDatabase(); assertThat(db1, sameInstance(db2)); } @Test public void testClose() throws Exception { SQLiteDatabase database = helper.getWritableDatabase(); assertThat(database.isOpen(), equalTo(true)); helper.close(); assertThat(database.isOpen(), equalTo(false)); } private void assertInitialDB(SQLiteDatabase database) { assertDatabaseOpened(database); assertThat(helper.onCreateCalled, equalTo(true)); } private void assertSubsequentDB(SQLiteDatabase database) { assertDatabaseOpened(database); assertThat(helper.onCreateCalled, equalTo(false)); } private void assertDatabaseOpened(SQLiteDatabase database) { assertThat(database, notNullValue()); assertThat(database.isOpen(), equalTo(true)); assertThat(helper.onOpenCalled, equalTo(true)); assertThat(helper.onUpgradeCalled, equalTo(false)); } private class TestOpenHelper extends SQLiteOpenHelper { public boolean onCreateCalled; public boolean onUpgradeCalled; public boolean onOpenCalled; public TestOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); reset(); } @Override public void onCreate(SQLiteDatabase database) { onCreateCalled = true; } @Override public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { onUpgradeCalled = true; } @Override public void onOpen(SQLiteDatabase database) { onOpenCalled = true; } public void reset() { onCreateCalled = false; onUpgradeCalled = false; onOpenCalled = false; } } }