vmess_transport_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package main
  2. import (
  3. "net/netip"
  4. "testing"
  5. C "github.com/sagernet/sing-box/constant"
  6. "github.com/sagernet/sing-box/option"
  7. "github.com/gofrs/uuid"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func TestVMessGRPCSelf(t *testing.T) {
  11. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  12. Type: C.V2RayTransportTypeGRPC,
  13. GRPCOptions: option.V2RayGRPCOptions{
  14. ServiceName: "TunService",
  15. },
  16. })
  17. }
  18. func TestVMessWebscoketSelf(t *testing.T) {
  19. t.Run("basic", func(t *testing.T) {
  20. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  21. Type: C.V2RayTransportTypeWebsocket,
  22. })
  23. })
  24. t.Run("v2ray early data", func(t *testing.T) {
  25. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  26. Type: C.V2RayTransportTypeWebsocket,
  27. WebsocketOptions: option.V2RayWebsocketOptions{
  28. MaxEarlyData: 2048,
  29. },
  30. })
  31. })
  32. t.Run("xray early data", func(t *testing.T) {
  33. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  34. Type: C.V2RayTransportTypeWebsocket,
  35. WebsocketOptions: option.V2RayWebsocketOptions{
  36. MaxEarlyData: 2048,
  37. EarlyDataHeaderName: "Sec-WebSocket-Protocol",
  38. },
  39. })
  40. })
  41. }
  42. func testVMessWebscoketSelf(t *testing.T, transport *option.V2RayTransportOptions) {
  43. user, err := uuid.DefaultGenerator.NewV4()
  44. require.NoError(t, err)
  45. _, certPem, keyPem := createSelfSignedCertificate(t, "example.org")
  46. startInstance(t, option.Options{
  47. Log: &option.LogOptions{
  48. Level: "error",
  49. Output: "stderr",
  50. },
  51. Inbounds: []option.Inbound{
  52. {
  53. Type: C.TypeMixed,
  54. Tag: "mixed-in",
  55. MixedOptions: option.HTTPMixedInboundOptions{
  56. ListenOptions: option.ListenOptions{
  57. Listen: option.ListenAddress(netip.IPv4Unspecified()),
  58. ListenPort: clientPort,
  59. },
  60. },
  61. },
  62. {
  63. Type: C.TypeVMess,
  64. VMessOptions: option.VMessInboundOptions{
  65. ListenOptions: option.ListenOptions{
  66. Listen: option.ListenAddress(netip.IPv4Unspecified()),
  67. ListenPort: serverPort,
  68. },
  69. Users: []option.VMessUser{
  70. {
  71. Name: "sekai",
  72. UUID: user.String(),
  73. },
  74. },
  75. TLS: &option.InboundTLSOptions{
  76. Enabled: true,
  77. ServerName: "example.org",
  78. CertificatePath: certPem,
  79. KeyPath: keyPem,
  80. },
  81. Transport: transport,
  82. },
  83. },
  84. },
  85. Outbounds: []option.Outbound{
  86. {
  87. Type: C.TypeDirect,
  88. },
  89. {
  90. Type: C.TypeVMess,
  91. Tag: "vmess-out",
  92. VMessOptions: option.VMessOutboundOptions{
  93. ServerOptions: option.ServerOptions{
  94. Server: "127.0.0.1",
  95. ServerPort: serverPort,
  96. },
  97. UUID: user.String(),
  98. Security: "zero",
  99. TLS: &option.OutboundTLSOptions{
  100. Enabled: true,
  101. ServerName: "example.org",
  102. CertificatePath: certPem,
  103. },
  104. Transport: transport,
  105. },
  106. },
  107. },
  108. Route: &option.RouteOptions{
  109. Rules: []option.Rule{
  110. {
  111. DefaultOptions: option.DefaultRule{
  112. Inbound: []string{"mixed-in"},
  113. Outbound: "vmess-out",
  114. },
  115. },
  116. },
  117. },
  118. })
  119. testSuit(t, clientPort, testPort)
  120. }