1
1
package io .iohk .ethereum .blockchain .sync .regular
2
2
3
- import akka .actor .{ActorRef , ActorSystem }
3
+ import akka .actor .{ActorRef , ActorSystem , PoisonPill }
4
+ import akka .actor .typed .{ActorRef => TypedActorRef }
4
5
import akka .testkit .TestActor .AutoPilot
5
6
import akka .testkit .TestKit
6
7
import akka .util .ByteString
@@ -10,6 +11,8 @@ import cats.syntax.traverse._
10
11
import io .iohk .ethereum .blockchain .sync .Blacklist .BlacklistReason
11
12
import io .iohk .ethereum .blockchain .sync .SyncProtocol .Status
12
13
import io .iohk .ethereum .blockchain .sync .SyncProtocol .Status .Progress
14
+ import io .iohk .ethereum .blockchain .sync .regular .BlockFetcher .{FetchCommand , PrintStatus , ReceivedHeaders }
15
+ import io .iohk .ethereum .blockchain .sync .regular .HeadersFetcher .HeadersFetcherCommand
13
16
import io .iohk .ethereum .blockchain .sync .regular .RegularSync .NewCheckpoint
14
17
import io .iohk .ethereum .blockchain .sync .{PeersClient , SyncProtocol }
15
18
import io .iohk .ethereum .crypto .kec256
@@ -37,6 +40,7 @@ import org.scalatest.{Assertion, BeforeAndAfterEach}
37
40
38
41
import scala .concurrent .duration ._
39
42
import scala .concurrent .{Await , Future , Promise }
43
+ import scala .math .BigInt
40
44
41
45
class RegularSyncSpec
42
46
extends WordSpecBase
@@ -112,34 +116,97 @@ class RegularSyncSpec
112
116
peersClient.expectMsg(PeersClient .BlacklistPeer (defaultPeer.id, BlacklistReason .RegularSyncRequestFailed (" a random reason" )))
113
117
})
114
118
115
- // TODO: To be re-enabled with ETCM-370
116
- " blacklist peer which returns headers starting from one with higher number than expected" ignore sync(
117
- new Fixture (
118
- testSystem
119
- ) {
119
+ " blacklist peer which returns headers starting from one with higher number than expected" in sync(
120
+ new Fixture (testSystem) {
121
+ var blockFetcher : ActorRef = _
122
+
120
123
regularSync ! SyncProtocol .Start
124
+ peerEventBus.expectMsgClass(classOf [Subscribe ])
125
+ blockFetcher = peerEventBus.sender()
121
126
122
127
peersClient.expectMsgEq(blockHeadersChunkRequest(0 ))
123
- peersClient.reply(PeersClient .Response (defaultPeer, BlockHeaders (testBlocksChunked(1 ).headers)))
128
+ peersClient.reply(PeersClient .Response (defaultPeer, BlockHeaders (testBlocksChunked.head.headers)))
129
+
130
+ val getBodies : PeersClient .Request [GetBlockBodies ] = PeersClient .Request .create(
131
+ GetBlockBodies (testBlocksChunked.head.headers.map(_.hash)),
132
+ PeersClient .BestPeer
133
+ )
134
+ peersClient.expectMsgEq(getBodies)
135
+ peersClient.reply(PeersClient .Response (defaultPeer, BlockBodies (testBlocksChunked.head.bodies)))
136
+
137
+ blockFetcher ! MessageFromPeer (NewBlock (testBlocks.last, ChainWeight .totalDifficultyOnly(testBlocks.last.number)), defaultPeer.id)
138
+ peersClient.expectMsgEq(blockHeadersChunkRequest(1 ))
139
+ peersClient.reply(PeersClient .Response (defaultPeer, BlockHeaders (testBlocksChunked(5 ).headers)))
124
140
peersClient.expectMsgPF() {
125
141
case PeersClient .BlacklistPeer (id, _) if id == defaultPeer.id => true
126
142
}
127
143
}
128
144
)
129
145
130
- // TODO: To be re-enabled with ETCM-370
131
- " blacklist peer which returns headers not forming a chain" ignore sync(new Fixture (testSystem) {
146
+ " blacklist peer which returns headers not forming a chain" in sync(new Fixture (testSystem) {
132
147
regularSync ! SyncProtocol .Start
133
148
134
149
peersClient.expectMsgEq(blockHeadersChunkRequest(0 ))
135
150
peersClient.reply(
136
- PeersClient .Response (defaultPeer, BlockHeaders (testBlocksChunked.head .headers.filter(_.number % 2 == 0 )))
151
+ PeersClient .Response (defaultPeer, BlockHeaders (testBlocks .headers.filter(_.number % 2 == 0 )))
137
152
)
138
153
peersClient.expectMsgPF() {
139
154
case PeersClient .BlacklistPeer (id, _) if id == defaultPeer.id => true
140
155
}
141
156
})
142
157
158
+ " blacklist peer which sends headers that were not requested" ignore sync(new Fixture (testSystem) {
159
+ import akka .actor .typed .scaladsl .adapter ._
160
+ var blockFetcherAdapter : TypedActorRef [MessageFromPeer ] = _
161
+ var blockFetcher : TypedActorRef [FetchCommand ] = _
162
+ // var blockFetcher: ActorRef = _
163
+
164
+ regularSync ! SyncProtocol .Start
165
+ peerEventBus.expectMsgClass(classOf [Subscribe ])
166
+ blockFetcherAdapter = peerEventBus.sender()
167
+
168
+ peersClient.expectMsgEq(blockHeadersChunkRequest(0 ))
169
+ peersClient.reply(PeersClient .Response (defaultPeer, BlockHeaders (testBlocksChunked.head.headers)))
170
+
171
+ val getBodies : PeersClient .Request [GetBlockBodies ] = PeersClient .Request .create(
172
+ GetBlockBodies (testBlocksChunked.head.headers.map(_.hash)),
173
+ PeersClient .BestPeer
174
+ )
175
+ val getBodies2 : PeersClient .Request [GetBlockBodies ] = PeersClient .Request .create(
176
+ GetBlockBodies (testBlocksChunked(1 ).headers.map(_.hash)),
177
+ PeersClient .BestPeer
178
+ )
179
+ peersClient.expectMsgEq(getBodies)
180
+ peersClient.reply(PeersClient .Response (defaultPeer, BlockBodies (testBlocksChunked.head.bodies)))
181
+
182
+ blockFetcherAdapter ! MessageFromPeer (NewBlock (testBlocks(3 ), ChainWeight .totalDifficultyOnly(testBlocks(3 ).number)), defaultPeer.id)
183
+ peersClient.expectMsgEq(blockHeadersChunkRequest(1 ))
184
+ peersClient.reply(PeersClient .Response (defaultPeer, BlockHeaders (testBlocksChunked(2 ).headers)))
185
+
186
+ peersClient.expectMsgClass(classOf [PeersClient .BlacklistPeer ])
187
+
188
+ blockFetcher = peersClient.sender()
189
+
190
+ println(" ============ " + blockFetcher)
191
+ println(" ------------ " + blockFetcherAdapter)
192
+ blockFetcher ! PrintStatus
193
+
194
+ val notBlacklistedPeer = peerByNumber(1 )
195
+ peersClient.expectMsgEq(blockHeadersChunkRequest(1 ))
196
+ peersClient.reply(PeersClient .Response (notBlacklistedPeer, BlockHeaders (testBlocksChunked(1 ).headers)))
197
+ peersClient.expectMsgEq(getBodies2)
198
+ peersClient.reply(PeersClient .Response (notBlacklistedPeer, BlockBodies (testBlocksChunked(1 ).bodies)))
199
+
200
+ peersClient.expectNoMessage()
201
+
202
+ blockFetcher ! BlockFetcher .ReceivedHeaders (notBlacklistedPeer, testBlocksChunked(3 ).headers)
203
+ blockFetcher ! BlockFetcher .ReceivedBodies (notBlacklistedPeer, testBlocksChunked(3 ).bodies)
204
+
205
+ peersClient.expectMsgPF() {
206
+ case PeersClient .BlacklistPeer (id, _) if id == notBlacklistedPeer.id => true
207
+ }
208
+ })
209
+
143
210
" wait for time defined in config until issuing a retry request due to no suitable peer" in sync(
144
211
new Fixture (
145
212
testSystem
0 commit comments