health_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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("is ready verbose", func(t *testing.T) {
  47. chm := newComboHealthManager()
  48. hm := NewHealthManager(probeName)
  49. assert.True(t, chm.IsReady())
  50. chm.addProbe(hm)
  51. assert.False(t, chm.IsReady())
  52. hm.MarkReady()
  53. assert.True(t, chm.IsReady())
  54. assert.Contains(t, chm.verboseInfo(), probeName)
  55. assert.Contains(t, chm.verboseInfo(), "is ready")
  56. })
  57. t.Run("concurrent add probes", func(t *testing.T) {
  58. chm := newComboHealthManager()
  59. var wg sync.WaitGroup
  60. wg.Add(10)
  61. for i := 0; i < 10; i++ {
  62. go func() {
  63. hm := NewHealthManager(probeName)
  64. hm.MarkReady()
  65. chm.addProbe(hm)
  66. wg.Done()
  67. }()
  68. }
  69. wg.Wait()
  70. assert.True(t, chm.IsReady())
  71. })
  72. t.Run("markReady and markNotReady", func(t *testing.T) {
  73. chm := newComboHealthManager()
  74. for i := 0; i < 10; i++ {
  75. hm := NewHealthManager(probeName)
  76. chm.addProbe(hm)
  77. }
  78. assert.False(t, chm.IsReady())
  79. chm.MarkReady()
  80. assert.True(t, chm.IsReady())
  81. chm.MarkNotReady()
  82. assert.False(t, chm.IsReady())
  83. })
  84. }
  85. func TestAddGlobalProbes(t *testing.T) {
  86. cleanupForTest(t)
  87. t.Run("concurrent add probes", func(t *testing.T) {
  88. var wg sync.WaitGroup
  89. wg.Add(10)
  90. for i := 0; i < 10; i++ {
  91. go func() {
  92. hm := NewHealthManager(probeName)
  93. hm.MarkReady()
  94. AddProbe(hm)
  95. wg.Done()
  96. }()
  97. }
  98. wg.Wait()
  99. assert.True(t, defaultHealthManager.IsReady())
  100. })
  101. }
  102. func TestCreateHttpHandler(t *testing.T) {
  103. cleanupForTest(t)
  104. srv := httptest.NewServer(CreateHttpHandler())
  105. defer srv.Close()
  106. resp, err := http.Get(srv.URL)
  107. assert.Nil(t, err)
  108. _ = resp.Body.Close()
  109. assert.Equal(t, http.StatusOK, resp.StatusCode)
  110. hm := NewHealthManager(probeName)
  111. defaultHealthManager.addProbe(hm)
  112. resp, err = http.Get(srv.URL)
  113. assert.Nil(t, err)
  114. assert.Equal(t, http.StatusServiceUnavailable, resp.StatusCode)
  115. content, _ := io.ReadAll(resp.Body)
  116. assert.True(t, strings.HasPrefix(string(content), "Service Unavailable"))
  117. _ = resp.Body.Close()
  118. hm.MarkReady()
  119. resp, err = http.Get(srv.URL)
  120. assert.Nil(t, err)
  121. _ = resp.Body.Close()
  122. assert.Equal(t, http.StatusOK, resp.StatusCode)
  123. }
  124. func cleanupForTest(t *testing.T) {
  125. t.Cleanup(func() {
  126. defaultHealthManager = &comboHealthManager{}
  127. })
  128. }