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  }