kcp_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package kcp_test
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "io"
  6. "testing"
  7. "time"
  8. "github.com/google/go-cmp/cmp"
  9. "golang.org/x/sync/errgroup"
  10. "v2ray.com/core/common"
  11. "v2ray.com/core/common/errors"
  12. "v2ray.com/core/common/net"
  13. "v2ray.com/core/transport/internet"
  14. . "v2ray.com/core/transport/internet/kcp"
  15. )
  16. func TestDialAndListen(t *testing.T) {
  17. listerner, err := NewListener(context.Background(), net.LocalHostIP, net.Port(0), &internet.MemoryStreamConfig{
  18. ProtocolName: "mkcp",
  19. ProtocolSettings: &Config{},
  20. }, func(conn internet.Connection) {
  21. go func(c internet.Connection) {
  22. payload := make([]byte, 4096)
  23. for {
  24. nBytes, err := c.Read(payload)
  25. if err != nil {
  26. break
  27. }
  28. for idx, b := range payload[:nBytes] {
  29. payload[idx] = b ^ 'c'
  30. }
  31. c.Write(payload[:nBytes])
  32. }
  33. c.Close()
  34. }(conn)
  35. })
  36. common.Must(err)
  37. defer listerner.Close()
  38. port := net.Port(listerner.Addr().(*net.UDPAddr).Port)
  39. var errg errgroup.Group
  40. for i := 0; i < 10; i++ {
  41. errg.Go(func() error {
  42. clientConn, err := DialKCP(context.Background(), net.UDPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{
  43. ProtocolName: "mkcp",
  44. ProtocolSettings: &Config{},
  45. })
  46. if err != nil {
  47. return err
  48. }
  49. defer clientConn.Close()
  50. clientSend := make([]byte, 1024*1024)
  51. rand.Read(clientSend)
  52. go clientConn.Write(clientSend)
  53. clientReceived := make([]byte, 1024*1024)
  54. common.Must2(io.ReadFull(clientConn, clientReceived))
  55. clientExpected := make([]byte, 1024*1024)
  56. for idx, b := range clientSend {
  57. clientExpected[idx] = b ^ 'c'
  58. }
  59. if r := cmp.Diff(clientReceived, clientExpected); r != "" {
  60. return errors.New(r)
  61. }
  62. return nil
  63. })
  64. }
  65. if err := errg.Wait(); err != nil {
  66. t.Fatal(err)
  67. }
  68. for i := 0; i < 60 && listerner.ActiveConnections() > 0; i++ {
  69. time.Sleep(500 * time.Millisecond)
  70. }
  71. if v := listerner.ActiveConnections(); v != 0 {
  72. t.Error("active connections: ", v)
  73. }
  74. }