mux_cool_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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/spyzhov/ajson"
  11. "github.com/stretchr/testify/require"
  12. )
  13. func TestMuxCoolServer(t *testing.T) {
  14. userId := newUUID()
  15. content, err := os.ReadFile("config/vmess-mux-client.json")
  16. require.NoError(t, err)
  17. config, err := ajson.Unmarshal(content)
  18. require.NoError(t, err)
  19. config.MustKey("inbounds").MustIndex(0).MustKey("port").SetNumeric(float64(clientPort))
  20. outbound := config.MustKey("outbounds").MustIndex(0).MustKey("settings").MustKey("vnext").MustIndex(0)
  21. outbound.MustKey("port").SetNumeric(float64(serverPort))
  22. user := outbound.MustKey("users").MustIndex(0)
  23. user.MustKey("id").SetString(userId.String())
  24. content, err = ajson.Marshal(config)
  25. require.NoError(t, err)
  26. startDockerContainer(t, DockerOptions{
  27. Image: ImageV2RayCore,
  28. Ports: []uint16{serverPort, testPort},
  29. EntryPoint: "v2ray",
  30. Cmd: []string{"run"},
  31. Stdin: content,
  32. })
  33. startInstance(t, option.Options{
  34. Inbounds: []option.Inbound{
  35. {
  36. Type: C.TypeVMess,
  37. Options: &option.VMessInboundOptions{
  38. ListenOptions: option.ListenOptions{
  39. Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
  40. ListenPort: serverPort,
  41. },
  42. Users: []option.VMessUser{
  43. {
  44. Name: "sekai",
  45. UUID: userId.String(),
  46. },
  47. },
  48. },
  49. },
  50. },
  51. })
  52. testSuitSimple(t, clientPort, testPort)
  53. }
  54. func TestMuxCoolClient(t *testing.T) {
  55. user := newUUID()
  56. content, err := os.ReadFile("config/vmess-server.json")
  57. require.NoError(t, err)
  58. config, err := ajson.Unmarshal(content)
  59. require.NoError(t, err)
  60. inbound := config.MustKey("inbounds").MustIndex(0)
  61. inbound.MustKey("port").SetNumeric(float64(serverPort))
  62. inbound.MustKey("settings").MustKey("clients").MustIndex(0).MustKey("id").SetString(user.String())
  63. content, err = ajson.Marshal(config)
  64. require.NoError(t, err)
  65. startDockerContainer(t, DockerOptions{
  66. Image: ImageXRayCore,
  67. Ports: []uint16{serverPort, testPort},
  68. EntryPoint: "xray",
  69. Stdin: content,
  70. })
  71. startInstance(t, option.Options{
  72. Inbounds: []option.Inbound{
  73. {
  74. Type: C.TypeMixed,
  75. Options: &option.HTTPMixedInboundOptions{
  76. ListenOptions: option.ListenOptions{
  77. Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
  78. ListenPort: clientPort,
  79. },
  80. },
  81. },
  82. },
  83. Outbounds: []option.Outbound{
  84. {
  85. Type: C.TypeVMess,
  86. Options: &option.VMessOutboundOptions{
  87. ServerOptions: option.ServerOptions{
  88. Server: "127.0.0.1",
  89. ServerPort: serverPort,
  90. },
  91. UUID: user.String(),
  92. PacketEncoding: "xudp",
  93. },
  94. },
  95. },
  96. })
  97. testSuitSimple(t, clientPort, testPort)
  98. }
  99. func TestMuxCoolSelf(t *testing.T) {
  100. user := newUUID()
  101. startInstance(t, option.Options{
  102. Inbounds: []option.Inbound{
  103. {
  104. Type: C.TypeMixed,
  105. Tag: "mixed-in",
  106. Options: &option.HTTPMixedInboundOptions{
  107. ListenOptions: option.ListenOptions{
  108. Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
  109. ListenPort: clientPort,
  110. },
  111. },
  112. },
  113. {
  114. Type: C.TypeVMess,
  115. Options: &option.VMessInboundOptions{
  116. ListenOptions: option.ListenOptions{
  117. Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
  118. ListenPort: serverPort,
  119. },
  120. Users: []option.VMessUser{
  121. {
  122. Name: "sekai",
  123. UUID: user.String(),
  124. },
  125. },
  126. },
  127. },
  128. },
  129. Outbounds: []option.Outbound{
  130. {
  131. Type: C.TypeDirect,
  132. },
  133. {
  134. Type: C.TypeVMess,
  135. Tag: "vmess-out",
  136. Options: &option.VMessOutboundOptions{
  137. ServerOptions: option.ServerOptions{
  138. Server: "127.0.0.1",
  139. ServerPort: serverPort,
  140. },
  141. UUID: user.String(),
  142. PacketEncoding: "xudp",
  143. },
  144. },
  145. },
  146. Route: &option.RouteOptions{
  147. Rules: []option.Rule{
  148. {
  149. Type: C.RuleTypeDefault,
  150. DefaultOptions: option.DefaultRule{
  151. RawDefaultRule: option.RawDefaultRule{
  152. Inbound: []string{"mixed-in"},
  153. },
  154. RuleAction: option.RuleAction{
  155. Action: C.RuleActionTypeRoute,
  156. RouteOptions: option.RouteActionOptions{
  157. Outbound: "vmess-out",
  158. },
  159. },
  160. },
  161. },
  162. },
  163. },
  164. })
  165. testSuitSimple(t, clientPort, testPort)
  166. }