/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.zookeepermaster.group.internal;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.camel.component.zookeepermaster.group.NodeState;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryOneTime;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
public class ZooKeeperGroupTest {
private static final String PATH = "/singletons/test/" + ZooKeeperGroupTest.class.getSimpleName();
private CuratorFramework curator;
private ZooKeeperGroup<NodeState> group;
private int findFreePort() throws Exception {
ServerSocket ss = new ServerSocket(0);
int port = ss.getLocalPort();
ss.close();
return port;
}
@Before
public void setUp() throws Exception {
int port = findFreePort();
curator = CuratorFrameworkFactory.builder()
.connectString("localhost:" + port)
.retryPolicy(new RetryOneTime(1))
.build();
//curator.start();
group = new ZooKeeperGroup<>(curator, PATH, NodeState.class);
//group.start();
// Starting curator and group is not necessary for the current tests.
}
@After
public void tearDown() throws IOException {
group.close();
curator.close();
group = null;
curator = null;
}
private static void putChildData(ZooKeeperGroup<NodeState> group, String path, String container) throws Exception {
NodeState node = new NodeState("test", container);
ByteArrayOutputStream data = new ByteArrayOutputStream();
new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).writeValue(data, node);
ChildData<NodeState> child = new ChildData<>(path, new Stat(), data.toByteArray(), node);
group.putCurrentData(path, child);
}
@Test
public void testMembers() throws Exception {
putChildData(group, PATH + "/001", "container1");
putChildData(group, PATH + "/002", "container2");
putChildData(group, PATH + "/003", "container3");
Map<String, NodeState> members = group.members();
assertThat(members.size(), equalTo(3));
assertThat(members.get(PATH + "/001").getContainer(), equalTo("container1"));
assertThat(members.get(PATH + "/002").getContainer(), equalTo("container2"));
assertThat(members.get(PATH + "/003").getContainer(), equalTo("container3"));
}
@Test
public void testMembersWithStaleNodes() throws Exception {
putChildData(group, PATH + "/001", "container1"); // stale
putChildData(group, PATH + "/002", "container1");
putChildData(group, PATH + "/003", "container2"); // stale
putChildData(group, PATH + "/004", "container3"); // stale
putChildData(group, PATH + "/005", "container2");
putChildData(group, PATH + "/006", "container3");
Map<String, NodeState> members = group.members();
assertThat(members.size(), equalTo(3));
assertThat(members.get(PATH + "/002").getContainer(), equalTo("container1"));
assertThat(members.get(PATH + "/005").getContainer(), equalTo("container2"));
assertThat(members.get(PATH + "/006").getContainer(), equalTo("container3"));
}
@Test
public void testIsMaster() throws Exception {
putChildData(group, PATH + "/001", "container1");
putChildData(group, PATH + "/002", "container2");
putChildData(group, PATH + "/003", "container3");
group.setId(PATH + "/001");
assertThat(group.isMaster(), equalTo(true));
group.setId(PATH + "/002");
assertThat(group.isMaster(), equalTo(false));
}
@Test
public void testIsMasterWithStaleNodes1() throws Exception {
putChildData(group, PATH + "/001", "container1"); // stale
putChildData(group, PATH + "/002", "container1");
putChildData(group, PATH + "/003", "container2"); // stale
putChildData(group, PATH + "/004", "container3"); // stale
putChildData(group, PATH + "/005", "container2");
putChildData(group, PATH + "/006", "container3");
group.setId(PATH + "/002");
assertThat(group.isMaster(), equalTo(true));
group.setId(PATH + "/005");
assertThat(group.isMaster(), equalTo(false));
}
@Test
public void testIsMasterWithStaleNodes2() throws Exception {
putChildData(group, PATH + "/001", "container1"); // stale
putChildData(group, PATH + "/002", "container2");
putChildData(group, PATH + "/003", "container1");
putChildData(group, PATH + "/004", "container3"); // stale
putChildData(group, PATH + "/005", "container3");
group.setId(PATH + "/002");
assertThat(group.isMaster(), equalTo(true));
group.setId(PATH + "/003");
assertThat(group.isMaster(), equalTo(false));
}
@Test
public void testMaster() throws Exception {
putChildData(group, PATH + "/001", "container1");
putChildData(group, PATH + "/002", "container2");
putChildData(group, PATH + "/003", "container3");
NodeState master = group.master();
assertThat(master, notNullValue());
assertThat(master.getContainer(), equalTo("container1"));
}
@Test
public void testMasterWithStaleNodes1() throws Exception {
putChildData(group, PATH + "/001", "container1"); // stale
putChildData(group, PATH + "/002", "container1");
putChildData(group, PATH + "/003", "container2"); // stale
putChildData(group, PATH + "/004", "container3"); // stale
putChildData(group, PATH + "/005", "container2");
putChildData(group, PATH + "/006", "container3");
NodeState master = group.master();
assertThat(master, notNullValue());
assertThat(master.getContainer(), equalTo("container1"));
}
@Test
public void testMasterWithStaleNodes2() throws Exception {
putChildData(group, PATH + "/001", "container1"); // stale
putChildData(group, PATH + "/002", "container2");
putChildData(group, PATH + "/003", "container1");
putChildData(group, PATH + "/004", "container3"); // stale
putChildData(group, PATH + "/005", "container3");
NodeState master = group.master();
assertThat(master, notNullValue());
assertThat(master.getContainer(), equalTo("container2"));
}
@Test
public void testSlaves() throws Exception {
putChildData(group, PATH + "/001", "container1");
putChildData(group, PATH + "/002", "container2");
putChildData(group, PATH + "/003", "container3");
List<NodeState> slaves = group.slaves();
assertThat(slaves.size(), equalTo(2));
assertThat(slaves.get(0).getContainer(), equalTo("container2"));
assertThat(slaves.get(1).getContainer(), equalTo("container3"));
}
@Test
public void testSlavesWithStaleNodes1() throws Exception {
putChildData(group, PATH + "/001", "container1"); // stale
putChildData(group, PATH + "/002", "container1");
putChildData(group, PATH + "/003", "container2"); // stale
putChildData(group, PATH + "/004", "container3"); // stale
putChildData(group, PATH + "/005", "container2");
putChildData(group, PATH + "/006", "container3");
List<NodeState> slaves = group.slaves();
assertThat(slaves.size(), equalTo(2));
assertThat(slaves.get(0).getContainer(), equalTo("container2"));
assertThat(slaves.get(1).getContainer(), equalTo("container3"));
}
@Test
public void testSlavesWithStaleNodes2() throws Exception {
putChildData(group, PATH + "/001", "container1"); // stale
putChildData(group, PATH + "/002", "container2");
putChildData(group, PATH + "/003", "container1");
putChildData(group, PATH + "/004", "container3"); // stale
putChildData(group, PATH + "/005", "container3");
List<NodeState> slaves = group.slaves();
assertThat(slaves.size(), equalTo(2));
assertThat(slaves.get(0).getContainer(), equalTo("container1"));
assertThat(slaves.get(1).getContainer(), equalTo("container3"));
}
}