provider/mesh: test NotificationInfos OnGossip*
This commit is contained in:
parent
c5d006537b
commit
3ebf21b7b4
|
@ -0,0 +1,141 @@
|
||||||
|
package mesh
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/gob"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/prometheus/common/log"
|
||||||
|
"github.com/weaveworks/mesh"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNotificationInfosOnGossip(t *testing.T) {
|
||||||
|
var (
|
||||||
|
t0 = time.Now()
|
||||||
|
t1 = t0.Add(time.Minute)
|
||||||
|
)
|
||||||
|
cases := []struct {
|
||||||
|
initial map[string]notificationEntry
|
||||||
|
msg map[string]notificationEntry
|
||||||
|
delta map[string]notificationEntry
|
||||||
|
final map[string]notificationEntry
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
initial: map[string]notificationEntry{},
|
||||||
|
msg: map[string]notificationEntry{
|
||||||
|
"123:recv1": {true, t0},
|
||||||
|
},
|
||||||
|
delta: map[string]notificationEntry{
|
||||||
|
"123:recv1": {true, t0},
|
||||||
|
},
|
||||||
|
final: map[string]notificationEntry{
|
||||||
|
"123:recv1": {true, t0},
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
initial: map[string]notificationEntry{
|
||||||
|
"123:recv1": {true, t0},
|
||||||
|
},
|
||||||
|
msg: map[string]notificationEntry{
|
||||||
|
"123:recv1": {false, t1},
|
||||||
|
},
|
||||||
|
delta: map[string]notificationEntry{
|
||||||
|
"123:recv1": {false, t1},
|
||||||
|
},
|
||||||
|
final: map[string]notificationEntry{
|
||||||
|
"123:recv1": {false, t1},
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
initial: map[string]notificationEntry{
|
||||||
|
"123:recv1": {true, t1},
|
||||||
|
},
|
||||||
|
msg: map[string]notificationEntry{
|
||||||
|
"123:recv1": {false, t0},
|
||||||
|
},
|
||||||
|
delta: map[string]notificationEntry{},
|
||||||
|
final: map[string]notificationEntry{
|
||||||
|
"123:recv1": {true, t1},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
ni := NewNotificationInfos(log.Base())
|
||||||
|
|
||||||
|
ni.st.mergeComplete(c.initial)
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := gob.NewEncoder(&buf).Encode(c.msg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// OnGossip expects the delta but an empty set to be replaced with nil.
|
||||||
|
d, err := ni.OnGossip(buf.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v OnGossip %v: %s", c.initial, c.msg, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
want := c.final
|
||||||
|
if have := ni.st.set; !reflect.DeepEqual(want, have) {
|
||||||
|
t.Errorf("%v OnGossip %v: want %v, have %v", c.initial, c.msg, want, have)
|
||||||
|
}
|
||||||
|
|
||||||
|
want = c.delta
|
||||||
|
if len(c.delta) == 0 {
|
||||||
|
want = nil
|
||||||
|
}
|
||||||
|
if d != nil {
|
||||||
|
if have := d.(*notificationState).set; !reflect.DeepEqual(want, have) {
|
||||||
|
t.Errorf("%v OnGossip %v: want %v, have %v", c.initial, c.msg, want, have)
|
||||||
|
}
|
||||||
|
} else if want != nil {
|
||||||
|
t.Errorf("%v OnGossip %v: want nil", c.initial, c.msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
ni := NewNotificationInfos(log.Base())
|
||||||
|
|
||||||
|
ni.st.mergeComplete(c.initial)
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := gob.NewEncoder(&buf).Encode(c.msg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnGossipBroadcast expects the provided delta as is.
|
||||||
|
d, err := ni.OnGossipBroadcast(mesh.UnknownPeerName, buf.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v OnGossipBroadcast %v: %s", c.initial, c.msg, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
want := c.final
|
||||||
|
if have := ni.st.set; !reflect.DeepEqual(want, have) {
|
||||||
|
t.Errorf("%v OnGossip %v: want %v, have %v", c.initial, c.msg, want, have)
|
||||||
|
}
|
||||||
|
|
||||||
|
want = c.delta
|
||||||
|
if have := d.(*notificationState).set; !reflect.DeepEqual(want, have) {
|
||||||
|
t.Errorf("%v OnGossipBroadcast %v: want %v, have %v", c.initial, c.msg, want, have)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
ni := NewNotificationInfos(log.Base())
|
||||||
|
|
||||||
|
ni.st.mergeComplete(c.initial)
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := gob.NewEncoder(&buf).Encode(c.msg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// OnGossipUnicast always expects the full state back.
|
||||||
|
err := ni.OnGossipUnicast(mesh.UnknownPeerName, buf.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v OnGossip %v: %s", c.initial, c.msg, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
want := c.final
|
||||||
|
if have := ni.st.set; !reflect.DeepEqual(want, have) {
|
||||||
|
t.Errorf("%v OnGossip %v: want %v, have %v", c.initial, c.msg, want, have)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue