github.com/olljanat/moby@v1.13.1/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, nil)
    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  }