kcp_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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), func(ctx context.Context, conn internet.Connection) bool {
  18. go func(c internet.Connection) {
  19. payload := make([]byte, 4096)
  20. for {
  21. nBytes, err := c.Read(payload)
  22. if err != nil {
  23. break
  24. }
  25. for idx, b := range payload[:nBytes] {
  26. payload[idx] = b ^ 'c'
  27. }
  28. c.Write(payload[:nBytes])
  29. }
  30. c.Close()
  31. }(conn)
  32. return true
  33. })
  34. assert.Error(err).IsNil()
  35. port := v2net.Port(listerner.Addr().(*net.UDPAddr).Port)
  36. ctx := internet.ContextWithTransportSettings(context.Background(), &Config{})
  37. wg := new(sync.WaitGroup)
  38. for i := 0; i < 10; i++ {
  39. clientConn, err := DialKCP(ctx, v2net.UDPDestination(v2net.LocalHostIP, port))
  40. assert.Error(err).IsNil()
  41. wg.Add(1)
  42. go func() {
  43. clientSend := make([]byte, 1024*1024)
  44. rand.Read(clientSend)
  45. go clientConn.Write(clientSend)
  46. clientReceived := make([]byte, 1024*1024)
  47. nBytes, _ := io.ReadFull(clientConn, clientReceived)
  48. assert.Int(nBytes).Equals(len(clientReceived))
  49. clientConn.Close()
  50. clientExpected := make([]byte, 1024*1024)
  51. for idx, b := range clientSend {
  52. clientExpected[idx] = b ^ 'c'
  53. }
  54. assert.Bytes(clientReceived).Equals(clientExpected)
  55. wg.Done()
  56. }()
  57. }
  58. wg.Wait()
  59. for i := 0; i < 60 && listerner.ActiveConnections() > 0; i++ {
  60. time.Sleep(500 * time.Millisecond)
  61. }
  62. assert.Int(listerner.ActiveConnections()).Equals(0)
  63. listerner.Close()
  64. }