v2ray_grpc_test.go 5.6 KB

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