Skip to content

Commit

Permalink
add test for topic score parameter reset
Browse files Browse the repository at this point in the history
  • Loading branch information
vyzo committed Sep 9, 2020
1 parent 5d06aa2 commit 26bb273
Showing 1 changed file with 97 additions and 0 deletions.
97 changes: 97 additions & 0 deletions score_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -842,6 +842,103 @@ func TestScoreRetention(t *testing.T) {
}
}

func TestScoreResetTopicParams(t *testing.T) {
// Create parameters with reasonable default values
mytopic := "mytopic"
params := &PeerScoreParams{
AppSpecificScore: func(peer.ID) float64 { return 0 },
Topics: make(map[string]*TopicScoreParams),
}
topicScoreParams := &TopicScoreParams{
TopicWeight: 1,

MeshMessageDeliveriesWeight: -1,
MeshMessageDeliveriesActivation: time.Second,
MeshMessageDeliveriesWindow: 10 * time.Millisecond,
MeshMessageDeliveriesThreshold: 20,
MeshMessageDeliveriesCap: 100,
MeshMessageDeliveriesDecay: 1.0, // no decay for this test

FirstMessageDeliveriesWeight: 10,
FirstMessageDeliveriesDecay: 1.0, // no decay for this test
FirstMessageDeliveriesCap: 100,

TimeInMeshQuantum: time.Second,
}

params.Topics[mytopic] = topicScoreParams

// peer A always delivers the message first.
// peer B delivers next (within the delivery window).
// peer C delivers outside the delivery window.
// we expect peers A and B to have a score of zero, since all other parameter weights are zero.
// Peer C should have a negative score.
peerA := peer.ID("A")
peerB := peer.ID("B")
peers := []peer.ID{peerA, peerB}

ps := newPeerScore(params)
for _, p := range peers {
ps.AddPeer(p, "myproto")
ps.Graft(p, mytopic)
}

// deliver a bunch of messages from peer A, with duplicates within the window from peer B,
nMessages := 100
for i := 0; i < nMessages; i++ {
pbMsg := makeTestMessage(i)
pbMsg.TopicIDs = []string{mytopic}
msg := Message{ReceivedFrom: peerA, Message: pbMsg}
ps.ValidateMessage(&msg)
ps.DeliverMessage(&msg)

msg.ReceivedFrom = peerB
ps.DuplicateMessage(&msg)
}

// check that the FirstMessageDeliveries for peerA and MeshMessageDeliveries for PeerB is
// at 100
if ps.peerStats[peerA].topics[mytopic].firstMessageDeliveries != 100 {
t.Fatalf("expected 100 FirstMessageDeliveries for peerA, but got %f", ps.peerStats[peerA].topics[mytopic].firstMessageDeliveries)
}
// check that the MeshMessageDeliveries for peerB and MeshMessageDeliveries for PeerB is
// at 100
if ps.peerStats[peerB].topics[mytopic].meshMessageDeliveries != 100 {
t.Fatalf("expected 100 MeshMessageDeliveries for peerB, but got %f", ps.peerStats[peerB].topics[mytopic].meshMessageDeliveries)
}

// reset the topic paramaters recapping the deliveries counters
newTopicScoreParams := &TopicScoreParams{
TopicWeight: 1,

MeshMessageDeliveriesWeight: -1,
MeshMessageDeliveriesActivation: time.Second,
MeshMessageDeliveriesWindow: 10 * time.Millisecond,
MeshMessageDeliveriesThreshold: 20,
MeshMessageDeliveriesCap: 50,
MeshMessageDeliveriesDecay: 1.0, // no decay for this test

FirstMessageDeliveriesWeight: 10,
FirstMessageDeliveriesDecay: 1.0, // no decay for this test
FirstMessageDeliveriesCap: 50,

TimeInMeshQuantum: time.Second,
}

err := ps.SetTopicScoreParams(mytopic, newTopicScoreParams)
if err != nil {
t.Fatal(err)
}

// verify that the counters got recapped
if ps.peerStats[peerA].topics[mytopic].firstMessageDeliveries != 50 {
t.Fatalf("expected 50 FirstMessageDeliveries for peerA, but got %f", ps.peerStats[peerA].topics[mytopic].firstMessageDeliveries)
}
if ps.peerStats[peerB].topics[mytopic].meshMessageDeliveries != 50 {
t.Fatalf("expected 50 MeshMessageDeliveries for peerB, but got %f", ps.peerStats[peerB].topics[mytopic].meshMessageDeliveries)
}
}

func withinVariance(score float64, expected float64, variance float64) bool {
if expected >= 0 {
return score > expected*(1-variance) && score < expected*(1+variance)
Expand Down

0 comments on commit 26bb273

Please sign in to comment.