health_test.go 2.1 KB

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