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