netproxy_test.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package netproxy
  2. import (
  3. "net/http"
  4. "testing"
  5. "time"
  6. )
  7. func TestNewHTTPClient(t *testing.T) {
  8. tests := []struct {
  9. name string
  10. proxyURL string
  11. wantErr bool
  12. wantProxy bool
  13. wantDial bool
  14. }{
  15. {name: "empty returns direct client", proxyURL: ""},
  16. {name: "socks5 sets custom dialer", proxyURL: "socks5://127.0.0.1:1080", wantDial: true},
  17. {name: "socks5 with auth", proxyURL: "socks5://user:[email protected]:1080", wantDial: true},
  18. {name: "http sets transport proxy", proxyURL: "http://127.0.0.1:8080", wantProxy: true},
  19. {name: "https sets transport proxy", proxyURL: "https://127.0.0.1:8080", wantProxy: true},
  20. {name: "unsupported scheme errors", proxyURL: "ftp://127.0.0.1:21", wantErr: true},
  21. }
  22. for _, tc := range tests {
  23. t.Run(tc.name, func(t *testing.T) {
  24. client, err := NewHTTPClient(tc.proxyURL, 5*time.Second)
  25. if tc.wantErr {
  26. if err == nil {
  27. t.Fatalf("expected error for %q, got nil", tc.proxyURL)
  28. }
  29. return
  30. }
  31. if err != nil {
  32. t.Fatalf("unexpected error for %q: %v", tc.proxyURL, err)
  33. }
  34. if client.Timeout != 5*time.Second {
  35. t.Errorf("timeout = %v, want 5s", client.Timeout)
  36. }
  37. if tc.wantProxy {
  38. transport, ok := client.Transport.(*http.Transport)
  39. if !ok || transport.Proxy == nil {
  40. t.Errorf("expected transport with Proxy set for %q", tc.proxyURL)
  41. }
  42. }
  43. if tc.wantDial {
  44. transport, ok := client.Transport.(*http.Transport)
  45. if !ok || transport.DialContext == nil {
  46. t.Errorf("expected transport with DialContext set for %q", tc.proxyURL)
  47. }
  48. }
  49. })
  50. }
  51. }