resolving_bind_test.go 2.1 KB

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