package com.liveramp.hank.coordinator;
import com.liveramp.hank.test.BaseTestCase;
import com.liveramp.hank.coordinator.mock.MockDomain;
import com.liveramp.hank.test.coordinator.MockHost;
import com.liveramp.hank.test.coordinator.MockHostDomain;
import org.junit.Test;
import java.io.IOException;
import java.util.*;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class TestAbstractRing extends BaseTestCase {
private static final PartitionServerAddress LOCALHOST = new PartitionServerAddress("localhost", 1);
private static class SlightlyLessAbstractRing extends AbstractRing {
protected SlightlyLessAbstractRing(int ringNum,
RingGroup ringGroupConfig) {
super(ringNum, ringGroupConfig);
}
@Override
public Host addHost(PartitionServerAddress address,
List<String> flags) throws IOException {
return null;
}
@Override
public Host getHostByAddress(PartitionServerAddress address) {
return null;
}
@Override
public Set<Host> getHosts() {
return null;
}
@Override
public boolean removeHost(PartitionServerAddress address) {
return false;
}
}
@Test
public void testCommandAll() throws IOException {
final Host hc = new MockHost(LOCALHOST);
SlightlyLessAbstractRing rc = new SlightlyLessAbstractRing(1, null) {
@Override
public Set<Host> getHosts() {
return Collections.singleton(hc);
}
};
assertNull(hc.getCurrentCommand());
assertTrue(hc.getCommandQueue().isEmpty());
Rings.commandAll(rc, HostCommand.SERVE_DATA);
assertNull(hc.getCurrentCommand());
assertEquals(Arrays.asList(HostCommand.SERVE_DATA), hc.getCommandQueue());
}
@Test
public void testGetHostsForDomainPartition() throws Exception {
final Domain d0 = new MockDomain("d0");
final Host hc = new MockHost(LOCALHOST) {
HostDomain hd1 = new MockHostDomain(d0, 1, 1, 2, 2);
HostDomain hd2 = new MockHostDomain(null, 1, 2, 2, 2);
@Override
public Set<HostDomain> getAssignedDomains() throws IOException {
return new HashSet<HostDomain>(Arrays.asList(hd1, hd2));
}
@Override
public HostDomain getHostDomain(Domain domain) {
return hd1;
}
};
SlightlyLessAbstractRing ring = new SlightlyLessAbstractRing(1, null) {
@Override
public Set<Host> getHosts() {
return Collections.singleton(hc);
}
};
assertEquals(Collections.singleton(hc), Rings.getHostsForDomainPartition(ring, d0, 1));
assertEquals(Collections.singleton(hc), Rings.getHostsForDomainPartition(ring, d0, 2));
assertEquals(Collections.EMPTY_SET, Rings.getHostsForDomainPartition(ring, d0, 3));
}
@Test
public void testGetHostsInState() throws Exception {
final MockHost h1 = new MockHost(new PartitionServerAddress("localhost", 1));
final MockHost h2 = new MockHost(new PartitionServerAddress("localhost", 2));
final MockHost h3 = new MockHost(new PartitionServerAddress("localhost", 3));
SlightlyLessAbstractRing rc = new SlightlyLessAbstractRing(1, null) {
@Override
public Set<Host> getHosts() {
return new HashSet<Host>(Arrays.asList(h1, h2, h3));
}
};
h1.setState(HostState.IDLE);
h2.setState(HostState.SERVING);
h3.setState(HostState.OFFLINE);
assertEquals(Collections.singleton(h1), Rings.getHostsInState(rc, HostState.IDLE));
assertEquals(Collections.singleton(h2), Rings.getHostsInState(rc, HostState.SERVING));
assertEquals(Collections.singleton(h3), Rings.getHostsInState(rc, HostState.OFFLINE));
}
}