func TestMerger(t *testing.T) { // Use 3 reports to check the pair-wise merging in SmartMerger report1 := report.MakeReport() report1.Endpoint.AddNode(report.MakeNode("foo")) report2 := report.MakeReport() report2.Endpoint.AddNode(report.MakeNode("bar")) report3 := report.MakeReport() report3.Endpoint.AddNode(report.MakeNode("baz")) reports := []report.Report{ report1, report2, report3, } want := report.MakeReport() want.Endpoint. AddNode(report.MakeNode("foo")). AddNode(report.MakeNode("bar")). AddNode(report.MakeNode("baz")) for _, merger := range []app.Merger{app.MakeDumbMerger(), app.NewSmartMerger()} { // Test the empty list case if have := merger.Merge([]report.Report{}); !reflect.DeepEqual(have, report.MakeReport()) { t.Errorf("Bad merge: %s", test.Diff(have, want)) } if have := merger.Merge(reports); !reflect.DeepEqual(have, want) { t.Errorf("Bad merge: %s", test.Diff(have, want)) } // Repeat the above test to ensure caching works if have := merger.Merge(reports); !reflect.DeepEqual(have, want) { t.Errorf("Bad merge: %s", test.Diff(have, want)) } } }
func TestSets(t *testing.T) { sets := EmptySets.Add("foo", MakeStringSet("bar")) if v, _ := sets.Lookup("foo"); !reflect.DeepEqual(v, MakeStringSet("bar")) { t.Fatal(v) } sets = sets.Merge(EmptySets.Add("foo", MakeStringSet("baz"))) if v, _ := sets.Lookup("foo"); !reflect.DeepEqual(v, MakeStringSet("bar", "baz")) { t.Fatal(v) } }
func TestMetricCopy(t *testing.T) { want := report.MakeMetric() have := want.Copy() if !reflect.DeepEqual(want, have) { t.Errorf("diff: %s", test.Diff(want, have)) } want = report.MakeMetric().Add(time.Now(), 1) have = want.Copy() if !reflect.DeepEqual(want, have) { t.Errorf("diff: %s", test.Diff(want, have)) } }
func TestCountersDeepEquals(t *testing.T) { want := EmptyCounters. Add("foo", 3) have := EmptyCounters. Add("foo", 3) if !reflect.DeepEqual(want, have) { t.Errorf(test.Diff(want, have)) } notequal := EmptyCounters. Add("foo", 4) if reflect.DeepEqual(want, notequal) { t.Errorf(test.Diff(want, have)) } }
func TestLatestMapDeepEquals(t *testing.T) { now := time.Now() want := EmptyLatestMap. Set("foo", now, "Bar") have := EmptyLatestMap. Set("foo", now, "Bar") if !reflect.DeepEqual(want, have) { t.Errorf(test.Diff(want, have)) } notequal := EmptyLatestMap. Set("foo", now, "Baz") if reflect.DeepEqual(want, notequal) { t.Errorf(test.Diff(want, have)) } }
func TestLatestMapDeleteNil(t *testing.T) { want := LatestMap{} have := LatestMap{}.Delete("foo") if !reflect.DeepEqual(want, have) { t.Errorf(test.Diff(want, have)) } }
func TestLatestMapEncodingNil(t *testing.T) { want := LatestMap{} { gobs, err := want.GobEncode() if err != nil { t.Fatal(err) } have := EmptyLatestMap have.GobDecode(gobs) if have.Map == nil { t.Error("Decoded LatestMap.psMap should not be nil") } } { for _, h := range []codec.Handle{ codec.Handle(&codec.MsgpackHandle{}), codec.Handle(&codec.JsonHandle{}), } { buf := &bytes.Buffer{} encoder := codec.NewEncoder(buf, h) want.CodecEncodeSelf(encoder) decoder := codec.NewDecoder(buf, h) have := EmptyLatestMap have.CodecDecodeSelf(decoder) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } } }
func TestMakePluginSpecs(t *testing.T) { for _, testcase := range []struct { inputs []string wants []string }{ {inputs: nil, wants: nil}, { inputs: []string{"a"}, wants: []string{"a"}, }, { inputs: []string{"a", "a"}, wants: []string{"a"}, }, { inputs: []string{"b", "c", "a"}, wants: []string{"a", "b", "c"}, }, } { var inputs []PluginSpec for _, id := range testcase.inputs { inputs = append(inputs, PluginSpec{ID: id}) } have := MakePluginSpecs(inputs...) var haveIDs []string have.ForEach(func(p PluginSpec) { haveIDs = append(haveIDs, p.ID) }) if !reflect.DeepEqual(testcase.wants, haveIDs) { t.Errorf("%#v: want %#v, have %#v", inputs, testcase.wants, haveIDs) } } }
func TestSetsMerge(t *testing.T) { for _, testcase := range []struct { a, b report.Sets want map[string][]string }{ {report.EmptySets, report.EmptySets, map[string][]string{}}, { report.EmptySets, report.EmptySets.Add("a", report.MakeStringSet("b")), map[string][]string{"a": {"b"}}, }, { report.EmptySets, report.EmptySets.Add("a", report.MakeStringSet("b", "c")), map[string][]string{"a": {"b", "c"}}, }, { report.EmptySets.Add("a", report.MakeStringSet("1")).Add("b", report.MakeStringSet("2")), report.EmptySets.Add("c", report.MakeStringSet("3")).Add("b", report.MakeStringSet("3")), map[string][]string{"a": {"1"}, "b": {"2", "3"}, "c": {"3"}}, }, } { haveSets := testcase.a.Merge(testcase.b) have := map[string][]string{} keys := haveSets.Keys() for _, k := range keys { have[k], _ = haveSets.Lookup(k) } if !reflect.DeepEqual(testcase.want, have) { t.Errorf("%+v.Merge(%+v): want %+v, have %+v", testcase.a, testcase.b, testcase.want, have) } } }
func TestApply(t *testing.T) { var ( endpointNodeID = "c" endpointNode = report.MakeNodeWith(endpointNodeID, map[string]string{"5": "6"}) ) p := New(0, 0, nil) p.AddTagger(NewTopologyTagger()) r := report.MakeReport() r.Endpoint.AddNode(endpointNode) r = p.tag(r) for _, tuple := range []struct { want report.Node from report.Topology via string }{ {endpointNode.Merge(report.MakeNode("c").WithTopology(report.Endpoint)), r.Endpoint, endpointNodeID}, } { if want, have := tuple.want, tuple.from.Nodes[tuple.via]; !reflect.DeepEqual(want, have) { t.Errorf("want %+v, have %+v", want, have) } } }
func TestEdgeMetadataDeepEquals(t *testing.T) { for _, c := range []struct { name string a, b interface{} want bool }{ { name: "zero values", a: EdgeMetadata{}, b: EdgeMetadata{}, want: true, }, { name: "matching, but different pointers", a: EdgeMetadata{EgressPacketCount: newu64(3)}, b: EdgeMetadata{EgressPacketCount: newu64(3)}, want: true, }, { name: "mismatching", a: EdgeMetadata{EgressPacketCount: newu64(3)}, b: EdgeMetadata{EgressPacketCount: newu64(4)}, want: false, }, } { if have := reflect.DeepEqual(c.a, c.b); have != c.want { t.Errorf("reflect.DeepEqual(%v, %v) != %v", c.a, c.b, c.want) } } }
func TestHostRenderer(t *testing.T) { have := Prune(render.HostRenderer.Render(fixture.Report, render.FilterNoop)) want := Prune(expected.RenderedHosts) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } }
func TestEdgeMetadatasEncodingNil(t *testing.T) { want := EdgeMetadatas{} { gobs, err := want.GobEncode() if err != nil { t.Fatal(err) } have := EmptyEdgeMetadatas have.GobDecode(gobs) if have.psMap == nil { t.Error("needed to get back a non-nil psMap for EdgeMetadata") } } { for _, h := range []codec.Handle{ codec.Handle(&codec.MsgpackHandle{}), codec.Handle(&codec.JsonHandle{}), } { buf := &bytes.Buffer{} encoder := codec.NewEncoder(buf, h) want.CodecEncodeSelf(encoder) decoder := codec.NewDecoder(buf, h) have := EmptyEdgeMetadatas have.CodecDecodeSelf(decoder) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } } }
func TestContainerHostnameFilterRenderer(t *testing.T) { // add a system container into the topology and ensure // it is filtered out correctly. input := fixture.Report.Copy() clientContainer2ID := "f6g7h8i9j1" clientContainer2NodeID := report.MakeContainerNodeID(clientContainer2ID) input.Container.AddNode(report.MakeNodeWith(clientContainer2NodeID, map[string]string{ docker.LabelPrefix + "works.weave.role": "system", docker.ContainerHostname: fixture.ClientContainerHostname, report.HostNodeID: fixture.ClientHostNodeID, }). WithParents(report.EmptySets. Add("host", report.MakeStringSet(fixture.ClientHostNodeID)), ).WithTopology(report.Container)) have := Prune(render.ContainerHostnameRenderer.Render(input, render.FilterApplication)) want := Prune(expected.RenderedContainerHostnames) // Test works by virtue of the RenderedContainerHostname only having a container // counter == 1 if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } }
func TestContainerRenderer(t *testing.T) { have := Prune(render.ContainerWithImageNameRenderer.Render(fixture.Report, render.FilterNoop)) want := Prune(expected.RenderedContainers) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } }
func TestPodServiceRenderer(t *testing.T) { have := Prune(render.PodServiceRenderer.Render(fixture.Report, nil)) want := Prune(expected.RenderedPodServices) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } }
func TestMakeNodeSet(t *testing.T) { for _, testcase := range []struct { inputs []string wants []string }{ {inputs: nil, wants: nil}, { inputs: []string{"a"}, wants: []string{"a"}, }, { inputs: []string{"b", "c", "a"}, wants: []string{"a", "b", "c"}, }, { inputs: []string{"a", "a", "a"}, wants: []string{"a"}, }, } { var inputs []report.Node for _, id := range testcase.inputs { inputs = append(inputs, report.MakeNode(id)) } set := report.MakeNodeSet(inputs...) var have []string set.ForEach(func(node report.Node) { have = append(have, node.ID) }) if !reflect.DeepEqual(testcase.wants, have) { t.Errorf("%#v: want %#v, have %#v", testcase.inputs, testcase.wants, have) } } }
// Poll repeatedly evaluates condition until we either timeout, or it succeeds. func Poll(t *testing.T, d time.Duration, want interface{}, have func() interface{}) { deadline := time.Now().Add(d) for { if time.Now().After(deadline) { break } if reflect.DeepEqual(want, have()) { return } time.Sleep(d / 10) } h := have() if !reflect.DeepEqual(want, h) { _, file, line, _ := runtime.Caller(1) t.Fatalf("%s:%d: %s", file, line, Diff(want, h)) } }
func TestEdgeMetadataFlatten(t *testing.T) { // Test two EdgeMetadatas flatten to the correct values { have := (EdgeMetadata{ EgressPacketCount: newu64(1), }).Flatten(EdgeMetadata{ EgressPacketCount: newu64(4), EgressByteCount: newu64(8), }) want := EdgeMetadata{ EgressPacketCount: newu64(1 + 4), EgressByteCount: newu64(8), } if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } // Test an EdgeMetadatas flatten to the correct value (should // just sum) { have := EmptyEdgeMetadatas. Add("foo", EdgeMetadata{ EgressPacketCount: newu64(1), }). Add("bar", EdgeMetadata{ EgressPacketCount: newu64(3), }).Flatten() want := EdgeMetadata{ EgressPacketCount: newu64(1 + 3), } if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } { // Should not panic on nil have := EdgeMetadatas{}.Flatten() want := EdgeMetadata{} if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } }
func TestMemoise(t *testing.T) { calls := 0 r := renderFunc(func(rpt report.Report) report.Nodes { calls++ return report.Nodes{rpt.ID: report.MakeNode(rpt.ID)} }) m := render.Memoise(r) rpt1 := report.MakeReport() result1 := m.Render(rpt1, nil) // it should have rendered it. if _, ok := result1[rpt1.ID]; !ok { t.Errorf("Expected rendered report to contain a node, but got: %v", result1) } if calls != 1 { t.Errorf("Expected renderer to have been called the first time") } result2 := m.Render(rpt1, nil) if !reflect.DeepEqual(result1, result2) { t.Errorf("Expected memoised result to be returned: %s", test.Diff(result1, result2)) } if calls != 1 { t.Errorf("Expected renderer to not have been called the second time") } rpt2 := report.MakeReport() result3 := m.Render(rpt2, nil) if reflect.DeepEqual(result1, result3) { t.Errorf("Expected different result for different report, but were the same") } if calls != 2 { t.Errorf("Expected renderer to have been called again for a different report") } render.ResetCache() result4 := m.Render(rpt1, nil) if !reflect.DeepEqual(result1, result4) { t.Errorf("Expected original result to be returned: %s", test.Diff(result1, result4)) } if calls != 3 { t.Errorf("Expected renderer to have been called again after cache reset") } }
func TestNodeSetDelete(t *testing.T) { for _, testcase := range []struct { input report.NodeSet nodes []string want report.NodeSet }{ { input: report.NodeSet{}, nodes: []string{}, want: report.NodeSet{}, }, { input: report.EmptyNodeSet, nodes: []string{}, want: report.EmptyNodeSet, }, { input: report.MakeNodeSet(report.MakeNode("a")), nodes: []string{}, want: report.MakeNodeSet(report.MakeNode("a")), }, { input: report.EmptyNodeSet, nodes: []string{"a"}, want: report.EmptyNodeSet, }, { input: report.MakeNodeSet(report.MakeNode("a")), nodes: []string{"a"}, want: report.EmptyNodeSet, }, { input: report.MakeNodeSet(report.MakeNode("b")), nodes: []string{"a", "b"}, want: report.EmptyNodeSet, }, { input: report.MakeNodeSet(report.MakeNode("a")), nodes: []string{"c", "b"}, want: report.MakeNodeSet(report.MakeNode("a")), }, { input: report.MakeNodeSet(report.MakeNode("a"), report.MakeNode("c")), nodes: []string{"a", "a", "a"}, want: report.MakeNodeSet(report.MakeNode("c")), }, } { originalLen := testcase.input.Size() if want, have := testcase.want, testcase.input.Delete(testcase.nodes...); !reflect.DeepEqual(want, have) { t.Errorf("%v + %v: want %v, have %v", testcase.input, testcase.nodes, want, have) } if testcase.input.Size() != originalLen { t.Errorf("%v + %v: modified the original input!", testcase.input, testcase.nodes) } } }
func TestLatestMapDelete(t *testing.T) { now := time.Now() want := EmptyLatestMap have := EmptyLatestMap. Set("foo", now, "Baz"). Delete("foo") if !reflect.DeepEqual(want, have) { t.Errorf(test.Diff(want, have)) } }
func checkLoadedPlugins(t *testing.T, forEach iterator, expected []xfer.PluginSpec) { var plugins []xfer.PluginSpec forEach(func(p *Plugin) { plugins = append(plugins, p.PluginSpec) }) sort.Sort(xfer.PluginSpecsByID(plugins)) if !reflect.DeepEqual(plugins, expected) { t.Fatalf(test.Diff(expected, plugins)) } }
func TestMetricsCopy(t *testing.T) { t1 := time.Now() want := report.Metrics{ "metric1": report.MakeMetric().Add(t1, 0.1), } delete(want.Copy(), "metric1") // Modify a copy have := want.Copy() // Check the original wasn't affected if !reflect.DeepEqual(want, have) { t.Errorf("diff: %s", test.Diff(want, have)) } }
func TestEdgeMetadataReversed(t *testing.T) { have := EdgeMetadata{ EgressPacketCount: newu64(1), }.Reversed() want := EdgeMetadata{ IngressPacketCount: newu64(1), } if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } }
func TestPluginSpecsMerge(t *testing.T) { for _, testcase := range []struct { input PluginSpecs other PluginSpecs want PluginSpecs }{ {input: PluginSpecs{}, other: PluginSpecs{}, want: PluginSpecs{}}, {input: EmptyPluginSpecs, other: EmptyPluginSpecs, want: EmptyPluginSpecs}, { input: MakePluginSpecs(PluginSpec{ID: "a"}), other: EmptyPluginSpecs, want: MakePluginSpecs(PluginSpec{ID: "a"}), }, { input: EmptyPluginSpecs, other: MakePluginSpecs(PluginSpec{ID: "a"}), want: MakePluginSpecs(PluginSpec{ID: "a"}), }, { input: MakePluginSpecs(PluginSpec{ID: "a"}), other: MakePluginSpecs(PluginSpec{ID: "b"}), want: MakePluginSpecs(PluginSpec{ID: "a"}, PluginSpec{ID: "b"}), }, { input: MakePluginSpecs(PluginSpec{ID: "b"}), other: MakePluginSpecs(PluginSpec{ID: "a"}), want: MakePluginSpecs(PluginSpec{ID: "a"}, PluginSpec{ID: "b"}), }, { input: MakePluginSpecs(PluginSpec{ID: "a"}), other: MakePluginSpecs(PluginSpec{ID: "a"}), want: MakePluginSpecs(PluginSpec{ID: "a"}), }, { input: MakePluginSpecs(PluginSpec{ID: "a"}, PluginSpec{ID: "c"}), other: MakePluginSpecs(PluginSpec{ID: "a"}, PluginSpec{ID: "b"}), want: MakePluginSpecs(PluginSpec{ID: "a"}, PluginSpec{ID: "b"}, PluginSpec{ID: "c"}), }, { input: MakePluginSpecs(PluginSpec{ID: "b"}), other: MakePluginSpecs(PluginSpec{ID: "a"}), want: MakePluginSpecs(PluginSpec{ID: "a"}, PluginSpec{ID: "b"}), }, } { originalLen := testcase.input.Size() if want, have := testcase.want, testcase.input.Merge(testcase.other); !reflect.DeepEqual(want, have) { t.Errorf("%v + %v: want %v, have %v", testcase.input, testcase.other, want, have) } if testcase.input.Size() != originalLen { t.Errorf("%v + %v: modified the original input!", testcase.input, testcase.other) } } }
func TestNodeSetMerge(t *testing.T) { for _, testcase := range []struct { input report.NodeSet other report.NodeSet want report.NodeSet }{ {input: report.NodeSet{}, other: report.NodeSet{}, want: report.NodeSet{}}, {input: report.EmptyNodeSet, other: report.EmptyNodeSet, want: report.EmptyNodeSet}, { input: report.MakeNodeSet(report.MakeNode("a")), other: report.EmptyNodeSet, want: report.MakeNodeSet(report.MakeNode("a")), }, { input: report.EmptyNodeSet, other: report.MakeNodeSet(report.MakeNode("a")), want: report.MakeNodeSet(report.MakeNode("a")), }, { input: report.MakeNodeSet(report.MakeNode("a")), other: report.MakeNodeSet(report.MakeNode("b")), want: report.MakeNodeSet(report.MakeNode("a"), report.MakeNode("b")), }, { input: report.MakeNodeSet(report.MakeNode("b")), other: report.MakeNodeSet(report.MakeNode("a")), want: report.MakeNodeSet(report.MakeNode("a"), report.MakeNode("b")), }, { input: report.MakeNodeSet(report.MakeNode("a")), other: report.MakeNodeSet(report.MakeNode("a")), want: report.MakeNodeSet(report.MakeNode("a")), }, { input: report.MakeNodeSet(report.MakeNode("a"), report.MakeNode("c")), other: report.MakeNodeSet(report.MakeNode("a"), report.MakeNode("b")), want: report.MakeNodeSet(report.MakeNode("a"), report.MakeNode("b"), report.MakeNode("c")), }, { input: report.MakeNodeSet(report.MakeNode("b")), other: report.MakeNodeSet(report.MakeNode("a")), want: report.MakeNodeSet(report.MakeNode("a"), report.MakeNode("b")), }, } { originalLen := testcase.input.Size() if want, have := testcase.want, testcase.input.Merge(testcase.other); !reflect.DeepEqual(want, have) { t.Errorf("%v + %v: want %v, have %v", testcase.input, testcase.other, want, have) } if testcase.input.Size() != originalLen { t.Errorf("%v + %v: modified the original input!", testcase.input, testcase.other) } } }
func TestCollectorExpire(t *testing.T) { now := time.Now() mtime.NowForce(now) defer mtime.NowReset() ctx := context.Background() window := 10 * time.Second c := app.NewCollector(window) // 1st check the collector is empty have, err := c.Report(ctx) if err != nil { t.Error(err) } if want := report.MakeReport(); !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } // Now check an added report is returned r1 := report.MakeReport() r1.Endpoint.AddNode(report.MakeNode("foo")) c.Add(ctx, r1) have, err = c.Report(ctx) if err != nil { t.Error(err) } if want := r1; !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } // Finally move time forward to expire the report mtime.NowForce(now.Add(window)) have, err = c.Report(ctx) if err != nil { t.Error(err) } if want := report.MakeReport(); !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } }
func TestCollector(t *testing.T) { ctx := context.Background() window := 10 * time.Second c := app.NewCollector(window) r1 := report.MakeReport() r1.Endpoint.AddNode(report.MakeNode("foo")) r2 := report.MakeReport() r2.Endpoint.AddNode(report.MakeNode("foo")) have, err := c.Report(ctx) if err != nil { t.Error(err) } if want := report.MakeReport(); !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } c.Add(ctx, r1) have, err = c.Report(ctx) if err != nil { t.Error(err) } if want := r1; !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } c.Add(ctx, r2) merged := report.MakeReport() merged = merged.Merge(r1) merged = merged.Merge(r2) have, err = c.Report(ctx) if err != nil { t.Error(err) } if want := merged; !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } }
func TestEdgeMetadatasEncoding(t *testing.T) { want := EmptyEdgeMetadatas. Add("foo", EdgeMetadata{ EgressPacketCount: newu64(1), }). Add("bar", EdgeMetadata{ EgressPacketCount: newu64(3), }) { gobs, err := want.GobEncode() if err != nil { t.Fatal(err) } have := EmptyEdgeMetadatas have.GobDecode(gobs) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } { for _, h := range []codec.Handle{ codec.Handle(&codec.MsgpackHandle{}), codec.Handle(&codec.JsonHandle{}), } { buf := &bytes.Buffer{} encoder := codec.NewEncoder(buf, h) want.CodecEncodeSelf(encoder) decoder := codec.NewDecoder(buf, h) have := EmptyEdgeMetadatas have.CodecDecodeSelf(decoder) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } } }