package netflix.ocelli.toplogies;
import com.google.common.collect.Sets;
import netflix.ocelli.CloseableInstance;
import netflix.ocelli.Host;
import netflix.ocelli.Instance;
import netflix.ocelli.InstanceCollector;
import netflix.ocelli.functions.Functions;
import netflix.ocelli.topologies.RingTopology;
import netflix.ocelli.util.RxUtil;
import org.junit.Assert;
import org.junit.Test;
import rx.schedulers.TestScheduler;
import rx.subjects.PublishSubject;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
public class TopologiesTest {
public static class HostWithId extends Host {
private final Integer id;
public HostWithId(String hostName, int port, Integer id) {
super(hostName, port);
this.id = id;
}
public Integer getId() {
return this.id;
}
public String toString() {
return id.toString();
}
}
@Test
public void test() {
CloseableInstance<Integer> m1 = CloseableInstance.from(1);
CloseableInstance<Integer> m2 = CloseableInstance.from(2);
CloseableInstance<Integer> m3 = CloseableInstance.from(3);
CloseableInstance<Integer> m4 = CloseableInstance.from(4);
CloseableInstance<Integer> m6 = CloseableInstance.from(6);
CloseableInstance<Integer> m7 = CloseableInstance.from(7);
CloseableInstance<Integer> m8 = CloseableInstance.from(8);
CloseableInstance<Integer> m9 = CloseableInstance.from(9);
CloseableInstance<Integer> m10 = CloseableInstance.from(10);
CloseableInstance<Integer> m11 = CloseableInstance.from(11);
PublishSubject<Instance<Integer>> members = PublishSubject.create();
TestScheduler scheduler = new TestScheduler();
RingTopology<Integer, Integer> mapper = RingTopology.create(5, Functions.identity(), Functions.memoize(3), scheduler);
AtomicReference<List<Integer>> current = new AtomicReference<List<Integer>>();
members
.doOnNext(RxUtil.info("add"))
.compose(mapper)
.compose(InstanceCollector.<Integer>create())
.doOnNext(RxUtil.info("current"))
.subscribe(RxUtil.set(current));
members.onNext(m11);
Assert.assertEquals(Sets.newHashSet(11) , Sets.newHashSet(current.get()));
members.onNext(m7);
Assert.assertEquals(Sets.newHashSet(7, 11) , Sets.newHashSet(current.get()));
members.onNext(m1);
Assert.assertEquals(Sets.newHashSet(1, 7, 11) , Sets.newHashSet(current.get()));
members.onNext(m2);
Assert.assertEquals(Sets.newHashSet(1, 7, 11) , Sets.newHashSet(current.get()));
members.onNext(m4);
Assert.assertEquals(Sets.newHashSet(1, 7, 11) , Sets.newHashSet(current.get()));
members.onNext(m3);
Assert.assertEquals(Sets.newHashSet(1, 7, 11) , Sets.newHashSet(current.get()));
members.onNext(m8);
Assert.assertEquals(Sets.newHashSet(7, 8, 11) , Sets.newHashSet(current.get()));
members.onNext(m10);
Assert.assertEquals(Sets.newHashSet(7, 8, 10), Sets.newHashSet(current.get()));
members.onNext(m9);
Assert.assertEquals(Sets.newHashSet(7, 8, 9), Sets.newHashSet(current.get()));
members.onNext(m6);
Assert.assertEquals(Sets.newHashSet(6, 7, 8), Sets.newHashSet(current.get()));
m6.close();
Assert.assertEquals(Sets.newHashSet(7, 8, 9), Sets.newHashSet(current.get()));
m9.close();
Assert.assertEquals(Sets.newHashSet(7, 8, 10), Sets.newHashSet(current.get()));
m8.close();
Assert.assertEquals(Sets.newHashSet(7, 10, 11), Sets.newHashSet(current.get()));
}
}