github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/exchange/bitswap/strategy/strategy_test.go (about)

     1  package strategy
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	blocks "github.com/jbenet/go-ipfs/blocks"
     8  	message "github.com/jbenet/go-ipfs/exchange/bitswap/message"
     9  	peer "github.com/jbenet/go-ipfs/peer"
    10  )
    11  
    12  type peerAndStrategist struct {
    13  	peer.Peer
    14  	Strategy
    15  }
    16  
    17  func newPeerAndStrategist(idStr string) peerAndStrategist {
    18  	return peerAndStrategist{
    19  		Peer:     peer.WithIDString(idStr),
    20  		Strategy: New(true),
    21  	}
    22  }
    23  
    24  func TestConsistentAccounting(t *testing.T) {
    25  	sender := newPeerAndStrategist("Ernie")
    26  	receiver := newPeerAndStrategist("Bert")
    27  
    28  	// Send messages from Ernie to Bert
    29  	for i := 0; i < 1000; i++ {
    30  
    31  		m := message.New()
    32  		content := []string{"this", "is", "message", "i"}
    33  		m.AddBlock(*blocks.NewBlock([]byte(strings.Join(content, " "))))
    34  
    35  		sender.MessageSent(receiver.Peer, m)
    36  		receiver.MessageReceived(sender.Peer, m)
    37  	}
    38  
    39  	// Ensure sender records the change
    40  	if sender.NumBytesSentTo(receiver.Peer) == 0 {
    41  		t.Fatal("Sent bytes were not recorded")
    42  	}
    43  
    44  	// Ensure sender and receiver have the same values
    45  	if sender.NumBytesSentTo(receiver.Peer) != receiver.NumBytesReceivedFrom(sender.Peer) {
    46  		t.Fatal("Inconsistent book-keeping. Strategies don't agree")
    47  	}
    48  
    49  	// Ensure sender didn't record receving anything. And that the receiver
    50  	// didn't record sending anything
    51  	if receiver.NumBytesSentTo(sender.Peer) != 0 || sender.NumBytesReceivedFrom(receiver.Peer) != 0 {
    52  		t.Fatal("Bert didn't send bytes to Ernie")
    53  	}
    54  }
    55  
    56  func TestBlockRecordedAsWantedAfterMessageReceived(t *testing.T) {
    57  	beggar := newPeerAndStrategist("can't be chooser")
    58  	chooser := newPeerAndStrategist("chooses JIF")
    59  
    60  	block := blocks.NewBlock([]byte("data wanted by beggar"))
    61  
    62  	messageFromBeggarToChooser := message.New()
    63  	messageFromBeggarToChooser.AddWanted(block.Key())
    64  
    65  	chooser.MessageReceived(beggar.Peer, messageFromBeggarToChooser)
    66  	// for this test, doesn't matter if you record that beggar sent
    67  
    68  	if !chooser.BlockIsWantedByPeer(block.Key(), beggar.Peer) {
    69  		t.Fatal("chooser failed to record that beggar wants block")
    70  	}
    71  }
    72  
    73  func TestPeerIsAddedToPeersWhenMessageReceivedOrSent(t *testing.T) {
    74  
    75  	sanfrancisco := newPeerAndStrategist("sf")
    76  	seattle := newPeerAndStrategist("sea")
    77  
    78  	m := message.New()
    79  
    80  	sanfrancisco.MessageSent(seattle.Peer, m)
    81  	seattle.MessageReceived(sanfrancisco.Peer, m)
    82  
    83  	if seattle.Peer.Key() == sanfrancisco.Peer.Key() {
    84  		t.Fatal("Sanity Check: Peers have same Key!")
    85  	}
    86  
    87  	if !peerIsPartner(seattle.Peer, sanfrancisco.Strategy) {
    88  		t.Fatal("Peer wasn't added as a Partner")
    89  	}
    90  
    91  	if !peerIsPartner(sanfrancisco.Peer, seattle.Strategy) {
    92  		t.Fatal("Peer wasn't added as a Partner")
    93  	}
    94  }
    95  
    96  func peerIsPartner(p peer.Peer, s Strategy) bool {
    97  	for _, partner := range s.Peers() {
    98  		if partner.Key() == p.Key() {
    99  			return true
   100  		}
   101  	}
   102  	return false
   103  }