1
0

v2ray_grpc_test.go 5.8 KB

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