func TestMergeRenderableNode(t *testing.T) { node1 := render.RenderableNode{ ID: "foo", LabelMajor: "", LabelMinor: "minor", Rank: "", Pseudo: false, Node: report.MakeNode().WithAdjacent("a1"), Children: report.MakeNodeSet(report.MakeNode().WithID("child1")), } node2 := render.RenderableNode{ ID: "foo", LabelMajor: "major", LabelMinor: "", Rank: "rank", Pseudo: false, Node: report.MakeNode().WithAdjacent("a2"), Children: report.MakeNodeSet(report.MakeNode().WithID("child2")), } want := render.RenderableNode{ ID: "foo", LabelMajor: "major", LabelMinor: "minor", Rank: "rank", Pseudo: false, Node: report.MakeNode().WithID("foo").WithAdjacent("a1").WithAdjacent("a2"), Children: report.MakeNodeSet(report.MakeNode().WithID("child1"), report.MakeNode().WithID("child2")), EdgeMetadata: report.EdgeMetadata{}, }.Prune() have := node1.Merge(node2).Prune() 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) } } }
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) } } }
// PruneNode returns a copy of the Node with all information not strictly // necessary for rendering nodes and edges stripped away. Specifically, that // means cutting out parts of the Node. func PruneNode(node report.Node) report.Node { prunedChildren := report.MakeNodeSet() node.Children.ForEach(func(child report.Node) { prunedChildren = prunedChildren.Add(PruneNode(child)) }) return report.MakeNode( node.ID). WithTopology(node.Topology). WithAdjacent(node.Adjacency.Copy()...). WithChildren(prunedChildren) }
func TestMakeNodeSet(t *testing.T) { for _, testcase := range []struct { inputs []nodeSpec wants []nodeSpec }{ {inputs: nil, wants: nil}, {inputs: []nodeSpec{}, wants: []nodeSpec{}}, { inputs: []nodeSpec{{"", "a"}}, wants: []nodeSpec{{"", "a"}}, }, { inputs: []nodeSpec{{"", "a"}, {"", "a"}, {"1", "a"}}, wants: []nodeSpec{{"", "a"}, {"1", "a"}}, }, { inputs: []nodeSpec{{"", "b"}, {"", "c"}, {"", "a"}}, wants: []nodeSpec{{"", "a"}, {"", "b"}, {"", "c"}}, }, { inputs: []nodeSpec{{"2", "a"}, {"3", "a"}, {"1", "a"}}, wants: []nodeSpec{{"1", "a"}, {"2", "a"}, {"3", "a"}}, }, } { var ( inputs []report.Node wants []report.Node ) for _, spec := range testcase.inputs { inputs = append(inputs, report.MakeNode().WithTopology(spec.topology).WithID(spec.id)) } for _, spec := range testcase.wants { wants = append(wants, report.MakeNode().WithTopology(spec.topology).WithID(spec.id)) } if want, have := report.MakeNodeSet(wants...), report.MakeNodeSet(inputs...); !reflect.DeepEqual(want, have) { t.Errorf("%#v: want %#v, have %#v", inputs, wants, have) } } }
func BenchmarkMakeNodeSet(b *testing.B) { nodes := []report.Node{} for i := 1000; i >= 0; i-- { nodes = append(nodes, report.MakeNodeWith(fmt.Sprint(i), map[string]string{ "a": "1", "b": "2", })) } b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { benchmarkResult = report.MakeNodeSet(nodes...) } }
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().WithID("a")), other: report.EmptyNodeSet, want: report.MakeNodeSet(report.MakeNode().WithID("a")), }, { input: report.EmptyNodeSet, other: report.MakeNodeSet(report.MakeNode().WithID("a")), want: report.MakeNodeSet(report.MakeNode().WithID("a")), }, { input: report.MakeNodeSet(report.MakeNode().WithID("a")), other: report.MakeNodeSet(report.MakeNode().WithID("b")), want: report.MakeNodeSet(report.MakeNode().WithID("a"), report.MakeNode().WithID("b")), }, { input: report.MakeNodeSet(report.MakeNode().WithID("b")), other: report.MakeNodeSet(report.MakeNode().WithID("a")), want: report.MakeNodeSet(report.MakeNode().WithID("a"), report.MakeNode().WithID("b")), }, { input: report.MakeNodeSet(report.MakeNode().WithID("a")), other: report.MakeNodeSet(report.MakeNode().WithID("a")), want: report.MakeNodeSet(report.MakeNode().WithID("a")), }, { input: report.MakeNodeSet(report.MakeNode().WithID("a"), report.MakeNode().WithID("c")), other: report.MakeNodeSet(report.MakeNode().WithID("a"), report.MakeNode().WithID("b")), want: report.MakeNodeSet(report.MakeNode().WithID("a"), report.MakeNode().WithID("b"), report.MakeNode().WithID("c")), }, { input: report.MakeNodeSet(report.MakeNode().WithID("b")), other: report.MakeNodeSet(report.MakeNode().WithID("a")), want: report.MakeNodeSet(report.MakeNode().WithID("a"), report.MakeNode().WithID("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) } } }
render.TheInternetID: theInternetNode(ServerProcessID), }).Prune() ServerProcessRenderedID = render.MakeProcessID(fixture.ServerHostID, fixture.ServerPID) ClientProcess1RenderedID = render.MakeProcessID(fixture.ClientHostID, fixture.Client1PID) ClientProcess2RenderedID = render.MakeProcessID(fixture.ClientHostID, fixture.Client2PID) RenderedProcessNames = (render.RenderableNodes{ fixture.Client1Name: { ID: fixture.Client1Name, LabelMajor: fixture.Client1Name, LabelMinor: "2 processes", Rank: fixture.Client1Name, Pseudo: false, Children: report.MakeNodeSet( fixture.Report.Process.Nodes[fixture.ClientProcess1NodeID], fixture.Report.Process.Nodes[fixture.ClientProcess2NodeID], ), Node: report.MakeNode().WithAdjacent(fixture.ServerName), EdgeMetadata: report.EdgeMetadata{ EgressPacketCount: newu64(30), EgressByteCount: newu64(300), }, }, fixture.ServerName: { ID: fixture.ServerName, LabelMajor: fixture.ServerName, LabelMinor: "1 process", Rank: fixture.ServerName, Pseudo: false, Children: report.MakeNodeSet( fixture.Report.Process.Nodes[fixture.ServerProcessNodeID],
func TestPropagateSingleMetrics(t *testing.T) { now := time.Now() for _, c := range []struct { name string input report.Node topology string output report.Nodes }{ { name: "empty", input: report.MakeNode("empty"), topology: "", output: report.Nodes{"empty": report.MakeNode("empty")}, }, { name: "one child", input: report.MakeNode("a").WithChildren( report.MakeNodeSet( report.MakeNode("child1"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }), ), ), topology: report.Container, output: report.Nodes{ "a": report.MakeNode("a").WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }).WithChildren( report.MakeNodeSet( report.MakeNode("child1"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }), ), ), }, }, { name: "ignores other topologies", input: report.MakeNode("a").WithChildren( report.MakeNodeSet( report.MakeNode("child1"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }), report.MakeNode("child2"). WithTopology("otherTopology"). WithMetrics(report.Metrics{ "metric2": report.MakeMetric(), }), ), ), topology: report.Container, output: report.Nodes{ "a": report.MakeNode("a").WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }).WithChildren( report.MakeNodeSet( report.MakeNode("child1"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }), report.MakeNode("child2"). WithTopology("otherTopology"). WithMetrics(report.Metrics{ "metric2": report.MakeMetric(), }), ), ), }, }, { name: "two children", input: report.MakeNode("a").WithChildren( report.MakeNodeSet( report.MakeNode("child1"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }), report.MakeNode("child2"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric2": report.MakeMetric(), }), ), ), topology: report.Container, output: report.Nodes{ "a": report.MakeNode("a").WithChildren( report.MakeNodeSet( report.MakeNode("child1"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }), report.MakeNode("child2"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric2": report.MakeMetric(), }), ), ), }, }, { name: "ignores k8s pause container", input: report.MakeNode("a").WithChildren( report.MakeNodeSet( report.MakeNode("child1"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }), report.MakeNode("child2"). WithLatest(report.DoesNotMakeConnections, now, ""). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric2": report.MakeMetric(), }), ), ), topology: report.Container, output: report.Nodes{ "a": report.MakeNode("a").WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }).WithChildren( report.MakeNodeSet( report.MakeNode("child1"). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric1": report.MakeMetric(), }), report.MakeNode("child2"). WithLatest(report.DoesNotMakeConnections, now, ""). WithTopology(report.Container). WithMetrics(report.Metrics{ "metric2": report.MakeMetric(), }), ), ), }, }, } { got := render.PropagateSingleMetrics(c.topology)(c.input, report.Networks{}) if !reflect.DeepEqual(got, c.output) { t.Errorf("[%s] Diff: %s", c.name, test.Diff(c.output, got)) } } }