private void runTxAndWaitForObservers(int latchCount) { observerLatch = new CountDownLatch(latchCount); store.runInTx(txRunnable); assertLatchCountedDown(observerLatch, 5); }
public void testSingle(boolean weak, boolean wrapped) { SubscriptionBuilder<Class> subscriptionBuilder = store.subscribe().single(); if (weak) { subscriptionBuilder.weak(); } if (wrapped) { subscriptionBuilder.on(new TestScheduler()); } observerLatch = new CountDownLatch(2); subscriptionBuilder.observer(objectClassObserver); assertLatchCountedDown(observerLatch, 5); assertEquals(2, classesWithChanges.size()); assertTrue(classesWithChanges.contains(TestEntity.class)); assertTrue(classesWithChanges.contains(TestEntityMinimal.class)); classesWithChanges.clear(); store.runInTx(txRunnable); assertNoStaleObservers(); }
public void testObserverError(Scheduler scheduler) throws InterruptedException { final List<Throwable> errors = new CopyOnWriteArrayList<>(); final CountDownLatch latch = new CountDownLatch(2); final Thread testThread = Thread.currentThread(); DataSubscription subscription = store.subscribe().onlyChanges().onError(new ErrorObserver() { @Override public void onError(Throwable th) { assertNotSame(testThread, Thread.currentThread()); errors.add(th); latch.countDown(); } }).on(scheduler).observer(new DataObserver<Class>() { @Override public void onData(Class data) { throw new RuntimeException("Boo"); } }); store.runInTx(txRunnable); assertLatchCountedDown(latch, 5); assertEquals(2, errors.size()); assertEquals("Boo", errors.get(0).getMessage()); errors.clear(); subscription.cancel(); store.runInTx(txRunnable); Thread.sleep(20); assertEquals(0, errors.size()); }
public void testTwoObjectClassesChanged_oneClassObserver(boolean weak) throws InterruptedException { DataSubscription subscription = subscribe(weak, TestEntityMinimal.class); runTxAndWaitForObservers(1); assertEquals(1, classesWithChanges.size()); assertEquals(classesWithChanges.get(0), TestEntityMinimal.class); classesWithChanges.clear(); putTestEntities(1); assertEquals(0, classesWithChanges.size()); // Adding twice should not trigger notification twice DataSubscription subscription2 = subscribe(weak, TestEntityMinimal.class); Box<TestEntityMinimal> boxMini = store.boxFor(TestEntityMinimal.class); observerLatch = new CountDownLatch(1); boxMini.put(new TestEntityMinimal(), new TestEntityMinimal()); assertLatchCountedDown(observerLatch, 5); Thread.sleep(20); assertEquals(1, classesWithChanges.size()); classesWithChanges.clear(); subscription.cancel(); store.runInTx(txRunnable); assertNoStaleObservers(); }
assertLatchCountedDown(latch, 5); assertEquals(2, objectCounts.size()); assertTrue(objectCounts.contains(2L));
assertLatchCountedDown(latch, 5); assertEquals(2, errors.size()); assertEquals("Boo", errors.get(0).getMessage());