package sockaddr_test import ( "testing" sockaddr "github.com/hashicorp/go-sockaddr" ) func TestIfAttr_net(t *testing.T) { ifAddrs, err := sockaddr.GetAllInterfaces() if err != nil { t.Fatalf("Unable to proceed: %v", err) } for _, ifAddr := range ifAddrs { testSockAddrAttr(t, ifAddr) } } func TestIfAttr_unix(t *testing.T) { newUnixSock := func(path string) sockaddr.UnixSock { sa, err := sockaddr.NewUnixSock(path) if err != nil { t.Fatalf("unable to create new unix socket: %v", err) } return sa } unixSockets := []sockaddr.SockAddr{ newUnixSock("/tmp/test"), } for _, sa := range unixSockets { testSockAddrAttr(t, sa) } } func testSockAddrAttr(t *testing.T, sai interface{}) { attrNamesPerType := []struct { name sockaddr.AttrName ipv4Pass bool ipv6Pass bool unixPass bool }{ // Universal {"type", true, true, true}, {"string", true, true, true}, // IP {"name", true, true, false}, {"size", true, true, false}, {"flags", true, true, false}, {"host", true, true, false}, {"address", true, true, false}, {"port", true, true, false}, {"netmask", true, true, false}, {"network", true, true, false}, {"mask_bits", true, true, false}, {"binary", true, true, false}, {"hex", true, true, false}, {"first_usable", true, true, false}, {"last_usable", true, true, false}, {"octets", true, true, false}, // IPv4 {"broadcast", true, false, false}, {"uint32", true, false, false}, // IPv6 {"uint128", false, true, false}, // Unix {"path", false, false, true}, } for _, attrTest := range attrNamesPerType { switch v := sai.(type) { case sockaddr.IfAddr: saType := v.Type() _, err := v.Attr(attrTest.name) switch saType { case sockaddr.TypeIPv4: if err == nil && attrTest.ipv4Pass || err != nil && !attrTest.ipv4Pass { // pass } // fallthrough case sockaddr.TypeIPv6: if err == nil && attrTest.ipv6Pass || err != nil && !attrTest.ipv6Pass { // pass } // fallthrough case sockaddr.TypeUnix: if err == nil && attrTest.unixPass || err != nil && !attrTest.unixPass { // pass } // fallthrough default: t.Errorf("Unable to fetch attr name %q: %v", attrTest.name, err) } case sockaddr.SockAddr: val, err := sockaddr.Attr(v, attrTest.name) _ = err pass := len(val) > 0 switch { case v.Type() == sockaddr.TypeIPv4 && attrTest.ipv4Pass == pass, v.Type() == sockaddr.TypeIPv6 && attrTest.ipv6Pass == pass, v.Type() == sockaddr.TypeUnix && attrTest.unixPass == pass: // pass default: t.Errorf("Unable to fetch attr name %q from %v / %v + %+q", attrTest.name, v, v.Type(), val) } default: t.Fatal("unsupported type %T %v", sai, sai) } } }