From 6127cfeb3bad4f648cdc06e3ed23d2786188b5c5 Mon Sep 17 00:00:00 2001 From: Lewis Marshall Date: Fri, 22 Sep 2017 00:23:26 +0100 Subject: [PATCH] p2p/simulations: Fix HTTP message filter tests Signed-off-by: Lewis Marshall --- p2p/simulations/events.go | 2 +- p2p/simulations/http_test.go | 109 ++++++++++++++++++----------------- 2 files changed, 57 insertions(+), 54 deletions(-) diff --git a/p2p/simulations/events.go b/p2p/simulations/events.go index 271af8415b..f17958c689 100644 --- a/p2p/simulations/events.go +++ b/p2p/simulations/events.go @@ -101,7 +101,7 @@ func (e *Event) String() string { case EventTypeConn: return fmt.Sprintf(" nodes: %s->%s up: %t", e.Conn.One.TerminalString(), e.Conn.Other.TerminalString(), e.Conn.Up) case EventTypeMsg: - return fmt.Sprintf(" nodes: %s->%s code: %d, received: %t", e.Msg.One.TerminalString(), e.Msg.Other.TerminalString(), e.Msg.Code, e.Msg.Received) + return fmt.Sprintf(" nodes: %s->%s proto: %s, code: %d, received: %t", e.Msg.One.TerminalString(), e.Msg.Other.TerminalString(), e.Msg.Protocol, e.Msg.Code, e.Msg.Received) default: return "" } diff --git a/p2p/simulations/http_test.go b/p2p/simulations/http_test.go index e21ab959da..677a8fb147 100644 --- a/p2p/simulations/http_test.go +++ b/p2p/simulations/http_test.go @@ -21,6 +21,7 @@ import ( "fmt" "math/rand" "net/http/httptest" + "reflect" "sync" "sync/atomic" "testing" @@ -316,7 +317,7 @@ func TestHTTPNetwork(t *testing.T) { nodeIDs := startTestNetwork(t, client) // check we got all the events - x := &expectEvents{t, events, sub, false} + x := &expectEvents{t, events, sub} x.expect( x.nodeEvent(nodeIDs[0], false), x.nodeEvent(nodeIDs[1], false), @@ -334,7 +335,7 @@ func TestHTTPNetwork(t *testing.T) { t.Fatalf("error subscribing to network events: %s", err) } defer sub.Unsubscribe() - x = &expectEvents{t, events, sub, false} + x = &expectEvents{t, events, sub} x.expect( x.nodeEvent(nodeIDs[0], true), x.nodeEvent(nodeIDs[1], true), @@ -399,9 +400,8 @@ func startTestNetwork(t *testing.T, client *Client) []string { type expectEvents struct { *testing.T - events chan *Event - sub event.Subscription - msgOnly bool + events chan *Event + sub event.Subscription } func (t *expectEvents) nodeEvent(id string, up bool) *Event { @@ -427,28 +427,49 @@ func (t *expectEvents) connEvent(one, other string, up bool) *Event { } } -func (t *expectEvents) msgEvent(proto string, code uint64) *Event { - return &Event{ - Type: EventTypeMsg, - Msg: &Msg{ - Protocol: proto, - Code: code, - }, - } -} - -func (t *expectEvents) expect(events ...*Event) { +func (t *expectEvents) expectMsgs(expected map[MsgFilter]int) { + actual := make(map[MsgFilter]int) timeout := time.After(10 * time.Second) - i := 0 loop: for { select { case event := <-t.events: t.Logf("received %s event: %s", event.Type, event) - if t.msgOnly && (event.Type != EventTypeMsg || event.Msg.Received) { + if event.Type != EventTypeMsg || event.Msg.Received { continue loop } + if event.Msg == nil { + t.Fatal("expected event.Msg to be set") + } + filter := MsgFilter{ + Proto: event.Msg.Protocol, + Code: int64(event.Msg.Code), + } + actual[filter]++ + if actual[filter] > expected[filter] { + t.Fatalf("received too many msgs for filter: %v", filter) + } + if reflect.DeepEqual(actual, expected) { + return + } + + case err := <-t.sub.Err(): + t.Fatalf("network stream closed unexpectedly: %s", err) + + case <-timeout: + t.Fatal("timed out waiting for expected events") + } + } +} + +func (t *expectEvents) expect(events ...*Event) { + timeout := time.After(10 * time.Second) + i := 0 + for { + select { + case event := <-t.events: + t.Logf("received %s event: %s", event.Type, event) expected := events[i] if event.Type != expected.Type { @@ -482,17 +503,6 @@ loop: t.Fatalf("expected conn event %d to have up=%t, got up=%t", i, expected.Conn.Up, event.Conn.Up) } - case EventTypeMsg: - if event.Msg == nil { - t.Fatal("expected event.Msg to be set") - } - if event.Msg.Protocol != expected.Msg.Protocol { - t.Fatalf("expected msg event %d to have protocol %q, got %q", i, expected.Msg.Protocol, event.Msg.Protocol) - } - if event.Msg.Code != expected.Msg.Code { - t.Fatalf("expected msg event %d to have code %d, got %d", i, expected.Msg.Code, event.Msg.Code) - } - } i++ @@ -680,7 +690,7 @@ func TestHTTPSnapshot(t *testing.T) { } // check we got all the events - x := &expectEvents{t, events, sub, false} + x := &expectEvents{t, events, sub} x.expect( x.nodeEvent(nodes[0].ID, false), x.nodeEvent(nodes[0].ID, true), @@ -714,13 +724,11 @@ func TestMsgFilterPassMultiple(t *testing.T) { startTestNetwork(t, client) // check we got the expected events - x := &expectEvents{t, events, sub, true} - x.expect( - x.msgEvent("test", 0), - x.msgEvent("test", 0), - x.msgEvent("prb", 0), - x.msgEvent("prb", 0), - ) + x := &expectEvents{t, events, sub} + x.expectMsgs(map[MsgFilter]int{ + {"test", 0}: 2, + {"prb", 0}: 2, + }) } // TestMsgFilterPassWildcard tests streaming message events using a filter @@ -746,17 +754,13 @@ func TestMsgFilterPassWildcard(t *testing.T) { startTestNetwork(t, client) // check we got the expected events - x := &expectEvents{t, events, sub, true} - x.expect( - x.msgEvent("test", 2), - x.msgEvent("test", 2), - x.msgEvent("test", 1), - x.msgEvent("test", 1), - x.msgEvent("test", 0), - x.msgEvent("test", 0), - x.msgEvent("prb", 0), - x.msgEvent("prb", 0), - ) + x := &expectEvents{t, events, sub} + x.expectMsgs(map[MsgFilter]int{ + {"test", 2}: 2, + {"test", 1}: 2, + {"test", 0}: 2, + {"prb", 0}: 2, + }) } // TestMsgFilterPassSingle tests streaming message events using a filter @@ -782,11 +786,10 @@ func TestMsgFilterPassSingle(t *testing.T) { startTestNetwork(t, client) // check we got the expected events - x := &expectEvents{t, events, sub, true} - x.expect( - x.msgEvent("dum", 0), - x.msgEvent("dum", 0), - ) + x := &expectEvents{t, events, sub} + x.expectMsgs(map[MsgFilter]int{ + {"dum", 0}: 2, + }) } // TestMsgFilterPassSingle tests streaming message events using an invalid