public static IDisposable StartRandomlyCrashing(this Node[] nodes, Subject<IEnumerable<Peer>> peerObservable, Random random, IScheduler scheduler = null) { return Observable.Interval(new TimeSpan(TestNode.ElectionTimeout.Ticks*7), scheduler ?? Scheduler.Default) .Subscribe(o => { nodes.Start(); var nodeIndexToRemove = random.Next(0, nodes.Count()); Console.WriteLine(string.Format("Removing Node at index {0}", nodeIndexToRemove)); var id = nodes[nodeIndexToRemove].Id; nodes[nodeIndexToRemove] = new TestNode(new NodeSettings(id, TestNode.ElectionTimeout, TestNode.HeartBeatTimeout, peerObservable, scheduler)); peerObservable.OnNext(nodes.Where(n => n.Id != id).Select(n => n.AsPeer())); }, e => Debug.WriteLine(e.Message)); }
public async Task all_nodes_start_as_followers() { TestNode.CreateCluster().ForEach(n => n.State.Should().Be(State.Follower)); }
public async Task nodes_do_not_add_themselves_as_peers() { var nodes = TestNode.CreateCluster(); nodes.ForEach(n => n.GetPeerIds().Should().NotContain(p => p == n.Id)); }
public async Task Nodes_start_as_followers() { var nodes = TestNode.CreateCluster(); nodes.Count(n => n.State == State.Follower).Should().Be(3); }