dns_family_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package amneziawgnet
  2. import (
  3. "net/netip"
  4. "testing"
  5. "golang.org/x/net/dns/dnsmessage"
  6. )
  7. func TestDNSQueryTypesFor(t *testing.T) {
  8. v4 := netip.MustParseAddr("10.8.0.2")
  9. v6 := netip.MustParseAddr("2001:db8::2")
  10. mapped := netip.MustParseAddr("::ffff:10.8.0.2")
  11. cases := []struct {
  12. name string
  13. addrs []netip.Addr
  14. want []dnsmessage.Type
  15. }{
  16. {
  17. name: "v4-only",
  18. addrs: []netip.Addr{v4},
  19. want: []dnsmessage.Type{dnsmessage.TypeA},
  20. },
  21. {
  22. name: "v6-only",
  23. addrs: []netip.Addr{v6},
  24. want: []dnsmessage.Type{dnsmessage.TypeAAAA},
  25. },
  26. {
  27. name: "dual-stack prefers A then AAAA",
  28. addrs: []netip.Addr{v4, v6},
  29. want: []dnsmessage.Type{dnsmessage.TypeA, dnsmessage.TypeAAAA},
  30. },
  31. {
  32. name: "empty falls back to A then AAAA",
  33. addrs: nil,
  34. want: []dnsmessage.Type{dnsmessage.TypeA, dnsmessage.TypeAAAA},
  35. },
  36. {
  37. name: "v4-mapped alone is not dual-stack",
  38. addrs: []netip.Addr{mapped},
  39. want: []dnsmessage.Type{dnsmessage.TypeA, dnsmessage.TypeAAAA},
  40. },
  41. }
  42. for _, tc := range cases {
  43. t.Run(tc.name, func(t *testing.T) {
  44. got := dnsQueryTypesFor(tc.addrs)
  45. if len(got) != len(tc.want) {
  46. t.Fatalf("dnsQueryTypesFor(%v) = %v, want %v", tc.addrs, got, tc.want)
  47. }
  48. for i := range got {
  49. if got[i] != tc.want[i] {
  50. t.Fatalf("dnsQueryTypesFor(%v) = %v, want %v", tc.addrs, got, tc.want)
  51. }
  52. }
  53. })
  54. }
  55. }
  56. func TestTunnelSupportsAddr(t *testing.T) {
  57. v4 := netip.MustParseAddr("10.8.0.2")
  58. v6 := netip.MustParseAddr("2001:db8::2")
  59. dest4 := netip.MustParseAddr("8.8.8.8")
  60. dest6 := netip.MustParseAddr("2001:4860:4860::8888")
  61. mappedDest := netip.MustParseAddr("::ffff:8.8.8.8")
  62. if !tunnelSupportsAddr([]netip.Addr{v4}, dest4) {
  63. t.Error("v4 tunnel should dial IPv4")
  64. }
  65. if tunnelSupportsAddr([]netip.Addr{v4}, dest6) {
  66. t.Error("v4-only tunnel must not dial IPv6")
  67. }
  68. if !tunnelSupportsAddr([]netip.Addr{v6}, dest6) {
  69. t.Error("v6 tunnel should dial IPv6")
  70. }
  71. if tunnelSupportsAddr([]netip.Addr{v6}, dest4) {
  72. t.Error("v6-only tunnel must not dial IPv4")
  73. }
  74. if !tunnelSupportsAddr([]netip.Addr{v4, v6}, dest4) || !tunnelSupportsAddr([]netip.Addr{v4, v6}, dest6) {
  75. t.Error("dual-stack tunnel should dial both families")
  76. }
  77. if !tunnelSupportsAddr([]netip.Addr{v4}, mappedDest) {
  78. t.Error("v4 tunnel should treat IPv4-mapped destinations as IPv4")
  79. }
  80. if tunnelSupportsAddr(nil, dest4) {
  81. t.Error("empty address list should not claim support")
  82. }
  83. }
  84. func TestSocksTargetResolveTunnelVia_RejectsWrongFamilyLiteral(t *testing.T) {
  85. dev := &Device{localAddrs: []netip.Addr{netip.MustParseAddr("10.8.0.2")}}
  86. target := socksTarget{ip: netip.MustParseAddr("2001:4860:4860::8888"), port: 443}
  87. _, err := target.resolveTunnelVia("", "awg", dev)
  88. if err == nil {
  89. t.Fatal("expected error dialing IPv6 literal on v4-only tunnel")
  90. }
  91. okTarget := socksTarget{ip: netip.MustParseAddr("8.8.8.8"), port: 443}
  92. got, err := okTarget.resolveTunnelVia("", "awg", dev)
  93. if err != nil {
  94. t.Fatalf("v4 literal on v4 tunnel: %v", err)
  95. }
  96. if got.String() != "8.8.8.8:443" {
  97. t.Fatalf("got %s", got)
  98. }
  99. }