github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/exchange/bitswap/testnet/network_test.go (about) 1 package bitswap 2 3 import ( 4 "sync" 5 "testing" 6 7 context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" 8 blocks "github.com/jbenet/go-ipfs/blocks" 9 bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" 10 bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" 11 peer "github.com/jbenet/go-ipfs/peer" 12 ) 13 14 func TestSendRequestToCooperativePeer(t *testing.T) { 15 net := VirtualNetwork() 16 17 idOfRecipient := []byte("recipient") 18 19 t.Log("Get two network adapters") 20 21 initiator := net.Adapter(peer.WithIDString("initiator")) 22 recipient := net.Adapter(peer.WithID(idOfRecipient)) 23 24 expectedStr := "response from recipient" 25 recipient.SetDelegate(lambda(func( 26 ctx context.Context, 27 from peer.Peer, 28 incoming bsmsg.BitSwapMessage) ( 29 peer.Peer, bsmsg.BitSwapMessage) { 30 31 t.Log("Recipient received a message from the network") 32 33 // TODO test contents of incoming message 34 35 m := bsmsg.New() 36 m.AddBlock(*blocks.NewBlock([]byte(expectedStr))) 37 38 return from, m 39 })) 40 41 t.Log("Build a message and send a synchronous request to recipient") 42 43 message := bsmsg.New() 44 message.AddBlock(*blocks.NewBlock([]byte("data"))) 45 response, err := initiator.SendRequest( 46 context.Background(), peer.WithID(idOfRecipient), message) 47 if err != nil { 48 t.Fatal(err) 49 } 50 51 t.Log("Check the contents of the response from recipient") 52 53 for _, blockFromRecipient := range response.Blocks() { 54 if string(blockFromRecipient.Data) == expectedStr { 55 return 56 } 57 } 58 t.Fatal("Should have returned after finding expected block data") 59 } 60 61 func TestSendMessageAsyncButWaitForResponse(t *testing.T) { 62 net := VirtualNetwork() 63 idOfResponder := []byte("responder") 64 waiter := net.Adapter(peer.WithIDString("waiter")) 65 responder := net.Adapter(peer.WithID(idOfResponder)) 66 67 var wg sync.WaitGroup 68 69 wg.Add(1) 70 71 expectedStr := "received async" 72 73 responder.SetDelegate(lambda(func( 74 ctx context.Context, 75 fromWaiter peer.Peer, 76 msgFromWaiter bsmsg.BitSwapMessage) ( 77 peer.Peer, bsmsg.BitSwapMessage) { 78 79 msgToWaiter := bsmsg.New() 80 msgToWaiter.AddBlock(*blocks.NewBlock([]byte(expectedStr))) 81 82 return fromWaiter, msgToWaiter 83 })) 84 85 waiter.SetDelegate(lambda(func( 86 ctx context.Context, 87 fromResponder peer.Peer, 88 msgFromResponder bsmsg.BitSwapMessage) ( 89 peer.Peer, bsmsg.BitSwapMessage) { 90 91 // TODO assert that this came from the correct peer and that the message contents are as expected 92 ok := false 93 for _, b := range msgFromResponder.Blocks() { 94 if string(b.Data) == expectedStr { 95 wg.Done() 96 ok = true 97 } 98 } 99 100 if !ok { 101 t.Fatal("Message not received from the responder") 102 103 } 104 return nil, nil 105 })) 106 107 messageSentAsync := bsmsg.New() 108 messageSentAsync.AddBlock(*blocks.NewBlock([]byte("data"))) 109 errSending := waiter.SendMessage( 110 context.Background(), peer.WithID(idOfResponder), messageSentAsync) 111 if errSending != nil { 112 t.Fatal(errSending) 113 } 114 115 wg.Wait() // until waiter delegate function is executed 116 } 117 118 type receiverFunc func(ctx context.Context, p peer.Peer, 119 incoming bsmsg.BitSwapMessage) (peer.Peer, bsmsg.BitSwapMessage) 120 121 // lambda returns a Receiver instance given a receiver function 122 func lambda(f receiverFunc) bsnet.Receiver { 123 return &lambdaImpl{ 124 f: f, 125 } 126 } 127 128 type lambdaImpl struct { 129 f func(ctx context.Context, p peer.Peer, incoming bsmsg.BitSwapMessage) ( 130 peer.Peer, bsmsg.BitSwapMessage) 131 } 132 133 func (lam *lambdaImpl) ReceiveMessage(ctx context.Context, 134 p peer.Peer, incoming bsmsg.BitSwapMessage) ( 135 peer.Peer, bsmsg.BitSwapMessage) { 136 return lam.f(ctx, p, incoming) 137 } 138 139 func (lam *lambdaImpl) ReceiveError(err error) { 140 // TODO log error 141 }