v2ray_grpc_test.go 5.9 KB

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