Commit d2ea3d25 authored by Brian Tiger Chow's avatar Brian Tiger Chow

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
parent ff4b979d
...@@ -24,6 +24,10 @@ type Strategy interface { ...@@ -24,6 +24,10 @@ type Strategy interface {
// MessageSent records sending of message for accounting purposes // MessageSent records sending of message for accounting purposes
MessageSent(*peer.Peer, bsmsg.BitSwapMessage) error MessageSent(*peer.Peer, bsmsg.BitSwapMessage) error
NumBytesSentTo(*peer.Peer) uint64
NumBytesReceivedFrom(*peer.Peer) uint64
} }
type WantList interface { type WantList interface {
......
...@@ -76,6 +76,14 @@ func (s *strategist) MessageSent(p *peer.Peer, m bsmsg.BitSwapMessage) error { ...@@ -76,6 +76,14 @@ func (s *strategist) MessageSent(p *peer.Peer, m bsmsg.BitSwapMessage) error {
return nil return nil
} }
func (s *strategist) NumBytesSentTo(p *peer.Peer) uint64 {
return s.ledger(p).Accounting.BytesSent
}
func (s *strategist) NumBytesReceivedFrom(p *peer.Peer) uint64 {
return s.ledger(p).Accounting.BytesRecv
}
// ledger lazily instantiates a ledger // ledger lazily instantiates a ledger
func (s *strategist) ledger(p *peer.Peer) *ledger { func (s *strategist) ledger(p *peer.Peer) *ledger {
l, ok := s.ledgerMap[peerKey(p.Key())] l, ok := s.ledgerMap[peerKey(p.Key())]
......
package strategy package strategy
import ( import (
"strings"
"testing" "testing"
message "github.com/jbenet/go-ipfs/exchange/bitswap/message" message "github.com/jbenet/go-ipfs/exchange/bitswap/message"
"github.com/jbenet/go-ipfs/peer" peer "github.com/jbenet/go-ipfs/peer"
"github.com/jbenet/go-ipfs/util/testutil" testutil "github.com/jbenet/go-ipfs/util/testutil"
) )
type peerAndStrategist struct { type peerAndStrategist struct {
...@@ -20,6 +21,38 @@ func newPeerAndStrategist(idStr string) peerAndStrategist { ...@@ -20,6 +21,38 @@ func newPeerAndStrategist(idStr string) peerAndStrategist {
} }
} }
func TestConsistentAccounting(t *testing.T) {
sender := newPeerAndStrategist("Ernie")
receiver := newPeerAndStrategist("Bert")
// Send messages from Ernie to Bert
for i := 0; i < 1000; i++ {
m := message.New()
content := []string{"this", "is", "message", "i"}
m.AppendBlock(testutil.NewBlockOrFail(t, strings.Join(content, " ")))
sender.MessageSent(receiver.Peer, m)
receiver.MessageReceived(sender.Peer, m)
}
// Ensure sender records the change
if sender.NumBytesSentTo(receiver.Peer) == 0 {
t.Fatal("Sent bytes were not recorded")
}
// Ensure sender and receiver have the same values
if sender.NumBytesSentTo(receiver.Peer) != receiver.NumBytesReceivedFrom(sender.Peer) {
t.Fatal("Inconsistent book-keeping. Strategies don't agree")
}
// Ensure sender didn't record receving anything. And that the receiver
// didn't record sending anything
if receiver.NumBytesSentTo(sender.Peer) != 0 || sender.NumBytesReceivedFrom(receiver.Peer) != 0 {
t.Fatal("Bert didn't send bytes to Ernie")
}
}
func TestBlockRecordedAsWantedAfterMessageReceived(t *testing.T) { func TestBlockRecordedAsWantedAfterMessageReceived(t *testing.T) {
beggar := newPeerAndStrategist("can't be chooser") beggar := newPeerAndStrategist("can't be chooser")
chooser := newPeerAndStrategist("chooses JIF") chooser := newPeerAndStrategist("chooses JIF")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment