kcp_test.go 1.7 KB

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