/* * Copyright 2016 Realm Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.realm.internal; import android.support.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import io.realm.RealmConfiguration; import io.realm.exceptions.RealmError; import io.realm.rule.TestRealmConfigurationFactory; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class SharedRealmTests { @Rule public final TestRealmConfigurationFactory configFactory = new TestRealmConfigurationFactory(); @Rule public final ExpectedException thrown = ExpectedException.none(); private RealmConfiguration config; private SharedRealm sharedRealm; @Before public void setUp() { config = configFactory.createConfiguration(); sharedRealm = SharedRealm.getInstance(config); } @After public void tearDown() { if (sharedRealm != null) { sharedRealm.close(); } } @Test public void getVersionID() { SharedRealm.VersionID versionID1 = sharedRealm.getVersionID(); sharedRealm.beginTransaction(); sharedRealm.commitTransaction(); SharedRealm.VersionID versionID2 = sharedRealm.getVersionID(); assertFalse(versionID1.equals(versionID2)); } @Test public void hasTable() { assertFalse(sharedRealm.hasTable("MyTable")); sharedRealm.beginTransaction(); sharedRealm.getTable("MyTable"); sharedRealm.commitTransaction(); assertTrue(sharedRealm.hasTable("MyTable")); } @Test(expected = IllegalStateException.class) public void getTable_createNotInTransactionThrows() { sharedRealm.getTable("NON-EXISTING"); } @Test public void getTable() { assertFalse(sharedRealm.hasTable("MyTable")); sharedRealm.beginTransaction(); sharedRealm.getTable("MyTable"); sharedRealm.commitTransaction(); assertTrue(sharedRealm.hasTable("MyTable")); // Table is existing, no need transaction to create it sharedRealm.getTable("MyTable"); } @Test public void isInTransaction() { assertFalse(sharedRealm.isInTransaction()); sharedRealm.beginTransaction(); assertTrue(sharedRealm.isInTransaction()); sharedRealm.cancelTransaction(); assertFalse(sharedRealm.isInTransaction()); } @Test public void isInTransaction_returnFalseWhenRealmClosed() { sharedRealm.close(); assertFalse(sharedRealm.isInTransaction()); sharedRealm = null; } @Test public void removeTable() { sharedRealm.beginTransaction(); sharedRealm.getTable("TableToRemove"); assertTrue(sharedRealm.hasTable("TableToRemove")); sharedRealm.removeTable("TableToRemove"); assertFalse(sharedRealm.hasTable("TableToRemove")); sharedRealm.commitTransaction(); } @Test public void removeTable_notInTransactionThrows() { sharedRealm.beginTransaction(); sharedRealm.getTable("TableToRemove"); sharedRealm.commitTransaction(); thrown.expect(IllegalStateException.class); sharedRealm.removeTable("TableToRemove"); } @Test public void removeTable_tableNotExist() { sharedRealm.beginTransaction(); assertFalse(sharedRealm.hasTable("TableToRemove")); thrown.expect(RealmError.class); sharedRealm.removeTable("TableToRemove"); sharedRealm.cancelTransaction(); } @Test public void renameTable() { sharedRealm.beginTransaction(); sharedRealm.getTable("OldTable"); assertTrue(sharedRealm.hasTable("OldTable")); sharedRealm.renameTable("OldTable", "NewTable"); assertFalse(sharedRealm.hasTable("OldTable")); assertTrue(sharedRealm.hasTable("NewTable")); sharedRealm.commitTransaction(); } @Test public void renameTable_notInTransactionThrows() { sharedRealm.beginTransaction(); sharedRealm.getTable("OldTable"); sharedRealm.commitTransaction(); thrown.expect(IllegalStateException.class); sharedRealm.renameTable("OldTable", "NewTable"); } @Test public void renameTable_tableNotExist() { sharedRealm.beginTransaction(); assertFalse(sharedRealm.hasTable("TableToRemove")); thrown.expect(RealmError.class); sharedRealm.renameTable("TableToRemove", "newName"); sharedRealm.cancelTransaction(); } @Test public void beginTransaction_SchemaVersionListener() { final AtomicBoolean listenerCalled = new AtomicBoolean(false); final AtomicLong schemaVersionFromListener = new AtomicLong(-1L); sharedRealm.close(); sharedRealm = SharedRealm.getInstance(config, new SharedRealm.SchemaVersionListener() { @Override public void onSchemaVersionChanged(long currentVersion) { listenerCalled.set(true); schemaVersionFromListener.set(currentVersion); } }, true); final long before = sharedRealm.getSchemaVersion(); sharedRealm.beginTransaction(); try { // Listener is not called if there was no schema change. assertFalse(listenerCalled.get()); // Changes the schema version. sharedRealm.setSchemaVersion(before + 1); } finally { sharedRealm.commitTransaction(); } // Listener is not yet called. assertFalse(listenerCalled.get()); sharedRealm.beginTransaction(); try { assertTrue(listenerCalled.get()); assertEquals(before + 1, schemaVersionFromListener.get()); } finally { sharedRealm.cancelTransaction(); } } @Test public void refresh_SchemaVersionListener() { final AtomicBoolean listenerCalled = new AtomicBoolean(false); final AtomicLong schemaVersionFromListener = new AtomicLong(-1L); sharedRealm.close(); sharedRealm = SharedRealm.getInstance(config, new SharedRealm.SchemaVersionListener() { @Override public void onSchemaVersionChanged(long currentVersion) { listenerCalled.set(true); schemaVersionFromListener.set(currentVersion); } }, true); final long before = sharedRealm.getSchemaVersion(); sharedRealm.refresh(); // Listener is not called if there was no schema change. assertFalse(listenerCalled.get()); sharedRealm.beginTransaction(); try { // Changes the schema version. sharedRealm.setSchemaVersion(before + 1); } finally { sharedRealm.commitTransaction(); } // Listener is not yet called. assertFalse(listenerCalled.get()); sharedRealm.refresh(); assertTrue(listenerCalled.get()); assertEquals(before + 1, schemaVersionFromListener.get()); } @Test public void isClosed() { sharedRealm.close(); assertTrue(sharedRealm.isClosed()); sharedRealm = null; } @Test public void close_twice() { sharedRealm.close(); sharedRealm.close(); assertTrue(sharedRealm.isClosed()); sharedRealm = null; } }