@cryptotaxi247 / kubo / commits / 5cec6197a

test(exch:bs:strategy) test accounting consistency

> Why expose num bytes sent and received? Makes it easy to test consistency of the ledgers > Got a better reason? Makes it possible to expose metrics to the people-facing API

Brian Tiger Chow committed Sep 18, 2014 at 18:13 UTC 5cec6197ae39aedfec3d5f5e14a5d34add0995dd
3 files changed +47 -2
exchange/bitswap/strategy/interface.go
+4
@@ -24,6 +24,10 @@ type Strategy interface {
24
25 // MessageSent records sending of message for accounting purposes
26 MessageSent(*peer.Peer, bsmsg.BitSwapMessage) error
27 +
28 + NumBytesSentTo(*peer.Peer) uint64
29 +
30 + NumBytesReceivedFrom(*peer.Peer) uint64
31 }
32
33 type WantList interface {
exchange/bitswap/strategy/strategy.go
+8
@@ -76,6 +76,14 @@ func (s *strategist) MessageSent(p *peer.Peer, m bsmsg.BitSwapMessage) error {
76 return nil
77 }
78
79 +func (s *strategist) NumBytesSentTo(p *peer.Peer) uint64 {
80 + return s.ledger(p).Accounting.BytesSent
81 +}
82 +
83 +func (s *strategist) NumBytesReceivedFrom(p *peer.Peer) uint64 {
84 + return s.ledger(p).Accounting.BytesRecv
85 +}
86 +
87 // ledger lazily instantiates a ledger
88 func (s *strategist) ledger(p *peer.Peer) *ledger {
89 l, ok := s.ledgerMap[peerKey(p.Key())]
exchange/bitswap/strategy/strategy_test.go
+35 -2
@@ -1,11 +1,12 @@
1 package strategy
2
3 import (
4 + "strings"
5 "testing"
6
7 message "github.com/jbenet/go-ipfs/exchange/bitswap/message"
7 - "github.com/jbenet/go-ipfs/peer"
8 - "github.com/jbenet/go-ipfs/util/testutil"
8 + peer "github.com/jbenet/go-ipfs/peer"
9 + testutil "github.com/jbenet/go-ipfs/util/testutil"
10 )
11
12 type peerAndStrategist struct {
@@ -20,6 +21,38 @@ func newPeerAndStrategist(idStr string) peerAndStrategist {
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.AppendBlock(testutil.NewBlockOrFail(t, 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")