rate_test.go 873 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package limiter
  2. import (
  3. "bytes"
  4. "ehang.io/nps/lib/enet"
  5. "github.com/stretchr/testify/assert"
  6. "net"
  7. "testing"
  8. "time"
  9. )
  10. func TestRateLimiter(t *testing.T) {
  11. cl := RateLimiter{
  12. RateLimit: 100,
  13. }
  14. assert.NoError(t, cl.Init())
  15. ln, err := net.Listen("tcp", "127.0.0.1:0")
  16. assert.NoError(t, err)
  17. nowBytes := 0
  18. close := make(chan struct{})
  19. go func() {
  20. buf := make([]byte, 10)
  21. c, err := ln.Accept()
  22. assert.NoError(t, err)
  23. c, err = cl.DoLimit(enet.NewReaderConn(c))
  24. go func() {
  25. <-time.After(time.Second * 2)
  26. if nowBytes > 500 {
  27. t.Fail()
  28. }
  29. close <- struct{}{}
  30. }()
  31. for {
  32. n, err := c.Read(buf)
  33. nowBytes += n
  34. assert.NoError(t, err)
  35. }
  36. }()
  37. c, err := net.Dial("tcp", ln.Addr().String())
  38. assert.NoError(t, err)
  39. for i := 11; i > 0; i-- {
  40. _, err := c.Write(bytes.Repeat([]byte{0}, 10000))
  41. assert.NoError(t, err)
  42. }
  43. <-close
  44. }