protocol_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package shadowsocks_test
  2. import (
  3. "testing"
  4. "v2ray.com/core/common/alloc"
  5. "v2ray.com/core/common/loader"
  6. v2net "v2ray.com/core/common/net"
  7. "v2ray.com/core/common/protocol"
  8. . "v2ray.com/core/proxy/shadowsocks"
  9. "v2ray.com/core/testing/assert"
  10. )
  11. func TestUDPEncoding(t *testing.T) {
  12. assert := assert.On(t)
  13. request := &protocol.RequestHeader{
  14. Version: Version,
  15. Command: protocol.RequestCommandUDP,
  16. Address: v2net.LocalHostIP,
  17. Port: 1234,
  18. User: &protocol.User{
  19. Email: "love@v2ray.com",
  20. Account: loader.NewTypedSettings(&Account{
  21. Password: "shadowsocks-password",
  22. CipherType: CipherType_AES_128_CFB,
  23. Ota: Account_Disabled,
  24. }),
  25. },
  26. }
  27. data := alloc.NewLocalBuffer(256).Clear().AppendString("test string")
  28. encodedData, err := EncodeUDPPacket(request, data)
  29. assert.Error(err).IsNil()
  30. decodedRequest, decodedData, err := DecodeUDPPacket(request.User, encodedData)
  31. assert.Error(err).IsNil()
  32. assert.Bytes(decodedData.Value).Equals(data.Value)
  33. assert.Address(decodedRequest.Address).Equals(request.Address)
  34. assert.Port(decodedRequest.Port).Equals(request.Port)
  35. }
  36. func TestTCPRequest(t *testing.T) {
  37. assert := assert.On(t)
  38. request := &protocol.RequestHeader{
  39. Version: Version,
  40. Command: protocol.RequestCommandTCP,
  41. Address: v2net.LocalHostIP,
  42. Option: RequestOptionOneTimeAuth,
  43. Port: 1234,
  44. User: &protocol.User{
  45. Email: "love@v2ray.com",
  46. Account: loader.NewTypedSettings(&Account{
  47. Password: "tcp-password",
  48. CipherType: CipherType_CHACHA20,
  49. }),
  50. },
  51. }
  52. data := alloc.NewLocalBuffer(256).Clear().AppendString("test string")
  53. cache := alloc.NewBuffer().Clear()
  54. writer, err := WriteTCPRequest(request, cache)
  55. assert.Error(err).IsNil()
  56. writer.Write(data)
  57. decodedRequest, reader, err := ReadTCPSession(request.User, cache)
  58. assert.Error(err).IsNil()
  59. assert.Address(decodedRequest.Address).Equals(request.Address)
  60. assert.Port(decodedRequest.Port).Equals(request.Port)
  61. decodedData, err := reader.Read()
  62. assert.Error(err).IsNil()
  63. assert.Bytes(decodedData.Value).Equals([]byte("test string"))
  64. }
  65. func TestUDPReaderWriter(t *testing.T) {
  66. assert := assert.On(t)
  67. user := &protocol.User{
  68. Account: loader.NewTypedSettings(&Account{
  69. Password: "test-password",
  70. CipherType: CipherType_CHACHA20_IEFT,
  71. }),
  72. }
  73. cache := alloc.NewBuffer().Clear()
  74. writer := &UDPWriter{
  75. Writer: cache,
  76. Request: &protocol.RequestHeader{
  77. Version: Version,
  78. Address: v2net.DomainAddress("v2ray.com"),
  79. Port: 123,
  80. User: user,
  81. Option: RequestOptionOneTimeAuth,
  82. },
  83. }
  84. reader := &UDPReader{
  85. Reader: cache,
  86. User: user,
  87. }
  88. err := writer.Write(alloc.NewBuffer().Clear().AppendString("test payload"))
  89. assert.Error(err).IsNil()
  90. payload, err := reader.Read()
  91. assert.Error(err).IsNil()
  92. assert.String(payload.String()).Equals("test payload")
  93. err = writer.Write(alloc.NewBuffer().Clear().AppendString("test payload 2"))
  94. assert.Error(err).IsNil()
  95. payload, err = reader.Read()
  96. assert.Error(err).IsNil()
  97. assert.String(payload.String()).Equals("test payload 2")
  98. }