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