health_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package daemon
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/docker/docker/api/types"
  6. containertypes "github.com/docker/docker/api/types/container"
  7. eventtypes "github.com/docker/docker/api/types/events"
  8. "github.com/docker/docker/container"
  9. "github.com/docker/docker/daemon/events"
  10. )
  11. func reset(c *container.Container) {
  12. c.State = &container.State{}
  13. c.State.Health = &container.Health{}
  14. c.State.Health.Status = types.Starting
  15. }
  16. func TestNoneHealthcheck(t *testing.T) {
  17. c := &container.Container{
  18. CommonContainer: container.CommonContainer{
  19. ID: "container_id",
  20. Name: "container_name",
  21. Config: &containertypes.Config{
  22. Image: "image_name",
  23. Healthcheck: &containertypes.HealthConfig{
  24. Test: []string{"NONE"},
  25. },
  26. },
  27. State: &container.State{},
  28. },
  29. }
  30. daemon := &Daemon{}
  31. daemon.initHealthMonitor(c)
  32. if c.State.Health != nil {
  33. t.Error("Expecting Health to be nil, but was not")
  34. }
  35. }
  36. // FIXME(vdemeester) This takes around 3s… This is *way* too long
  37. func TestHealthStates(t *testing.T) {
  38. e := events.New()
  39. _, l, _ := e.Subscribe()
  40. defer e.Evict(l)
  41. expect := func(expected string) {
  42. select {
  43. case event := <-l:
  44. ev := event.(eventtypes.Message)
  45. if ev.Status != expected {
  46. t.Errorf("Expecting event %#v, but got %#v\n", expected, ev.Status)
  47. }
  48. case <-time.After(1 * time.Second):
  49. t.Errorf("Expecting event %#v, but got nothing\n", expected)
  50. }
  51. }
  52. c := &container.Container{
  53. CommonContainer: container.CommonContainer{
  54. ID: "container_id",
  55. Name: "container_name",
  56. Config: &containertypes.Config{
  57. Image: "image_name",
  58. },
  59. },
  60. }
  61. daemon := &Daemon{
  62. EventsService: e,
  63. }
  64. c.Config.Healthcheck = &containertypes.HealthConfig{
  65. Retries: 1,
  66. }
  67. reset(c)
  68. handleResult := func(startTime time.Time, exitCode int) {
  69. handleProbeResult(daemon, c, &types.HealthcheckResult{
  70. Start: startTime,
  71. End: startTime,
  72. ExitCode: exitCode,
  73. }, nil)
  74. }
  75. // starting -> failed -> success -> failed
  76. handleResult(c.State.StartedAt.Add(1*time.Second), 1)
  77. expect("health_status: unhealthy")
  78. handleResult(c.State.StartedAt.Add(2*time.Second), 0)
  79. expect("health_status: healthy")
  80. handleResult(c.State.StartedAt.Add(3*time.Second), 1)
  81. expect("health_status: unhealthy")
  82. // Test retries
  83. reset(c)
  84. c.Config.Healthcheck.Retries = 3
  85. handleResult(c.State.StartedAt.Add(20*time.Second), 1)
  86. handleResult(c.State.StartedAt.Add(40*time.Second), 1)
  87. if c.State.Health.Status != types.Starting {
  88. t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status)
  89. }
  90. if c.State.Health.FailingStreak != 2 {
  91. t.Errorf("Expecting FailingStreak=2, but got %d\n", c.State.Health.FailingStreak)
  92. }
  93. handleResult(c.State.StartedAt.Add(60*time.Second), 1)
  94. expect("health_status: unhealthy")
  95. handleResult(c.State.StartedAt.Add(80*time.Second), 0)
  96. expect("health_status: healthy")
  97. if c.State.Health.FailingStreak != 0 {
  98. t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak)
  99. }
  100. // Test start period
  101. reset(c)
  102. c.Config.Healthcheck.Retries = 2
  103. c.Config.Healthcheck.StartPeriod = 30 * time.Second
  104. handleResult(c.State.StartedAt.Add(20*time.Second), 1)
  105. if c.State.Health.Status != types.Starting {
  106. t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status)
  107. }
  108. if c.State.Health.FailingStreak != 0 {
  109. t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak)
  110. }
  111. handleResult(c.State.StartedAt.Add(50*time.Second), 1)
  112. if c.State.Health.Status != types.Starting {
  113. t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status)
  114. }
  115. if c.State.Health.FailingStreak != 1 {
  116. t.Errorf("Expecting FailingStreak=1, but got %d\n", c.State.Health.FailingStreak)
  117. }
  118. handleResult(c.State.StartedAt.Add(80*time.Second), 0)
  119. expect("health_status: healthy")
  120. if c.State.Health.FailingStreak != 0 {
  121. t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak)
  122. }
  123. }