1
0

protocol_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package tuic
  2. import (
  3. "bytes"
  4. "net"
  5. "reflect"
  6. "testing"
  7. )
  8. func TestAddressEncodingDecoding(t *testing.T) {
  9. tests := []struct {
  10. name string
  11. addr *Address
  12. }{
  13. {
  14. name: "IPv4",
  15. addr: &Address{
  16. Type: AddrTypeIPv4,
  17. IP: net.ParseIP("1.2.3.4").To4(),
  18. Host: "1.2.3.4",
  19. Port: 443,
  20. },
  21. },
  22. {
  23. name: "IPv6",
  24. addr: &Address{
  25. Type: AddrTypeIPv6,
  26. IP: net.ParseIP("2001:db8::1"),
  27. Host: "2001:db8::1",
  28. Port: 8080,
  29. },
  30. },
  31. {
  32. name: "Domain",
  33. addr: &Address{
  34. Type: AddrTypeDomain,
  35. Host: "example.com",
  36. Port: 8443,
  37. },
  38. },
  39. {
  40. name: "None",
  41. addr: &Address{
  42. Type: AddrTypeNone,
  43. },
  44. },
  45. }
  46. for _, tc := range tests {
  47. t.Run(tc.name, func(t *testing.T) {
  48. var buf bytes.Buffer
  49. if err := WriteAddress(&buf, tc.addr); err != nil {
  50. t.Fatalf("WriteAddress error: %v", err)
  51. }
  52. decoded, err := ReadAddress(&buf)
  53. if err != nil {
  54. t.Fatalf("ReadAddress error: %v", err)
  55. }
  56. if tc.addr.Type == AddrTypeNone {
  57. if decoded.Type != AddrTypeNone {
  58. t.Fatalf("expected None type, got %v", decoded.Type)
  59. }
  60. return
  61. }
  62. if decoded.Type != tc.addr.Type {
  63. t.Errorf("Type mismatch: got %v, want %v", decoded.Type, tc.addr.Type)
  64. }
  65. if decoded.Port != tc.addr.Port {
  66. t.Errorf("Port mismatch: got %v, want %v", decoded.Port, tc.addr.Port)
  67. }
  68. if tc.addr.Type == AddrTypeDomain {
  69. if decoded.Host != tc.addr.Host {
  70. t.Errorf("Host mismatch: got %v, want %v", decoded.Host, tc.addr.Host)
  71. }
  72. } else {
  73. if !decoded.IP.Equal(tc.addr.IP) {
  74. t.Errorf("IP mismatch: got %v, want %v", decoded.IP, tc.addr.IP)
  75. }
  76. }
  77. })
  78. }
  79. }
  80. func TestCommandHeader(t *testing.T) {
  81. buf := bytes.NewBuffer([]byte{0x05, 0x01})
  82. ver, cmd, err := ReadCommand(buf)
  83. if err != nil {
  84. t.Fatalf("ReadCommand error: %v", err)
  85. }
  86. if ver != ProtocolVersion || cmd != CmdConnect {
  87. t.Fatalf("got ver=%d, cmd=%d; want ver=5, cmd=1", ver, cmd)
  88. }
  89. invalidBuf := bytes.NewBuffer([]byte{0x04, 0x01})
  90. _, _, err = ReadCommand(invalidBuf)
  91. if err == nil {
  92. t.Fatal("expected error on invalid version, got nil")
  93. }
  94. }
  95. func TestPacketHeaderAndPayload(t *testing.T) {
  96. var buf bytes.Buffer
  97. target := &Address{
  98. Type: AddrTypeDomain,
  99. Host: "dns.google",
  100. Port: 53,
  101. }
  102. payload := []byte("hello-udp")
  103. err := WritePacket(&buf, 100, 1, 1, 0, target, payload)
  104. if err != nil {
  105. t.Fatalf("WritePacket error: %v", err)
  106. }
  107. ver, cmd, err := ReadCommand(&buf)
  108. if err != nil {
  109. t.Fatalf("ReadCommand error: %v", err)
  110. }
  111. if ver != ProtocolVersion || cmd != CmdPacket {
  112. t.Fatalf("got ver=%d cmd=%d, want 5 and 2", ver, cmd)
  113. }
  114. ph, err := ReadPacketHeader(&buf)
  115. if err != nil {
  116. t.Fatalf("ReadPacketHeader error: %v", err)
  117. }
  118. if ph.AssocID != 100 || ph.PktID != 1 || ph.FragTotal != 1 || ph.FragID != 0 {
  119. t.Fatalf("PacketHeader mismatch: %+v", ph)
  120. }
  121. if ph.Addr.Host != "dns.google" || ph.Addr.Port != 53 {
  122. t.Fatalf("Packet address mismatch: %+v", ph.Addr)
  123. }
  124. readPayload := make([]byte, ph.Size)
  125. if _, err := buf.Read(readPayload); err != nil {
  126. t.Fatalf("reading payload error: %v", err)
  127. }
  128. if !reflect.DeepEqual(readPayload, payload) {
  129. t.Fatalf("payload mismatch: got %s, want %s", readPayload, payload)
  130. }
  131. }