@@ -5,12 +5,14 @@ import { peerIdFromPrivateKey } from '@libp2p/peer-id'
55import { expect } from 'aegir/chai'
66import { MemoryBlockstore } from 'blockstore-core'
77import { CID } from 'multiformats/cid'
8- import { sha256 } from 'multiformats/hashes/sha2'
8+ import * as raw from 'multiformats/codecs/raw'
9+ import { sha256 , sha512 } from 'multiformats/hashes/sha2'
910import pDefer from 'p-defer'
1011import Sinon from 'sinon'
1112import { stubInterface } from 'sinon-ts'
1213import { Bitswap } from '../src/bitswap.js'
1314import { cidToPrefix } from '../src/utils/cid-prefix.js'
15+ import type { MultihashHasherLoader } from '../src/index.ts'
1416import type { BitswapMessageEventDetail } from '../src/network.js'
1517import type { Routing } from '@helia/interface/routing'
1618import type { Libp2p , PeerId } from '@libp2p/interface'
@@ -29,11 +31,13 @@ describe('bitswap', () => {
2931 let bitswap : Bitswap
3032 let cid : CID
3133 let block : Uint8Array
34+ let hashLoader : StubbedInstance < MultihashHasherLoader >
3235
3336 beforeEach ( async ( ) => {
3437 block = Uint8Array . from ( [ 0 , 1 , 2 , 3 , 4 ] )
3538 const mh = await sha256 . digest ( block )
3639 cid = CID . createV0 ( mh ) . toV1 ( )
40+ hashLoader = stubInterface < MultihashHasherLoader > ( )
3741
3842 components = {
3943 peerId : peerIdFromPrivateKey ( await generateKeyPair ( 'Ed25519' ) ) ,
@@ -47,6 +51,8 @@ describe('bitswap', () => {
4751 bitswap = new Bitswap ( {
4852 ...components ,
4953 logger : defaultLogger ( )
54+ } , {
55+ hashLoader
5056 } )
5157
5258 components . libp2p . getConnections . returns ( [ ] )
@@ -107,6 +113,59 @@ describe('bitswap', () => {
107113 expect ( b ) . to . equalBytes ( block )
108114 } )
109115
116+ it ( 'should want a block with a truncated hash' , async ( ) => {
117+ hashLoader . getHasher . withArgs ( sha512 . code ) . resolves ( sha512 )
118+
119+ const mh = await sha512 . digest ( block , {
120+ truncate : 32
121+ } )
122+ cid = CID . createV1 ( raw . code , mh )
123+
124+ const remotePeer = peerIdFromPrivateKey ( await generateKeyPair ( 'Ed25519' ) )
125+ const findProvsSpy = bitswap . network . findAndConnect = Sinon . stub ( )
126+ findProvsSpy . resolves ( )
127+
128+ // add peer
129+ bitswap . wantList . peers . set ( remotePeer , new Set ( ) )
130+
131+ // wait for message send to peer
132+ const sentMessages = pDefer ( )
133+
134+ bitswap . network . sendMessage = async ( peerId ) => {
135+ if ( remotePeer . equals ( peerId ) ) {
136+ sentMessages . resolve ( )
137+ }
138+ }
139+
140+ const p = bitswap . want ( cid )
141+
142+ // wait for message send to peer
143+ await sentMessages . promise
144+
145+ // provider sends message
146+ bitswap . network . safeDispatchEvent < BitswapMessageEventDetail > ( 'bitswap:message' , {
147+ detail : {
148+ peer : remotePeer ,
149+ message : {
150+ blocks : [ {
151+ prefix : cidToPrefix ( cid ) ,
152+ data : block
153+ } ] ,
154+ blockPresences : [ ] ,
155+ pendingBytes : 0
156+ }
157+ }
158+ } )
159+
160+ const b = await p
161+
162+ // should have added cid to wantlist and searched for providers
163+ expect ( findProvsSpy . called ) . to . be . true ( )
164+
165+ // should have cancelled the notification request
166+ expect ( b ) . to . equalBytes ( block )
167+ } )
168+
110169 it ( 'should abort wanting a block that is not available on the network' , async ( ) => {
111170 const p = bitswap . want ( cid , {
112171 signal : AbortSignal . timeout ( 100 )
0 commit comments