protocol_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package trojan_test
  2. import (
  3. "crypto/rand"
  4. "testing"
  5. "github.com/google/go-cmp/cmp"
  6. "github.com/v2fly/v2ray-core/v5/common"
  7. "github.com/v2fly/v2ray-core/v5/common/buf"
  8. "github.com/v2fly/v2ray-core/v5/common/net"
  9. "github.com/v2fly/v2ray-core/v5/common/protocol"
  10. . "github.com/v2fly/v2ray-core/v5/proxy/trojan"
  11. )
  12. func toAccount(a *Account) protocol.Account {
  13. account, err := a.AsAccount()
  14. common.Must(err)
  15. return account
  16. }
  17. func TestTCPRequest(t *testing.T) {
  18. user := &protocol.MemoryUser{
  19. Email: "love@v2fly.org",
  20. Account: toAccount(&Account{
  21. Password: "password",
  22. }),
  23. }
  24. payload := []byte("test string")
  25. data := buf.New()
  26. common.Must2(data.Write(payload))
  27. buffer := buf.New()
  28. defer buffer.Release()
  29. destination := net.Destination{Network: net.Network_TCP, Address: net.LocalHostIP, Port: 1234}
  30. writer := &ConnWriter{Writer: buffer, Target: destination, Account: user.Account.(*MemoryAccount)}
  31. common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{data}))
  32. reader := &ConnReader{Reader: buffer}
  33. common.Must(reader.ParseHeader())
  34. if r := cmp.Diff(reader.Target, destination); r != "" {
  35. t.Error("destination: ", r)
  36. }
  37. decodedData, err := reader.ReadMultiBuffer()
  38. common.Must(err)
  39. if r := cmp.Diff(decodedData[0].Bytes(), payload); r != "" {
  40. t.Error("data: ", r)
  41. }
  42. }
  43. func TestUDPRequest(t *testing.T) {
  44. user := &protocol.MemoryUser{
  45. Email: "love@v2fly.org",
  46. Account: toAccount(&Account{
  47. Password: "password",
  48. }),
  49. }
  50. payload := []byte("test string")
  51. data := buf.New()
  52. common.Must2(data.Write(payload))
  53. buffer := buf.New()
  54. defer buffer.Release()
  55. destination := net.Destination{Network: net.Network_UDP, Address: net.LocalHostIP, Port: 1234}
  56. writer := &PacketWriter{Writer: &ConnWriter{Writer: buffer, Target: destination, Account: user.Account.(*MemoryAccount)}, Target: destination}
  57. common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{data}))
  58. connReader := &ConnReader{Reader: buffer}
  59. common.Must(connReader.ParseHeader())
  60. packetReader := &PacketReader{Reader: connReader}
  61. p, err := packetReader.ReadMultiBufferWithMetadata()
  62. common.Must(err)
  63. if p.Buffer.IsEmpty() {
  64. t.Error("no request data")
  65. }
  66. if r := cmp.Diff(p.Target, destination); r != "" {
  67. t.Error("destination: ", r)
  68. }
  69. mb, decoded := buf.SplitFirst(p.Buffer)
  70. buf.ReleaseMulti(mb)
  71. if r := cmp.Diff(decoded.Bytes(), payload); r != "" {
  72. t.Error("data: ", r)
  73. }
  74. }
  75. func TestLargeUDPRequest(t *testing.T) {
  76. user := &protocol.MemoryUser{
  77. Email: "love@v2fly.org",
  78. Account: toAccount(&Account{
  79. Password: "password",
  80. }),
  81. }
  82. payload := make([]byte, 4096)
  83. common.Must2(rand.Read(payload))
  84. data := buf.NewWithSize(int32(len(payload)))
  85. common.Must2(data.Write(payload))
  86. buffer := buf.NewWithSize(2*data.Len() + 1)
  87. defer buffer.Release()
  88. destination := net.Destination{Network: net.Network_UDP, Address: net.LocalHostIP, Port: 1234}
  89. writer := &PacketWriter{Writer: &ConnWriter{Writer: buffer, Target: destination, Account: user.Account.(*MemoryAccount)}, Target: destination}
  90. common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{data, data}))
  91. connReader := &ConnReader{Reader: buffer}
  92. common.Must(connReader.ParseHeader())
  93. packetReader := &PacketReader{Reader: connReader}
  94. for i := 0; i < 2; i++ {
  95. p, err := packetReader.ReadMultiBufferWithMetadata()
  96. common.Must(err)
  97. if p.Buffer.IsEmpty() {
  98. t.Error("no request data")
  99. }
  100. if r := cmp.Diff(p.Target, destination); r != "" {
  101. t.Error("destination: ", r)
  102. }
  103. mb, decoded := buf.SplitFirst(p.Buffer)
  104. buf.ReleaseMulti(mb)
  105. if r := cmp.Diff(decoded.Bytes(), payload); r != "" {
  106. t.Error("data: ", r)
  107. }
  108. }
  109. }