kcp_test.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package kcp_test
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "io"
  6. "net"
  7. "sync"
  8. "testing"
  9. "time"
  10. v2net "v2ray.com/core/common/net"
  11. "v2ray.com/core/testing/assert"
  12. "v2ray.com/core/transport/internet"
  13. . "v2ray.com/core/transport/internet/kcp"
  14. )
  15. func TestDialAndListen(t *testing.T) {
  16. assert := assert.On(t)
  17. listerner, err := NewListener(internet.ContextWithTransportSettings(context.Background(), &Config{}), v2net.LocalHostIP, v2net.Port(0))
  18. assert.Error(err).IsNil()
  19. port := v2net.Port(listerner.Addr().(*net.UDPAddr).Port)
  20. go func() {
  21. for {
  22. conn, err := listerner.Accept()
  23. if err != nil {
  24. break
  25. }
  26. go func() {
  27. payload := make([]byte, 4096)
  28. for {
  29. nBytes, err := conn.Read(payload)
  30. if err != nil {
  31. break
  32. }
  33. for idx, b := range payload[:nBytes] {
  34. payload[idx] = b ^ 'c'
  35. }
  36. conn.Write(payload[:nBytes])
  37. }
  38. conn.Close()
  39. }()
  40. }
  41. }()
  42. ctx := internet.ContextWithTransportSettings(context.Background(), &Config{})
  43. wg := new(sync.WaitGroup)
  44. for i := 0; i < 10; i++ {
  45. clientConn, err := DialKCP(ctx, v2net.UDPDestination(v2net.LocalHostIP, port))
  46. assert.Error(err).IsNil()
  47. wg.Add(1)
  48. go func() {
  49. clientSend := make([]byte, 1024*1024)
  50. rand.Read(clientSend)
  51. go clientConn.Write(clientSend)
  52. clientReceived := make([]byte, 1024*1024)
  53. nBytes, _ := io.ReadFull(clientConn, clientReceived)
  54. assert.Int(nBytes).Equals(len(clientReceived))
  55. clientConn.Close()
  56. clientExpected := make([]byte, 1024*1024)
  57. for idx, b := range clientSend {
  58. clientExpected[idx] = b ^ 'c'
  59. }
  60. assert.Bytes(clientReceived).Equals(clientExpected)
  61. wg.Done()
  62. }()
  63. }
  64. wg.Wait()
  65. for i := 0; i < 60 && listerner.ActiveConnections() > 0; i++ {
  66. time.Sleep(500 * time.Millisecond)
  67. }
  68. assert.Int(listerner.ActiveConnections()).Equals(0)
  69. listerner.Close()
  70. }