@@ -49,13 +49,13 @@ public async Task When_JoinNodeToCluster_Then_StorageIsUpdated()
4949 public async Task When_NodeIsStopped_Then_NodeBecomeUnreachable ( )
5050 {
5151 // ARRANGE
52- var seedNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > ( ) , 4000 , new ConcurrentBag < ClusterNode > ( ) , true ) ;
53- var firstNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > ( ) , 4001 , new ConcurrentBag < ClusterNode > ( ) ) ;
52+ var seedNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > ( ) , 4001 , new ConcurrentBag < ClusterNode > ( ) , true ) ;
53+ var firstNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > ( ) , 4002 , new ConcurrentBag < ClusterNode > ( ) ) ;
5454 await seedNode . Start ( CancellationToken . None ) ;
5555 await firstNode . Start ( CancellationToken . None ) ;
5656 WaitNodeIsStarted ( seedNode ) ;
5757 WaitNodeIsStarted ( firstNode ) ;
58- using ( var gossipClient = new GossipClient ( "localhost" , 4000 ) ) await gossipClient . JoinNode ( "localhost" , 4001 ) ;
58+ using ( var gossipClient = new GossipClient ( "localhost" , 4001 ) ) await gossipClient . JoinNode ( "localhost" , 4002 ) ;
5959 var seedNodeStates = await WaitEntityTypes ( seedNode , ( nodes ) => nodes . Count ( ) == 2 ) ;
6060 var firstNodeStates = await WaitEntityTypes ( firstNode , ( nodes ) => nodes . Count ( ) == 2 ) ;
6161
@@ -67,25 +67,25 @@ public async Task When_NodeIsStopped_Then_NodeBecomeUnreachable()
6767 // ASSERT
6868 Assert . Single ( clusterNodes ) ;
6969 Assert . Equal ( "localhost" , clusterNodes . First ( ) . Node . Url ) ;
70- Assert . Equal ( 4001 , clusterNodes . First ( ) . Node . Port ) ;
70+ Assert . Equal ( 4002 , clusterNodes . First ( ) . Node . Port ) ;
7171 }
7272
7373 [ Fact ]
7474 public async Task When_StateIsAdded_Then_StorageIsUpdated ( )
7575 {
7676 // ARRANGE
77- var seedNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > ( ) , 4000 , new ConcurrentBag < ClusterNode > ( ) , true ) ;
78- var firstNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > ( ) , 4001 , new ConcurrentBag < ClusterNode > ( ) ) ;
77+ var seedNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > ( ) , 4003 , new ConcurrentBag < ClusterNode > ( ) , true ) ;
78+ var firstNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > ( ) , 4004 , new ConcurrentBag < ClusterNode > ( ) ) ;
7979 await seedNode . Start ( CancellationToken . None ) ;
8080 await firstNode . Start ( CancellationToken . None ) ;
8181 WaitNodeIsStarted ( seedNode ) ;
8282 WaitNodeIsStarted ( firstNode ) ;
83- using ( var gossipClient = new GossipClient ( "localhost" , 4000 ) ) await gossipClient . JoinNode ( "localhost" , 4001 ) ;
83+ using ( var gossipClient = new GossipClient ( "localhost" , 4003 ) ) await gossipClient . JoinNode ( "localhost" , 4004 ) ;
8484 var seedNodeStates = await WaitEntityTypes ( seedNode , ( nodes ) => nodes . Count ( ) == 2 ) ;
8585 var firstNodeStates = await WaitEntityTypes ( firstNode , ( nodes ) => nodes . Count ( ) == 2 ) ;
8686
8787 // ACT
88- using ( var gossipClient = new GossipClient ( "localhost" , 4000 ) ) await gossipClient . UpdateNodeState ( "Client" , "id" , "value" ) ;
88+ using ( var gossipClient = new GossipClient ( "localhost" , 4003 ) ) await gossipClient . UpdateNodeState ( "Client" , "id" , "value" ) ;
8989 var seedClient = ( await WaitEntityTypes ( seedNode , ( nodes ) => nodes . Any ( n => n . EntityType == "Client" ) ) ) . First ( c => c . EntityType == "Client" ) ;
9090 var firstNodeClient = ( await WaitEntityTypes ( firstNode , ( nodes ) => nodes . Any ( n => n . EntityType == "Client" ) ) ) . First ( c => c . EntityType == "Client" ) ;
9191
@@ -98,105 +98,77 @@ public async Task When_StateIsAdded_Then_StorageIsUpdated()
9898
9999 #endregion
100100
101+ #region Consensus
102+
101103 [ Fact ]
102104 public async Task When_AppendLogInOnePartition_Then_LogIsReplicated ( )
103105 {
104106 // ARRANGE
105- var firstNode = BuildNodeHost ( new ConcurrentBag < PeerInfo >
106- {
107- new PeerInfo { TermId = "termId" , TermIndex = 0 }
108- } , 4001 , new ConcurrentBag < ClusterNode >
109- {
110- new ClusterNode
111- {
112- Port = 4002 ,
113- Url = "localhost"
114- }
115- } ) ;
116- var secondNode = BuildNodeHost ( new ConcurrentBag < PeerInfo >
117- {
118- new PeerInfo { TermId = "termId" , TermIndex = 0 }
119- } , 4002 , new ConcurrentBag < ClusterNode >
120- {
121- new ClusterNode
122- {
123- Port = 4001 ,
124- Url = "localhost"
125- }
126- } ) ;
107+ var seedNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > { new PeerInfo { TermId = "termId" , TermIndex = 0 } } , 4005 , new ConcurrentBag < ClusterNode > ( ) , true ) ;
108+ var firstNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > { new PeerInfo { TermId = "termId" , TermIndex = 0 } } , 4006 , new ConcurrentBag < ClusterNode > ( ) ) ;
109+ await seedNode . Start ( CancellationToken . None ) ;
127110 await firstNode . Start ( CancellationToken . None ) ;
128- await secondNode . Start ( CancellationToken . None ) ;
129- var allNodes = new List < INodeHost > { firstNode , secondNode } ;
111+ WaitNodeIsStarted ( seedNode ) ;
112+ WaitNodeIsStarted ( firstNode ) ;
113+ using ( var gossipClient = new GossipClient ( "localhost" , 4005 ) ) await gossipClient . JoinNode ( "localhost" , 4006 ) ;
114+ var seedNodeStates = await WaitEntityTypes ( seedNode , ( nodes ) => nodes . Count ( ) == 2 ) ;
115+ var firstNodeStates = await WaitEntityTypes ( firstNode , ( nodes ) => nodes . Count ( ) == 2 ) ;
116+ var allNodes = new List < INodeHost > { seedNode , firstNode } ;
130117
131118 // ACT
132119 WaitOnlyOneLeader ( allNodes , "termId" ) ;
133- var client = new ConsensusClient ( "localhost" , 4001 ) ;
120+ var client = new ConsensusClient ( "localhost" , 4005 ) ;
134121 client . AppendEntry ( "termId" , "value" , CancellationToken . None ) . Wait ( ) ;
135122 WaitLogs ( allNodes , p => p . Info . TermId == "termId" , l => l . Value == "value" ) ;
136123
137124 // ASSERT
125+ var seedPeerLogs = seedNode . Peers . First ( ) . LogStore . GetAll ( CancellationToken . None ) . Result ;
138126 var firstPeerLogs = firstNode . Peers . First ( ) . LogStore . GetAll ( CancellationToken . None ) . Result ;
139- var secondPeerLogs = secondNode . Peers . First ( ) . LogStore . GetAll ( CancellationToken . None ) . Result ;
127+ Assert . Single ( seedPeerLogs ) ;
140128 Assert . Single ( firstPeerLogs ) ;
141- Assert . Single ( secondPeerLogs ) ;
129+ Assert . Equal ( "value" , seedPeerLogs . First ( ) . Value ) ;
142130 Assert . Equal ( "value" , firstPeerLogs . First ( ) . Value ) ;
143- Assert . Equal ( "value" , secondPeerLogs . First ( ) . Value ) ;
131+ await seedNode . Stop ( ) ;
144132 await firstNode . Stop ( ) ;
145- await secondNode . Stop ( ) ;
146133 }
147134
148135 [ Fact ]
149136 public async Task When_AppendLogInTwoPartitions_Then_LogIsReplicated ( )
150137 {
151138 // ARRANGE
152- var firstNode = BuildNodeHost ( new ConcurrentBag < PeerInfo >
153- {
154- new PeerInfo { TermId = "termId" , TermIndex = 0 } ,
155- new PeerInfo { TermId = "secondTermId" , TermIndex = 0 }
156- } , 4001 , new ConcurrentBag < ClusterNode >
157- {
158- new ClusterNode
159- {
160- Port = 4002 ,
161- Url = "localhost"
162- }
163- } ) ;
164- var secondNode = BuildNodeHost ( new ConcurrentBag < PeerInfo >
165- {
166- new PeerInfo { TermId = "termId" , TermIndex = 0 } ,
167- new PeerInfo { TermId = "secondTermId" , TermIndex = 0 }
168- } , 4002 , new ConcurrentBag < ClusterNode >
169- {
170- new ClusterNode
171- {
172- Port = 4001 ,
173- Url = "localhost"
174- }
175- } ) ;
139+ var seedNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > { new PeerInfo { TermId = "termId" , TermIndex = 0 } , new PeerInfo { TermId = "secondTermId" , TermIndex = 0 } } , 4007 , new ConcurrentBag < ClusterNode > ( ) , true ) ;
140+ var firstNode = BuildNodeHost ( new ConcurrentBag < PeerInfo > { new PeerInfo { TermId = "termId" , TermIndex = 0 } , new PeerInfo { TermId = "secondTermId" , TermIndex = 0 } } , 4008 , new ConcurrentBag < ClusterNode > ( ) ) ;
141+ await seedNode . Start ( CancellationToken . None ) ;
176142 await firstNode . Start ( CancellationToken . None ) ;
177- await secondNode . Start ( CancellationToken . None ) ;
178- var allNodes = new List < INodeHost > { firstNode , secondNode } ;
143+ WaitNodeIsStarted ( seedNode ) ;
144+ WaitNodeIsStarted ( firstNode ) ;
145+ using ( var gossipClient = new GossipClient ( "localhost" , 4007 ) ) await gossipClient . JoinNode ( "localhost" , 4008 ) ;
146+ var seedNodeStates = await WaitEntityTypes ( seedNode , ( nodes ) => nodes . Count ( ) == 2 ) ;
147+ var firstNodeStates = await WaitEntityTypes ( firstNode , ( nodes ) => nodes . Count ( ) == 2 ) ;
148+ var allNodes = new List < INodeHost > { seedNode , firstNode } ;
179149
180150 // ACT
181151 WaitOnlyOneLeader ( allNodes , "termId" ) ;
182152 WaitOnlyOneLeader ( allNodes , "secondTermId" ) ;
183- var client = new ConsensusClient ( "localhost" , 4001 ) ;
153+ var client = new ConsensusClient ( "localhost" , 4007 ) ;
184154 client . AppendEntry ( "termId" , "value" , CancellationToken . None ) . Wait ( ) ;
185155 client . AppendEntry ( "secondTermId" , "value" , CancellationToken . None ) . Wait ( ) ;
186156 WaitLogs ( allNodes , p => p . Info . TermId == "termId" , l => l . Value == "value" ) ;
187157 WaitLogs ( allNodes , p => p . Info . TermId == "secondTermId" , l => l . Value == "value" ) ;
188158
189159 // ASSERT
160+ var seedPeerLogs = seedNode . Peers . First ( ) . LogStore . GetAll ( CancellationToken . None ) . Result ;
190161 var firstPeerLogs = firstNode . Peers . First ( ) . LogStore . GetAll ( CancellationToken . None ) . Result ;
191- var secondPeerLogs = secondNode . Peers . First ( ) . LogStore . GetAll ( CancellationToken . None ) . Result ;
162+ Assert . Single ( seedPeerLogs ) ;
192163 Assert . Single ( firstPeerLogs ) ;
193- Assert . Single ( secondPeerLogs ) ;
164+ Assert . Equal ( "value" , seedPeerLogs . First ( ) . Value ) ;
194165 Assert . Equal ( "value" , firstPeerLogs . First ( ) . Value ) ;
195- Assert . Equal ( "value" , secondPeerLogs . First ( ) . Value ) ;
166+ await seedNode . Stop ( ) ;
196167 await firstNode . Stop ( ) ;
197- await secondNode . Stop ( ) ;
198168 }
199169
170+ #endregion
171+
200172 private static INodeHost BuildNodeHost ( ConcurrentBag < PeerInfo > peers , int port , ConcurrentBag < ClusterNode > clusterNodes , bool isSeed = false )
201173 {
202174 var serviceCollection = new ServiceCollection ( )
0 commit comments