From 1e35ba25dc6432336448b6e062be5cb4b56d7aad Mon Sep 17 00:00:00 2001 From: Vishvananda Abrams Date: Tue, 26 Aug 2025 23:34:14 +0000 Subject: [PATCH] test: Improve test reliability with proper cleanup and isolation Refactors test setup and teardown logic to use `t.Cleanup` instead of `defer`. This ensures that cleanup functions are correctly scoped to each subtest's lifecycle, improving test isolation and reliability. The `setUpNetlinkTest` helper function is also improved to correctly save and restore the original network namespace, ensuring that tests do not leak state. To support this, a `Close()` method that returns an error is added to the `Handle` struct, allowing for proper cleanup of underlying netlink sockets. The test helpers are updated to use this new method, preventing resource leaks between tests. Additionally, a bug in the `netns` tests is fixed where a large namespace ID could overflow a 32-bit integer, causing spurious failures on some systems. --- addr_test.go | 12 +- bridge_linux_test.go | 9 +- chain_test.go | 3 +- class_test.go | 9 +- conntrack_linux.go | 25 ++-- conntrack_test.go | 216 ++++++++++++++--------------- conntrack_unspecified.go | 1 + devlink_test.go | 9 +- filter_test.go | 57 +++----- fou_test.go | 3 +- genetlink_unspecified.go | 1 + gtp_test.go | 7 +- handle_linux.go | 12 +- handle_test.go | 1 + ipset_linux_test.go | 15 +- link_test.go | 272 +++++++++++++------------------------ neigh_test.go | 21 +-- netlink_test.go | 49 ++++++- netns_test.go | 5 +- netns_unspecified.go | 1 + nl/nl_linux.go | 9 +- proc_event_test.go | 1 + protinfo_test.go | 3 +- qdisc_test.go | 30 ++-- rdma_link_test.go | 1 + route_test.go | 84 ++++-------- route_unspecified.go | 1 + rule_test.go | 4 +- socket_test.go | 4 +- xfrm_monitor_linux_test.go | 2 +- xfrm_policy_linux_test.go | 11 +- xfrm_state_linux_test.go | 27 ++-- 32 files changed, 392 insertions(+), 513 deletions(-) diff --git a/addr_test.go b/addr_test.go index 0a1deb2..7c0fa22 100644 --- a/addr_test.go +++ b/addr_test.go @@ -87,8 +87,7 @@ func DoTestAddr(t *testing.T, FunctionUndertest func(Link, *Addr) error) { t.Run(tt.name, func(t *testing.T) { tt.t = t - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) link, err := LinkByName("lo") if err != nil { @@ -171,8 +170,7 @@ func DoTestAddr(t *testing.T, FunctionUndertest func(Link, *Addr) error) { } func TestAddrAddReplace(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) for _, nilLink := range []bool{false, true} { var address = &net.IPNet{IP: net.IPv4(127, 0, 0, 2), Mask: net.CIDRMask(24, 32)} @@ -251,8 +249,7 @@ func expectAddrUpdate(ch <-chan AddrUpdate, add bool, dst net.IP) bool { } func TestAddrSubscribeWithOptions(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ch := make(chan AddrUpdate) done := make(chan struct{}) @@ -289,8 +286,7 @@ func TestAddrSubscribeWithOptions(t *testing.T) { } func TestAddrSubscribeListExisting(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ch := make(chan AddrUpdate) done := make(chan struct{}) diff --git a/bridge_linux_test.go b/bridge_linux_test.go index d7aa596..5e17bbb 100644 --- a/bridge_linux_test.go +++ b/bridge_linux_test.go @@ -9,8 +9,7 @@ import ( func TestBridgeVlan(t *testing.T) { minKernelRequired(t, 3, 10) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := remountSysfs(); err != nil { t.Fatal(err) } @@ -81,8 +80,7 @@ func TestBridgeVlan(t *testing.T) { func TestBridgeVlanTunnelInfo(t *testing.T) { minKernelRequired(t, 4, 11) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := remountSysfs(); err != nil { t.Fatal(err) @@ -206,8 +204,7 @@ func TestBridgeVlanTunnelInfo(t *testing.T) { func TestBridgeGroupFwdMask(t *testing.T) { minKernelRequired(t, 4, 15) //minimal release for per-port group_fwd_mask - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := remountSysfs(); err != nil { t.Fatal(err) } diff --git a/chain_test.go b/chain_test.go index 7b0d225..97e1e27 100644 --- a/chain_test.go +++ b/chain_test.go @@ -8,8 +8,7 @@ import ( ) func TestChainAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } diff --git a/class_test.go b/class_test.go index 9f0bf5d..ea47036 100644 --- a/class_test.go +++ b/class_test.go @@ -54,8 +54,7 @@ func testClassStats(this, that *ClassStatistics, t *testing.T) { } func TestClassAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -235,8 +234,7 @@ func TestHtbClassAddHtbClassChangeDel(t *testing.T) { ClassChange when the parent/handle pair exists and that it will create a new class if the handle is modified. */ - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -474,8 +472,7 @@ func TestHtbClassAddHtbClassChangeDel(t *testing.T) { func TestClassHfsc(t *testing.T) { // New network namespace for tests - tearDown := setUpNetlinkTestWithKModule(t, "sch_hfsc") - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "sch_hfsc")) // Set up testing link and check if succeeded if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { diff --git a/conntrack_linux.go b/conntrack_linux.go index b3d354d..771fa70 100644 --- a/conntrack_linux.go +++ b/conntrack_linux.go @@ -225,10 +225,11 @@ type ProtoInfo interface { type ProtoInfoTCP struct { State uint8 } + // Protocol returns "tcp". -func (*ProtoInfoTCP) Protocol() string {return "tcp"} +func (*ProtoInfoTCP) Protocol() string { return "tcp" } func (p *ProtoInfoTCP) toNlData() ([]*nl.RtAttr, error) { - ctProtoInfo := nl.NewRtAttr(unix.NLA_F_NESTED | nl.CTA_PROTOINFO, []byte{}) + ctProtoInfo := nl.NewRtAttr(unix.NLA_F_NESTED|nl.CTA_PROTOINFO, []byte{}) ctProtoInfoTCP := nl.NewRtAttr(unix.NLA_F_NESTED|nl.CTA_PROTOINFO_TCP, []byte{}) ctProtoInfoTCPState := nl.NewRtAttr(nl.CTA_PROTOINFO_TCP_STATE, nl.Uint8Attr(p.State)) ctProtoInfoTCP.AddChild(ctProtoInfoTCPState) @@ -238,14 +239,16 @@ func (p *ProtoInfoTCP) toNlData() ([]*nl.RtAttr, error) { } // ProtoInfoSCTP only supports the protocol name. -type ProtoInfoSCTP struct {} +type ProtoInfoSCTP struct{} + // Protocol returns "sctp". -func (*ProtoInfoSCTP) Protocol() string {return "sctp"} +func (*ProtoInfoSCTP) Protocol() string { return "sctp" } // ProtoInfoDCCP only supports the protocol name. -type ProtoInfoDCCP struct {} +type ProtoInfoDCCP struct{} + // Protocol returns "dccp". -func (*ProtoInfoDCCP) Protocol() string {return "dccp"} +func (*ProtoInfoDCCP) Protocol() string { return "dccp" } // The full conntrack flow structure is very complicated and can be found in the file: // http://git.netfilter.org/libnetfilter_conntrack/tree/include/internal/object.h @@ -287,7 +290,7 @@ func (t *IPTuple) toNlData(family uint8) ([]*nl.RtAttr, error) { ctTupleProtoSrcPort := nl.NewRtAttr(nl.CTA_PROTO_SRC_PORT, nl.BEUint16Attr(t.SrcPort)) ctTupleProto.AddChild(ctTupleProtoSrcPort) ctTupleProtoDstPort := nl.NewRtAttr(nl.CTA_PROTO_DST_PORT, nl.BEUint16Attr(t.DstPort)) - ctTupleProto.AddChild(ctTupleProtoDstPort, ) + ctTupleProto.AddChild(ctTupleProtoDstPort) return []*nl.RtAttr{ctTupleIP, ctTupleProto}, nil } @@ -364,7 +367,7 @@ func (s *ConntrackFlow) toNlData() ([]*nl.RtAttr, error) { // // // - + // CTA_TUPLE_ORIG ctTupleOrig := nl.NewRtAttr(unix.NLA_F_NESTED|nl.CTA_TUPLE_ORIG, nil) forwardFlowAttrs, err := s.Forward.toNlData(s.FamilyType) @@ -547,12 +550,12 @@ func parseTimeStamp(r *bytes.Reader, readSize uint16) (tstart, tstop uint64) { func parseProtoInfoTCPState(r *bytes.Reader) (s uint8) { binary.Read(r, binary.BigEndian, &s) - r.Seek(nl.SizeofNfattr - 1, seekCurrent) + r.Seek(nl.SizeofNfattr-1, seekCurrent) return s } // parseProtoInfoTCP reads the entire nested protoinfo structure, but only parses the state attr. -func parseProtoInfoTCP(r *bytes.Reader, attrLen uint16) (*ProtoInfoTCP) { +func parseProtoInfoTCP(r *bytes.Reader, attrLen uint16) *ProtoInfoTCP { p := new(ProtoInfoTCP) bytesRead := 0 for bytesRead < int(attrLen) { @@ -666,7 +669,7 @@ func parseRawData(data []byte) *ConntrackFlow { switch t { case nl.CTA_MARK: s.Mark = parseConnectionMark(reader) - case nl.CTA_LABELS: + case nl.CTA_LABELS: s.Labels = parseConnectionLabels(reader) case nl.CTA_TIMEOUT: s.TimeOut = parseTimeOut(reader) diff --git a/conntrack_test.go b/conntrack_test.go index 6850f3c..2b26974 100644 --- a/conntrack_test.go +++ b/conntrack_test.go @@ -82,8 +82,8 @@ func applyFilter(flowList []ConntrackFlow, ipv4Filter *ConntrackFilter, ipv6Filt // TestConntrackSocket test the opening of a NETFILTER family socket func TestConntrackSocket(t *testing.T) { skipUnlessRoot(t) - setUpNetlinkTestWithKModule(t, "nf_conntrack") - setUpNetlinkTestWithKModule(t, "nf_conntrack_netlink") + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack")) + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack_netlink")) h, err := NewHandle(unix.NETLINK_NETFILTER) CheckErrorFail(t, err) @@ -107,11 +107,11 @@ func TestConntrackTableList(t *testing.T) { // conntrack l3proto was unified since 4.19 // https://github.com/torvalds/linux/commit/a0ae2562c6c4b2721d9fddba63b7286c13517d9f if k < 4 || k == 4 && m < 19 { - setUpNetlinkTestWithKModule(t, "nf_conntrack_ipv4") - setUpNetlinkTestWithKModule(t, "nf_conntrack_ipv6") + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack_ipv4")) + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack_ipv6")) } - setUpNetlinkTestWithKModule(t, "nf_conntrack") - setUpNetlinkTestWithKModule(t, "nf_conntrack_netlink") + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack")) + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack_netlink")) // Creates a new namespace and bring up the loopback interface origns, ns, h := nsCreateAndEnter(t) @@ -180,8 +180,8 @@ func TestConntrackTableFlush(t *testing.T) { t.Skipf("Fails in CI: Flow creation fails") } skipUnlessRoot(t) - setUpNetlinkTestWithKModule(t, "nf_conntrack") - setUpNetlinkTestWithKModule(t, "nf_conntrack_netlink") + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack")) + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack_netlink")) k, m, err := KernelVersion() if err != nil { t.Fatal(err) @@ -189,9 +189,9 @@ func TestConntrackTableFlush(t *testing.T) { // conntrack l3proto was unified since 4.19 // https://github.com/torvalds/linux/commit/a0ae2562c6c4b2721d9fddba63b7286c13517d9f if k < 4 || k == 4 && m < 19 { - setUpNetlinkTestWithKModule(t, "nf_conntrack_ipv4") + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack_ipv4")) } - setUpNetlinkTestWithKModule(t, "nf_conntrack") + t.Cleanup(setUpNetlinkTestWithKModule(t, "nf_conntrack")) // Creates a new namespace and bring up the loopback interface origns, ns, h := nsCreateAndEnter(t) defer netns.Set(*origns) @@ -265,7 +265,7 @@ func TestConntrackTableDelete(t *testing.T) { requiredModules = append(requiredModules, "nf_conntrack_ipv4") } - setUpNetlinkTestWithKModule(t, requiredModules...) + t.Cleanup(setUpNetlinkTestWithKModule(t, requiredModules...)) // Creates a new namespace and bring up the loopback interface origns, ns, h := nsCreateAndEnter(t) @@ -350,22 +350,22 @@ func TestConntrackTableDelete(t *testing.T) { func TestConntrackFilter(t *testing.T) { var flowList []ConntrackFlow flowList = append(flowList, ConntrackFlow{ - FamilyType: unix.AF_INET, - Forward: IPTuple{ - SrcIP: net.ParseIP("10.0.0.1"), - DstIP: net.ParseIP("20.0.0.1"), - SrcPort: 1000, - DstPort: 2000, - Protocol: 17, - }, - Reverse: IPTuple{ - SrcIP: net.ParseIP("20.0.0.1"), - DstIP: net.ParseIP("192.168.1.1"), - SrcPort: 2000, - DstPort: 1000, - Protocol: 17, - }, + FamilyType: unix.AF_INET, + Forward: IPTuple{ + SrcIP: net.ParseIP("10.0.0.1"), + DstIP: net.ParseIP("20.0.0.1"), + SrcPort: 1000, + DstPort: 2000, + Protocol: 17, }, + Reverse: IPTuple{ + SrcIP: net.ParseIP("20.0.0.1"), + DstIP: net.ParseIP("192.168.1.1"), + SrcPort: 2000, + DstPort: 1000, + Protocol: 17, + }, + }, ConntrackFlow{ FamilyType: unix.AF_INET, Forward: IPTuple{ @@ -1000,7 +1000,7 @@ func TestConntrackUpdateV4(t *testing.T) { } // Implicitly skips test if not root: nsStr, teardown := setUpNamedNetlinkTestWithKModule(t, requiredModules...) - defer teardown() + t.Cleanup(teardown) ns, err := netns.GetFromName(nsStr) if err != nil { @@ -1015,23 +1015,23 @@ func TestConntrackUpdateV4(t *testing.T) { flow := ConntrackFlow{ FamilyType: FAMILY_V4, Forward: IPTuple{ - SrcIP: net.IP{234,234,234,234}, - DstIP: net.IP{123,123,123,123}, - SrcPort: 48385, - DstPort: 53, + SrcIP: net.IP{234, 234, 234, 234}, + DstIP: net.IP{123, 123, 123, 123}, + SrcPort: 48385, + DstPort: 53, Protocol: unix.IPPROTO_TCP, }, Reverse: IPTuple{ - SrcIP: net.IP{123,123,123,123}, - DstIP: net.IP{234,234,234,234}, - SrcPort: 53, - DstPort: 48385, + SrcIP: net.IP{123, 123, 123, 123}, + DstIP: net.IP{234, 234, 234, 234}, + SrcPort: 53, + DstPort: 48385, Protocol: unix.IPPROTO_TCP, }, // No point checking equivalence of timeout, but value must // be reasonable to allow for a potentially slow subsequent read. - TimeOut: 100, - Mark: 12, + TimeOut: 100, + Mark: 12, ProtoInfo: &ProtoInfoTCP{ State: nl.TCP_CONNTRACK_SYN_SENT2, }, @@ -1054,8 +1054,8 @@ func TestConntrackUpdateV4(t *testing.T) { filter := ConntrackFilter{ ipNetFilter: map[ConntrackFilterType]*net.IPNet{ - ConntrackOrigSrcIP: NewIPNet(flow.Forward.SrcIP), - ConntrackOrigDstIP: NewIPNet(flow.Forward.DstIP), + ConntrackOrigSrcIP: NewIPNet(flow.Forward.SrcIP), + ConntrackOrigDstIP: NewIPNet(flow.Forward.DstIP), ConntrackReplySrcIP: NewIPNet(flow.Reverse.SrcIP), ConntrackReplyDstIP: NewIPNet(flow.Reverse.DstIP), }, @@ -1063,7 +1063,7 @@ func TestConntrackUpdateV4(t *testing.T) { ConntrackOrigSrcPort: flow.Forward.SrcPort, ConntrackOrigDstPort: flow.Forward.DstPort, }, - protoFilter:unix.IPPROTO_TCP, + protoFilter: unix.IPPROTO_TCP, } var match *ConntrackFlow @@ -1133,7 +1133,7 @@ func TestConntrackUpdateV6(t *testing.T) { } // Implicitly skips test if not root: nsStr, teardown := setUpNamedNetlinkTestWithKModule(t, requiredModules...) - defer teardown() + t.Cleanup(teardown) ns, err := netns.GetFromName(nsStr) if err != nil { @@ -1148,23 +1148,23 @@ func TestConntrackUpdateV6(t *testing.T) { flow := ConntrackFlow{ FamilyType: FAMILY_V6, Forward: IPTuple{ - SrcIP: net.ParseIP("2001:db8::68"), - DstIP: net.ParseIP("2001:db9::32"), - SrcPort: 48385, - DstPort: 53, + SrcIP: net.ParseIP("2001:db8::68"), + DstIP: net.ParseIP("2001:db9::32"), + SrcPort: 48385, + DstPort: 53, Protocol: unix.IPPROTO_TCP, }, Reverse: IPTuple{ - SrcIP: net.ParseIP("2001:db9::32"), - DstIP: net.ParseIP("2001:db8::68"), - SrcPort: 53, - DstPort: 48385, + SrcIP: net.ParseIP("2001:db9::32"), + DstIP: net.ParseIP("2001:db8::68"), + SrcPort: 53, + DstPort: 48385, Protocol: unix.IPPROTO_TCP, }, // No point checking equivalence of timeout, but value must // be reasonable to allow for a potentially slow subsequent read. - TimeOut: 100, - Mark: 12, + TimeOut: 100, + Mark: 12, ProtoInfo: &ProtoInfoTCP{ State: nl.TCP_CONNTRACK_SYN_SENT2, }, @@ -1187,8 +1187,8 @@ func TestConntrackUpdateV6(t *testing.T) { filter := ConntrackFilter{ ipNetFilter: map[ConntrackFilterType]*net.IPNet{ - ConntrackOrigSrcIP: NewIPNet(flow.Forward.SrcIP), - ConntrackOrigDstIP: NewIPNet(flow.Forward.DstIP), + ConntrackOrigSrcIP: NewIPNet(flow.Forward.SrcIP), + ConntrackOrigDstIP: NewIPNet(flow.Forward.DstIP), ConntrackReplySrcIP: NewIPNet(flow.Reverse.SrcIP), ConntrackReplyDstIP: NewIPNet(flow.Reverse.DstIP), }, @@ -1196,7 +1196,7 @@ func TestConntrackUpdateV6(t *testing.T) { ConntrackOrigSrcPort: flow.Forward.SrcPort, ConntrackOrigDstPort: flow.Forward.DstPort, }, - protoFilter:unix.IPPROTO_TCP, + protoFilter: unix.IPPROTO_TCP, } var match *ConntrackFlow @@ -1264,7 +1264,7 @@ func TestConntrackCreateV4(t *testing.T) { } // Implicitly skips test if not root: nsStr, teardown := setUpNamedNetlinkTestWithKModule(t, requiredModules...) - defer teardown() + t.Cleanup(teardown) ns, err := netns.GetFromName(nsStr) if err != nil { @@ -1279,23 +1279,23 @@ func TestConntrackCreateV4(t *testing.T) { flow := ConntrackFlow{ FamilyType: FAMILY_V4, Forward: IPTuple{ - SrcIP: net.IP{234,234,234,234}, - DstIP: net.IP{123,123,123,123}, - SrcPort: 48385, - DstPort: 53, + SrcIP: net.IP{234, 234, 234, 234}, + DstIP: net.IP{123, 123, 123, 123}, + SrcPort: 48385, + DstPort: 53, Protocol: unix.IPPROTO_TCP, }, Reverse: IPTuple{ - SrcIP: net.IP{123,123,123,123}, - DstIP: net.IP{234,234,234,234}, - SrcPort: 53, - DstPort: 48385, + SrcIP: net.IP{123, 123, 123, 123}, + DstIP: net.IP{234, 234, 234, 234}, + SrcPort: 53, + DstPort: 48385, Protocol: unix.IPPROTO_TCP, }, // No point checking equivalence of timeout, but value must // be reasonable to allow for a potentially slow subsequent read. - TimeOut: 100, - Mark: 12, + TimeOut: 100, + Mark: 12, ProtoInfo: &ProtoInfoTCP{ State: nl.TCP_CONNTRACK_ESTABLISHED, }, @@ -1313,8 +1313,8 @@ func TestConntrackCreateV4(t *testing.T) { filter := ConntrackFilter{ ipNetFilter: map[ConntrackFilterType]*net.IPNet{ - ConntrackOrigSrcIP: NewIPNet(flow.Forward.SrcIP), - ConntrackOrigDstIP: NewIPNet(flow.Forward.DstIP), + ConntrackOrigSrcIP: NewIPNet(flow.Forward.SrcIP), + ConntrackOrigDstIP: NewIPNet(flow.Forward.DstIP), ConntrackReplySrcIP: NewIPNet(flow.Reverse.SrcIP), ConntrackReplyDstIP: NewIPNet(flow.Reverse.DstIP), }, @@ -1322,7 +1322,7 @@ func TestConntrackCreateV4(t *testing.T) { ConntrackOrigSrcPort: flow.Forward.SrcPort, ConntrackOrigDstPort: flow.Forward.DstPort, }, - protoFilter:unix.IPPROTO_TCP, + protoFilter: unix.IPPROTO_TCP, } var match *ConntrackFlow @@ -1359,7 +1359,7 @@ func TestConntrackCreateV6(t *testing.T) { } // Implicitly skips test if not root: nsStr, teardown := setUpNamedNetlinkTestWithKModule(t, requiredModules...) - defer teardown() + t.Cleanup(teardown) ns, err := netns.GetFromName(nsStr) if err != nil { @@ -1374,23 +1374,23 @@ func TestConntrackCreateV6(t *testing.T) { flow := ConntrackFlow{ FamilyType: FAMILY_V6, Forward: IPTuple{ - SrcIP: net.ParseIP("2001:db8::68"), - DstIP: net.ParseIP("2001:db9::32"), - SrcPort: 48385, - DstPort: 53, + SrcIP: net.ParseIP("2001:db8::68"), + DstIP: net.ParseIP("2001:db9::32"), + SrcPort: 48385, + DstPort: 53, Protocol: unix.IPPROTO_TCP, }, Reverse: IPTuple{ - SrcIP: net.ParseIP("2001:db9::32"), - DstIP: net.ParseIP("2001:db8::68"), - SrcPort: 53, - DstPort: 48385, + SrcIP: net.ParseIP("2001:db9::32"), + DstIP: net.ParseIP("2001:db8::68"), + SrcPort: 53, + DstPort: 48385, Protocol: unix.IPPROTO_TCP, }, // No point checking equivalence of timeout, but value must // be reasonable to allow for a potentially slow subsequent read. - TimeOut: 100, - Mark: 12, + TimeOut: 100, + Mark: 12, ProtoInfo: &ProtoInfoTCP{ State: nl.TCP_CONNTRACK_ESTABLISHED, }, @@ -1408,8 +1408,8 @@ func TestConntrackCreateV6(t *testing.T) { filter := ConntrackFilter{ ipNetFilter: map[ConntrackFilterType]*net.IPNet{ - ConntrackOrigSrcIP: NewIPNet(flow.Forward.SrcIP), - ConntrackOrigDstIP: NewIPNet(flow.Forward.DstIP), + ConntrackOrigSrcIP: NewIPNet(flow.Forward.SrcIP), + ConntrackOrigDstIP: NewIPNet(flow.Forward.DstIP), ConntrackReplySrcIP: NewIPNet(flow.Reverse.SrcIP), ConntrackReplyDstIP: NewIPNet(flow.Reverse.DstIP), }, @@ -1417,7 +1417,7 @@ func TestConntrackCreateV6(t *testing.T) { ConntrackOrigSrcPort: flow.Forward.SrcPort, ConntrackOrigDstPort: flow.Forward.DstPort, }, - protoFilter:unix.IPPROTO_TCP, + protoFilter: unix.IPPROTO_TCP, } var match *ConntrackFlow @@ -1448,43 +1448,43 @@ func TestConntrackFlowToNlData(t *testing.T) { flowV4 := ConntrackFlow{ FamilyType: FAMILY_V4, Forward: IPTuple{ - SrcIP: net.IP{234,234,234,234}, - DstIP: net.IP{123,123,123,123}, - SrcPort: 48385, - DstPort: 53, + SrcIP: net.IP{234, 234, 234, 234}, + DstIP: net.IP{123, 123, 123, 123}, + SrcPort: 48385, + DstPort: 53, Protocol: unix.IPPROTO_TCP, }, Reverse: IPTuple{ - SrcIP: net.IP{123,123,123,123}, - DstIP: net.IP{234,234,234,234}, - SrcPort: 53, - DstPort: 48385, + SrcIP: net.IP{123, 123, 123, 123}, + DstIP: net.IP{234, 234, 234, 234}, + SrcPort: 53, + DstPort: 48385, Protocol: unix.IPPROTO_TCP, }, - Mark: 5, - TimeOut: 10, + Mark: 5, + TimeOut: 10, ProtoInfo: &ProtoInfoTCP{ State: nl.TCP_CONNTRACK_ESTABLISHED, }, } - flowV6 := ConntrackFlow { + flowV6 := ConntrackFlow{ FamilyType: FAMILY_V6, Forward: IPTuple{ - SrcIP: net.ParseIP("2001:db8::68"), - DstIP: net.ParseIP("2001:db9::32"), - SrcPort: 48385, - DstPort: 53, - Protocol: unix.IPPROTO_TCP, - }, - Reverse: IPTuple{ - SrcIP: net.ParseIP("2001:db9::32"), - DstIP: net.ParseIP("2001:db8::68"), - SrcPort: 53, - DstPort: 48385, + SrcIP: net.ParseIP("2001:db8::68"), + DstIP: net.ParseIP("2001:db9::32"), + SrcPort: 48385, + DstPort: 53, Protocol: unix.IPPROTO_TCP, }, - Mark: 5, - TimeOut: 10, + Reverse: IPTuple{ + SrcIP: net.ParseIP("2001:db9::32"), + DstIP: net.ParseIP("2001:db8::68"), + SrcPort: 53, + DstPort: 48385, + Protocol: unix.IPPROTO_TCP, + }, + Mark: 5, + TimeOut: 10, ProtoInfo: &ProtoInfoTCP{ State: nl.TCP_CONNTRACK_ESTABLISHED, }, @@ -1497,7 +1497,7 @@ func TestConntrackFlowToNlData(t *testing.T) { t.Fatalf("Error converting ConntrackFlow to netlink messages: %s", err) } // Mock nfgenmsg header - bytesV4 = append(bytesV4, flowV4.FamilyType,0,0,0) + bytesV4 = append(bytesV4, flowV4.FamilyType, 0, 0, 0) for _, a := range attrsV4 { bytesV4 = append(bytesV4, a.Serialize()...) } @@ -1507,7 +1507,7 @@ func TestConntrackFlowToNlData(t *testing.T) { t.Fatalf("Error converting ConntrackFlow to netlink messages: %s", err) } // Mock nfgenmsg header - bytesV6 = append(bytesV6, flowV6.FamilyType,0,0,0) + bytesV6 = append(bytesV6, flowV6.FamilyType, 0, 0, 0) for _, a := range attrsV6 { bytesV6 = append(bytesV6, a.Serialize()...) } diff --git a/conntrack_unspecified.go b/conntrack_unspecified.go index 0049048..c995d6a 100644 --- a/conntrack_unspecified.go +++ b/conntrack_unspecified.go @@ -1,3 +1,4 @@ +//go:build !linux // +build !linux package netlink diff --git a/devlink_test.go b/devlink_test.go index cf6961c..4f44b49 100644 --- a/devlink_test.go +++ b/devlink_test.go @@ -16,7 +16,7 @@ import ( func TestDevLinkGetDeviceList(t *testing.T) { minKernelRequired(t, 4, 12) - setUpNetlinkTestWithKModule(t, "devlink") + t.Cleanup(setUpNetlinkTestWithKModule(t, "devlink")) _, err := DevLinkGetDeviceList() if err != nil { t.Fatal(err) @@ -25,7 +25,7 @@ func TestDevLinkGetDeviceList(t *testing.T) { func TestDevLinkGetDeviceByName(t *testing.T) { minKernelRequired(t, 4, 12) - setUpNetlinkTestWithKModule(t, "devlink") + t.Cleanup(setUpNetlinkTestWithKModule(t, "devlink")) _, err := DevLinkGetDeviceByName("foo", "bar") if err != nil { t.Fatal(err) @@ -34,7 +34,7 @@ func TestDevLinkGetDeviceByName(t *testing.T) { func TestDevLinkSetEswitchMode(t *testing.T) { minKernelRequired(t, 4, 12) - setUpNetlinkTestWithKModule(t, "devlink") + t.Cleanup(setUpNetlinkTestWithKModule(t, "devlink")) dev, err := DevLinkGetDeviceByName("foo", "bar") if err != nil { t.Fatal(err) @@ -271,8 +271,7 @@ func areInfoStructsEqual(first *DevlinkDeviceInfo, second *DevlinkDeviceInfo) bo func TestDevlinkGetDeviceResources(t *testing.T) { minKernelRequired(t, 5, 11) - tearDown := setUpNetlinkTestWithKModule(t, "devlink") - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "devlink")) if bus == "" || device == "" { //TODO: setup netdevsim device instead of getting device from flags diff --git a/filter_test.go b/filter_test.go index 47ace1e..1819e60 100644 --- a/filter_test.go +++ b/filter_test.go @@ -14,8 +14,7 @@ import ( ) func TestFilterAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -108,8 +107,7 @@ func TestFilterAddDel(t *testing.T) { } func TestFilterReplace(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -169,8 +167,7 @@ func TestFilterReplace(t *testing.T) { } func TestAdvancedFilterAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "baz"}}); err != nil { t.Fatal(err) } @@ -365,8 +362,7 @@ func TestAdvancedFilterAddDel(t *testing.T) { } func TestFilterFwAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -512,8 +508,7 @@ func TestFilterFwAddDel(t *testing.T) { } func TestFilterFwActAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -642,8 +637,7 @@ func TestFilterFwActAddDel(t *testing.T) { func TestFilterU32BpfAddDel(t *testing.T) { t.Skipf("Fd does not match in ci") - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -775,8 +769,7 @@ func TestFilterU32BpfAddDel(t *testing.T) { } func TestFilterU32ConnmarkAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -916,8 +909,7 @@ func TestFilterU32ConnmarkAddDel(t *testing.T) { } func TestFilterU32CsumAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatalf("add link foo error: %v", err) } @@ -1084,8 +1076,7 @@ func TestFilterClsActBpfAddDel(t *testing.T) { // This feature was added in kernel 4.5 minKernelRequired(t, 4, 5) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) qdisc, link := setupLinkForTestWithQdisc(t, "foo") filterattrs := FilterAttrs{ @@ -1159,8 +1150,7 @@ func TestFilterMatchAllAddDel(t *testing.T) { // This classifier was added in kernel 4.7 minKernelRequired(t, 4, 7) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) _, link := setupLinkForTestWithQdisc(t, "foo") _, link2 := setupLinkForTestWithQdisc(t, "bar") filter := &MatchAll{ @@ -1227,8 +1217,7 @@ func TestFilterMatchAllAddDel(t *testing.T) { } func TestFilterU32TunnelKeyAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -1399,8 +1388,7 @@ func TestFilterU32TunnelKeyAddDel(t *testing.T) { } func TestFilterU32SkbEditAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -1576,8 +1564,7 @@ func TestFilterU32SkbEditAddDel(t *testing.T) { } func TestFilterU32LinkOption(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatalf("add link foo error: %v", err) } @@ -1718,8 +1705,7 @@ func TestFilterU32LinkOption(t *testing.T) { } func TestFilterFlowerAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -2118,8 +2104,7 @@ func TestFilterFlowerAddDel(t *testing.T) { } func TestFilterIPv6FlowerPedit(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -2278,8 +2263,7 @@ func TestFilterIPv6FlowerPedit(t *testing.T) { } func TestFilterU32PoliceAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -2457,8 +2441,7 @@ func TestFilterU32PoliceAddDel(t *testing.T) { } func TestFilterU32DirectPoliceAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -2559,8 +2542,7 @@ func TestFilterU32DirectPoliceAddDel(t *testing.T) { } func TestFilterChainAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -2658,8 +2640,7 @@ func TestFilterSampleAddDel(t *testing.T) { t.Skip("psample genetlink family unavailable - is CONFIG_PSAMPLE enabled?") } - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } diff --git a/fou_test.go b/fou_test.go index 7949556..b04d886 100644 --- a/fou_test.go +++ b/fou_test.go @@ -79,8 +79,7 @@ func TestFouAddDel(t *testing.T) { minKernelRequired(t, 3, 18) // the fou module is usually not compiled in the kernel so we'll load it - tearDown := setUpNetlinkTestWithKModule(t, "fou") - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "fou")) fou := Fou{ Port: 5555, diff --git a/genetlink_unspecified.go b/genetlink_unspecified.go index 0192b99..18f8e62 100644 --- a/genetlink_unspecified.go +++ b/genetlink_unspecified.go @@ -1,3 +1,4 @@ +//go:build !linux // +build !linux package netlink diff --git a/gtp_test.go b/gtp_test.go index 4b94b6b..9b4c877 100644 --- a/gtp_test.go +++ b/gtp_test.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package netlink @@ -8,8 +9,7 @@ import ( ) func TestPDPv0AddDel(t *testing.T) { - tearDown := setUpNetlinkTestWithKModule(t, "gtp") - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "gtp")) if err := LinkAdd(testGTPLink(t)); err != nil { t.Fatal(err) @@ -61,8 +61,7 @@ func TestPDPv0AddDel(t *testing.T) { } func TestPDPv1AddDel(t *testing.T) { - tearDown := setUpNetlinkTestWithKModule(t, "gtp") - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "gtp")) if err := LinkAdd(testGTPLink(t)); err != nil { t.Fatal(err) diff --git a/handle_linux.go b/handle_linux.go index df1a9ba..358c175 100644 --- a/handle_linux.go +++ b/handle_linux.go @@ -165,12 +165,16 @@ func newHandle(newNs, curNs netns.NsHandle, nlFamilies ...int) (*Handle, error) return h, nil } -// Close releases the resources allocated to this handle -func (h *Handle) Close() { +// Close closes all netlink sockets held by this Handle. +func (h *Handle) Close() error { + var firstErr error for _, sh := range h.sockets { - sh.Close() + if err := sh.Close(); err != nil && firstErr == nil { + firstErr = err + } } h.sockets = nil + return firstErr } // Delete releases the resources allocated to this handle @@ -178,7 +182,7 @@ func (h *Handle) Close() { // Deprecated: use Close instead which is in line with typical resource release // patterns for files and other resources. func (h *Handle) Delete() { - h.Close() + _ = h.Close() } func (h *Handle) newNetlinkRequest(proto, flags int) *nl.NetlinkRequest { diff --git a/handle_test.go b/handle_test.go index c7feb22..cc5b85e 100644 --- a/handle_test.go +++ b/handle_test.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package netlink diff --git a/ipset_linux_test.go b/ipset_linux_test.go index 361d1f7..744a55e 100644 --- a/ipset_linux_test.go +++ b/ipset_linux_test.go @@ -88,8 +88,7 @@ func TestParseIpsetListResult(t *testing.T) { } func TestIpsetCreateListAddDelDestroy(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) timeout := uint32(3) err := IpsetCreate("my-test-ipset-1", "hash:ip", IpsetCreateOptions{ Replace: true, @@ -444,8 +443,7 @@ func TestIpsetCreateListAddDelDestroyWithTestCases(t *testing.T) { for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) err := IpsetCreate(tC.setname, tC.typename, tC.options) if err != nil { @@ -615,8 +613,7 @@ func TestIpsetBitmapCreateListWithTestCases(t *testing.T) { for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) err := IpsetCreate(tC.setname, tC.typename, tC.options) if err != nil { @@ -643,8 +640,7 @@ func TestIpsetBitmapCreateListWithTestCases(t *testing.T) { } func TestIpsetSwap(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ipset1 := "my-test-ipset-swap-1" ipset2 := "my-test-ipset-swap-2" @@ -723,8 +719,7 @@ func nextIP(ip net.IP) { // TestIpsetMaxElements tests that we can create an ipset containing // 128k elements, which is double the default size (64k elements). func TestIpsetMaxElements(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ipsetName := "my-test-ipset-max" maxElements := uint32(128 << 10) diff --git a/link_test.go b/link_test.go index 758a79e..bfe033b 100644 --- a/link_test.go +++ b/link_test.go @@ -708,29 +708,25 @@ func compareBareUDP(t *testing.T, expected, actual *BareUDP) { } func TestLinkAddDelWithIndex(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Dummy{LinkAttrs{Index: 1000, Name: "foo"}}) } func TestLinkAddDelDummy(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Dummy{LinkAttrs{Name: "foo"}}) } func TestLinkAddDelDummyWithGroup(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Dummy{LinkAttrs{Name: "foo", Group: 42}}) } func TestLinkModify(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) linkName := "foo" originalMTU := 1500 @@ -760,22 +756,19 @@ func TestLinkModify(t *testing.T) { } func TestLinkAddDelIfb(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Ifb{LinkAttrs{Name: "foo"}}) } func TestLinkAddDelBridge(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Bridge{LinkAttrs: LinkAttrs{Name: "foo", MTU: 1400}}) } func TestLinkAddDelGeneve(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Geneve{ LinkAttrs: LinkAttrs{Name: "foo4", EncapType: "geneve"}, @@ -789,8 +782,7 @@ func TestLinkAddDelGeneve(t *testing.T) { } func TestLinkAddDelGeneveFlowBased(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Geneve{ LinkAttrs: LinkAttrs{Name: "foo"}, @@ -800,7 +792,7 @@ func TestLinkAddDelGeneveFlowBased(t *testing.T) { func TestGeneveCompareToIP(t *testing.T) { ns, tearDown := setUpNamedNetlinkTest(t) - defer tearDown() + t.Cleanup(tearDown) expected := &Geneve{ ID: 0x764332, // 23 bits @@ -838,8 +830,7 @@ func TestGeneveCompareToIP(t *testing.T) { } func TestLinkAddDelGretap(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Gretap{ LinkAttrs: LinkAttrs{Name: "foo4"}, @@ -858,8 +849,7 @@ func TestLinkAddDelGretap(t *testing.T) { } func TestLinkAddDelGretun(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Gretun{ LinkAttrs: LinkAttrs{Name: "foo4"}, @@ -873,8 +863,7 @@ func TestLinkAddDelGretun(t *testing.T) { } func TestLinkAddDelGretunPointToMultiPoint(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Gretun{ LinkAttrs: LinkAttrs{Name: "foo"}, @@ -892,8 +881,7 @@ func TestLinkAddDelGretunPointToMultiPoint(t *testing.T) { func TestLinkAddDelGretunFlowBased(t *testing.T) { minKernelRequired(t, 4, 3) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Gretun{ LinkAttrs: LinkAttrs{Name: "foo"}, @@ -903,8 +891,7 @@ func TestLinkAddDelGretunFlowBased(t *testing.T) { func TestLinkAddDelGretapFlowBased(t *testing.T) { minKernelRequired(t, 4, 3) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Gretap{ LinkAttrs: LinkAttrs{Name: "foo"}, @@ -912,8 +899,7 @@ func TestLinkAddDelGretapFlowBased(t *testing.T) { } func TestLinkAddDelVlan(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { @@ -935,8 +921,7 @@ func TestLinkAddDelVlan(t *testing.T) { } func TestLinkAddVlanWithQosMaps(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { @@ -984,8 +969,7 @@ func TestLinkAddVlanWithQosMaps(t *testing.T) { } func TestLinkAddVlanWithFlags(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { @@ -1034,8 +1018,7 @@ func TestLinkAddVlanWithFlags(t *testing.T) { } func TestLinkModifyVlanFlags(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { @@ -1093,8 +1076,7 @@ func TestLinkModifyVlanFlags(t *testing.T) { } func TestLinkAddDelMacvlan(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { @@ -1122,8 +1104,7 @@ func TestLinkAddDelMacvlan(t *testing.T) { } func TestLinkAddDelMacvtap(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { @@ -1159,8 +1140,7 @@ func TestLinkAddDelMacvtap(t *testing.T) { func TestLinkMacvBCQueueLen(t *testing.T) { minKernelRequired(t, 5, 11) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { @@ -1188,8 +1168,7 @@ func TestLinkMacvBCQueueLen(t *testing.T) { func TestNetkitPeerNs(t *testing.T) { minKernelRequired(t, 6, 7) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) basens, err := netns.Get() if err != nil { @@ -1261,8 +1240,7 @@ func TestNetkitPeerNs(t *testing.T) { func TestLinkAddDelNetkit(t *testing.T) { minKernelRequired(t, 6, 7) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) netkit := &Netkit{ LinkAttrs: LinkAttrs{ @@ -1284,8 +1262,7 @@ func TestLinkAddDelNetkit(t *testing.T) { } func TestLinkAddDelVeth(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) peerMAC, _ := net.ParseMAC("00:12:34:56:78:02") @@ -1305,8 +1282,7 @@ func TestLinkAddDelVeth(t *testing.T) { func TestLinkAddDelBond(t *testing.T) { minKernelRequired(t, 3, 13) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) modes := []string{"802.3ad", "balance-tlb"} for _, mode := range modes { @@ -1328,8 +1304,7 @@ func TestLinkAddDelBond(t *testing.T) { } func TestLinkAddVethWithDefaultTxQLen(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) la := NewLinkAttrs() la.Name = "foo" @@ -1363,8 +1338,7 @@ func TestLinkAddVethWithDefaultTxQLen(t *testing.T) { } func TestLinkAddVethWithZeroTxQLen(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) la := NewLinkAttrs() la.Name = "foo" la.TxQLen = 0 @@ -1399,8 +1373,7 @@ func TestLinkAddVethWithZeroTxQLen(t *testing.T) { } func TestLinkAddVethWithPeerAttrs(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) la := NewLinkAttrs() la.Name = "foo" la.MTU = 1500 @@ -1460,8 +1433,7 @@ func TestLinkAddVethWithPeerAttrs(t *testing.T) { } func TestLinkAddVethWithoutPeerAttrs(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) la := NewLinkAttrs() la.Name = "foo" la.MTU = 1500 @@ -1522,8 +1494,7 @@ func TestLinkAddDelDummyWithGSO(t *testing.T) { gsoMaxSize = 1 << 14 ) minKernelRequired(t, 4, 16) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) dummy := &Dummy{LinkAttrs: LinkAttrs{Name: "foo", GSOMaxSize: gsoMaxSize, GSOMaxSegs: gsoMaxSegs}} if err := LinkAdd(dummy); err != nil { @@ -1551,8 +1522,7 @@ func TestLinkAddDelDummyWithGRO(t *testing.T) { groMaxSize = 1 << 14 ) minKernelRequired(t, 5, 19) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) dummy := &Dummy{LinkAttrs: LinkAttrs{Name: "foo", GROMaxSize: groMaxSize}} if err := LinkAdd(dummy); err != nil { @@ -1573,8 +1543,7 @@ func TestLinkAddDelDummyWithGRO(t *testing.T) { } func TestLinkAddDummyWithTxQLen(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) la := NewLinkAttrs() la.Name = "foo" la.TxQLen = 1500 @@ -1597,8 +1566,7 @@ func TestLinkAddDummyWithTxQLen(t *testing.T) { } func TestLinkAddDelBridgeMaster(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) master := &Bridge{LinkAttrs: LinkAttrs{Name: "foo"}} if err := LinkAdd(master); err != nil { @@ -1667,8 +1635,7 @@ func testLinkSetUnsetResetMaster(t *testing.T, master, newmaster Link) { } func TestLinkSetUnsetResetMaster(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) master := &Bridge{LinkAttrs: LinkAttrs{Name: "foo"}} if err := LinkAdd(master); err != nil { @@ -1692,8 +1659,7 @@ func TestLinkSetUnsetResetMaster(t *testing.T) { } func TestLinkSetUnsetResetMasterBond(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) master := NewLinkBond(LinkAttrs{Name: "foo"}) master.Mode = BOND_MODE_BALANCE_RR @@ -1719,8 +1685,7 @@ func TestLinkSetUnsetResetMasterBond(t *testing.T) { } func TestLinkSetNs(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) basens, err := netns.Get() if err != nil { @@ -1783,15 +1748,13 @@ func TestLinkSetNs(t *testing.T) { func TestLinkAddDelWireguard(t *testing.T) { minKernelRequired(t, 5, 6) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Wireguard{LinkAttrs: LinkAttrs{Name: "wg0"}}) } func TestVethPeerNs(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) basens, err := netns.Get() if err != nil { @@ -1837,8 +1800,7 @@ func TestVethPeerNs(t *testing.T) { } func TestVethPeerNs2(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) basens, err := netns.Get() if err != nil { @@ -1895,8 +1857,7 @@ func TestVethPeerNs2(t *testing.T) { } func TestLinkAddDelVxlan(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{ LinkAttrs{Name: "foo"}, @@ -1924,8 +1885,7 @@ func TestLinkAddDelVxlan(t *testing.T) { func TestLinkAddDelVxlanUdpCSum6(t *testing.T) { minKernelRequired(t, 3, 16) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{ LinkAttrs{Name: "foo"}, @@ -1956,8 +1916,7 @@ func TestLinkAddDelVxlanUdpCSum6(t *testing.T) { func TestLinkAddDelVxlanGbp(t *testing.T) { minKernelRequired(t, 4, 0) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{ LinkAttrs{Name: "foo"}, @@ -1989,8 +1948,7 @@ func TestLinkAddDelVxlanGbp(t *testing.T) { func TestLinkAddDelVxlanFlowBased(t *testing.T) { minKernelRequired(t, 4, 3) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) vxlan := Vxlan{ LinkAttrs: LinkAttrs{ @@ -2005,9 +1963,8 @@ func TestLinkAddDelVxlanFlowBased(t *testing.T) { func TestLinkAddDelBareUDP(t *testing.T) { minKernelRequired(t, 5, 1) - setUpNetlinkTestWithKModule(t, "bareudp") - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "bareudp")) + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &BareUDP{ LinkAttrs: LinkAttrs{Name: "foo99"}, @@ -2032,9 +1989,9 @@ func TestBareUDPCompareToIP(t *testing.T) { } // requires iproute2 >= 5.10 minKernelRequired(t, 5, 9) - setUpNetlinkTestWithKModule(t, "bareudp") + t.Cleanup(setUpNetlinkTestWithKModule(t, "bareudp")) ns, tearDown := setUpNamedNetlinkTest(t) - defer tearDown() + t.Cleanup(tearDown) expected := &BareUDP{ Port: uint16(6635), @@ -2073,8 +2030,7 @@ func TestBareUDPCompareToIP(t *testing.T) { func TestLinkAddDelIPVlanL2(t *testing.T) { minKernelRequired(t, 4, 2) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { t.Fatal(err) @@ -2093,8 +2049,7 @@ func TestLinkAddDelIPVlanL2(t *testing.T) { func TestLinkAddDelIPVlanL3(t *testing.T) { minKernelRequired(t, 4, 2) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { t.Fatal(err) @@ -2113,8 +2068,7 @@ func TestLinkAddDelIPVlanL3(t *testing.T) { func TestLinkAddDelIPVlanVepa(t *testing.T) { minKernelRequired(t, 4, 15) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) parent := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(parent); err != nil { t.Fatal(err) @@ -2133,8 +2087,7 @@ func TestLinkAddDelIPVlanVepa(t *testing.T) { } func TestLinkAddDelIPVlanNoParent(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ipv := IPVlan{ LinkAttrs: LinkAttrs{ @@ -2152,8 +2105,7 @@ func TestLinkAddDelIPVlanNoParent(t *testing.T) { } func TestLinkByIndex(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) dummy := &Dummy{LinkAttrs{Name: "dummy"}} if err := LinkAdd(dummy); err != nil { @@ -2179,8 +2131,7 @@ func TestLinkByIndex(t *testing.T) { } func TestLinkSet(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Dummy{LinkAttrs{Name: "foo"}} if err := LinkAdd(iface); err != nil { @@ -2284,8 +2235,7 @@ func TestLinkSet(t *testing.T) { } func TestLinkAltName(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Dummy{LinkAttrs{Name: "bar"}} if err := LinkAdd(iface); err != nil { @@ -2350,8 +2300,7 @@ func TestLinkAltName(t *testing.T) { } func TestLinkSetARP(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1500}, PeerName: "banana"} if err := LinkAdd(iface); err != nil { @@ -2407,8 +2356,7 @@ func expectLinkUpdate(ch <-chan LinkUpdate, ifaceName string, up bool) bool { } func TestLinkSubscribe(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ch := make(chan LinkUpdate) done := make(chan struct{}) @@ -2444,8 +2392,7 @@ func TestLinkSubscribe(t *testing.T) { } func TestLinkSubscribeWithOptions(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ch := make(chan LinkUpdate) done := make(chan struct{}) @@ -2578,7 +2525,7 @@ func TestLinkSubscribeListExisting(t *testing.T) { } func TestLinkStats(t *testing.T) { - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) // Create a veth pair and verify the cross-stats once both // ends are brought up and some ICMPv6 packets are exchanged @@ -2657,8 +2604,7 @@ func TestLinkXdp(t *testing.T) { func TestLinkAddDelIptun(t *testing.T) { minKernelRequired(t, 4, 9) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Iptun{ LinkAttrs: LinkAttrs{Name: "iptunfoo"}, @@ -2669,8 +2615,7 @@ func TestLinkAddDelIptun(t *testing.T) { func TestLinkAddDelIptunFlowBased(t *testing.T) { minKernelRequired(t, 4, 9) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Iptun{ LinkAttrs: LinkAttrs{Name: "iptunflowfoo"}, @@ -2679,8 +2624,7 @@ func TestLinkAddDelIptunFlowBased(t *testing.T) { } func TestLinkAddDelIp6tnl(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Ip6tnl{ LinkAttrs: LinkAttrs{Name: "ip6tnltest"}, @@ -2690,8 +2634,7 @@ func TestLinkAddDelIp6tnl(t *testing.T) { } func TestLinkAddDelIp6tnlFlowbased(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Ip6tnl{ LinkAttrs: LinkAttrs{Name: "ip6tnltest"}, @@ -2700,8 +2643,7 @@ func TestLinkAddDelIp6tnlFlowbased(t *testing.T) { } func TestLinkAddDelSittun(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Sittun{ LinkAttrs: LinkAttrs{Name: "sittunfoo"}, @@ -2711,8 +2653,7 @@ func TestLinkAddDelSittun(t *testing.T) { } func TestLinkAddDelVti(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) testLinkAddDel(t, &Vti{ LinkAttrs: LinkAttrs{Name: "vtifoo"}, @@ -2731,8 +2672,7 @@ func TestLinkAddDelVti(t *testing.T) { func TestLinkSetGSOMaxSize(t *testing.T) { minKernelRequired(t, 5, 19) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1500}, PeerName: "bar"} if err := LinkAdd(iface); err != nil { @@ -2761,8 +2701,7 @@ func TestLinkSetGSOMaxSize(t *testing.T) { func TestLinkSetGSOMaxSegs(t *testing.T) { minKernelRequired(t, 5, 19) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1500}, PeerName: "bar"} if err := LinkAdd(iface); err != nil { @@ -2791,8 +2730,7 @@ func TestLinkSetGSOMaxSegs(t *testing.T) { func TestLinkSetGROMaxSize(t *testing.T) { minKernelRequired(t, 5, 19) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1500}, PeerName: "bar"} if err := LinkAdd(iface); err != nil { @@ -2821,8 +2759,7 @@ func TestLinkSetGROMaxSize(t *testing.T) { func TestLinkGetTSOMax(t *testing.T) { minKernelRequired(t, 5, 19) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1500}, PeerName: "bar"} if err := LinkAdd(iface); err != nil { @@ -2841,8 +2778,7 @@ func TestLinkGetTSOMax(t *testing.T) { func TestLinkSetGSOIPv4MaxSize(t *testing.T) { minKernelRequired(t, 6, 3) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1500}, PeerName: "bar"} if err := LinkAdd(iface); err != nil { @@ -2871,8 +2807,7 @@ func TestLinkSetGSOIPv4MaxSize(t *testing.T) { func TestLinkSetGROIPv4MaxSize(t *testing.T) { minKernelRequired(t, 6, 3) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1500}, PeerName: "bar"} if err := LinkAdd(iface); err != nil { @@ -2902,8 +2837,7 @@ func TestLinkSetGROIPv4MaxSize(t *testing.T) { func TestBridgeCreationWithMulticastSnooping(t *testing.T) { minKernelRequired(t, 4, 4) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) bridgeWithDefaultMcastSnoopName := "foo" bridgeWithDefaultMcastSnoop := &Bridge{LinkAttrs: LinkAttrs{Name: bridgeWithDefaultMcastSnoopName}} @@ -2941,8 +2875,7 @@ func TestBridgeCreationWithMulticastSnooping(t *testing.T) { func TestBridgeSetMcastSnoop(t *testing.T) { minKernelRequired(t, 4, 4) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) bridgeName := "foo" bridge := &Bridge{LinkAttrs: LinkAttrs{Name: bridgeName}} @@ -2980,8 +2913,7 @@ func expectMcastSnooping(t *testing.T, linkName string, expected bool) { func TestBridgeSetVlanFiltering(t *testing.T) { minKernelRequired(t, 4, 4) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) bridgeName := "foo" bridge := &Bridge{LinkAttrs: LinkAttrs{Name: bridgeName}} @@ -3008,8 +2940,7 @@ func TestBridgeSetVlanFiltering(t *testing.T) { func TestBridgeDefaultPVID(t *testing.T) { minKernelRequired(t, 4, 4) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) bridgeName := "foo" bridge := &Bridge{LinkAttrs: LinkAttrs{Name: bridgeName}} @@ -3058,8 +2989,7 @@ func expectVlanDefaultPVID(t *testing.T, linkName string, expected uint16) { func TestBridgeCreationWithAgeingTime(t *testing.T) { minKernelRequired(t, 3, 18) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) bridgeWithSpecifiedAgeingTimeName := "foo" ageingTime := uint32(20000) @@ -3104,8 +3034,7 @@ func TestBridgeCreationWithAgeingTime(t *testing.T) { func TestBridgeCreationWithHelloTime(t *testing.T) { minKernelRequired(t, 3, 18) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) bridgeWithSpecifiedHelloTimeName := "foo" helloTime := uint32(300) @@ -3150,8 +3079,7 @@ func TestBridgeCreationWithHelloTime(t *testing.T) { func TestBridgeCreationWithVlanFiltering(t *testing.T) { minKernelRequired(t, 3, 18) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) bridgeWithVlanFilteringEnabledName := "foo" vlanFiltering := true @@ -3194,8 +3122,7 @@ func TestBridgeCreationWithVlanFiltering(t *testing.T) { } func TestLinkSubscribeWithProtinfo(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) master := &Bridge{LinkAttrs: LinkAttrs{Name: "foo"}} if err := LinkAdd(master); err != nil { @@ -3272,15 +3199,14 @@ func testGTPLink(t *testing.T) *GTP { } func TestLinkAddDelGTP(t *testing.T) { - tearDown := setUpNetlinkTestWithKModule(t, "gtp") - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "gtp")) gtp := testGTPLink(t) testLinkAddDel(t, gtp) } func TestLinkAddDelXfrmi(t *testing.T) { minKernelRequired(t, 4, 19) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) lo, _ := LinkByName("lo") @@ -3291,7 +3217,7 @@ func TestLinkAddDelXfrmi(t *testing.T) { func TestLinkAddDelXfrmiNoId(t *testing.T) { minKernelRequired(t, 4, 19) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) lo, _ := LinkByName("lo") @@ -3328,8 +3254,7 @@ func TestLinkByAliasWhenLinkIsNotFound(t *testing.T) { } func TestLinkAddDelTuntap(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // Mount sysfs so that sysfs gets the namespace tag of the current network namespace // This is necessary so that /sys shows the network interfaces of the current namespace. @@ -3349,8 +3274,7 @@ func TestLinkAddDelTuntap(t *testing.T) { } func TestLinkAddDelTuntapMq(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := syscall.Mount("sysfs", "/sys", "sysfs", syscall.MS_RDONLY, ""); err != nil { t.Fatal("Cannot mount sysfs") @@ -3382,8 +3306,7 @@ func TestLinkAddDelTuntapMq(t *testing.T) { } func TestTuntapPartialQueues(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := syscall.Mount("sysfs", "/sys", "sysfs", syscall.MS_RDONLY, ""); err != nil { t.Fatal("Cannot mount sysfs") @@ -3440,8 +3363,7 @@ func TestTuntapPartialQueues(t *testing.T) { } func TestLinkAddDelTuntapOwnerGroup(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := syscall.Mount("sysfs", "/sys", "sysfs", syscall.MS_RDONLY, ""); err != nil { t.Fatal("Cannot mount sysfs") @@ -3462,8 +3384,7 @@ func TestLinkAddDelTuntapOwnerGroup(t *testing.T) { } func TestVethPeerIndex(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) const ( vethPeer1 = "vethOne" @@ -3515,8 +3436,7 @@ func TestVethPeerIndex(t *testing.T) { func TestLinkSlaveBond(t *testing.T) { minKernelRequired(t, 3, 13) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) const ( bondName = "foo" @@ -3558,8 +3478,7 @@ func TestLinkSlaveBond(t *testing.T) { func TestLinkSetBondSlaveQueueId(t *testing.T) { minKernelRequired(t, 3, 13) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) const ( bondName = "foo" @@ -3590,8 +3509,7 @@ func TestLinkSetBondSlaveQueueId(t *testing.T) { func TestLinkSetBondSlave(t *testing.T) { minKernelRequired(t, 3, 13) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) const ( bondName = "foo" @@ -3693,8 +3611,7 @@ func testFailover(t *testing.T, slaveName, bondName string) { func TestLinkFailover(t *testing.T) { minKernelRequired(t, 3, 13) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) const ( bondName = "foo" @@ -3766,8 +3683,7 @@ func TestLinkFailover(t *testing.T) { } func TestLinkSetAllmulticast(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo"}, PeerName: "bar"} if err := LinkAdd(iface); err != nil { @@ -3816,8 +3732,7 @@ func TestLinkSetAllmulticast(t *testing.T) { } func TestLinkSetMulticast(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo"}, PeerName: "bar"} if err := LinkAdd(iface); err != nil { @@ -3866,8 +3781,7 @@ func TestLinkSetMulticast(t *testing.T) { } func TestLinkSetMacvlanMode(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) const ( parentName = "foo" diff --git a/neigh_test.go b/neigh_test.go index bf52cd8..886bac6 100644 --- a/neigh_test.go +++ b/neigh_test.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package netlink @@ -67,10 +68,7 @@ func dumpContainsProxy(dump []Neigh, p proxyEntry) bool { } func TestNeighAddDelLLIPAddr(t *testing.T) { - setUpNetlinkTestWithKModule(t, "ip_gre") - - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "ip_gre")) dummy := Gretun{ LinkAttrs: LinkAttrs{Name: "neigh0"}, @@ -116,8 +114,7 @@ func TestNeighAddDelLLIPAddr(t *testing.T) { } func TestNeighAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) dummy := Dummy{LinkAttrs{Name: "neigh0"}} if err := LinkAdd(&dummy); err != nil { @@ -192,8 +189,7 @@ func TestNeighAddDel(t *testing.T) { } func TestNeighAddDelProxy(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) dummy := Dummy{LinkAttrs{Name: "neigh0"}} if err := LinkAdd(&dummy); err != nil { @@ -293,8 +289,7 @@ func expectNeighUpdate(ch <-chan NeighUpdate, expected []NeighUpdate) bool { } func TestNeighSubscribe(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) dummy := &Dummy{LinkAttrs{Name: "neigh0"}} if err := LinkAdd(dummy); err != nil { @@ -344,8 +339,7 @@ func TestNeighSubscribe(t *testing.T) { } func TestNeighSubscribeWithOptions(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ch := make(chan NeighUpdate) done := make(chan struct{}) @@ -556,8 +550,7 @@ func TestNeighSubscribeListExisting(t *testing.T) { } func TestNeighListExecuteStateFilter(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // Create dummy iface dummy := Dummy{LinkAttrs{Name: "neigh0"}} diff --git a/netlink_test.go b/netlink_test.go index ed0059a..14e0f9c 100644 --- a/netlink_test.go +++ b/netlink_test.go @@ -66,18 +66,37 @@ func skipUnlessKModuleLoaded(t *testing.T, moduleNames ...string) { func setUpNetlinkTest(t testing.TB) tearDownNetlinkTest { skipUnlessRoot(t) - - // new temporary namespace so we don't pollute the host - // lock thread since the namespace is thread local + // Lock the OS thread, then record original namespace runtime.LockOSThread() - var err error + origNS, err := netns.Get() + if err != nil { + runtime.UnlockOSThread() + t.Fatal("Failed to get current namespace:", err) + } + // Create and enter a fresh namespace ns, err := netns.New() if err != nil { - t.Fatal("Failed to create newns", ns) + // attempt to restore before failing + _ = netns.Set(origNS) + runtime.UnlockOSThread() + t.Fatal("Failed to create new namespace:", err) } + // Reinitialize the package-level handle in this namespace + if pkgHandle != nil { + // ensure all sockets from the previous Handle are closed + _ = pkgHandle.Close() + } + pkgHandle = &Handle{} return func() { + // Close the new namespace handle ns.Close() + // Restore the original namespace + if err := netns.Set(origNS); err != nil { + t.Fatalf("Failed to restore original namespace: %v", err) + } + _ = origNS.Close() + // Unlock the OS thread runtime.UnlockOSThread() } } @@ -123,11 +142,22 @@ func setUpNetlinkTestWithLoopback(t *testing.T) tearDownNetlinkTest { skipUnlessRoot(t) runtime.LockOSThread() - ns, err := netns.New() + + // Save the current namespace + origNS, err := netns.Get() if err != nil { - t.Fatal("Failed to create new netns", ns) + runtime.UnlockOSThread() + t.Fatal("Failed to get current namespace:", err) } + // Create and enter a fresh namespace + ns, err := netns.New() + if err != nil { + runtime.UnlockOSThread() + t.Fatal("Failed to create new netns:", err) + } + + // Bring up the loopback interface link, err := LinkByName("lo") if err != nil { t.Fatalf("Failed to find \"lo\" in new netns: %v", err) @@ -136,8 +166,13 @@ func setUpNetlinkTestWithLoopback(t *testing.T) tearDownNetlinkTest { t.Fatalf("Failed to bring up \"lo\" in new netns: %v", err) } + // Teardown: restore original namespace and thread state return func() { ns.Close() + if err := netns.Set(origNS); err != nil { + t.Fatalf("Failed to restore original namespace: %v", err) + } + _ = origNS.Close() runtime.UnlockOSThread() } } diff --git a/netns_test.go b/netns_test.go index e18169a..73fab0e 100644 --- a/netns_test.go +++ b/netns_test.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package netlink @@ -25,7 +26,7 @@ func TestNetNsIdByFd(t *testing.T) { // In an attempt to avoid namespace id collisions, set this to something // insanely high. When the kernel assigns IDs, it does so starting from 0 // So, just use our pid shifted up 16 bits - wantID := os.Getpid() << 16 + wantID := (os.Getpid() << 16) & 0x7FFFFFFF h, err := NewHandle() CheckErrorFail(t, err) @@ -64,7 +65,7 @@ func TestNetNsIdByPid(t *testing.T) { }() // As above, we'll pick a crazy large netnsid to avoid collisions - wantID := syscall.Gettid() << 16 + wantID := (syscall.Gettid() << 16) & 0x7FFFFFFF h, err := NewHandle() CheckErrorFail(t, err) diff --git a/netns_unspecified.go b/netns_unspecified.go index 5c5899e..a187cf8 100644 --- a/netns_unspecified.go +++ b/netns_unspecified.go @@ -1,3 +1,4 @@ +//go:build !linux // +build !linux package netlink diff --git a/nl/nl_linux.go b/nl/nl_linux.go index 0a0c1bb..1a676b6 100644 --- a/nl/nl_linux.go +++ b/nl/nl_linux.go @@ -829,8 +829,8 @@ func SubscribeAt(newNs, curNs netns.NsHandle, protocol int, groups ...uint) (*Ne return Subscribe(protocol, groups...) } -func (s *NetlinkSocket) Close() { - s.file.Close() +func (s *NetlinkSocket) Close() error { + return s.file.Close() } func (s *NetlinkSocket) GetFd() int { @@ -1083,8 +1083,9 @@ type SocketHandle struct { } // Close closes the netlink socket -func (sh *SocketHandle) Close() { +func (sh *SocketHandle) Close() error { if sh.Socket != nil { - sh.Socket.Close() + return sh.Socket.Close() } + return nil } diff --git a/proc_event_test.go b/proc_event_test.go index 6455be8..f200f05 100644 --- a/proc_event_test.go +++ b/proc_event_test.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package netlink diff --git a/protinfo_test.go b/protinfo_test.go index 7e9561c..29eef4c 100644 --- a/protinfo_test.go +++ b/protinfo_test.go @@ -8,8 +8,7 @@ import ( ) func TestProtinfo(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) master := &Bridge{LinkAttrs: LinkAttrs{Name: "foo"}} if err := LinkAdd(master); err != nil { t.Fatal(err) diff --git a/qdisc_test.go b/qdisc_test.go index 21c7786..9583c56 100644 --- a/qdisc_test.go +++ b/qdisc_test.go @@ -8,8 +8,7 @@ import ( ) func TestTbfAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -66,8 +65,7 @@ func TestTbfAddDel(t *testing.T) { } func TestHtbAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -129,8 +127,7 @@ func TestHtbAddDel(t *testing.T) { } func TestSfqAddDel(t *testing.T) { - tearDown := setUpNetlinkTestWithKModule(t, "sch_sfq") - defer tearDown() + t.Cleanup(setUpNetlinkTestWithKModule(t, "sch_sfq")) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -195,8 +192,7 @@ func TestSfqAddDel(t *testing.T) { } func TestPrioAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -239,8 +235,7 @@ func TestPrioAddDel(t *testing.T) { } func TestTbfAddHtbReplaceDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -330,8 +325,7 @@ func TestTbfAddHtbReplaceDel(t *testing.T) { } func TestTbfAddTbfChangeDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -421,8 +415,7 @@ func TestTbfAddTbfChangeDel(t *testing.T) { func TestFqAddChangeDel(t *testing.T) { minKernelRequired(t, 3, 11) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -478,8 +471,7 @@ func TestFqAddChangeDel(t *testing.T) { func TestFqHorizon(t *testing.T) { minKernelRequired(t, 5, 7) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -535,8 +527,7 @@ func TestFqHorizon(t *testing.T) { func TestFqCodelAddChangeDel(t *testing.T) { minKernelRequired(t, 3, 4) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } @@ -587,8 +578,7 @@ func TestFqCodelAddChangeDel(t *testing.T) { } func TestIngressAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil { t.Fatal(err) } diff --git a/rdma_link_test.go b/rdma_link_test.go index 6c33775..6e9b921 100644 --- a/rdma_link_test.go +++ b/rdma_link_test.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package netlink diff --git a/route_test.go b/route_test.go index 5563987..c51a0d4 100644 --- a/route_test.go +++ b/route_test.go @@ -17,8 +17,7 @@ import ( ) func TestRouteAddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -155,8 +154,7 @@ func TestRouteAddDel(t *testing.T) { } func TestRoute6AddDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // create dummy interface // IPv6 route added to loopback interface will be unreachable @@ -332,8 +330,7 @@ func TestRoute6AddDel(t *testing.T) { } func TestRouteChange(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -398,8 +395,7 @@ func TestRouteChange(t *testing.T) { } func TestRouteReplace(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -459,8 +455,7 @@ func TestRouteReplace(t *testing.T) { } func TestRouteAppend(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -523,8 +518,7 @@ func TestRouteAppend(t *testing.T) { } func TestRouteAddIncomplete(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -562,8 +556,7 @@ func expectRouteUpdate(ch <-chan RouteUpdate, t, f uint16, dst net.IP) bool { } func TestRouteSubscribe(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ch := make(chan RouteUpdate) done := make(chan struct{}) @@ -607,8 +600,7 @@ func TestRouteSubscribe(t *testing.T) { } func TestRouteSubscribeWithOptions(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) ch := make(chan RouteUpdate) done := make(chan struct{}) @@ -796,8 +788,7 @@ func TestRouteSubscribeListExisting(t *testing.T) { } func TestRouteFilterAllTables(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -877,8 +868,7 @@ func TestRouteFilterAllTables(t *testing.T) { } func TestRouteFilterByFamily(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) const table int = 999 @@ -950,8 +940,7 @@ func TestRouteFilterByFamily(t *testing.T) { } func TestRouteFilterIterCanStop(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -1016,8 +1005,7 @@ func TestRouteFilterIterCanStop(t *testing.T) { } func BenchmarkRouteListFilteredNew(b *testing.B) { - tearDown := setUpNetlinkTest(b) - defer tearDown() + b.Cleanup(setUpNetlinkTest(b)) link, err := setUpRoutesBench(b) @@ -1039,8 +1027,7 @@ func BenchmarkRouteListFilteredNew(b *testing.B) { } func BenchmarkRouteListIter(b *testing.B) { - tearDown := setUpNetlinkTest(b) - defer tearDown() + b.Cleanup(setUpNetlinkTest(b)) link, err := setUpRoutesBench(b) @@ -1104,8 +1091,7 @@ func tableIDIn(ids []int, id int) bool { } func TestRouteExtraFields(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -1180,8 +1166,7 @@ func TestRouteExtraFields(t *testing.T) { } func TestRouteMultiPath(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -1357,8 +1342,7 @@ func TestRouteIifOption(t *testing.T) { } func TestRouteOifOption(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // setup two interfaces: eth0, eth1 err := LinkAdd(&Dummy{LinkAttrs{Name: "eth0"}}) @@ -1467,8 +1451,7 @@ func TestRouteOifOption(t *testing.T) { } func TestFilterDefaultRoute(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -1549,8 +1532,7 @@ func TestFilterDefaultRoute(t *testing.T) { } func TestMPLSRouteAddDel(t *testing.T) { - tearDown := setUpMPLSNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpMPLSNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -1601,8 +1583,7 @@ func TestIP6tnlRouteAddDel(t *testing.T) { t.Fatal(err) } - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -2021,8 +2002,7 @@ func TestSEG6RouteAddDel(t *testing.T) { } // add/del routes with LWTUNNEL_SEG6 to/from loopback interface. // Test both seg6 modes: encap (IPv4) & inline (IPv6). - tearDown := setUpSEG6NetlinkTest(t) - defer tearDown() + t.Cleanup(setUpSEG6NetlinkTest(t)) // get loopback interface and bring it up link, err := LinkByName("lo") @@ -2107,8 +2087,7 @@ func TestSEG6RouteAddDel(t *testing.T) { // add/del routes with LWTUNNEL_ENCAP_SEG6_LOCAL to/from dummy interface. func TestSEG6LocalRoute6AddDel(t *testing.T) { minKernelRequired(t, 4, 14) - tearDown := setUpSEG6NetlinkTest(t) - defer tearDown() + t.Cleanup(setUpSEG6NetlinkTest(t)) // create dummy interface // IPv6 route added to loopback interface will be unreachable @@ -2238,8 +2217,7 @@ func TestMTURouteAddDel(t *testing.T) { t.Fatal(err) } - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -2292,8 +2270,7 @@ func TestMTULockRouteAddDel(t *testing.T) { t.Fatal(err) } - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -2350,8 +2327,7 @@ func TestRtoMinLockRouteAddDel(t *testing.T) { t.Fatal(err) } - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // get loopback interface link, err := LinkByName("lo") @@ -2404,8 +2380,7 @@ func TestRtoMinLockRouteAddDel(t *testing.T) { func TestRouteViaAddDel(t *testing.T) { minKernelRequired(t, 5, 4) - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) _, err := RouteList(nil, FAMILY_V4) if err != nil { @@ -2469,8 +2444,7 @@ func TestRouteViaAddDel(t *testing.T) { } func TestRouteUIDOption(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // setup eth0 so that network is reachable err := LinkAdd(&Dummy{LinkAttrs{Name: "eth0"}}) @@ -2565,8 +2539,7 @@ func TestRouteUIDOption(t *testing.T) { } func TestRouteFWMarkOption(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) // setup eth0 so that network is reachable err := LinkAdd(&Dummy{LinkAttrs{Name: "eth0"}}) @@ -2710,8 +2683,7 @@ func TestRouteFWMarkOption(t *testing.T) { } func TestRouteGetFIBMatchOption(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) err := LinkAdd(&Dummy{LinkAttrs{Name: "eth0"}}) if err != nil { diff --git a/route_unspecified.go b/route_unspecified.go index db73726..380d50b 100644 --- a/route_unspecified.go +++ b/route_unspecified.go @@ -1,3 +1,4 @@ +//go:build !linux // +build !linux package netlink diff --git a/rule_test.go b/rule_test.go index ebcd2e0..67338bc 100644 --- a/rule_test.go +++ b/rule_test.go @@ -13,7 +13,7 @@ import ( func TestRuleAddDel(t *testing.T) { skipUnlessRoot(t) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) srcNet := &net.IPNet{IP: net.IPv4(172, 16, 0, 1), Mask: net.CIDRMask(16, 32)} dstNet := &net.IPNet{IP: net.IPv4(172, 16, 1, 1), Mask: net.CIDRMask(24, 32)} @@ -584,7 +584,7 @@ func runRuleListFiltered(t *testing.T, family int, srcNet, dstNet *net.IPNet) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) rule := tt.preRun() wantRules, wantErr := tt.setupWant(rule) diff --git a/socket_test.go b/socket_test.go index 0f11e78..d0ae80a 100644 --- a/socket_test.go +++ b/socket_test.go @@ -12,7 +12,7 @@ import ( ) func TestSocketGet(t *testing.T) { - defer setUpNetlinkTestWithLoopback(t)() + t.Cleanup(setUpNetlinkTestWithLoopback(t)) type Addr struct { IP net.IP @@ -102,7 +102,7 @@ func TestSocketGet(t *testing.T) { } func TestSocketDestroy(t *testing.T) { - defer setUpNetlinkTestWithLoopback(t)() + t.Cleanup(setUpNetlinkTestWithLoopback(t)) addr, err := net.ResolveTCPAddr("tcp", "localhost:0") if err != nil { diff --git a/xfrm_monitor_linux_test.go b/xfrm_monitor_linux_test.go index 47b6ecd..2c916e2 100644 --- a/xfrm_monitor_linux_test.go +++ b/xfrm_monitor_linux_test.go @@ -11,7 +11,7 @@ func TestXfrmMonitorExpire(t *testing.T) { if os.Getenv("CI") == "true" { t.Skipf("Flaky in CI: Intermittently causes 10 minute timeout") } - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) ch := make(chan XfrmMsg) done := make(chan struct{}) diff --git a/xfrm_policy_linux_test.go b/xfrm_policy_linux_test.go index fff14e3..8fb3cc8 100644 --- a/xfrm_policy_linux_test.go +++ b/xfrm_policy_linux_test.go @@ -9,8 +9,7 @@ import ( const zeroCIDR = "0.0.0.0/0" func TestXfrmPolicyAddUpdateDel(t *testing.T) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) policy := getPolicy() if err := XfrmPolicyAdd(policy); err != nil { @@ -102,7 +101,7 @@ func TestXfrmPolicyAddUpdateDel(t *testing.T) { } func TestXfrmPolicyFlush(t *testing.T) { - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) p1 := getPolicy() if err := XfrmPolicyAdd(p1); err != nil { @@ -140,7 +139,7 @@ func TestXfrmPolicyFlush(t *testing.T) { } func TestXfrmPolicyBlockWithIfindex(t *testing.T) { - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) pBlock := getPolicy() pBlock.Action = XFRM_POLICY_BLOCK @@ -165,7 +164,7 @@ func TestXfrmPolicyBlockWithIfindex(t *testing.T) { func TestXfrmPolicyWithIfid(t *testing.T) { minKernelRequired(t, 4, 19) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) pol := getPolicy() pol.Ifid = 54321 @@ -190,7 +189,7 @@ func TestXfrmPolicyWithIfid(t *testing.T) { func TestXfrmPolicyWithOptional(t *testing.T) { minKernelRequired(t, 4, 19) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) pol := getPolicy() pol.Dir = XFRM_DIR_IN diff --git a/xfrm_state_linux_test.go b/xfrm_state_linux_test.go index d6acc5a..3131fb1 100644 --- a/xfrm_state_linux_test.go +++ b/xfrm_state_linux_test.go @@ -21,8 +21,7 @@ func TestXfrmStateAddGetDel(t *testing.T) { } func testXfrmStateAddGetDel(t *testing.T, state *XfrmState) { - tearDown := setUpNetlinkTest(t) - defer tearDown() + t.Cleanup(setUpNetlinkTest(t)) if err := XfrmStateAdd(state); err != nil { t.Fatal(err) } @@ -66,7 +65,7 @@ func testXfrmStateAddGetDel(t *testing.T, state *XfrmState) { } func TestXfrmStateAllocSpi(t *testing.T) { - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) state := getBaseState() state.Spi = 0 @@ -87,7 +86,7 @@ func TestXfrmStateAllocSpi(t *testing.T) { } func TestXfrmStateFlush(t *testing.T) { - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) state1 := getBaseState() state2 := getBaseState() @@ -138,7 +137,7 @@ func TestXfrmStateFlush(t *testing.T) { } func TestXfrmStateUpdateLimits(t *testing.T) { - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) // Program state with limits state := getBaseState() @@ -186,7 +185,7 @@ func TestXfrmStateUpdateLimits(t *testing.T) { } func TestXfrmStateStats(t *testing.T) { - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) // Program state and record time state := getBaseState() @@ -207,7 +206,7 @@ func TestXfrmStateStats(t *testing.T) { func TestXfrmStateWithIfid(t *testing.T) { minKernelRequired(t, 4, 19) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) state := getBaseState() state.Ifid = 54321 @@ -228,7 +227,7 @@ func TestXfrmStateWithIfid(t *testing.T) { func TestXfrmStateWithSADir(t *testing.T) { minKernelRequired(t, 4, 19) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) state := getBaseState() state.SADir = XFRM_SA_DIR_IN @@ -260,18 +259,18 @@ func TestXfrmStateWithPcpunumWithoutSADir(t *testing.T) { t.Skipf("Host Kernel (%d.%d) does not meet test's minimum required version: (%d.%d)", k, m, minKernel, minMajor) } - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) state := getBaseState() pcpuNum := uint32(1) state.Pcpunum = &pcpuNum err = XfrmStateAdd(state) - + if err != nil { if k > maxKernel || k == maxKernel && m >= maxMajor { // On and After maxKernel.maxMajor, SA_PCPU is only supported with SA_DIR t.Logf("Host Kernel(%d.%d) does not allows SA_PCPU without SA_DIR", k, m) - if ! strings.Contains(err.Error(), unsupportedMsg) { + if !strings.Contains(err.Error(), unsupportedMsg) { t.Fatal("Unexpected error from XfrmStateAdd", "error: ", err) } return @@ -292,7 +291,7 @@ func TestXfrmStateWithPcpunumWithoutSADir(t *testing.T) { func TestXfrmStateWithPcpunumWithSADir(t *testing.T) { minKernelRequired(t, 4, 19) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) state := getBaseState() state.SADir = XFRM_SA_DIR_IN @@ -315,7 +314,7 @@ func TestXfrmStateWithPcpunumWithSADir(t *testing.T) { func TestXfrmStateWithOutputMark(t *testing.T) { minKernelRequired(t, 4, 14) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) state := getBaseState() state.OutputMark = &XfrmMark{ @@ -338,7 +337,7 @@ func TestXfrmStateWithOutputMark(t *testing.T) { func TestXfrmStateWithOutputMarkAndMask(t *testing.T) { minKernelRequired(t, 4, 19) - defer setUpNetlinkTest(t)() + t.Cleanup(setUpNetlinkTest(t)) state := getBaseState() state.OutputMark = &XfrmMark{