@@ -41,6 +41,7 @@ import io.iohk.ethereum.network.p2p.messages.ETH62.BlockBodies
4141import io .iohk .ethereum .network .p2p .messages .ETH62 .BlockHeaders
4242import io .iohk .ethereum .utils .ByteStringUtils
4343import io .iohk .ethereum .utils .Hex
44+ import akka .stream .scaladsl .SourceQueue
4445
4546class FetcherServiceSpec
4647 extends TestKit (ActorSystem (" FetcherServiceSpec_System" ))
@@ -60,8 +61,8 @@ class FetcherServiceSpec
6061 " FetcherService" should " return RequestFailed when asking for a not existing blocks" in {
6162 val blockchainReader : BlockchainReader = mock[BlockchainReader ]
6263 (blockchainReader.getBlockHeaderByHash _).expects(* ).returning(None ).anyNumberOfTimes()
63- val blockValidator : BlockValidator = mock[BlockValidator ]
64- val fetcherService = new FetcherService (blockValidator, blockchainReader, syncConfig)
64+ val sourceQueue = mock[SourceQueue [ Block ] ]
65+ val fetcherService = new FetcherService (blockchainReader, syncConfig, sourceQueue )
6566 val peerProbe : TestProbe = TestProbe ()
6667 val peer = Peer (PeerId (" peerId" ), new InetSocketAddress (9191 ), peerProbe.ref, true )
6768 val result = fetcherService.fetchBlocksUntil(peer, Right (ByteString (" byteString" )), Right (ByteString (" byteString" )))
@@ -72,40 +73,13 @@ class FetcherServiceSpec
7273 it should " return an error when request to fetch headers in fetchBlocks fails" ignore {
7374 val blockchainReader : BlockchainReader = mock[BlockchainReader ]
7475 (blockchainReader.getHashByBlockNumber _).expects(* , * ).returning(Some (genesisHash))
75- val blockValidator : BlockValidator = mock[BlockValidator ]
76- val fetcherService = new FetcherService (blockValidator, blockchainReader, syncConfig)
76+ val sourceQueue = mock[SourceQueue [ Block ] ]
77+ val fetcherService = new FetcherService (blockchainReader, syncConfig, sourceQueue )
7778 val fetchBlocks = PrivateMethod [EitherT [Task , RequestFailed , Peer ]](' fetchBlocks )
7879 val eitherPeerOrError = fetcherService.invokePrivate(fetchBlocks())
7980 assert(eitherPeerOrError === RequestFailed )
8081 }
8182
82- it should " fail to verify that bodies are a subset of headers if they don't match" in {
83- val blockchainReader : BlockchainReader = mock[BlockchainReader ]
84- // Here we are forcing the mismatch between request headers and received bodies
85- val blockValidator = new MockValidatorsFailingOnBlockBodies
86- val fetcherService = new FetcherService (blockValidator.blockValidator, blockchainReader, syncConfig)
87- val bodiesAreOrderedSubsetOfRequested = PrivateMethod [Option [Seq [Block ]]](' bodiesAreOrderedSubsetOfRequested )
88- val blocks = Seq (Block (ValidBlock .header.copy(number = 97 ), ValidBlock .body))
89- val headers : Seq [BlockHeader ] = blocks.map(_.header)
90- val bodies : Seq [BlockBody ] = blocks.map(_.body)
91- val verifiedBlocks : Option [Seq [Block ]] =
92- fetcherService.invokePrivate(bodiesAreOrderedSubsetOfRequested(headers, bodies, Nil ))
93- verifiedBlocks shouldBe None
94- }
95-
96- it should " verify that bodies are a subset of headers" in {
97- val blockchainReader : BlockchainReader = mock[BlockchainReader ]
98- val blockValidator = new MockValidatorsAlwaysSucceed
99- val fetcherService = new FetcherService (blockValidator.blockValidator, blockchainReader, syncConfig)
100- val bodiesAreOrderedSubsetOfRequested = PrivateMethod [Option [Seq [Block ]]](' bodiesAreOrderedSubsetOfRequested )
101- val blocks = Seq (Block (ValidBlock .header.copy(number = 97 ), ValidBlock .body))
102- val headers : Seq [BlockHeader ] = blocks.map(_.header)
103- val bodies : Seq [BlockBody ] = blocks.map(_.body)
104- val verifiedBlocks : Option [Seq [Block ]] =
105- fetcherService.invokePrivate(bodiesAreOrderedSubsetOfRequested(headers, bodies, Nil ))
106- verifiedBlocks shouldBe Some (blocks)
107- }
108-
10983 val emptyTransactionsRoot : ByteString =
11084 ByteStringUtils .string2hash(" 56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" )
11185 val emptyOmmersHash : ByteString =
@@ -147,6 +121,11 @@ class FetcherServiceSpec
147121 (FetcherService .BlockIdentifier (body1) should not).equal(FetcherService .BlockIdentifier (header2))
148122 }
149123
124+ " FetcherService.buildBlocks" should " return matching headers and bodies only" in {
125+ val result = FetcherService .buildBlocks(Seq (header1, header2), Seq (body2, body3, body1))
126+ result shouldEqual Seq (Block (header1, body1), Block (header2, body2))
127+ }
128+
150129 " FetcherService.fetchBlocksForHeaders" should " combine matching headers and bodies" in {
151130 val messages = Seq (
152131 MessageFromPeer (BlockHeaders (Seq (header1, header2)), peerId),
0 commit comments