github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/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.Error("Expecting Health to be nil, but was not") 39 } 40 } 41 42 // FIXME(vdemeester) This takes around 3s… This is *way* too long 43 func TestHealthStates(t *testing.T) { 44 e := events.New() 45 _, l, _ := e.Subscribe() 46 defer e.Evict(l) 47 48 expect := func(expected string) { 49 select { 50 case event := <-l: 51 ev := event.(eventtypes.Message) 52 if ev.Status != expected { 53 t.Errorf("Expecting event %#v, but got %#v\n", expected, ev.Status) 54 } 55 case <-time.After(1 * time.Second): 56 t.Errorf("Expecting event %#v, but got nothing\n", expected) 57 } 58 } 59 60 c := &container.Container{ 61 CommonContainer: container.CommonContainer{ 62 ID: "container_id", 63 Name: "container_name", 64 Config: &containertypes.Config{ 65 Image: "image_name", 66 }, 67 }, 68 } 69 daemon := &Daemon{ 70 EventsService: e, 71 } 72 73 c.Config.Healthcheck = &containertypes.HealthConfig{ 74 Retries: 1, 75 } 76 77 reset(c) 78 79 handleResult := func(startTime time.Time, exitCode int) { 80 handleProbeResult(daemon, c, &types.HealthcheckResult{ 81 Start: startTime, 82 End: startTime, 83 ExitCode: exitCode, 84 }, nil) 85 } 86 87 // starting -> failed -> success -> failed 88 89 handleResult(c.State.StartedAt.Add(1*time.Second), 1) 90 expect("health_status: unhealthy") 91 92 handleResult(c.State.StartedAt.Add(2*time.Second), 0) 93 expect("health_status: healthy") 94 95 handleResult(c.State.StartedAt.Add(3*time.Second), 1) 96 expect("health_status: unhealthy") 97 98 // Test retries 99 100 reset(c) 101 c.Config.Healthcheck.Retries = 3 102 103 handleResult(c.State.StartedAt.Add(20*time.Second), 1) 104 handleResult(c.State.StartedAt.Add(40*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 != 2 { 109 t.Errorf("Expecting FailingStreak=2, but got %d\n", c.State.Health.FailingStreak) 110 } 111 handleResult(c.State.StartedAt.Add(60*time.Second), 1) 112 expect("health_status: unhealthy") 113 114 handleResult(c.State.StartedAt.Add(80*time.Second), 0) 115 expect("health_status: healthy") 116 if c.State.Health.FailingStreak != 0 { 117 t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak) 118 } 119 120 // Test start period 121 122 reset(c) 123 c.Config.Healthcheck.Retries = 2 124 c.Config.Healthcheck.StartPeriod = 30 * time.Second 125 126 handleResult(c.State.StartedAt.Add(20*time.Second), 1) 127 if c.State.Health.Status != types.Starting { 128 t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status) 129 } 130 if c.State.Health.FailingStreak != 0 { 131 t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak) 132 } 133 handleResult(c.State.StartedAt.Add(50*time.Second), 1) 134 if c.State.Health.Status != types.Starting { 135 t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status) 136 } 137 if c.State.Health.FailingStreak != 1 { 138 t.Errorf("Expecting FailingStreak=1, but got %d\n", c.State.Health.FailingStreak) 139 } 140 handleResult(c.State.StartedAt.Add(80*time.Second), 0) 141 expect("health_status: healthy") 142 if c.State.Health.FailingStreak != 0 { 143 t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak) 144 } 145 }