v2ray_grpc_test.go 5.7 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"
  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. Log: &option.LogOptions{
  26. Level: "error",
  27. },
  28. Inbounds: []option.Inbound{
  29. {
  30. Type: C.TypeVMess,
  31. VMessOptions: option.VMessInboundOptions{
  32. ListenOptions: option.ListenOptions{
  33. Listen: option.ListenAddress(netip.IPv4Unspecified()),
  34. ListenPort: serverPort,
  35. },
  36. Users: []option.VMessUser{
  37. {
  38. Name: "sekai",
  39. UUID: userId.String(),
  40. },
  41. },
  42. TLS: &option.InboundTLSOptions{
  43. Enabled: true,
  44. ServerName: "example.org",
  45. CertificatePath: certPem,
  46. KeyPath: keyPem,
  47. },
  48. Transport: &option.V2RayTransportOptions{
  49. Type: C.V2RayTransportTypeGRPC,
  50. GRPCOptions: option.V2RayGRPCOptions{
  51. ServiceName: "TunService",
  52. ForceLite: forceLite,
  53. },
  54. },
  55. },
  56. },
  57. },
  58. })
  59. content, err := os.ReadFile("config/vmess-grpc-client.json")
  60. require.NoError(t, err)
  61. config, err := ajson.Unmarshal(content)
  62. require.NoError(t, err)
  63. config.MustKey("inbounds").MustIndex(0).MustKey("port").SetNumeric(float64(clientPort))
  64. outbound := config.MustKey("outbounds").MustIndex(0).MustKey("settings").MustKey("vnext").MustIndex(0)
  65. outbound.MustKey("port").SetNumeric(float64(serverPort))
  66. user := outbound.MustKey("users").MustIndex(0)
  67. user.MustKey("id").SetString(userId.String())
  68. content, err = ajson.Marshal(config)
  69. require.NoError(t, err)
  70. startDockerContainer(t, DockerOptions{
  71. Image: ImageV2RayCore,
  72. Ports: []uint16{serverPort, testPort},
  73. EntryPoint: "v2ray",
  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. Stdin: content,
  108. Env: []string{"V2RAY_VMESS_AEAD_FORCED=false"},
  109. Bind: map[string]string{
  110. certPem: "/path/to/certificate.crt",
  111. keyPem: "/path/to/private.key",
  112. },
  113. })
  114. startInstance(t, option.Options{
  115. Log: &option.LogOptions{
  116. Level: "error",
  117. },
  118. Inbounds: []option.Inbound{
  119. {
  120. Type: C.TypeMixed,
  121. Tag: "mixed-in",
  122. MixedOptions: option.HTTPMixedInboundOptions{
  123. ListenOptions: option.ListenOptions{
  124. Listen: option.ListenAddress(netip.IPv4Unspecified()),
  125. ListenPort: clientPort,
  126. },
  127. },
  128. },
  129. },
  130. Outbounds: []option.Outbound{
  131. {
  132. Type: C.TypeVMess,
  133. Tag: "vmess-out",
  134. VMessOptions: option.VMessOutboundOptions{
  135. ServerOptions: option.ServerOptions{
  136. Server: "127.0.0.1",
  137. ServerPort: serverPort,
  138. },
  139. UUID: userId.String(),
  140. Security: "zero",
  141. TLS: &option.OutboundTLSOptions{
  142. Enabled: true,
  143. ServerName: "example.org",
  144. CertificatePath: certPem,
  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. testSuitSimple(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. }