health_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package daemon
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/docker/docker/container"
  6. "github.com/docker/docker/daemon/events"
  7. "github.com/docker/engine-api/types"
  8. containertypes "github.com/docker/engine-api/types/container"
  9. eventtypes "github.com/docker/engine-api/types/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.Errorf("Expecting Health to be nil, but was not")
  34. }
  35. }
  36. func TestHealthStates(t *testing.T) {
  37. e := events.New()
  38. _, l, _ := e.Subscribe()
  39. defer e.Evict(l)
  40. expect := func(expected string) {
  41. select {
  42. case event := <-l:
  43. ev := event.(eventtypes.Message)
  44. if ev.Status != expected {
  45. t.Errorf("Expecting event %#v, but got %#v\n", expected, ev.Status)
  46. }
  47. case <-time.After(1 * time.Second):
  48. t.Errorf("Expecting event %#v, but got nothing\n", expected)
  49. }
  50. }
  51. c := &container.Container{
  52. CommonContainer: container.CommonContainer{
  53. ID: "container_id",
  54. Name: "container_name",
  55. Config: &containertypes.Config{
  56. Image: "image_name",
  57. },
  58. },
  59. }
  60. daemon := &Daemon{
  61. EventsService: e,
  62. }
  63. c.Config.Healthcheck = &containertypes.HealthConfig{
  64. Retries: 1,
  65. }
  66. reset(c)
  67. handleResult := func(startTime time.Time, exitCode int) {
  68. handleProbeResult(daemon, c, &types.HealthcheckResult{
  69. Start: startTime,
  70. End: startTime,
  71. ExitCode: exitCode,
  72. })
  73. }
  74. // starting -> failed -> success -> failed
  75. handleResult(c.State.StartedAt.Add(1*time.Second), 1)
  76. expect("health_status: unhealthy")
  77. handleResult(c.State.StartedAt.Add(2*time.Second), 0)
  78. expect("health_status: healthy")
  79. handleResult(c.State.StartedAt.Add(3*time.Second), 1)
  80. expect("health_status: unhealthy")
  81. // Test retries
  82. reset(c)
  83. c.Config.Healthcheck.Retries = 3
  84. handleResult(c.State.StartedAt.Add(20*time.Second), 1)
  85. handleResult(c.State.StartedAt.Add(40*time.Second), 1)
  86. if c.State.Health.Status != types.Starting {
  87. t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status)
  88. }
  89. if c.State.Health.FailingStreak != 2 {
  90. t.Errorf("Expecting FailingStreak=2, but got %d\n", c.State.Health.FailingStreak)
  91. }
  92. handleResult(c.State.StartedAt.Add(60*time.Second), 1)
  93. expect("health_status: unhealthy")
  94. handleResult(c.State.StartedAt.Add(80*time.Second), 0)
  95. expect("health_status: healthy")
  96. if c.State.Health.FailingStreak != 0 {
  97. t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak)
  98. }
  99. }