server_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package server
  2. import (
  3. "fmt"
  4. "github.com/rotisserie/eris"
  5. "log"
  6. "strconv"
  7. "sync"
  8. "sync/atomic"
  9. "testing"
  10. "time"
  11. "github.com/google/uuid"
  12. "github.com/gorilla/websocket"
  13. )
  14. func BenchmarkTest1(b *testing.B) {
  15. fmt.Println(b.N)
  16. for i := 0; i < b.N; i++ {
  17. _ = fmt.Sprintf("%d", i)
  18. }
  19. }
  20. func TestServer_WebsocketKeep(t *testing.T) {
  21. wg := sync.WaitGroup{}
  22. var count int32
  23. var failed int32
  24. go func() {
  25. wg.Add(1)
  26. defer wg.Done()
  27. for {
  28. time.Sleep(3 * time.Second)
  29. fmt.Printf("%d, %d \n", atomic.LoadInt32(&count), atomic.LoadInt32(&failed))
  30. }
  31. }()
  32. for i := 0; i < 3000; i++ {
  33. go func() {
  34. wg.Add(1)
  35. defer wg.Done()
  36. conn, _, err := websocket.DefaultDialer.Dial(
  37. fmt.Sprintf(`ws://127.0.0.1:10082/websocket/endpoint?X-Websocket-Header-ID=%s`, uuid.NewString()),
  38. //fmt.Sprintf(`ws://106.75.230.4:10082/websocket/endpoint?X-Websocket-Header-ID=%s`, uuid.NewString()),
  39. nil)
  40. if err != nil {
  41. atomic.StoreInt32(&failed, failed+1)
  42. log.Println(eris.Wrap(err, "unable to create connect"))
  43. return
  44. }
  45. conn.SetCloseHandler(func(code int, text string) error {
  46. log.Println(code, text)
  47. return nil
  48. })
  49. go func() {
  50. for {
  51. time.Sleep(3 * time.Second)
  52. message := Message{Type: MessageTypePingPong, RequestId: strconv.Itoa(int(time.Now().UnixMilli())), Content: "ping"}
  53. err = conn.WriteMessage(websocket.TextMessage, serializationMessage(&message))
  54. if err != nil {
  55. log.Println(eris.Wrap(err, "unable to write message"))
  56. return
  57. }
  58. }
  59. }()
  60. atomic.StoreInt32(&count, count+1)
  61. for {
  62. _, _, err = conn.ReadMessage()
  63. if err != nil {
  64. log.Println(eris.Wrap(err, "unable to read message"))
  65. return
  66. }
  67. }
  68. }()
  69. }
  70. wg.Wait()
  71. }
  72. func BenchmarkServer_WebsocketPressure(b *testing.B) {
  73. b.ReportAllocs()
  74. b.ResetTimer()
  75. b.SetParallelism(17)
  76. b.RunParallel(func(p *testing.PB) {
  77. for p.Next() {
  78. websocketConnect()
  79. }
  80. })
  81. }
  82. func websocketConnect() {
  83. conn, _, err := websocket.DefaultDialer.Dial(
  84. // fmt.Sprintf(`ws://127.0.0.1:10082/websocket/endpoint?X-Websocket-Header-ID=%s`, uuid.NewString()),
  85. fmt.Sprintf(`ws://106.75.230.4:10082/websocket/endpoint?X-Websocket-Header-ID=%s`, uuid.NewString()),
  86. nil)
  87. if err != nil {
  88. log.Println(err)
  89. }
  90. message := Message{Type: MessageTypePingPong, RequestId: strconv.Itoa(int(time.Now().UnixMilli())), Content: "ping"}
  91. conn.SetWriteDeadline(time.Now().Add(time.Second * 60))
  92. err = conn.WriteMessage(websocket.TextMessage, serializationMessage(&message))
  93. if err != nil {
  94. log.Println(err)
  95. }
  96. go func() {
  97. for {
  98. //conn.SetReadDeadline(time.Now().Add(time.Second * 2))
  99. _, _, err = conn.ReadMessage()
  100. if err != nil {
  101. log.Println(err)
  102. return
  103. }
  104. //conn.SetReadDeadline(time.Now().Add(time.Second * 2))
  105. //log.Println(string(msg))
  106. }
  107. }()
  108. }