utls_client_test.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //go:build with_utls
  2. package tls
  3. import (
  4. "context"
  5. "net"
  6. "testing"
  7. tf "github.com/sagernet/sing-box/common/tlsfragment"
  8. utls "github.com/metacubex/utls"
  9. "github.com/stretchr/testify/require"
  10. )
  11. // Guards the wrap gate in UTLSClientConfig.Client(): tf.Conn must wrap the
  12. // underlying connection whenever either `fragment` or `record_fragment` is
  13. // set. Mirrors the STDClientConfig gate tests to keep both code paths in
  14. // lockstep.
  15. func newUTLSClientConfigForGateTest(fragment, recordFragment bool) *UTLSClientConfig {
  16. return &UTLSClientConfig{
  17. ctx: context.Background(),
  18. config: &utls.Config{ServerName: "example.com", InsecureSkipVerify: true},
  19. id: utls.HelloChrome_Auto,
  20. fragment: fragment,
  21. recordFragment: recordFragment,
  22. }
  23. }
  24. func TestUTLSClient_Client_NoFragment_DoesNotWrap(t *testing.T) {
  25. t.Parallel()
  26. client, server := net.Pipe()
  27. defer client.Close()
  28. defer server.Close()
  29. wrapped, err := newUTLSClientConfigForGateTest(false, false).Client(client)
  30. require.NoError(t, err)
  31. _, isTF := wrapped.NetConn().(*tf.Conn)
  32. require.False(t, isTF, "no fragment flags: must not wrap with tf.Conn")
  33. }
  34. func TestUTLSClient_Client_FragmentOnly_Wraps(t *testing.T) {
  35. t.Parallel()
  36. client, server := net.Pipe()
  37. defer client.Close()
  38. defer server.Close()
  39. wrapped, err := newUTLSClientConfigForGateTest(true, false).Client(client)
  40. require.NoError(t, err)
  41. _, isTF := wrapped.NetConn().(*tf.Conn)
  42. require.True(t, isTF, "fragment=true: must wrap with tf.Conn")
  43. }
  44. func TestUTLSClient_Client_RecordFragmentOnly_Wraps(t *testing.T) {
  45. t.Parallel()
  46. client, server := net.Pipe()
  47. defer client.Close()
  48. defer server.Close()
  49. wrapped, err := newUTLSClientConfigForGateTest(false, true).Client(client)
  50. require.NoError(t, err)
  51. _, isTF := wrapped.NetConn().(*tf.Conn)
  52. require.True(t, isTF, "record_fragment=true: must wrap with tf.Conn")
  53. }
  54. func TestUTLSClient_Client_BothFragment_Wraps(t *testing.T) {
  55. t.Parallel()
  56. client, server := net.Pipe()
  57. defer client.Close()
  58. defer server.Close()
  59. wrapped, err := newUTLSClientConfigForGateTest(true, true).Client(client)
  60. require.NoError(t, err)
  61. _, isTF := wrapped.NetConn().(*tf.Conn)
  62. require.True(t, isTF, "both fragment flags: must wrap with tf.Conn")
  63. }