github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/exchange/bitswap/testnet/network_test.go (about) 1 package bitswap 2 3 import ( 4 "sync" 5 "testing" 6 7 context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" 8 blocks "github.com/ipfs/go-ipfs/blocks" 9 bsmsg "github.com/ipfs/go-ipfs/exchange/bitswap/message" 10 bsnet "github.com/ipfs/go-ipfs/exchange/bitswap/network" 11 peer "github.com/ipfs/go-ipfs/p2p/peer" 12 mockrouting "github.com/ipfs/go-ipfs/routing/mock" 13 delay "github.com/ipfs/go-ipfs/thirdparty/delay" 14 testutil "github.com/ipfs/go-ipfs/util/testutil" 15 ) 16 17 func TestSendMessageAsyncButWaitForResponse(t *testing.T) { 18 net := VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) 19 responderPeer := testutil.RandIdentityOrFatal(t) 20 waiter := net.Adapter(testutil.RandIdentityOrFatal(t)) 21 responder := net.Adapter(responderPeer) 22 23 var wg sync.WaitGroup 24 25 wg.Add(1) 26 27 expectedStr := "received async" 28 29 responder.SetDelegate(lambda(func( 30 ctx context.Context, 31 fromWaiter peer.ID, 32 msgFromWaiter bsmsg.BitSwapMessage) { 33 34 msgToWaiter := bsmsg.New(true) 35 msgToWaiter.AddBlock(blocks.NewBlock([]byte(expectedStr))) 36 waiter.SendMessage(ctx, fromWaiter, msgToWaiter) 37 })) 38 39 waiter.SetDelegate(lambda(func( 40 ctx context.Context, 41 fromResponder peer.ID, 42 msgFromResponder bsmsg.BitSwapMessage) { 43 44 // TODO assert that this came from the correct peer and that the message contents are as expected 45 ok := false 46 for _, b := range msgFromResponder.Blocks() { 47 if string(b.Data) == expectedStr { 48 wg.Done() 49 ok = true 50 } 51 } 52 53 if !ok { 54 t.Fatal("Message not received from the responder") 55 } 56 })) 57 58 messageSentAsync := bsmsg.New(true) 59 messageSentAsync.AddBlock(blocks.NewBlock([]byte("data"))) 60 errSending := waiter.SendMessage( 61 context.Background(), responderPeer.ID(), messageSentAsync) 62 if errSending != nil { 63 t.Fatal(errSending) 64 } 65 66 wg.Wait() // until waiter delegate function is executed 67 } 68 69 type receiverFunc func(ctx context.Context, p peer.ID, 70 incoming bsmsg.BitSwapMessage) 71 72 // lambda returns a Receiver instance given a receiver function 73 func lambda(f receiverFunc) bsnet.Receiver { 74 return &lambdaImpl{ 75 f: f, 76 } 77 } 78 79 type lambdaImpl struct { 80 f func(ctx context.Context, p peer.ID, incoming bsmsg.BitSwapMessage) 81 } 82 83 func (lam *lambdaImpl) ReceiveMessage(ctx context.Context, 84 p peer.ID, incoming bsmsg.BitSwapMessage) { 85 lam.f(ctx, p, incoming) 86 } 87 88 func (lam *lambdaImpl) ReceiveError(err error) { 89 // TODO log error 90 } 91 92 func (lam *lambdaImpl) PeerConnected(p peer.ID) { 93 // TODO 94 } 95 func (lam *lambdaImpl) PeerDisconnected(peer.ID) { 96 // TODO 97 }