v2ray_grpc_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package main
  2. import (
  3. "net/netip"
  4. "os"
  5. "testing"
  6. C "github.com/sagernet/sing-box/constant"
  7. "github.com/sagernet/sing-box/option"
  8. "github.com/gofrs/uuid/v5"
  9. "github.com/spyzhov/ajson"
  10. "github.com/stretchr/testify/require"
  11. )
  12. func TestV2RayGRPCInbound(t *testing.T) {
  13. t.Run("origin", func(t *testing.T) {
  14. testV2RayGRPCInbound(t, false)
  15. })
  16. t.Run("lite", func(t *testing.T) {
  17. testV2RayGRPCInbound(t, true)
  18. })
  19. }
  20. func testV2RayGRPCInbound(t *testing.T, forceLite bool) {
  21. userId, err := uuid.DefaultGenerator.NewV4()
  22. require.NoError(t, err)
  23. _, certPem, keyPem := createSelfSignedCertificate(t, "example.org")
  24. startInstance(t, option.Options{
  25. Inbounds: []option.Inbound{
  26. {
  27. Type: C.TypeVMess,
  28. VMessOptions: option.VMessInboundOptions{
  29. ListenOptions: option.ListenOptions{
  30. Listen: option.NewListenAddress(netip.IPv4Unspecified()),
  31. ListenPort: serverPort,
  32. },
  33. Users: []option.VMessUser{
  34. {
  35. Name: "sekai",
  36. UUID: userId.String(),
  37. },
  38. },
  39. TLS: &option.InboundTLSOptions{
  40. Enabled: true,
  41. ServerName: "example.org",
  42. CertificatePath: certPem,
  43. KeyPath: keyPem,
  44. },
  45. Transport: &option.V2RayTransportOptions{
  46. Type: C.V2RayTransportTypeGRPC,
  47. GRPCOptions: option.V2RayGRPCOptions{
  48. ServiceName: "TunService",
  49. ForceLite: forceLite,
  50. },
  51. },
  52. },
  53. },
  54. },
  55. })
  56. content, err := os.ReadFile("config/vmess-grpc-client.json")
  57. require.NoError(t, err)
  58. config, err := ajson.Unmarshal(content)
  59. require.NoError(t, err)
  60. config.MustKey("inbounds").MustIndex(0).MustKey("port").SetNumeric(float64(clientPort))
  61. outbound := config.MustKey("outbounds").MustIndex(0).MustKey("settings").MustKey("vnext").MustIndex(0)
  62. outbound.MustKey("port").SetNumeric(float64(serverPort))
  63. user := outbound.MustKey("users").MustIndex(0)
  64. user.MustKey("id").SetString(userId.String())
  65. content, err = ajson.Marshal(config)
  66. require.NoError(t, err)
  67. startDockerContainer(t, DockerOptions{
  68. Image: ImageV2RayCore,
  69. Ports: []uint16{serverPort, testPort},
  70. EntryPoint: "v2ray",
  71. Cmd: []string{"run"},
  72. Stdin: content,
  73. Bind: map[string]string{
  74. certPem: "/path/to/certificate.crt",
  75. keyPem: "/path/to/private.key",
  76. },
  77. })
  78. testSuitSimple(t, clientPort, testPort)
  79. }
  80. func TestV2RayGRPCOutbound(t *testing.T) {
  81. t.Run("origin", func(t *testing.T) {
  82. testV2RayGRPCOutbound(t, false)
  83. })
  84. t.Run("lite", func(t *testing.T) {
  85. testV2RayGRPCOutbound(t, true)
  86. })
  87. }
  88. func testV2RayGRPCOutbound(t *testing.T, forceLite bool) {
  89. userId, err := uuid.DefaultGenerator.NewV4()
  90. require.NoError(t, err)
  91. _, certPem, keyPem := createSelfSignedCertificate(t, "example.org")
  92. content, err := os.ReadFile("config/vmess-grpc-server.json")
  93. require.NoError(t, err)
  94. config, err := ajson.Unmarshal(content)
  95. require.NoError(t, err)
  96. inbound := config.MustKey("inbounds").MustIndex(0)
  97. inbound.MustKey("port").SetNumeric(float64(serverPort))
  98. inbound.MustKey("settings").MustKey("clients").MustIndex(0).MustKey("id").SetString(userId.String())
  99. content, err = ajson.Marshal(config)
  100. require.NoError(t, err)
  101. startDockerContainer(t, DockerOptions{
  102. Image: ImageV2RayCore,
  103. Ports: []uint16{serverPort, testPort},
  104. EntryPoint: "v2ray",
  105. Cmd: []string{"run"},
  106. Stdin: content,
  107. Env: []string{"V2RAY_VMESS_AEAD_FORCED=false"},
  108. Bind: map[string]string{
  109. certPem: "/path/to/certificate.crt",
  110. keyPem: "/path/to/private.key",
  111. },
  112. })
  113. startInstance(t, option.Options{
  114. Inbounds: []option.Inbound{
  115. {
  116. Type: C.TypeMixed,
  117. Tag: "mixed-in",
  118. MixedOptions: option.HTTPMixedInboundOptions{
  119. ListenOptions: option.ListenOptions{
  120. Listen: option.NewListenAddress(netip.IPv4Unspecified()),
  121. ListenPort: clientPort,
  122. },
  123. },
  124. },
  125. },
  126. Outbounds: []option.Outbound{
  127. {
  128. Type: C.TypeVMess,
  129. Tag: "vmess-out",
  130. VMessOptions: option.VMessOutboundOptions{
  131. ServerOptions: option.ServerOptions{
  132. Server: "127.0.0.1",
  133. ServerPort: serverPort,
  134. },
  135. UUID: userId.String(),
  136. Security: "zero",
  137. TLS: &option.OutboundTLSOptions{
  138. Enabled: true,
  139. ServerName: "example.org",
  140. CertificatePath: certPem,
  141. },
  142. Transport: &option.V2RayTransportOptions{
  143. Type: C.V2RayTransportTypeGRPC,
  144. GRPCOptions: option.V2RayGRPCOptions{
  145. ServiceName: "TunService",
  146. ForceLite: forceLite,
  147. },
  148. },
  149. },
  150. },
  151. },
  152. })
  153. testSuit(t, clientPort, testPort)
  154. }
  155. func TestV2RayGRPCLite(t *testing.T) {
  156. t.Run("server", func(t *testing.T) {
  157. testV2RayTransportSelfWith(t, &option.V2RayTransportOptions{
  158. Type: C.V2RayTransportTypeGRPC,
  159. GRPCOptions: option.V2RayGRPCOptions{
  160. ServiceName: "TunService",
  161. ForceLite: true,
  162. },
  163. }, &option.V2RayTransportOptions{
  164. Type: C.V2RayTransportTypeGRPC,
  165. GRPCOptions: option.V2RayGRPCOptions{
  166. ServiceName: "TunService",
  167. },
  168. })
  169. })
  170. t.Run("client", func(t *testing.T) {
  171. testV2RayTransportSelfWith(t, &option.V2RayTransportOptions{
  172. Type: C.V2RayTransportTypeGRPC,
  173. GRPCOptions: option.V2RayGRPCOptions{
  174. ServiceName: "TunService",
  175. },
  176. }, &option.V2RayTransportOptions{
  177. Type: C.V2RayTransportTypeGRPC,
  178. GRPCOptions: option.V2RayGRPCOptions{
  179. ServiceName: "TunService",
  180. ForceLite: true,
  181. },
  182. })
  183. })
  184. t.Run("self", func(t *testing.T) {
  185. testV2RayTransportSelfWith(t, &option.V2RayTransportOptions{
  186. Type: C.V2RayTransportTypeGRPC,
  187. GRPCOptions: option.V2RayGRPCOptions{
  188. ServiceName: "TunService",
  189. ForceLite: true,
  190. },
  191. }, &option.V2RayTransportOptions{
  192. Type: C.V2RayTransportTypeGRPC,
  193. GRPCOptions: option.V2RayGRPCOptions{
  194. ServiceName: "TunService",
  195. ForceLite: true,
  196. },
  197. })
  198. })
  199. }