mux_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package mux_test
  2. import (
  3. "io"
  4. "testing"
  5. "github.com/google/go-cmp/cmp"
  6. "github.com/xtls/xray-core/common"
  7. "github.com/xtls/xray-core/common/buf"
  8. . "github.com/xtls/xray-core/common/mux"
  9. "github.com/xtls/xray-core/common/net"
  10. "github.com/xtls/xray-core/common/protocol"
  11. "github.com/xtls/xray-core/common/session"
  12. "github.com/xtls/xray-core/transport/pipe"
  13. )
  14. func readAll(reader buf.Reader) (buf.MultiBuffer, error) {
  15. var mb buf.MultiBuffer
  16. for {
  17. b, err := reader.ReadMultiBuffer()
  18. if err == io.EOF {
  19. break
  20. }
  21. if err != nil {
  22. return nil, err
  23. }
  24. mb = append(mb, b...)
  25. }
  26. return mb, nil
  27. }
  28. func TestReaderWriter(t *testing.T) {
  29. pReader, pWriter := pipe.New(pipe.WithSizeLimit(1024))
  30. dest := net.TCPDestination(net.DomainAddress("example.com"), 80)
  31. writer := NewWriter(1, dest, pWriter, protocol.TransferTypeStream, [8]byte{}, &session.Inbound{})
  32. dest2 := net.TCPDestination(net.LocalHostIP, 443)
  33. writer2 := NewWriter(2, dest2, pWriter, protocol.TransferTypeStream, [8]byte{}, &session.Inbound{})
  34. dest3 := net.TCPDestination(net.LocalHostIPv6, 18374)
  35. writer3 := NewWriter(3, dest3, pWriter, protocol.TransferTypeStream, [8]byte{}, &session.Inbound{})
  36. writePayload := func(writer *Writer, payload ...byte) error {
  37. b := buf.New()
  38. b.Write(payload)
  39. return writer.WriteMultiBuffer(buf.MultiBuffer{b})
  40. }
  41. common.Must(writePayload(writer, 'a', 'b', 'c', 'd'))
  42. common.Must(writePayload(writer2))
  43. common.Must(writePayload(writer, 'e', 'f', 'g', 'h'))
  44. common.Must(writePayload(writer3, 'x'))
  45. writer.Close()
  46. writer3.Close()
  47. common.Must(writePayload(writer2, 'y'))
  48. writer2.Close()
  49. bytesReader := &buf.BufferedReader{Reader: pReader}
  50. {
  51. var meta FrameMetadata
  52. common.Must(meta.Unmarshal(bytesReader, false))
  53. if r := cmp.Diff(meta, FrameMetadata{
  54. SessionID: 1,
  55. SessionStatus: SessionStatusNew,
  56. Target: dest,
  57. Option: OptionData,
  58. }); r != "" {
  59. t.Error("metadata: ", r)
  60. }
  61. data, err := readAll(NewStreamReader(bytesReader))
  62. common.Must(err)
  63. if s := data.String(); s != "abcd" {
  64. t.Error("data: ", s)
  65. }
  66. }
  67. {
  68. var meta FrameMetadata
  69. common.Must(meta.Unmarshal(bytesReader, false))
  70. if r := cmp.Diff(meta, FrameMetadata{
  71. SessionStatus: SessionStatusNew,
  72. SessionID: 2,
  73. Option: 0,
  74. Target: dest2,
  75. }); r != "" {
  76. t.Error("meta: ", r)
  77. }
  78. }
  79. {
  80. var meta FrameMetadata
  81. common.Must(meta.Unmarshal(bytesReader, false))
  82. if r := cmp.Diff(meta, FrameMetadata{
  83. SessionID: 1,
  84. SessionStatus: SessionStatusKeep,
  85. Option: 1,
  86. }); r != "" {
  87. t.Error("meta: ", r)
  88. }
  89. data, err := readAll(NewStreamReader(bytesReader))
  90. common.Must(err)
  91. if s := data.String(); s != "efgh" {
  92. t.Error("data: ", s)
  93. }
  94. }
  95. {
  96. var meta FrameMetadata
  97. common.Must(meta.Unmarshal(bytesReader, false))
  98. if r := cmp.Diff(meta, FrameMetadata{
  99. SessionID: 3,
  100. SessionStatus: SessionStatusNew,
  101. Option: 1,
  102. Target: dest3,
  103. }); r != "" {
  104. t.Error("meta: ", r)
  105. }
  106. data, err := readAll(NewStreamReader(bytesReader))
  107. common.Must(err)
  108. if s := data.String(); s != "x" {
  109. t.Error("data: ", s)
  110. }
  111. }
  112. {
  113. var meta FrameMetadata
  114. common.Must(meta.Unmarshal(bytesReader, false))
  115. if r := cmp.Diff(meta, FrameMetadata{
  116. SessionID: 1,
  117. SessionStatus: SessionStatusEnd,
  118. Option: 0,
  119. }); r != "" {
  120. t.Error("meta: ", r)
  121. }
  122. }
  123. {
  124. var meta FrameMetadata
  125. common.Must(meta.Unmarshal(bytesReader, false))
  126. if r := cmp.Diff(meta, FrameMetadata{
  127. SessionID: 3,
  128. SessionStatus: SessionStatusEnd,
  129. Option: 0,
  130. }); r != "" {
  131. t.Error("meta: ", r)
  132. }
  133. }
  134. {
  135. var meta FrameMetadata
  136. common.Must(meta.Unmarshal(bytesReader, false))
  137. if r := cmp.Diff(meta, FrameMetadata{
  138. SessionID: 2,
  139. SessionStatus: SessionStatusKeep,
  140. Option: 1,
  141. }); r != "" {
  142. t.Error("meta: ", r)
  143. }
  144. data, err := readAll(NewStreamReader(bytesReader))
  145. common.Must(err)
  146. if s := data.String(); s != "y" {
  147. t.Error("data: ", s)
  148. }
  149. }
  150. {
  151. var meta FrameMetadata
  152. common.Must(meta.Unmarshal(bytesReader, false))
  153. if r := cmp.Diff(meta, FrameMetadata{
  154. SessionID: 2,
  155. SessionStatus: SessionStatusEnd,
  156. Option: 0,
  157. }); r != "" {
  158. t.Error("meta: ", r)
  159. }
  160. }
  161. pWriter.Close()
  162. {
  163. var meta FrameMetadata
  164. err := meta.Unmarshal(bytesReader, false)
  165. if err == nil {
  166. t.Error("nil error")
  167. }
  168. }
  169. }