protocol_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package shadowsocks_test
  2. import (
  3. "testing"
  4. "github.com/google/go-cmp/cmp"
  5. "github.com/xtls/xray-core/common"
  6. "github.com/xtls/xray-core/common/buf"
  7. "github.com/xtls/xray-core/common/net"
  8. "github.com/xtls/xray-core/common/protocol"
  9. . "github.com/xtls/xray-core/proxy/shadowsocks"
  10. )
  11. func toAccount(a *Account) protocol.Account {
  12. account, err := a.AsAccount()
  13. common.Must(err)
  14. return account
  15. }
  16. func equalRequestHeader(x, y *protocol.RequestHeader) bool {
  17. return cmp.Equal(x, y, cmp.Comparer(func(x, y protocol.RequestHeader) bool {
  18. return x == y
  19. }))
  20. }
  21. func TestUDPEncoding(t *testing.T) {
  22. request := &protocol.RequestHeader{
  23. Version: Version,
  24. Command: protocol.RequestCommandUDP,
  25. Address: net.LocalHostIP,
  26. Port: 1234,
  27. User: &protocol.MemoryUser{
  28. Email: "[email protected]",
  29. Account: toAccount(&Account{
  30. Password: "password",
  31. CipherType: CipherType_AES_128_GCM,
  32. }),
  33. },
  34. }
  35. data := buf.New()
  36. common.Must2(data.WriteString("test string"))
  37. encodedData, err := EncodeUDPPacket(request, data.Bytes())
  38. common.Must(err)
  39. validator := new(Validator)
  40. validator.Add(request.User)
  41. decodedRequest, decodedData, err := DecodeUDPPacket(validator, encodedData)
  42. common.Must(err)
  43. if r := cmp.Diff(decodedData.Bytes(), data.Bytes()); r != "" {
  44. t.Error("data: ", r)
  45. }
  46. if equalRequestHeader(decodedRequest, request) == false {
  47. t.Error("different request")
  48. }
  49. }
  50. func TestTCPRequest(t *testing.T) {
  51. cases := []struct {
  52. request *protocol.RequestHeader
  53. payload []byte
  54. }{
  55. {
  56. request: &protocol.RequestHeader{
  57. Version: Version,
  58. Command: protocol.RequestCommandTCP,
  59. Address: net.LocalHostIP,
  60. Port: 1234,
  61. User: &protocol.MemoryUser{
  62. Email: "[email protected]",
  63. Account: toAccount(&Account{
  64. Password: "tcp-password",
  65. CipherType: CipherType_AES_128_GCM,
  66. }),
  67. },
  68. },
  69. payload: []byte("test string"),
  70. },
  71. {
  72. request: &protocol.RequestHeader{
  73. Version: Version,
  74. Command: protocol.RequestCommandTCP,
  75. Address: net.LocalHostIPv6,
  76. Port: 1234,
  77. User: &protocol.MemoryUser{
  78. Email: "[email protected]",
  79. Account: toAccount(&Account{
  80. Password: "password",
  81. CipherType: CipherType_AES_256_GCM,
  82. }),
  83. },
  84. },
  85. payload: []byte("test string"),
  86. },
  87. {
  88. request: &protocol.RequestHeader{
  89. Version: Version,
  90. Command: protocol.RequestCommandTCP,
  91. Address: net.DomainAddress("example.com"),
  92. Port: 1234,
  93. User: &protocol.MemoryUser{
  94. Email: "[email protected]",
  95. Account: toAccount(&Account{
  96. Password: "password",
  97. CipherType: CipherType_CHACHA20_POLY1305,
  98. }),
  99. },
  100. },
  101. payload: []byte("test string"),
  102. },
  103. }
  104. runTest := func(request *protocol.RequestHeader, payload []byte) {
  105. data := buf.New()
  106. common.Must2(data.Write(payload))
  107. cache := buf.New()
  108. defer cache.Release()
  109. writer, err := WriteTCPRequest(request, cache)
  110. common.Must(err)
  111. common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{data}))
  112. validator := new(Validator)
  113. validator.Add(request.User)
  114. decodedRequest, reader, err := ReadTCPSession(validator, cache)
  115. common.Must(err)
  116. if equalRequestHeader(decodedRequest, request) == false {
  117. t.Error("different request")
  118. }
  119. decodedData, err := reader.ReadMultiBuffer()
  120. common.Must(err)
  121. if r := cmp.Diff(decodedData[0].Bytes(), payload); r != "" {
  122. t.Error("data: ", r)
  123. }
  124. }
  125. for _, test := range cases {
  126. runTest(test.request, test.payload)
  127. }
  128. }
  129. func TestUDPReaderWriter(t *testing.T) {
  130. user := &protocol.MemoryUser{
  131. Account: toAccount(&Account{
  132. Password: "test-password",
  133. CipherType: CipherType_CHACHA20_POLY1305,
  134. }),
  135. }
  136. cache := buf.New()
  137. defer cache.Release()
  138. writer := &UDPWriter{
  139. Writer: cache,
  140. Request: &protocol.RequestHeader{
  141. Version: Version,
  142. Address: net.DomainAddress("example.com"),
  143. Port: 123,
  144. User: user,
  145. },
  146. }
  147. reader := &UDPReader{
  148. Reader: cache,
  149. User: user,
  150. }
  151. {
  152. b := buf.New()
  153. common.Must2(b.WriteString("test payload"))
  154. common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{b}))
  155. payload, err := reader.ReadMultiBuffer()
  156. common.Must(err)
  157. if payload[0].String() != "test payload" {
  158. t.Error("unexpected output: ", payload[0].String())
  159. }
  160. }
  161. {
  162. b := buf.New()
  163. common.Must2(b.WriteString("test payload 2"))
  164. common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{b}))
  165. payload, err := reader.ReadMultiBuffer()
  166. common.Must(err)
  167. if payload[0].String() != "test payload 2" {
  168. t.Error("unexpected output: ", payload[0].String())
  169. }
  170. }
  171. }