func TestEdgeMetadatasEncoding(t *testing.T) { want := EmptyEdgeMetadatas. Add("foo", EdgeMetadata{ EgressPacketCount: newu64(1), MaxConnCountTCP: newu64(2), }). Add("bar", EdgeMetadata{ EgressPacketCount: newu64(3), MaxConnCountTCP: newu64(5), }) { 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)) } } { json, err := want.MarshalJSON() if err != nil { t.Fatal(err) } have := EmptyEdgeMetadatas have.UnmarshalJSON(json) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } }
func TestMemoise(t *testing.T) { calls := 0 r := renderFunc(func(rpt report.Report) render.RenderableNodes { calls++ return render.RenderableNodes{rpt.ID: render.NewRenderableNode(rpt.ID)} }) m := render.Memoise(r) rpt1 := report.MakeReport() result1 := m.Render(rpt1) // 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) 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) 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") } }
func TestLatestMapEncoding(t *testing.T) { now := time.Now() want := EmptyLatestMap. Set("foo", now, "bar"). Set("bar", now, "baz") { gobs, err := want.GobEncode() if err != nil { t.Fatal(err) } have := EmptyLatestMap have.GobDecode(gobs) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } { json, err := want.MarshalJSON() if err != nil { t.Fatal(err) } have := EmptyLatestMap have.UnmarshalJSON(json) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } }
func TestCountersEncoding(t *testing.T) { want := EmptyCounters. Add("foo", 1). Add("bar", 2) { gobs, err := want.GobEncode() if err != nil { t.Fatal(err) } have := EmptyCounters have.GobDecode(gobs) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } { json, err := want.MarshalJSON() if err != nil { t.Fatal(err) } have := EmptyCounters have.UnmarshalJSON(json) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } }
func TestCollector(t *testing.T) { window := time.Millisecond c := app.NewCollector(window) r1 := report.MakeReport() r1.Endpoint.AddNode("foo", report.MakeNode()) r2 := report.MakeReport() r2.Endpoint.AddNode("bar", report.MakeNode()) if want, have := report.MakeReport(), c.Report(); !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } c.Add(r1) if want, have := r1, c.Report(); !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } c.Add(r2) merged := report.MakeReport() merged = merged.Merge(r1) merged = merged.Merge(r2) if want, have := merged, c.Report(); !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } }
func TestFilterUnconnectedPseudoNodes(t *testing.T) { // Test pseudo nodes that are made unconnected by filtering // are also removed. { nodes := render.RenderableNodes{ "foo": {ID: "foo", Node: report.MakeNode().WithAdjacent("bar")}, "bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("baz")}, "baz": {ID: "baz", Node: report.MakeNode(), Pseudo: true}, } renderer := render.Filter{ FilterFunc: func(node render.RenderableNode) bool { return true }, Renderer: mockRenderer{RenderableNodes: nodes}, } want := nodes.Prune() have := renderer.Render(report.MakeReport()).Prune() if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } { renderer := render.Filter{ FilterFunc: func(node render.RenderableNode) bool { return node.ID != "bar" }, Renderer: mockRenderer{RenderableNodes: render.RenderableNodes{ "foo": {ID: "foo", Node: report.MakeNode().WithAdjacent("bar")}, "bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("baz")}, "baz": {ID: "baz", Node: report.MakeNode(), Pseudo: true}, }}, } want := render.RenderableNodes{ "foo": {ID: "foo", Node: report.MakeNode()}, } have := renderer.Render(report.MakeReport()).Prune() if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } { renderer := render.Filter{ FilterFunc: func(node render.RenderableNode) bool { return node.ID != "bar" }, Renderer: mockRenderer{RenderableNodes: render.RenderableNodes{ "foo": {ID: "foo", Node: report.MakeNode()}, "bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("foo")}, "baz": {ID: "baz", Node: report.MakeNode().WithAdjacent("bar"), Pseudo: true}, }}, } want := render.RenderableNodes{ "foo": {ID: "foo", Node: report.MakeNode()}, } have := renderer.Render(report.MakeReport()).Prune() if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } }
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 TestEdgeMetadataFlatten(t *testing.T) { // Test two EdgeMetadatas flatten to the correct values { have := (EdgeMetadata{ EgressPacketCount: newu64(1), MaxConnCountTCP: newu64(2), }).Flatten(EdgeMetadata{ EgressPacketCount: newu64(4), EgressByteCount: newu64(8), MaxConnCountTCP: newu64(16), }) want := EdgeMetadata{ EgressPacketCount: newu64(1 + 4), EgressByteCount: newu64(8), MaxConnCountTCP: newu64(2 + 16), // flatten should sum MaxConnCountTCP } 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), MaxConnCountTCP: newu64(2), }). Add("bar", EdgeMetadata{ EgressPacketCount: newu64(3), MaxConnCountTCP: newu64(5), }).Flatten() want := EdgeMetadata{ EgressPacketCount: newu64(1 + 3), MaxConnCountTCP: newu64(2 + 5), } 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 TestMakeRenderableNodes(t *testing.T) { var ( newu64 = func(value uint64) *uint64 { return &value } srcNodeID = "srcNode" dstNode1ID = "dstNode1" dstNode2ID = "dstNode2" srcNode = report.MakeNode(). WithEdge(dstNode1ID, report.EdgeMetadata{EgressPacketCount: newu64(100), EgressByteCount: newu64(1000)}). WithEdge(dstNode2ID, report.EdgeMetadata{EgressPacketCount: newu64(200), EgressByteCount: newu64(2000)}) dstNode1 = report.MakeNode() dstNode2 = report.MakeNode() topology = report.MakeTopology(). AddNode(srcNodeID, srcNode). AddNode(dstNode1ID, dstNode1). AddNode(dstNode2ID, dstNode2) ) result := render.MakeRenderableNodes(topology) mustLookup := func(id string) render.RenderableNode { node, ok := result[id] if !ok { t.Fatalf("Expected result to contain node: %q, got: %v", id, result) } return node } // Source nodes should have the flattened edge metadata { have := mustLookup(srcNodeID).EdgeMetadata want := report.EdgeMetadata{EgressPacketCount: newu64(300), EgressByteCount: newu64(3000)} if !reflect.DeepEqual(want, have) { t.Errorf(test.Diff(want, have)) } } // Result destination nodes should have the reverse of the source nodes { have := mustLookup(dstNode1ID).EdgeMetadata want := report.EdgeMetadata{IngressPacketCount: newu64(100), IngressByteCount: newu64(1000)} if !reflect.DeepEqual(want, have) { t.Errorf(test.Diff(want, have)) } have = mustLookup(dstNode2ID).EdgeMetadata want = report.EdgeMetadata{IngressPacketCount: newu64(200), IngressByteCount: newu64(2000)} if !reflect.DeepEqual(want, have) { t.Errorf(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 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 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 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, FilterNoop)) want := Prune(expected.RenderedHosts) if !reflect.DeepEqual(want, have) { t.Error(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 TestApply(t *testing.T) { var ( endpointNodeID = "c" addressNodeID = "d" endpointNode = report.MakeNodeWith(map[string]string{"5": "6"}) addressNode = report.MakeNodeWith(map[string]string{"7": "8"}) ) p := New(0, 0, nil) p.AddTagger(NewTopologyTagger()) r := report.MakeReport() r.Endpoint.AddNode(endpointNodeID, endpointNode) r.Address.AddNode(addressNodeID, addressNode) r = p.tag(r) for _, tuple := range []struct { want report.Node from report.Topology via string }{ {endpointNode.Merge(report.MakeNode().WithID("c").WithTopology(report.Endpoint)), r.Endpoint, endpointNodeID}, {addressNode.Merge(report.MakeNode().WithID("d").WithTopology(report.Address)), r.Address, addressNodeID}, } { if want, have := tuple.want, tuple.from.Nodes[tuple.via]; !reflect.DeepEqual(want, have) { t.Errorf("want %+v, have %+v", 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 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 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 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 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 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) } } }
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 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 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)) } } } }