transport_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package dns_test
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. C "github.com/sagernet/sing-box/constant"
  7. "github.com/sagernet/sing-box/dns"
  8. "github.com/sagernet/sing-box/log"
  9. M "github.com/sagernet/sing/common/metadata"
  10. N "github.com/sagernet/sing/common/network"
  11. "github.com/stretchr/testify/require"
  12. "golang.org/x/net/dns/dnsmessage"
  13. )
  14. func TestTCPDNS(t *testing.T) {
  15. t.Parallel()
  16. ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
  17. transport := dns.NewTCPTransport(ctx, N.SystemDialer, log.NewNopLogger(), M.ParseSocksaddr("1.0.0.1:53"))
  18. response, err := transport.Exchange(ctx, makeQuery())
  19. cancel()
  20. require.NoError(t, err)
  21. require.NotEmpty(t, response.Answers, "no answers")
  22. for _, answer := range response.Answers {
  23. t.Log(answer)
  24. }
  25. }
  26. func TestTLSDNS(t *testing.T) {
  27. t.Parallel()
  28. ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
  29. transport := dns.NewTLSTransport(ctx, N.SystemDialer, log.NewNopLogger(), M.ParseSocksaddr("1.0.0.1:853"))
  30. response, err := transport.Exchange(ctx, makeQuery())
  31. cancel()
  32. require.NoError(t, err)
  33. require.NotEmpty(t, response.Answers, "no answers")
  34. for _, answer := range response.Answers {
  35. t.Log(answer)
  36. }
  37. }
  38. func TestHTTPSDNS(t *testing.T) {
  39. t.Parallel()
  40. ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
  41. transport := dns.NewHTTPSTransport(N.SystemDialer, "https://1.0.0.1:443/dns-query")
  42. response, err := transport.Exchange(ctx, makeQuery())
  43. cancel()
  44. require.NoError(t, err)
  45. require.NotEmpty(t, response.Answers, "no answers")
  46. for _, answer := range response.Answers {
  47. t.Log(answer)
  48. }
  49. }
  50. func TestUDPDNS(t *testing.T) {
  51. t.Parallel()
  52. ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
  53. transport := dns.NewUDPTransport(ctx, N.SystemDialer, log.NewNopLogger(), M.ParseSocksaddr("1.0.0.1:53"))
  54. response, err := transport.Exchange(ctx, makeQuery())
  55. cancel()
  56. require.NoError(t, err)
  57. require.NotEmpty(t, response.Answers, "no answers")
  58. for _, answer := range response.Answers {
  59. t.Log(answer)
  60. }
  61. }
  62. func TestLocalDNS(t *testing.T) {
  63. t.Parallel()
  64. ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
  65. transport := dns.NewLocalTransport()
  66. response, err := transport.Lookup(ctx, "google.com", C.DomainStrategyAsIS)
  67. cancel()
  68. require.NoError(t, err)
  69. require.NotEmpty(t, response, "no answers")
  70. for _, answer := range response {
  71. t.Log(answer)
  72. }
  73. }
  74. func makeQuery() *dnsmessage.Message {
  75. message := &dnsmessage.Message{}
  76. message.Header.ID = 1
  77. message.Header.RecursionDesired = true
  78. message.Questions = append(message.Questions, dnsmessage.Question{
  79. Name: dnsmessage.MustNewName("google.com."),
  80. Type: dnsmessage.TypeA,
  81. Class: dnsmessage.ClassINET,
  82. })
  83. return message
  84. }