}
@Test
public void shouldJoinMultipleReadNodeRequest() {
// Create the original read node request ...
final ReadNodeRequest original = new ReadNodeRequest(location("/a/b/c"), "workspaceM");
// Create a single federated request using the mirror projection...
final FederatedRequest request = new FederatedRequest(original);
// And "fork" the original request into the first source request ...
final ReadNodeRequest projected1 = new ReadNodeRequest(location("/b/c"), "workspaceM");
projected1.setActualLocationOfNode(Location.create(projected1.at().getPath(), UUID.randomUUID()));
projected1.addProperty(property("propA", "valueA"));
projected1.addProperty(property("propB", "valueB"));
projected1.addChild(child(projected1.getActualLocationOfNode(), "child1"));
projected1.addChild(child(projected1.getActualLocationOfNode(), "child2"));
request.add(projected1, false, false, projectionA);
// And a second source request ...
final ReadNodeRequest projected2 = new ReadNodeRequest(location("/a/b/c"), "workspaceM");
projected2.setActualLocationOfNode(Location.create(projected2.at().getPath(), UUID.randomUUID()));
projected2.addProperty(property("propC", "valueC"));
projected2.addProperty(property("propD", "valueD"));
projected2.addChild(child(projected2.getActualLocationOfNode(), "child2"));
projected2.addChild(child(projected2.getActualLocationOfNode(), "child3"));
request.add(projected2, true, false, mirrorProjection);
request.freeze();
request.getLatch().countDown();
request.getLatch().countDown();
joinQueue.add(request);
// Add a terminating request and join the request...
joinQueue.add(new NoMoreFederatedRequests());
joinProcessor.process(joinQueue);
// Check the results of the original has the same results of the projected...
assertThat(original.getProperties().containsAll(projected1.getProperties()), is(true));
assertThat(original.getProperties().containsAll(projected2.getProperties()), is(true));
assertThat(original.getActualLocationOfNode().getPath(), is(path("/a/b/c")));
assertThat(original.getActualLocationOfNode().getUuid(), is(projected1.getActualLocationOfNode().getUuid()));
assertThat(original.getActualLocationOfNode().getIdProperty(DnaLexicon.UUID).isMultiple(), is(true));
assertThat(original.getActualLocationOfNode().getIdProperty(DnaLexicon.UUID).getValuesAsArray()[0],
is((Object)projected1.getActualLocationOfNode().getUuid()));
assertThat(original.getActualLocationOfNode().getIdProperty(DnaLexicon.UUID).getValuesAsArray()[1],
is((Object)projected2.getActualLocationOfNode().getUuid()));
assertThat(original.getChildren().get(0).getPath(), is(path("/a/b/c/child1")));
assertThat(original.getChildren().get(1).getPath(), is(path("/a/b/c/child2")));
assertThat(original.getChildren().get(2).getPath(), is(path("/a/b/c/child2[2]")));
assertThat(original.getChildren().get(3).getPath(), is(path("/a/b/c/child3")));
}