mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-23 03:17:43 +08:00
This extracts the routing package to its own repository (https://github.com/ipfs/go-ipfs-routing). History has been preserved. The new module has been gx'ed and published. Imports have been rewritten and re-ordered accordingly. An internal dependency to go-ipfs/repo has been removed by substituting it with the go-datastore.Batching interface. License: MIT Signed-off-by: Hector Sanjuan <hector@protocol.ai>
99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
package bitswap
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"testing"
|
|
|
|
bsmsg "github.com/ipfs/go-ipfs/exchange/bitswap/message"
|
|
bsnet "github.com/ipfs/go-ipfs/exchange/bitswap/network"
|
|
|
|
delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay"
|
|
testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
|
|
mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
|
|
peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
|
|
blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format"
|
|
)
|
|
|
|
func TestSendMessageAsyncButWaitForResponse(t *testing.T) {
|
|
net := VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0))
|
|
responderPeer := testutil.RandIdentityOrFatal(t)
|
|
waiter := net.Adapter(testutil.RandIdentityOrFatal(t))
|
|
responder := net.Adapter(responderPeer)
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
wg.Add(1)
|
|
|
|
expectedStr := "received async"
|
|
|
|
responder.SetDelegate(lambda(func(
|
|
ctx context.Context,
|
|
fromWaiter peer.ID,
|
|
msgFromWaiter bsmsg.BitSwapMessage) {
|
|
|
|
msgToWaiter := bsmsg.New(true)
|
|
msgToWaiter.AddBlock(blocks.NewBlock([]byte(expectedStr)))
|
|
waiter.SendMessage(ctx, fromWaiter, msgToWaiter)
|
|
}))
|
|
|
|
waiter.SetDelegate(lambda(func(
|
|
ctx context.Context,
|
|
fromResponder peer.ID,
|
|
msgFromResponder bsmsg.BitSwapMessage) {
|
|
|
|
// TODO assert that this came from the correct peer and that the message contents are as expected
|
|
ok := false
|
|
for _, b := range msgFromResponder.Blocks() {
|
|
if string(b.RawData()) == expectedStr {
|
|
wg.Done()
|
|
ok = true
|
|
}
|
|
}
|
|
|
|
if !ok {
|
|
t.Fatal("Message not received from the responder")
|
|
}
|
|
}))
|
|
|
|
messageSentAsync := bsmsg.New(true)
|
|
messageSentAsync.AddBlock(blocks.NewBlock([]byte("data")))
|
|
errSending := waiter.SendMessage(
|
|
context.Background(), responderPeer.ID(), messageSentAsync)
|
|
if errSending != nil {
|
|
t.Fatal(errSending)
|
|
}
|
|
|
|
wg.Wait() // until waiter delegate function is executed
|
|
}
|
|
|
|
type receiverFunc func(ctx context.Context, p peer.ID,
|
|
incoming bsmsg.BitSwapMessage)
|
|
|
|
// lambda returns a Receiver instance given a receiver function
|
|
func lambda(f receiverFunc) bsnet.Receiver {
|
|
return &lambdaImpl{
|
|
f: f,
|
|
}
|
|
}
|
|
|
|
type lambdaImpl struct {
|
|
f func(ctx context.Context, p peer.ID, incoming bsmsg.BitSwapMessage)
|
|
}
|
|
|
|
func (lam *lambdaImpl) ReceiveMessage(ctx context.Context,
|
|
p peer.ID, incoming bsmsg.BitSwapMessage) {
|
|
lam.f(ctx, p, incoming)
|
|
}
|
|
|
|
func (lam *lambdaImpl) ReceiveError(err error) {
|
|
// TODO log error
|
|
}
|
|
|
|
func (lam *lambdaImpl) PeerConnected(p peer.ID) {
|
|
// TODO
|
|
}
|
|
func (lam *lambdaImpl) PeerDisconnected(peer.ID) {
|
|
// TODO
|
|
}
|