blob: dbf8c665f305e9445dace7da856cb9619a426834 [file] [log] [blame]
Madan Jampani79924fa2016-09-13 13:57:03 -07001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.store.primitives.resources.impl;
18
19import static org.junit.Assert.assertArrayEquals;
20import static org.junit.Assert.assertEquals;
21import static org.junit.Assert.assertFalse;
Madan Jampani79924fa2016-09-13 13:57:03 -070022import static org.junit.Assert.assertNull;
23import static org.junit.Assert.assertTrue;
24import static org.junit.Assert.fail;
Madan Jampani98094222016-09-15 21:12:46 -070025import io.atomix.AtomixClient;
Madan Jampani79924fa2016-09-13 13:57:03 -070026import io.atomix.resource.ResourceType;
27
28import java.util.Map;
29import java.util.UUID;
30import java.util.concurrent.ArrayBlockingQueue;
31import java.util.concurrent.BlockingQueue;
32
33import org.junit.AfterClass;
34import org.junit.BeforeClass;
Madan Jampani79924fa2016-09-13 13:57:03 -070035import org.junit.Test;
36import org.onosproject.store.service.DocumentPath;
37import org.onosproject.store.service.DocumentTreeEvent;
38import org.onosproject.store.service.DocumentTreeListener;
39import org.onosproject.store.service.IllegalDocumentModificationException;
40import org.onosproject.store.service.NoSuchDocumentPathException;
41import org.onosproject.store.service.Versioned;
42
43import com.google.common.base.Throwables;
44
45/**
46 * Unit tests for {@link AtomixDocumentTree}.
47 */
48public class AtomixDocumentTreeTest extends AtomixTestBase {
49 @BeforeClass
50 public static void preTestSetup() throws Throwable {
51 createCopycatServers(3);
52 }
53
54 @AfterClass
55 public static void postTestCleanup() throws Exception {
56 clearTests();
57 }
58 @Override
59 protected ResourceType resourceType() {
60 return new ResourceType(AtomixDocumentTree.class);
61 }
62 /**
63 * Tests queries (get and getChildren).
64 */
65 @Test
66 public void testQueries() throws Throwable {
67 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
68 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -070069 Versioned<byte[]> root = tree.get(path("root")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -070070 assertEquals(1, root.version());
71 assertNull(root.value());
72 }
73
74 /**
75 * Tests create.
76 */
77 @Test
78 public void testCreate() throws Throwable {
79 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
80 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -070081 tree.create(path("root.a"), "a".getBytes()).join();
82 tree.create(path("root.a.b"), "ab".getBytes()).join();
83 tree.create(path("root.a.c"), "ac".getBytes()).join();
84 Versioned<byte[]> a = tree.get(path("root.a")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -070085 assertArrayEquals("a".getBytes(), a.value());
86
Thomas Vachuskae2bd1152017-03-23 13:42:32 -070087 Versioned<byte[]> ab = tree.get(path("root.a.b")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -070088 assertArrayEquals("ab".getBytes(), ab.value());
89
Thomas Vachuskae2bd1152017-03-23 13:42:32 -070090 Versioned<byte[]> ac = tree.get(path("root.a.c")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -070091 assertArrayEquals("ac".getBytes(), ac.value());
Madan Jampani4c8e3fe2016-09-16 16:20:28 -070092
Thomas Vachuskae2bd1152017-03-23 13:42:32 -070093 tree.create(path("root.x"), null).join();
94 Versioned<byte[]> x = tree.get(path("root.x")).join();
Madan Jampani4c8e3fe2016-09-16 16:20:28 -070095 assertNull(x.value());
Madan Jampani79924fa2016-09-13 13:57:03 -070096 }
97
98 /**
Madan Jampani86983282016-09-15 14:55:48 -070099 * Tests recursive create.
100 */
101 @Test
102 public void testRecursiveCreate() throws Throwable {
103 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
104 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700105 tree.createRecursive(path("root.a.b.c"), "abc".getBytes()).join();
106 Versioned<byte[]> a = tree.get(path("root.a")).join();
Madan Jampani4c8e3fe2016-09-16 16:20:28 -0700107 assertArrayEquals(null, a.value());
Madan Jampani86983282016-09-15 14:55:48 -0700108
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700109 Versioned<byte[]> ab = tree.get(path("root.a.b")).join();
Madan Jampani4c8e3fe2016-09-16 16:20:28 -0700110 assertArrayEquals(null, ab.value());
Madan Jampani86983282016-09-15 14:55:48 -0700111
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700112 Versioned<byte[]> abc = tree.get(path("root.a.b.c")).join();
Madan Jampani86983282016-09-15 14:55:48 -0700113 assertArrayEquals("abc".getBytes(), abc.value());
114 }
115
116 /**
Madan Jampani79924fa2016-09-13 13:57:03 -0700117 * Tests set.
118 */
119 @Test
120 public void testSet() throws Throwable {
121 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
122 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700123 tree.create(path("root.a"), "a".getBytes()).join();
124 tree.create(path("root.a.b"), "ab".getBytes()).join();
125 tree.create(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700126
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700127 tree.set(path("root.a.d"), "ad".getBytes()).join();
128 Versioned<byte[]> ad = tree.get(path("root.a.d")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700129 assertArrayEquals("ad".getBytes(), ad.value());
130
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700131 tree.set(path("root.a"), "newA".getBytes()).join();
132 Versioned<byte[]> newA = tree.get(path("root.a")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700133 assertArrayEquals("newA".getBytes(), newA.value());
134
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700135 tree.set(path("root.a.b"), "newAB".getBytes()).join();
136 Versioned<byte[]> newAB = tree.get(path("root.a.b")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700137 assertArrayEquals("newAB".getBytes(), newAB.value());
Madan Jampani4c8e3fe2016-09-16 16:20:28 -0700138
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700139 tree.set(path("root.x"), null).join();
140 Versioned<byte[]> x = tree.get(path("root.x")).join();
Madan Jampani4c8e3fe2016-09-16 16:20:28 -0700141 assertNull(x.value());
Madan Jampani79924fa2016-09-13 13:57:03 -0700142 }
143
144 /**
145 * Tests replace if version matches.
146 */
147 @Test
148 public void testReplaceVersion() throws Throwable {
149 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
150 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700151 tree.create(path("root.a"), "a".getBytes()).join();
152 tree.create(path("root.a.b"), "ab".getBytes()).join();
153 tree.create(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700154
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700155 Versioned<byte[]> ab = tree.get(path("root.a.b")).join();
156 assertTrue(tree.replace(path("root.a.b"), "newAB".getBytes(), ab.version()).join());
157 Versioned<byte[]> newAB = tree.get(path("root.a.b")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700158 assertArrayEquals("newAB".getBytes(), newAB.value());
159
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700160 assertFalse(tree.replace(path("root.a.b"), "newestAB".getBytes(), ab.version()).join());
161 assertArrayEquals("newAB".getBytes(), tree.get(path("root.a.b")).join().value());
Madan Jampani79924fa2016-09-13 13:57:03 -0700162
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700163 assertFalse(tree.replace(path("root.a.d"), "foo".getBytes(), 1).join());
Madan Jampani79924fa2016-09-13 13:57:03 -0700164 }
165
166 /**
167 * Tests replace if value matches.
168 */
169 @Test
170 public void testReplaceValue() throws Throwable {
171 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
172 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700173 tree.create(path("root.a"), "a".getBytes()).join();
174 tree.create(path("root.a.b"), "ab".getBytes()).join();
175 tree.create(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700176
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700177 Versioned<byte[]> ab = tree.get(path("root.a.b")).join();
178 assertTrue(tree.replace(path("root.a.b"), "newAB".getBytes(), ab.value()).join());
179 Versioned<byte[]> newAB = tree.get(path("root.a.b")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700180 assertArrayEquals("newAB".getBytes(), newAB.value());
181
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700182 assertFalse(tree.replace(path("root.a.b"), "newestAB".getBytes(), ab.value()).join());
183 assertArrayEquals("newAB".getBytes(), tree.get(path("root.a.b")).join().value());
Madan Jampani79924fa2016-09-13 13:57:03 -0700184
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700185 assertFalse(tree.replace(path("root.a.d"), "bar".getBytes(), "foo".getBytes()).join());
Madan Jampani79924fa2016-09-13 13:57:03 -0700186 }
187
188 /**
189 * Tests remove.
190 */
191 @Test
192 public void testRemove() throws Throwable {
193 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
194 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700195 tree.create(path("root.a"), "a".getBytes()).join();
196 tree.create(path("root.a.b"), "ab".getBytes()).join();
197 tree.create(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700198
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700199 Versioned<byte[]> ab = tree.removeNode(path("root.a.b")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700200 assertArrayEquals("ab".getBytes(), ab.value());
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700201 assertNull(tree.get(path("root.a.b")).join());
Madan Jampani79924fa2016-09-13 13:57:03 -0700202
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700203 Versioned<byte[]> ac = tree.removeNode(path("root.a.c")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700204 assertArrayEquals("ac".getBytes(), ac.value());
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700205 assertNull(tree.get(path("root.a.c")).join());
Madan Jampani79924fa2016-09-13 13:57:03 -0700206
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700207 Versioned<byte[]> a = tree.removeNode(path("root.a")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700208 assertArrayEquals("a".getBytes(), a.value());
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700209 assertNull(tree.get(path("root.a")).join());
Madan Jampani4c8e3fe2016-09-16 16:20:28 -0700210
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700211 tree.create(path("root.x"), null).join();
212 Versioned<byte[]> x = tree.removeNode(path("root.x")).join();
Madan Jampani4c8e3fe2016-09-16 16:20:28 -0700213 assertNull(x.value());
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700214 assertNull(tree.get(path("root.a.x")).join());
Madan Jampani79924fa2016-09-13 13:57:03 -0700215 }
216
217 /**
218 * Tests invalid removes.
219 */
220 @Test
221 public void testRemoveFailures() throws Throwable {
222 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
223 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700224 tree.create(path("root.a"), "a".getBytes()).join();
225 tree.create(path("root.a.b"), "ab".getBytes()).join();
226 tree.create(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700227
228 try {
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700229 tree.removeNode(path("root")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700230 fail();
231 } catch (Exception e) {
232 assertTrue(Throwables.getRootCause(e) instanceof IllegalDocumentModificationException);
233 }
234
235 try {
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700236 tree.removeNode(path("root.a")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700237 fail();
238 } catch (Exception e) {
239 assertTrue(Throwables.getRootCause(e) instanceof IllegalDocumentModificationException);
240 }
241
242 try {
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700243 tree.removeNode(path("root.d")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700244 fail();
245 } catch (Exception e) {
246 assertTrue(Throwables.getRootCause(e) instanceof NoSuchDocumentPathException);
247 }
248 }
249
250 /**
251 * Tests invalid create.
252 */
253 @Test
254 public void testCreateFailures() throws Throwable {
255 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
256 AtomixDocumentTree.class).join();
257 try {
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700258 tree.create(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700259 fail();
260 } catch (Exception e) {
261 assertTrue(Throwables.getRootCause(e) instanceof IllegalDocumentModificationException);
262 }
263 }
264
265 /**
266 * Tests invalid set.
267 */
268 @Test
269 public void testSetFailures() throws Throwable {
270 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
271 AtomixDocumentTree.class).join();
272 try {
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700273 tree.set(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700274 fail();
275 } catch (Exception e) {
276 assertTrue(Throwables.getRootCause(e) instanceof IllegalDocumentModificationException);
277 }
278 }
279
280 /**
281 * Tests getChildren.
282 */
283 @Test
284 public void testGetChildren() throws Throwable {
285 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
286 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700287 tree.create(path("root.a"), "a".getBytes()).join();
288 tree.create(path("root.a.b"), "ab".getBytes()).join();
289 tree.create(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700290
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700291 Map<String, Versioned<byte[]>> rootChildren = tree.getChildren(path("root")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700292 assertEquals(1, rootChildren.size());
293 Versioned<byte[]> a = rootChildren.get("a");
294 assertArrayEquals("a".getBytes(), a.value());
295
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700296 Map<String, Versioned<byte[]>> children = tree.getChildren(path("root.a")).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700297 assertEquals(2, children.size());
298 Versioned<byte[]> ab = children.get("b");
299 assertArrayEquals("ab".getBytes(), ab.value());
300 Versioned<byte[]> ac = children.get("c");
301 assertArrayEquals("ac".getBytes(), ac.value());
302
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700303 assertEquals(0, tree.getChildren(path("root.a.b")).join().size());
304 assertEquals(0, tree.getChildren(path("root.a.c")).join().size());
Madan Jampani79924fa2016-09-13 13:57:03 -0700305 }
306
307 /**
308 * Tests destroy.
309 */
310 @Test
311 public void testClear() {
312 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
313 AtomixDocumentTree.class).join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700314 tree.create(path("root.a"), "a".getBytes()).join();
315 tree.create(path("root.a.b"), "ab".getBytes()).join();
316 tree.create(path("root.a.c"), "ac".getBytes()).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700317
318 tree.destroy().join();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700319 assertEquals(0, tree.getChildren(path("root")).join().size());
Madan Jampani79924fa2016-09-13 13:57:03 -0700320 }
321
322 /**
323 * Tests listeners.
324 */
325 @Test
Madan Jampani79924fa2016-09-13 13:57:03 -0700326 public void testNotifications() throws Exception {
327 AtomixDocumentTree tree = createAtomixClient().getResource(UUID.randomUUID().toString(),
328 AtomixDocumentTree.class).join();
329 TestEventListener listener = new TestEventListener();
330
331 // add listener; create a node in the tree and verify an CREATED event is received.
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700332 tree.addListener(listener).thenCompose(v -> tree.set(path("root.a"), "a".getBytes())).join();
Madan Jampani79924fa2016-09-13 13:57:03 -0700333 DocumentTreeEvent<byte[]> event = listener.event();
Madan Jampani79924fa2016-09-13 13:57:03 -0700334 assertEquals(DocumentTreeEvent.Type.CREATED, event.type());
Madan Jampanicdbf6772016-09-15 15:41:34 -0700335 assertFalse(event.oldValue().isPresent());
Madan Jampani79924fa2016-09-13 13:57:03 -0700336 assertArrayEquals("a".getBytes(), event.newValue().get().value());
Madan Jampanicdbf6772016-09-15 15:41:34 -0700337 // update a node in the tree and verify an UPDATED event is received.
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700338 tree.set(path("root.a"), "newA".getBytes()).join();
Madan Jampanicdbf6772016-09-15 15:41:34 -0700339 event = listener.event();
340 assertEquals(DocumentTreeEvent.Type.UPDATED, event.type());
341 assertArrayEquals("newA".getBytes(), event.newValue().get().value());
342 assertArrayEquals("a".getBytes(), event.oldValue().get().value());
343 // remove a node in the tree and verify an REMOVED event is received.
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700344 tree.removeNode(path("root.a")).join();
Madan Jampanicdbf6772016-09-15 15:41:34 -0700345 event = listener.event();
346 assertEquals(DocumentTreeEvent.Type.DELETED, event.type());
347 assertFalse(event.newValue().isPresent());
348 assertArrayEquals("newA".getBytes(), event.oldValue().get().value());
349 // recursively create a node and verify CREATED events for all intermediate nodes.
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700350 tree.createRecursive(path("root.x.y"), "xy".getBytes()).join();
Madan Jampanicdbf6772016-09-15 15:41:34 -0700351 event = listener.event();
352 assertEquals(DocumentTreeEvent.Type.CREATED, event.type());
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700353 assertEquals(path("root.x"), event.path());
Madan Jampanicdbf6772016-09-15 15:41:34 -0700354 event = listener.event();
355 assertEquals(DocumentTreeEvent.Type.CREATED, event.type());
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700356 assertEquals(path("root.x.y"), event.path());
Madan Jampanicdbf6772016-09-15 15:41:34 -0700357 assertArrayEquals("xy".getBytes(), event.newValue().get().value());
Madan Jampani79924fa2016-09-13 13:57:03 -0700358 }
359
Madan Jampani98094222016-09-15 21:12:46 -0700360 @Test
361 public void testFilteredNotifications() throws Throwable {
362 AtomixClient client1 = createAtomixClient();
363 AtomixClient client2 = createAtomixClient();
364
365 String treeName = UUID.randomUUID().toString();
366 AtomixDocumentTree tree1 = client1.getResource(treeName, AtomixDocumentTree.class).join();
367 AtomixDocumentTree tree2 = client2.getResource(treeName, AtomixDocumentTree.class).join();
368
369 TestEventListener listener1a = new TestEventListener(3);
370 TestEventListener listener1ab = new TestEventListener(2);
371 TestEventListener listener2abc = new TestEventListener(1);
372
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700373 tree1.addListener(path("root.a"), listener1a).join();
374 tree1.addListener(path("root.a.b"), listener1ab).join();
375 tree2.addListener(path("root.a.b.c"), listener2abc).join();
Madan Jampani98094222016-09-15 21:12:46 -0700376
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700377 tree1.createRecursive(path("root.a.b.c"), "abc".getBytes()).join();
Madan Jampani98094222016-09-15 21:12:46 -0700378 DocumentTreeEvent<byte[]> event = listener1a.event();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700379 assertEquals(path("root.a"), event.path());
Madan Jampani98094222016-09-15 21:12:46 -0700380 event = listener1a.event();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700381 assertEquals(path("root.a.b"), event.path());
Madan Jampani98094222016-09-15 21:12:46 -0700382 event = listener1a.event();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700383 assertEquals(path("root.a.b.c"), event.path());
Madan Jampani98094222016-09-15 21:12:46 -0700384 event = listener1ab.event();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700385 assertEquals(path("root.a.b"), event.path());
Madan Jampani98094222016-09-15 21:12:46 -0700386 event = listener1ab.event();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700387 assertEquals(path("root.a.b.c"), event.path());
Madan Jampani98094222016-09-15 21:12:46 -0700388 event = listener2abc.event();
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700389 assertEquals(path("root.a.b.c"), event.path());
Madan Jampani98094222016-09-15 21:12:46 -0700390 }
391
Madan Jampani79924fa2016-09-13 13:57:03 -0700392 private static class TestEventListener implements DocumentTreeListener<byte[]> {
393
Madan Jampani98094222016-09-15 21:12:46 -0700394 private final BlockingQueue<DocumentTreeEvent<byte[]>> queue;
395
396 public TestEventListener() {
397 this(1);
398 }
399
400 public TestEventListener(int maxEvents) {
401 queue = new ArrayBlockingQueue<>(maxEvents);
402 }
Madan Jampani79924fa2016-09-13 13:57:03 -0700403
404 @Override
405 public void event(DocumentTreeEvent<byte[]> event) {
Madan Jampani98094222016-09-15 21:12:46 -0700406
Madan Jampani79924fa2016-09-13 13:57:03 -0700407 try {
408 queue.put(event);
409 } catch (InterruptedException e) {
410 Throwables.propagate(e);
411 }
412 }
413
Madan Jampani79924fa2016-09-13 13:57:03 -0700414 public DocumentTreeEvent<byte[]> event() throws InterruptedException {
415 return queue.take();
416 }
417 }
Thomas Vachuskae2bd1152017-03-23 13:42:32 -0700418
419 private static DocumentPath path(String path) {
420 return DocumentPath.from(path.replace(".", DocumentPath.DEFAULT_SEPARATOR));
421 }
Madan Jampani79924fa2016-09-13 13:57:03 -0700422}