kcp_test.go 1.6 KB

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