github.com/kinvolk/docker@v1.13.1/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.Errorf("Expecting Health to be nil, but was not")
    39  	}
    40  }
    41  
    42  func TestHealthStates(t *testing.T) {
    43  	e := events.New()
    44  	_, l, _ := e.Subscribe()
    45  	defer e.Evict(l)
    46  
    47  	expect := func(expected string) {
    48  		select {
    49  		case event := <-l:
    50  			ev := event.(eventtypes.Message)
    51  			if ev.Status != expected {
    52  				t.Errorf("Expecting event %#v, but got %#v\n", expected, ev.Status)
    53  			}
    54  		case <-time.After(1 * time.Second):
    55  			t.Errorf("Expecting event %#v, but got nothing\n", expected)
    56  		}
    57  	}
    58  
    59  	c := &container.Container{
    60  		CommonContainer: container.CommonContainer{
    61  			ID:   "container_id",
    62  			Name: "container_name",
    63  			Config: &containertypes.Config{
    64  				Image: "image_name",
    65  			},
    66  		},
    67  	}
    68  	daemon := &Daemon{
    69  		EventsService: e,
    70  	}
    71  
    72  	c.Config.Healthcheck = &containertypes.HealthConfig{
    73  		Retries: 1,
    74  	}
    75  
    76  	reset(c)
    77  
    78  	handleResult := func(startTime time.Time, exitCode int) {
    79  		handleProbeResult(daemon, c, &types.HealthcheckResult{
    80  			Start:    startTime,
    81  			End:      startTime,
    82  			ExitCode: exitCode,
    83  		}, nil)
    84  	}
    85  
    86  	// starting -> failed -> success -> failed
    87  
    88  	handleResult(c.State.StartedAt.Add(1*time.Second), 1)
    89  	expect("health_status: unhealthy")
    90  
    91  	handleResult(c.State.StartedAt.Add(2*time.Second), 0)
    92  	expect("health_status: healthy")
    93  
    94  	handleResult(c.State.StartedAt.Add(3*time.Second), 1)
    95  	expect("health_status: unhealthy")
    96  
    97  	// Test retries
    98  
    99  	reset(c)
   100  	c.Config.Healthcheck.Retries = 3
   101  
   102  	handleResult(c.State.StartedAt.Add(20*time.Second), 1)
   103  	handleResult(c.State.StartedAt.Add(40*time.Second), 1)
   104  	if c.State.Health.Status != types.Starting {
   105  		t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status)
   106  	}
   107  	if c.State.Health.FailingStreak != 2 {
   108  		t.Errorf("Expecting FailingStreak=2, but got %d\n", c.State.Health.FailingStreak)
   109  	}
   110  	handleResult(c.State.StartedAt.Add(60*time.Second), 1)
   111  	expect("health_status: unhealthy")
   112  
   113  	handleResult(c.State.StartedAt.Add(80*time.Second), 0)
   114  	expect("health_status: healthy")
   115  	if c.State.Health.FailingStreak != 0 {
   116  		t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak)
   117  	}
   118  }