/*
* Galaxy
* Copyright (C) 2012 Parallel Universe Software Co.
*
* This file is part of Galaxy.
*
* Galaxy is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* Galaxy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Galaxy. If not, see <http://www.gnu.org/licenses/>.
*/
package co.paralleluniverse.galaxy.core;
import co.paralleluniverse.galaxy.cluster.DistributedBranchHelper;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSet;
import com.google.common.primitives.Ints;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import co.paralleluniverse.galaxy.test.MockitoUtil;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
import org.hamcrest.Matcher;
import co.paralleluniverse.galaxy.cluster.DistributedTree.Listener;
import static co.paralleluniverse.galaxy.test.CollectionMatchers.*;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;
import static org.mockito.Matchers.*;
import static co.paralleluniverse.galaxy.test.MockitoUtil.*;
import java.util.Set;
import org.mockito.InOrder;
/**
*
* @author pron
*/
public class DistributedBranchHelperTest {
static final String ROOT = "/r";
MyLocalTree mdt;
DistributedBranchHelper branch;
Listener listener;
@Before
public void setUp() {
reset();
}
private void reset() {
mdt = new MyLocalTree();
listener = mock(Listener.class);
branch = null;
}
private void createBranch(boolean ordered) {
final Set<String> requiredProperties = ImmutableSet.of("a", "b");
branch = new DistributedBranchHelper(mdt.tree, ROOT, ordered) {
@Override
protected boolean isNodeComplete(String node, Set<String> properties) {
return properties.containsAll(requiredProperties);
}
};
branch.addListener(listener); // listener
branch.init();
}
//////////////////////////////////////////////////////////////////////////////
@Test
public void test1() {
createBranch(true);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "a");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "a", "a1");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
InOrder inOrder = inOrder(listener);
inOrder.verify(listener).nodeChildAdded(ROOT, "child1");
inOrder.verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child1", "child2")));
}
@Test
public void test2() {
for (boolean ordered : new boolean[]{false, true}) {
createBranch(ordered);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "a");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), (Matcher) empty());
reset();
}
}
@Test
public void test3() {
createBranch(true);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "a");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), (Matcher) empty());
}
@Test
public void test3_1() {
createBranch(false);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "a");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), (Matcher) empty());
}
@Test
public void test4() {
for (boolean ordered : new boolean[]{false, true}) {
createBranch(ordered);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "a");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "a", "a1");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child1")));
reset();
}
}
@Test
public void test5() {
createBranch(true);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "a");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), (Matcher) empty());
mdt.set(ROOT, "child1", "a", "a1");
InOrder inOrder = inOrder(listener);
inOrder.verify(listener).nodeChildAdded(ROOT, "child1");
inOrder.verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child1", "child2")));
}
@Test
public void test5_1() {
createBranch(false);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "a");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener).nodeChildAdded(ROOT, "child2");
mdt.set(ROOT, "child1", "a", "a1");
InOrder inOrder = inOrder(listener);
inOrder.verify(listener).nodeChildAdded(ROOT, "child2");
inOrder.verify(listener).nodeChildAdded(ROOT, "child1");
}
@Test
public void test6() {
for (boolean ordered : new boolean[]{false, true}) {
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "a");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "a", "a1");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
createBranch(ordered);
InOrder inOrder = inOrder(listener);
inOrder.verify(listener).nodeChildAdded(ROOT, "child1");
inOrder.verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child1", "child2")));
reset();
}
}
@Test
public void test7() {
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
assertThat(mdt.tree.getChildren(ROOT), equalTo(Arrays.asList("child1")));
createBranch(true);
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), (Matcher) empty());
mdt.add(ROOT, "child1", "a");
mdt.set(ROOT, "child1", "a", "a1");
InOrder inOrder = inOrder(listener);
inOrder.verify(listener).nodeChildAdded(ROOT, "child1");
inOrder.verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child1", "child2")));
}
@Test
public void test8() {
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
assertThat(mdt.tree.getChildren(ROOT), equalTo(Arrays.asList("child1")));
createBranch(true);
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), (Matcher) empty());
mdt.remove(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child2")));
}
@Test
public void test9() {
createBranch(true);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), (Matcher) empty());
mdt.remove(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child2")));
}
@Test
public void test10() {
createBranch(true);
mdt.add(ROOT, "child0");
mdt.add(ROOT, "child0", "a");
mdt.add(ROOT, "child0", "b");
mdt.set(ROOT, "child0", "a", "a0");
mdt.set(ROOT, "child0", "b", "b0");
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener).nodeChildAdded(ROOT, "child0");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child0")));
mdt.remove(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child0", "child2")));
}
@Test
public void test11() {
mdt.add(ROOT, "child0");
mdt.add(ROOT, "child0", "a");
mdt.add(ROOT, "child0", "b");
mdt.set(ROOT, "child0", "a", "a0");
mdt.set(ROOT, "child0", "b", "b0");
createBranch(true);
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
verify(listener).nodeChildAdded(ROOT, "child0");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child0")));
mdt.remove(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child0", "child2")));
}
@Test
public void test12() {
mdt.add(ROOT, "child0");
mdt.add(ROOT, "child0", "a");
mdt.add(ROOT, "child0", "b");
mdt.set(ROOT, "child0", "a", "a0");
mdt.set(ROOT, "child0", "b", "b0");
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
mdt.add(ROOT, "child2");
mdt.add(ROOT, "child2", "a");
mdt.add(ROOT, "child2", "b");
mdt.set(ROOT, "child2", "a", "a2");
mdt.set(ROOT, "child2", "b", "b2");
createBranch(true);
verify(listener).nodeChildAdded(ROOT, "child0");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child0")));
mdt.remove(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
verify(listener).nodeChildAdded(ROOT, "child2");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child0", "child2")));
}
@Test
public void test13() {
mdt.add(ROOT, "child0");
mdt.add(ROOT, "child0", "a");
mdt.add(ROOT, "child0", "b");
mdt.set(ROOT, "child0", "a", "a0");
mdt.set(ROOT, "child0", "b", "b0");
mdt.add(ROOT, "child1");
mdt.add(ROOT, "child1", "b");
mdt.set(ROOT, "child1", "b", "b1");
createBranch(true);
verify(listener).nodeChildAdded(ROOT, "child0");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child0")));
mdt.remove(ROOT, "child1");
verify(listener, never()).nodeChildAdded(ROOT, "child1");
assertThat(branch.getChildren(), equalTo(Arrays.asList("child0")));
}
///////////////////////////////////////////////////////////////////////////////////////////
static Listener PRINTER = new Listener() {
@Override
public void nodeAdded(String node) {
System.out.println("nodeAdded(" + node + ")");
}
@Override
public void nodeDeleted(String node) {
System.out.println("nodeRemoved(" + node + ")");
}
@Override
public void nodeUpdated(String node) {
System.out.println("nodeUpdated(" + node + ")");
}
@Override
public void nodeChildAdded(String node, String child) {
System.out.println("nodeChildAdded(" + node + ", " + child + ")");
}
@Override
public void nodeChildDeleted(String node, String child) {
System.out.println("nodeChildRemoved(" + node + ", " + child + ")");
}
@Override
public void nodeChildUpdated(String node, String child) {
System.out.println("nodeChildUpdated(" + node + ", " + child + ")");
}
};
private static class MyLocalTree {
private static final String SEP = "/";
private final LocalTree tree;
public MyLocalTree() {
this.tree = new LocalTree();
}
private void remove(String ROOT, String child1) {
tree.delete(ROOT+SEP+child1);
}
private void add(String ROOT, String child1) {
tree.create(ROOT+SEP+child1, false);
}
private void add(String ROOT, String child2, String a) {
tree.create(ROOT+SEP+child2+SEP+a, false);
}
private void set(String ROOT, String child0, String a, String a0) {
tree.set(ROOT+SEP+child0+SEP+a,a0.getBytes());
}
}
}