flow_test.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package limiter
  2. import (
  3. "bytes"
  4. "ehang.io/nps/lib/enet"
  5. "github.com/stretchr/testify/assert"
  6. "net"
  7. "testing"
  8. )
  9. func TestFlowLimiter(t *testing.T) {
  10. cl := FlowLimiter{
  11. OutLimit: 100,
  12. InLimit: 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. for {
  25. n, err := c.Read(buf)
  26. nowBytes += n
  27. if nowBytes > 100 {
  28. assert.Error(t, err)
  29. nowBytes = 0
  30. for i := 11; i > 0; i-- {
  31. n, err = c.Write(bytes.Repeat([]byte{0}, 10))
  32. nowBytes += n
  33. if nowBytes > 100 {
  34. assert.Error(t, err)
  35. close <- struct{}{}
  36. } else {
  37. assert.NoError(t, err)
  38. }
  39. }
  40. } else {
  41. assert.NoError(t, err)
  42. }
  43. }
  44. }()
  45. c, err := net.Dial("tcp", ln.Addr().String())
  46. assert.NoError(t, err)
  47. for i := 11; i > 0; i-- {
  48. _, err := c.Write(bytes.Repeat([]byte{0}, 10))
  49. assert.NoError(t, err)
  50. }
  51. buf := make([]byte, 10)
  52. for i := 11; i > 0; i-- {
  53. _, err := c.Read(buf)
  54. assert.NoError(t, err)
  55. }
  56. <-close
  57. }