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  }