health_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // +build !windows
  2. package container
  3. import (
  4. "testing"
  5. "time"
  6. "github.com/docker/docker/container"
  7. "github.com/docker/docker/daemon"
  8. "github.com/docker/docker/daemon/events"
  9. containertypes "github.com/docker/engine-api/types/container"
  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. CommonContainer: container.CommonContainer{
  35. ID: "id",
  36. Name: "name",
  37. Config: &containertypes.Config{
  38. Image: "image_name",
  39. Labels: map[string]string{
  40. "com.docker.swarm.task.id": "id",
  41. },
  42. },
  43. },
  44. }
  45. daemon := &daemon.Daemon{
  46. EventsService: e,
  47. }
  48. controller, err := newController(daemon, task)
  49. if err != nil {
  50. t.Fatalf("create controller fail %v", err)
  51. }
  52. errChan := make(chan error, 1)
  53. ctx, cancel := context.WithCancel(context.Background())
  54. defer cancel()
  55. // fire checkHealth
  56. go func() {
  57. err := controller.checkHealth(ctx)
  58. select {
  59. case errChan <- err:
  60. case <-ctx.Done():
  61. }
  62. }()
  63. // send an event and expect to get expectedErr
  64. // if expectedErr is nil, shouldn't get any error
  65. logAndExpect := func(msg string, expectedErr error) {
  66. daemon.LogContainerEvent(c, msg)
  67. timer := time.NewTimer(1 * time.Second)
  68. defer timer.Stop()
  69. select {
  70. case err := <-errChan:
  71. if err != expectedErr {
  72. t.Fatalf("expect error %v, but get %v", expectedErr, err)
  73. }
  74. case <-timer.C:
  75. if expectedErr != nil {
  76. t.Fatalf("time limit exceeded, didn't get expected error")
  77. }
  78. }
  79. }
  80. // events that are ignored by checkHealth
  81. logAndExpect("health_status: running", nil)
  82. logAndExpect("health_status: healthy", nil)
  83. logAndExpect("die", nil)
  84. // unhealthy event will be caught by checkHealth
  85. logAndExpect("health_status: unhealthy", ErrContainerUnhealthy)
  86. }