Skip to content

Commit 2e9fac5

Browse files
Test observer running write transaction in callback.
1 parent f1e9c44 commit 2e9fac5

File tree

1 file changed

+55
-10
lines changed

1 file changed

+55
-10
lines changed

tests/objectbox-java-test/src/test/java/io/objectbox/ObjectClassObserverTest.java

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,24 @@
1616

1717
package io.objectbox;
1818

19+
import io.objectbox.query.QueryObserverTest;
20+
import io.objectbox.reactive.DataObserver;
21+
import io.objectbox.reactive.DataSubscription;
22+
import io.objectbox.reactive.DataTransformer;
23+
import io.objectbox.reactive.RunWithParam;
24+
import io.objectbox.reactive.Scheduler;
25+
import io.objectbox.reactive.SubscriptionBuilder;
1926
import org.junit.Before;
2027
import org.junit.Test;
2128

2229
import java.util.ArrayList;
2330
import java.util.List;
2431
import java.util.concurrent.CopyOnWriteArrayList;
2532
import java.util.concurrent.CountDownLatch;
33+
import java.util.concurrent.TimeUnit;
2634
import java.util.concurrent.atomic.AtomicBoolean;
2735
import java.util.concurrent.atomic.AtomicInteger;
2836

29-
import io.objectbox.query.QueryObserverTest;
30-
import io.objectbox.reactive.DataObserver;
31-
import io.objectbox.reactive.DataSubscription;
32-
import io.objectbox.reactive.DataTransformer;
33-
import io.objectbox.reactive.ErrorObserver;
34-
import io.objectbox.reactive.RunWithParam;
35-
import io.objectbox.reactive.Scheduler;
36-
import io.objectbox.reactive.SubscriptionBuilder;
37-
38-
3937
import static org.junit.Assert.assertEquals;
4038
import static org.junit.Assert.assertNotSame;
4139
import static org.junit.Assert.assertTrue;
@@ -155,6 +153,53 @@ public void testTwoObjectClassesChanged_oneClassObserver(boolean weak) throws In
155153
assertNoStaleObservers();
156154
}
157155

156+
@Test
157+
public void observer_transactionInCallback_completesAndTriggersObserver() throws InterruptedException {
158+
RecursiveTestObserver testObserver = new RecursiveTestObserver(store);
159+
DataSubscription subscription = store.subscribe(TestEntityMinimal.class)
160+
.onlyChanges() // Do not publish on subscribing.
161+
.observer(testObserver);
162+
163+
// Put data to so observer is called.
164+
Box<TestEntityMinimal> box = store.boxFor(TestEntityMinimal.class);
165+
box.put(new TestEntityMinimal(0, "Written by test"));
166+
167+
// Observer is called, puts data, is called again, puts data again.
168+
assertTrue(testObserver.latch.await(100, TimeUnit.MILLISECONDS));
169+
170+
assertEquals(3, box.count());
171+
assertEquals("Written by test", box.get(1).getText());
172+
assertEquals("Written by observer 1", box.get(2).getText());
173+
assertEquals("Written by observer 2", box.get(3).getText());
174+
175+
// Clean up.
176+
subscription.cancel();
177+
}
178+
179+
private static class RecursiveTestObserver implements DataObserver<Class<TestEntityMinimal>> {
180+
181+
private final BoxStore store;
182+
private int count = 0;
183+
CountDownLatch latch = new CountDownLatch(2);
184+
185+
RecursiveTestObserver(BoxStore store) {
186+
this.store = store;
187+
}
188+
189+
@Override
190+
public void onData(Class<TestEntityMinimal> data) {
191+
if (latch.getCount() == 0) {
192+
System.out.println("RecursiveTestObserver: DONE");
193+
return;
194+
}
195+
count++;
196+
System.out.println("RecursiveTestObserver: writing " + count);
197+
store.runInTx(() -> store.boxFor(TestEntityMinimal.class)
198+
.put(new TestEntityMinimal(0, "Written by observer " + count)));
199+
latch.countDown();
200+
}
201+
}
202+
158203
@Test
159204
public void testTransform() throws InterruptedException {
160205
testTransform(null);

0 commit comments

Comments
 (0)