resolving_bind_test.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package amneziawgnet
  2. import (
  3. "context"
  4. "errors"
  5. "net/netip"
  6. "testing"
  7. awgconn "github.com/amnezia-vpn/amneziawg-go/v3/conn"
  8. )
  9. func endpointAddrPort(ep awgconn.Endpoint) netip.AddrPort {
  10. std, ok := ep.(*awgconn.StdNetEndpoint)
  11. if !ok {
  12. panic("unexpected endpoint type")
  13. }
  14. return std.AddrPort
  15. }
  16. func TestResolvingBind_ParseEndpointIPLiteral(t *testing.T) {
  17. b := newResolvingBind()
  18. ep, err := b.ParseEndpoint("203.0.113.7:51820")
  19. if err != nil {
  20. t.Fatalf("IP endpoint rejected: %v", err)
  21. }
  22. got := endpointAddrPort(ep)
  23. if got.Addr().String() != "203.0.113.7" || got.Port() != 51820 {
  24. t.Fatalf("endpoint = %v, want 203.0.113.7:51820", got)
  25. }
  26. }
  27. func TestResolvingBind_ParseEndpointHostnameResolves(t *testing.T) {
  28. orig := lookupEndpointHost
  29. lookupEndpointHost = func(ctx context.Context, host string) ([]netip.Addr, error) {
  30. if host != "peer.example.test" {
  31. t.Errorf("unexpected lookup host %q", host)
  32. }
  33. return []netip.Addr{netip.MustParseAddr("198.51.100.9")}, nil
  34. }
  35. defer func() { lookupEndpointHost = orig }()
  36. b := newResolvingBind()
  37. ep, err := b.ParseEndpoint("peer.example.test:443")
  38. if err != nil {
  39. t.Fatalf("hostname endpoint rejected: %v", err)
  40. }
  41. if got := endpointAddrPort(ep); got.Addr().String() != "198.51.100.9" || got.Port() != 443 {
  42. t.Fatalf("endpoint = %v, want 198.51.100.9:443", got)
  43. }
  44. }
  45. func TestResolvingBind_ParseEndpointResolveFailureIsAnError(t *testing.T) {
  46. orig := lookupEndpointHost
  47. lookupEndpointHost = func(ctx context.Context, host string) ([]netip.Addr, error) {
  48. return nil, errors.New("no such host")
  49. }
  50. defer func() { lookupEndpointHost = orig }()
  51. b := newResolvingBind()
  52. if _, err := b.ParseEndpoint("missing.example.test:80"); err == nil {
  53. t.Fatal("expected resolve failure to surface as an error")
  54. }
  55. }
  56. func TestResolvingBind_ParseEndpointBadPortRejected(t *testing.T) {
  57. b := newResolvingBind()
  58. if _, err := b.ParseEndpoint("203.0.113.7:none"); err == nil {
  59. t.Fatal("expected bad port to be rejected")
  60. }
  61. }