github.com/database64128/shadowsocks-go@v1.7.0/conn/addr_test.go (about)

     1  package conn
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rand"
     6  	"net/netip"
     7  	"strings"
     8  	"testing"
     9  )
    10  
    11  // Test zero value.
    12  var (
    13  	addrZero       Addr
    14  	addrZeroPort   uint16
    15  	addrZeroString string
    16  )
    17  
    18  // Test IP address.
    19  var (
    20  	addrIP                = AddrFromIPPort(addrIPAddrPort)
    21  	addrIPAddr            = netip.AddrFrom16([16]byte{0x20, 0x01, 0x0d, 0xb8, 0xfa, 0xd6, 0x05, 0x72, 0xac, 0xbe, 0x71, 0x43, 0x14, 0xe5, 0x7a, 0x6e})
    22  	addrIPPort     uint16 = 1080
    23  	addrIPAddrPort        = netip.AddrPortFrom(addrIPAddr, addrIPPort)
    24  	addrIPHost            = "2001:db8:fad6:572:acbe:7143:14e5:7a6e"
    25  	addrIPString          = "[2001:db8:fad6:572:acbe:7143:14e5:7a6e]:1080"
    26  )
    27  
    28  // Test domain name.
    29  var (
    30  	addrDomain              = MustAddrFromDomainPort(addrDomainHost, addrDomainPort)
    31  	addrDomainHost          = "example.com"
    32  	addrDomainPort   uint16 = 443
    33  	addrDomainString        = "example.com:443"
    34  )
    35  
    36  func TestAddrEquals(t *testing.T) {
    37  	if !addrZero.Equals(addrZero) {
    38  		t.Error("addrZero.Equals(addrZero) returned false.")
    39  	}
    40  	if !addrIP.Equals(addrIP) {
    41  		t.Error("addrIP.Equals(addrIP) returned false.")
    42  	}
    43  	if !addrDomain.Equals(addrDomain) {
    44  		t.Error("addrDomain.Equals(addrDomain) returned false.")
    45  	}
    46  
    47  	if addrZero.Equals(addrIP) {
    48  		t.Error("addrZero.Equals(addrIP) returned true.")
    49  	}
    50  	if addrZero.Equals(addrDomain) {
    51  		t.Error("addrZero.Equals(addrDomain) returned true.")
    52  	}
    53  	if addrIP.Equals(addrDomain) {
    54  		t.Error("addrIP.Equals(addrDomain) returned true.")
    55  	}
    56  
    57  	if addrIP443 := AddrFromIPPort(netip.AddrPortFrom(addrIPAddr, 443)); addrIP443.Equals(addrIP) {
    58  		t.Error("addrIP443.Equals(addrIP) returned true.")
    59  	}
    60  }
    61  
    62  func TestAddrIs(t *testing.T) {
    63  	if addrZero.IsValid() {
    64  		t.Error("addrZero.IsValid() returned true.")
    65  	}
    66  	if addrZero.IsIP() {
    67  		t.Error("addrZero.IsIP() returned true.")
    68  	}
    69  	if addrZero.IsDomain() {
    70  		t.Error("addrZero.IsDomain() returned true.")
    71  	}
    72  
    73  	if !addrIP.IsValid() {
    74  		t.Error("addrIP.IsValid() returned false.")
    75  	}
    76  	if !addrIP.IsIP() {
    77  		t.Error("addrIP.IsIP() returned false.")
    78  	}
    79  	if addrIP.IsDomain() {
    80  		t.Error("addrIP.IsDomain() returned true.")
    81  	}
    82  
    83  	if !addrDomain.IsValid() {
    84  		t.Error("addrDomain.IsValid() returned false.")
    85  	}
    86  	if addrDomain.IsIP() {
    87  		t.Error("addrDomain.IsIP() returned true.")
    88  	}
    89  	if !addrDomain.IsDomain() {
    90  		t.Error("addrDomain.IsDomain() returned false.")
    91  	}
    92  }
    93  
    94  func assertPanic(t *testing.T, f func()) {
    95  	t.Helper()
    96  	defer func() {
    97  		if r := recover(); r == nil {
    98  			t.Error("Expected panic, got none.")
    99  		}
   100  	}()
   101  	f()
   102  }
   103  
   104  func TestAddrIP(t *testing.T) {
   105  	if ip := addrIP.IP(); ip != addrIPAddr {
   106  		t.Errorf("addrIP.IP() returned %s, expected %s.", ip, addrIPAddr)
   107  	}
   108  
   109  	assertPanic(t, func() { addrZero.IP() })
   110  	assertPanic(t, func() { addrDomain.IP() })
   111  }
   112  
   113  func TestAddrDomain(t *testing.T) {
   114  	if domain := addrDomain.Domain(); domain != addrDomainHost {
   115  		t.Errorf("addrDomain.Domain() returned %s, expected %s.", domain, addrDomainHost)
   116  	}
   117  
   118  	assertPanic(t, func() { addrZero.Domain() })
   119  	assertPanic(t, func() { addrIP.Domain() })
   120  }
   121  
   122  func TestAddrPort(t *testing.T) {
   123  	if port := addrZero.Port(); port != addrZeroPort {
   124  		t.Errorf("addrZero.Port() returned %d, expected %d.", port, addrZeroPort)
   125  	}
   126  
   127  	if port := addrIP.Port(); port != addrIPPort {
   128  		t.Errorf("addrIP.Port() returned %d, expected %d.", port, addrIPPort)
   129  	}
   130  
   131  	if port := addrDomain.Port(); port != addrDomainPort {
   132  		t.Errorf("addrDomain.Port() returned %d, expected %d.", port, addrDomainPort)
   133  	}
   134  }
   135  
   136  func TestAddrIPPort(t *testing.T) {
   137  	if ap := addrIP.IPPort(); ap != addrIPAddrPort {
   138  		t.Errorf("addrIP.IPPort() returned %s, expected %s.", ap, addrIPAddrPort)
   139  	}
   140  
   141  	assertPanic(t, func() { addrZero.IPPort() })
   142  	assertPanic(t, func() { addrDomain.IPPort() })
   143  }
   144  
   145  func TestAddrResolveIP(t *testing.T) {
   146  	ip, err := addrIP.ResolveIP()
   147  	if err != nil {
   148  		t.Fatal(err)
   149  	}
   150  	if ip != addrIPAddr {
   151  		t.Errorf("addrIP.ResolveIP() returned %s, expected %s.", ip, addrIPAddr)
   152  	}
   153  
   154  	ip, err = addrDomain.ResolveIP()
   155  	if err != nil {
   156  		t.Fatal(err)
   157  	}
   158  	if !ip.IsValid() {
   159  		t.Error("addrDomain.ResolveIP() returned invalid IP address.")
   160  	}
   161  
   162  	assertPanic(t, func() { addrZero.ResolveIP() })
   163  }
   164  
   165  func TestAddrResolveIPPort(t *testing.T) {
   166  	ipPort, err := addrIP.ResolveIPPort()
   167  	if err != nil {
   168  		t.Fatal(err)
   169  	}
   170  	if ipPort != addrIPAddrPort {
   171  		t.Errorf("addrIP.ResolveIPPort() returned %s, expected %s.", ipPort, addrIPAddrPort)
   172  	}
   173  
   174  	ipPort, err = addrDomain.ResolveIPPort()
   175  	if err != nil {
   176  		t.Fatal(err)
   177  	}
   178  	if !ipPort.Addr().IsValid() {
   179  		t.Error("addrDomain.ResolveIPPort() returned invalid IP address.")
   180  	}
   181  	if ipPort.Port() != addrDomainPort {
   182  		t.Errorf("addrDomain.ResolveIPPort(false) returned %s, expected port %d.", ipPort, addrDomainPort)
   183  	}
   184  
   185  	assertPanic(t, func() { addrZero.ResolveIPPort() })
   186  }
   187  
   188  func TestAddrHost(t *testing.T) {
   189  	if host := addrIP.Host(); host != addrIPHost {
   190  		t.Errorf("addrIP.Host() returned %s, expected %s.", host, addrIPHost)
   191  	}
   192  
   193  	if host := addrDomain.Host(); host != addrDomainHost {
   194  		t.Errorf("addrDomain.Host() returned %s, expected %s.", host, addrDomainHost)
   195  	}
   196  
   197  	assertPanic(t, func() { addrZero.Host() })
   198  }
   199  
   200  func TestAddrString(t *testing.T) {
   201  	if s := addrZero.String(); s != addrZeroString {
   202  		t.Errorf("addrZero.String() returned %s, expected %s.", s, addrZeroString)
   203  	}
   204  
   205  	if s := addrIP.String(); s != addrIPString {
   206  		t.Errorf("addrIP.String() returned %s, expected %s.", s, addrIPString)
   207  	}
   208  
   209  	if s := addrDomain.String(); s != addrDomainString {
   210  		t.Errorf("addrDomain.String() returned %s, expected %s.", s, addrDomainString)
   211  	}
   212  }
   213  
   214  func TestAddrAppendTo(t *testing.T) {
   215  	head := make([]byte, 64)
   216  	_, err := rand.Read(head)
   217  	if err != nil {
   218  		t.Fatal(err)
   219  	}
   220  
   221  	b := make([]byte, 0, 128)
   222  	b = append(b, head...)
   223  	bHead := b
   224  
   225  	b = addrZero.AppendTo(b)
   226  	if !bytes.Equal(bHead, head) {
   227  		t.Error("addrIP.AppendTo() returned modified head.")
   228  	}
   229  	if string(b[64:]) != addrZeroString {
   230  		t.Errorf("addrZero.AppendTo() returned %s, expected %s.", b[64:], addrZeroString)
   231  	}
   232  
   233  	b = addrIP.AppendTo(bHead)
   234  	if !bytes.Equal(bHead, head) {
   235  		t.Error("addrIP.AppendTo() returned modified head.")
   236  	}
   237  	if string(b[64:]) != addrIPString {
   238  		t.Errorf("addrIP.AppendTo() returned %s, expected %s.", b[64:], addrIPString)
   239  	}
   240  
   241  	b = addrDomain.AppendTo(bHead)
   242  	if !bytes.Equal(bHead, head) {
   243  		t.Error("addrDomain.AppendTo() returned modified head.")
   244  	}
   245  	if string(b[64:]) != addrDomainString {
   246  		t.Errorf("addrDomain.AppendTo() returned %s, expected %s.", b[64:], addrDomainString)
   247  	}
   248  }
   249  
   250  func TestAddrMarshalAndUnmarshalText(t *testing.T) {
   251  	text, err := addrZero.MarshalText()
   252  	if err != nil {
   253  		t.Fatal(err)
   254  	}
   255  	if string(text) != addrZeroString {
   256  		t.Errorf("addrZero.MarshalText() returned %s, expected %s.", text, addrZeroString)
   257  	}
   258  
   259  	text, err = addrIP.MarshalText()
   260  	if err != nil {
   261  		t.Fatal(err)
   262  	}
   263  	if string(text) != addrIPString {
   264  		t.Errorf("addrIP.MarshalText() returned %s, expected %s.", text, addrIPString)
   265  	}
   266  
   267  	var addrUnmarshaled Addr
   268  	err = addrUnmarshaled.UnmarshalText(text)
   269  	if err != nil {
   270  		t.Fatal(err)
   271  	}
   272  	if !addrUnmarshaled.Equals(addrIP) {
   273  		t.Errorf("addrIP.UnmarshalText() returned %s, expected %s.", addrUnmarshaled, addrIP)
   274  	}
   275  
   276  	text, err = addrDomain.MarshalText()
   277  	if err != nil {
   278  		t.Fatal(err)
   279  	}
   280  	if string(text) != addrDomainString {
   281  		t.Errorf("addrDomain.MarshalText() returned %s, expected %s.", text, addrDomainString)
   282  	}
   283  
   284  	err = addrUnmarshaled.UnmarshalText(text)
   285  	if err != nil {
   286  		t.Fatal(err)
   287  	}
   288  	if !addrUnmarshaled.Equals(addrDomain) {
   289  		t.Errorf("addrDomain.UnmarshalText() returned %s, expected %s.", addrUnmarshaled, addrDomain)
   290  	}
   291  }
   292  
   293  func TestAddrFromDomainPort(t *testing.T) {
   294  	if _, err := AddrFromDomainPort("", 443); err == nil {
   295  		t.Error("AddrFromDomainPort(\"\", 443) did not return error.")
   296  	}
   297  	s := strings.Repeat(" ", 256)
   298  	if _, err := AddrFromDomainPort(s, 443); err == nil {
   299  		t.Error("AddrFromDomainPort(s, 443) did not return error.")
   300  	}
   301  }
   302  
   303  func TestAddrFromHostPort(t *testing.T) {
   304  	addrFromHostPort, err := AddrFromHostPort(addrIPHost, addrIPPort)
   305  	if err != nil {
   306  		t.Fatal(err)
   307  	}
   308  	if !addrFromHostPort.Equals(addrIP) {
   309  		t.Errorf("AddrFromHostPort() returned %s, expected %s.", addrFromHostPort, addrIP)
   310  	}
   311  
   312  	addrFromHostPort, err = AddrFromHostPort(addrDomainHost, addrDomainPort)
   313  	if err != nil {
   314  		t.Fatal(err)
   315  	}
   316  	if !addrFromHostPort.Equals(addrDomain) {
   317  		t.Errorf("AddrFromHostPort() returned %s, expected %s.", addrFromHostPort, addrDomain)
   318  	}
   319  }
   320  
   321  func TestAddrParsing(t *testing.T) {
   322  	addrParsed, err := ParseAddr(addrIPString)
   323  	if err != nil {
   324  		t.Fatal(err)
   325  	}
   326  	if !addrParsed.Equals(addrIP) {
   327  		t.Errorf("ParseAddr() returned %s, expected %s.", addrParsed, addrIP)
   328  	}
   329  
   330  	addrParsed, err = ParseAddr(addrDomainString)
   331  	if err != nil {
   332  		t.Fatal(err)
   333  	}
   334  	if !addrParsed.Equals(addrDomain) {
   335  		t.Errorf("ParseAddr() returned %s, expected %s.", addrParsed, addrDomain)
   336  	}
   337  }
   338  
   339  var (
   340  	addrPort4    = netip.AddrPortFrom(netip.AddrFrom4([4]byte{127, 0, 0, 1}), 1080)
   341  	addrPort4in6 = netip.AddrPortFrom(netip.AddrFrom16([16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 127, 0, 0, 1}), 1080)
   342  )
   343  
   344  func TestAddrPortMappedEqual(t *testing.T) {
   345  	if !AddrPortMappedEqual(addrPort4, addrPort4) {
   346  		t.Error("AddrPortMappedEqual(addrPort4, addrPort4) returned false.")
   347  	}
   348  
   349  	if !AddrPortMappedEqual(addrPort4, addrPort4in6) {
   350  		t.Error("AddrPortMappedEqual(addrPort4, addrPort4in6) returned false.")
   351  	}
   352  
   353  	if !AddrPortMappedEqual(addrPort4in6, addrPort4in6) {
   354  		t.Error("AddrPortMappedEqual(addrPort4in6, addrPort4in6) returned false.")
   355  	}
   356  
   357  	if AddrPortMappedEqual(addrPort4, addrIPAddrPort) {
   358  		t.Error("AddrPortMappedEqual(addrPort4, addrIPAddrPort) returned true.")
   359  	}
   360  
   361  	if AddrPortMappedEqual(addrPort4in6, addrIPAddrPort) {
   362  		t.Error("AddrPortMappedEqual(addrPort4in6, addrIPAddrPort) returned true.")
   363  	}
   364  }