kcp_test.go 1.8 KB

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