vmess_transport_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package main
  2. import (
  3. "net/netip"
  4. "testing"
  5. C "github.com/sagernet/sing-box/constant"
  6. "github.com/sagernet/sing-box/option"
  7. "github.com/gofrs/uuid"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func TestVMessGRPCSelf(t *testing.T) {
  11. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  12. Type: C.V2RayTransportTypeGRPC,
  13. GRPCOptions: option.V2RayGRPCOptions{
  14. ServiceName: "TunService",
  15. },
  16. })
  17. }
  18. func TestVMessWebscoketSelf(t *testing.T) {
  19. t.Run("basic", func(t *testing.T) {
  20. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  21. Type: C.V2RayTransportTypeWebsocket,
  22. })
  23. })
  24. t.Run("v2ray early data", func(t *testing.T) {
  25. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  26. Type: C.V2RayTransportTypeWebsocket,
  27. WebsocketOptions: option.V2RayWebsocketOptions{
  28. MaxEarlyData: 2048,
  29. },
  30. })
  31. })
  32. t.Run("xray early data", func(t *testing.T) {
  33. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  34. Type: C.V2RayTransportTypeWebsocket,
  35. WebsocketOptions: option.V2RayWebsocketOptions{
  36. MaxEarlyData: 2048,
  37. EarlyDataHeaderName: "Sec-WebSocket-Protocol",
  38. },
  39. })
  40. })
  41. }
  42. func TestVMessQUICSelf(t *testing.T) {
  43. testVMessWebscoketSelf(t, &option.V2RayTransportOptions{
  44. Type: C.V2RayTransportTypeQUIC,
  45. })
  46. }
  47. func testVMessWebscoketSelf(t *testing.T, transport *option.V2RayTransportOptions) {
  48. user, err := uuid.DefaultGenerator.NewV4()
  49. require.NoError(t, err)
  50. _, certPem, keyPem := createSelfSignedCertificate(t, "example.org")
  51. startInstance(t, option.Options{
  52. Log: &option.LogOptions{
  53. Level: "error",
  54. },
  55. Inbounds: []option.Inbound{
  56. {
  57. Type: C.TypeMixed,
  58. Tag: "mixed-in",
  59. MixedOptions: option.HTTPMixedInboundOptions{
  60. ListenOptions: option.ListenOptions{
  61. Listen: option.ListenAddress(netip.IPv4Unspecified()),
  62. ListenPort: clientPort,
  63. },
  64. },
  65. },
  66. {
  67. Type: C.TypeVMess,
  68. VMessOptions: option.VMessInboundOptions{
  69. ListenOptions: option.ListenOptions{
  70. Listen: option.ListenAddress(netip.IPv4Unspecified()),
  71. ListenPort: serverPort,
  72. },
  73. Users: []option.VMessUser{
  74. {
  75. Name: "sekai",
  76. UUID: user.String(),
  77. },
  78. },
  79. TLS: &option.InboundTLSOptions{
  80. Enabled: true,
  81. ServerName: "example.org",
  82. CertificatePath: certPem,
  83. KeyPath: keyPem,
  84. },
  85. Transport: transport,
  86. },
  87. },
  88. },
  89. Outbounds: []option.Outbound{
  90. {
  91. Type: C.TypeDirect,
  92. },
  93. {
  94. Type: C.TypeVMess,
  95. Tag: "vmess-out",
  96. VMessOptions: option.VMessOutboundOptions{
  97. ServerOptions: option.ServerOptions{
  98. Server: "127.0.0.1",
  99. ServerPort: serverPort,
  100. },
  101. UUID: user.String(),
  102. Security: "zero",
  103. TLS: &option.OutboundTLSOptions{
  104. Enabled: true,
  105. ServerName: "example.org",
  106. CertificatePath: certPem,
  107. },
  108. Transport: transport,
  109. },
  110. },
  111. },
  112. Route: &option.RouteOptions{
  113. Rules: []option.Rule{
  114. {
  115. DefaultOptions: option.DefaultRule{
  116. Inbound: []string{"mixed-in"},
  117. Outbound: "vmess-out",
  118. },
  119. },
  120. },
  121. },
  122. })
  123. testSuitQUIC(t, clientPort, testPort)
  124. }