ech_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package tls
  2. import (
  3. "io"
  4. "net/http"
  5. "strings"
  6. "sync"
  7. "testing"
  8. "github.com/xtls/xray-core/common"
  9. )
  10. func TestECHDial(t *testing.T) {
  11. config := &Config{
  12. ServerName: "cloudflare.com",
  13. EchConfigList: "encryptedsni.com+udp://1.1.1.1",
  14. }
  15. // test concurrent Dial(to test cache problem)
  16. wg := sync.WaitGroup{}
  17. for range 10 {
  18. wg.Add(1)
  19. go func() {
  20. TLSConfig := config.GetTLSConfig()
  21. TLSConfig.NextProtos = []string{"http/1.1"}
  22. client := &http.Client{
  23. Transport: &http.Transport{
  24. TLSClientConfig: TLSConfig,
  25. },
  26. }
  27. resp, err := client.Get("https://cloudflare.com/cdn-cgi/trace")
  28. common.Must(err)
  29. defer resp.Body.Close()
  30. body, err := io.ReadAll(resp.Body)
  31. common.Must(err)
  32. if !strings.Contains(string(body), "sni=encrypted") {
  33. t.Error("ECH Dial success but SNI is not encrypted")
  34. }
  35. wg.Done()
  36. }()
  37. }
  38. wg.Wait()
  39. // check cache
  40. echConfigCache, ok := GlobalECHConfigCache.Load(ECHCacheKey("udp://1.1.1.1", "encryptedsni.com", nil))
  41. if !ok {
  42. t.Error("ECH config cache not found")
  43. }
  44. ok = echConfigCache.UpdateLock.TryLock()
  45. if !ok {
  46. t.Error("ECH config cache dead lock detected")
  47. }
  48. echConfigCache.UpdateLock.Unlock()
  49. configRecord := echConfigCache.configRecord.Load()
  50. if configRecord == nil {
  51. t.Error("ECH config record not found in cache")
  52. }
  53. }
  54. func TestECHDialFail(t *testing.T) {
  55. config := &Config{
  56. ServerName: "cloudflare.com",
  57. EchConfigList: "udp://127.0.0.1",
  58. EchForceQuery: "half",
  59. }
  60. config.GetTLSConfig()
  61. // check cache
  62. echConfigCache, ok := GlobalECHConfigCache.Load(ECHCacheKey("udp://127.0.0.1", "cloudflare.com", nil))
  63. if !ok {
  64. t.Error("ECH config cache not found")
  65. }
  66. configRecord := echConfigCache.configRecord.Load()
  67. if configRecord == nil {
  68. t.Error("ECH config record not found in cache")
  69. return
  70. }
  71. if configRecord.err == nil {
  72. t.Error("unexpected nil error in ECH config record")
  73. }
  74. }