/**
* RealElectionTest.java
*
* Copyright 2016 the original author or authors.
*
* We 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.niolex.election;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import org.apache.niolex.commons.concurrent.ThreadUtil;
import org.apache.niolex.notify.AppTest;
import org.apache.niolex.zookeeper.core.ZKConnectorExceTest;
import org.junit.Test;
/**
* @author <a href="mailto:xiejiyun@foxmail.com">Xie, Jiyun</a>
* @version 2.1.2
* @since Jul 12, 2016
*/
public class RealElectionTest {
private static String BS = "/election/zkc/real-elect";
public static class LeaderLinstener implements Elector.Listener {
private String leaderAddr;
private boolean isLeader;
/**
* This is the override of super method.
* @see org.apache.niolex.election.Elector.Listener#leaderChange(java.lang.String)
*/
@Override
public void leaderChange(String address) {
leaderAddr = address;
isLeader = false;
System.out.println(" [x] => new leader: " + address);
}
/**
* This is the override of super method.
* @see org.apache.niolex.election.Elector.Listener#runAsLeader()
*/
@Override
public void runAsLeader() {
leaderAddr = null;
isLeader = true;
}
public String getLeaderAddr() {
return leaderAddr;
}
public boolean isLeader() {
return isLeader;
}
}
static {
AppTest.cleanZK(BS);
}
@Test
public void testElector() throws Exception {
Elector.Listener li = mock(Elector.Listener.class);
LeaderLinstener ll = new LeaderLinstener();
Elector el1 = new Elector(AppTest.URL, 10000, BS + "/", li);
Elector el2 = new Elector(AppTest.URL, 10000, BS, li);
Elector el3 = new Elector(AppTest.URL, 10000, BS + "/", li);
Elector el4 = new Elector(AppTest.URL, 10000, BS, ll);
el1.register("local1");
el2.register("local2");
el3.register("local3");
el4.register("local4");
assertEquals("local1", ll.leaderAddr);
assertFalse(ll.isLeader);
el1.close();
ThreadUtil.sleepAtLeast(100);
assertEquals("local2", ll.leaderAddr);
assertFalse(ll.isLeader);
el2.close();
ThreadUtil.sleepAtLeast(100);
assertEquals("local3", ll.leaderAddr);
assertFalse(ll.isLeader);
el3.close();
ThreadUtil.sleepAtLeast(100);
assertNull(ll.leaderAddr);
assertTrue(ll.isLeader);
System.out.println("============Start reconnect.================");
ZKConnectorExceTest.reconn(el2);
ZKConnectorExceTest.reconn(el3);
el4.close();
ZKConnectorExceTest.reconn(el4);
ZKConnectorExceTest.reconn(el1);
ThreadUtil.sleepAtLeast(100);
assertEquals("local2", ll.leaderAddr);
assertFalse(ll.isLeader);
el1.close();
el2.close();
el3.close();
el4.close();
}
}