github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/daemon/cluster/executor/container/health_test.go (about) 1 // +build !windows 2 3 package container 4 5 import ( 6 "testing" 7 "time" 8 9 containertypes "github.com/docker/docker/api/types/container" 10 "github.com/docker/docker/container" 11 "github.com/docker/docker/daemon" 12 "github.com/docker/docker/daemon/events" 13 "github.com/docker/swarmkit/api" 14 "golang.org/x/net/context" 15 ) 16 17 func TestHealthStates(t *testing.T) { 18 19 // set up environment: events, task, container .... 20 e := events.New() 21 _, l, _ := e.Subscribe() 22 defer e.Evict(l) 23 24 task := &api.Task{ 25 ID: "id", 26 ServiceID: "sid", 27 Spec: api.TaskSpec{ 28 Runtime: &api.TaskSpec_Container{ 29 Container: &api.ContainerSpec{ 30 Image: "image_name", 31 Labels: map[string]string{ 32 "com.docker.swarm.task.id": "id", 33 }, 34 }, 35 }, 36 }, 37 Annotations: api.Annotations{Name: "name"}, 38 } 39 40 c := &container.Container{ 41 CommonContainer: container.CommonContainer{ 42 ID: "id", 43 Name: "name", 44 Config: &containertypes.Config{ 45 Image: "image_name", 46 Labels: map[string]string{ 47 "com.docker.swarm.task.id": "id", 48 }, 49 }, 50 }, 51 } 52 53 daemon := &daemon.Daemon{ 54 EventsService: e, 55 } 56 57 controller, err := newController(daemon, task) 58 if err != nil { 59 t.Fatalf("create controller fail %v", err) 60 } 61 62 errChan := make(chan error, 1) 63 ctx, cancel := context.WithCancel(context.Background()) 64 defer cancel() 65 66 // fire checkHealth 67 go func() { 68 err := controller.checkHealth(ctx) 69 select { 70 case errChan <- err: 71 case <-ctx.Done(): 72 } 73 }() 74 75 // send an event and expect to get expectedErr 76 // if expectedErr is nil, shouldn't get any error 77 logAndExpect := func(msg string, expectedErr error) { 78 daemon.LogContainerEvent(c, msg) 79 80 timer := time.NewTimer(1 * time.Second) 81 defer timer.Stop() 82 83 select { 84 case err := <-errChan: 85 if err != expectedErr { 86 t.Fatalf("expect error %v, but get %v", expectedErr, err) 87 } 88 case <-timer.C: 89 if expectedErr != nil { 90 t.Fatalf("time limit exceeded, didn't get expected error") 91 } 92 } 93 } 94 95 // events that are ignored by checkHealth 96 logAndExpect("health_status: running", nil) 97 logAndExpect("health_status: healthy", nil) 98 logAndExpect("die", nil) 99 100 // unhealthy event will be caught by checkHealth 101 logAndExpect("health_status: unhealthy", ErrContainerUnhealthy) 102 }