health_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package health
  2. import (
  3. "io"
  4. "net/http"
  5. "net/http/httptest"
  6. "strings"
  7. "sync"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. const probeName = "probe"
  12. func TestHealthManager(t *testing.T) {
  13. hm := NewHealthManager(probeName)
  14. assert.False(t, hm.IsReady())
  15. hm.MarkReady()
  16. assert.True(t, hm.IsReady())
  17. hm.MarkNotReady()
  18. assert.False(t, hm.IsReady())
  19. t.Run("concurrent should works", func(t *testing.T) {
  20. var wg sync.WaitGroup
  21. wg.Add(10)
  22. for i := 0; i < 10; i++ {
  23. go func() {
  24. hm.MarkReady()
  25. wg.Done()
  26. }()
  27. }
  28. wg.Wait()
  29. assert.True(t, hm.IsReady())
  30. })
  31. }
  32. func TestComboHealthManager(t *testing.T) {
  33. t.Run("base", func(t *testing.T) {
  34. chm := newComboHealthManager()
  35. hm1 := NewHealthManager(probeName)
  36. hm2 := NewHealthManager(probeName + "2")
  37. assert.True(t, chm.IsReady())
  38. chm.addProbe(hm1)
  39. chm.addProbe(hm2)
  40. assert.False(t, chm.IsReady())
  41. hm1.MarkReady()
  42. assert.False(t, chm.IsReady())
  43. hm2.MarkReady()
  44. assert.True(t, chm.IsReady())
  45. })
  46. t.Run("concurrent add probes", func(t *testing.T) {
  47. chm := newComboHealthManager()
  48. var wg sync.WaitGroup
  49. wg.Add(10)
  50. for i := 0; i < 10; i++ {
  51. go func() {
  52. hm := NewHealthManager(probeName)
  53. hm.MarkReady()
  54. chm.addProbe(hm)
  55. wg.Done()
  56. }()
  57. }
  58. wg.Wait()
  59. assert.True(t, chm.IsReady())
  60. })
  61. t.Run("markReady and markNotReady", func(t *testing.T) {
  62. chm := newComboHealthManager()
  63. for i := 0; i < 10; i++ {
  64. hm := NewHealthManager(probeName)
  65. chm.addProbe(hm)
  66. }
  67. assert.False(t, chm.IsReady())
  68. chm.MarkReady()
  69. assert.True(t, chm.IsReady())
  70. chm.MarkNotReady()
  71. assert.False(t, chm.IsReady())
  72. })
  73. }
  74. func TestAddGlobalProbes(t *testing.T) {
  75. cleanupForTest(t)
  76. t.Run("concurrent add probes", func(t *testing.T) {
  77. var wg sync.WaitGroup
  78. wg.Add(10)
  79. for i := 0; i < 10; i++ {
  80. go func() {
  81. hm := NewHealthManager(probeName)
  82. hm.MarkReady()
  83. AddProbe(hm)
  84. wg.Done()
  85. }()
  86. }
  87. wg.Wait()
  88. assert.True(t, defaultHealthManager.IsReady())
  89. })
  90. }
  91. func TestCreateHttpHandler(t *testing.T) {
  92. cleanupForTest(t)
  93. srv := httptest.NewServer(CreateHttpHandler())
  94. defer srv.Close()
  95. resp, err := http.Get(srv.URL)
  96. assert.Nil(t, err)
  97. _ = resp.Body.Close()
  98. assert.Equal(t, http.StatusOK, resp.StatusCode)
  99. hm := NewHealthManager(probeName)
  100. defaultHealthManager.addProbe(hm)
  101. resp, err = http.Get(srv.URL)
  102. assert.Nil(t, err)
  103. assert.Equal(t, http.StatusServiceUnavailable, resp.StatusCode)
  104. content, _ := io.ReadAll(resp.Body)
  105. assert.True(t, strings.HasPrefix(string(content), "Service Unavailable"))
  106. _ = resp.Body.Close()
  107. hm.MarkReady()
  108. resp, err = http.Get(srv.URL)
  109. assert.Nil(t, err)
  110. _ = resp.Body.Close()
  111. assert.Equal(t, http.StatusOK, resp.StatusCode)
  112. }
  113. func cleanupForTest(t *testing.T) {
  114. t.Cleanup(func() {
  115. defaultHealthManager = &comboHealthManager{}
  116. })
  117. }