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")