github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/integration/system/event_test.go (about)

     1  package system // import "github.com/docker/docker/integration/system"
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"io"
     7  	"net/http"
     8  	"net/url"
     9  	"strconv"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/docker/docker/api/types"
    14  	"github.com/docker/docker/api/types/filters"
    15  	"github.com/docker/docker/api/types/strslice"
    16  	req "github.com/docker/docker/integration-cli/request"
    17  	"github.com/docker/docker/integration/internal/container"
    18  	"github.com/docker/docker/integration/internal/request"
    19  	"github.com/docker/docker/pkg/jsonmessage"
    20  	"github.com/gotestyourself/gotestyourself/assert"
    21  	is "github.com/gotestyourself/gotestyourself/assert/cmp"
    22  )
    23  
    24  func TestEvents(t *testing.T) {
    25  	defer setupTest(t)()
    26  	ctx := context.Background()
    27  	client := request.NewAPIClient(t)
    28  
    29  	cID := container.Run(t, ctx, client)
    30  
    31  	id, err := client.ContainerExecCreate(ctx, cID,
    32  		types.ExecConfig{
    33  			Cmd: strslice.StrSlice([]string{"echo", "hello"}),
    34  		},
    35  	)
    36  	assert.NilError(t, err)
    37  
    38  	filters := filters.NewArgs(
    39  		filters.Arg("container", cID),
    40  		filters.Arg("event", "exec_die"),
    41  	)
    42  	msg, errors := client.Events(ctx, types.EventsOptions{
    43  		Filters: filters,
    44  	})
    45  
    46  	err = client.ContainerExecStart(ctx, id.ID,
    47  		types.ExecStartCheck{
    48  			Detach: true,
    49  			Tty:    false,
    50  		},
    51  	)
    52  	assert.NilError(t, err)
    53  
    54  	select {
    55  	case m := <-msg:
    56  		assert.Equal(t, m.Type, "container")
    57  		assert.Equal(t, m.Actor.ID, cID)
    58  		assert.Equal(t, m.Action, "exec_die")
    59  		assert.Equal(t, m.Actor.Attributes["execID"], id.ID)
    60  		assert.Equal(t, m.Actor.Attributes["exitCode"], "0")
    61  	case err = <-errors:
    62  		t.Fatal(err)
    63  	case <-time.After(time.Second * 3):
    64  		t.Fatal("timeout hit")
    65  	}
    66  
    67  }
    68  
    69  // Test case for #18888: Events messages have been switched from generic
    70  // `JSONMessage` to `events.Message` types. The switch does not break the
    71  // backward compatibility so old `JSONMessage` could still be used.
    72  // This test verifies that backward compatibility maintains.
    73  func TestEventsBackwardsCompatible(t *testing.T) {
    74  	defer setupTest(t)()
    75  	ctx := context.Background()
    76  	client := request.NewAPIClient(t)
    77  
    78  	since := request.DaemonTime(ctx, t, client, testEnv)
    79  	ts := strconv.FormatInt(since.Unix(), 10)
    80  
    81  	cID := container.Create(t, ctx, client)
    82  
    83  	// In case there is no events, the API should have responded immediately (not blocking),
    84  	// The test here makes sure the response time is less than 3 sec.
    85  	expectedTime := time.Now().Add(3 * time.Second)
    86  	emptyResp, emptyBody, err := req.Get("/events")
    87  	assert.NilError(t, err)
    88  	defer emptyBody.Close()
    89  	assert.Check(t, is.DeepEqual(http.StatusOK, emptyResp.StatusCode))
    90  	assert.Check(t, time.Now().Before(expectedTime), "timeout waiting for events api to respond, should have responded immediately")
    91  
    92  	// We also test to make sure the `events.Message` is compatible with `JSONMessage`
    93  	q := url.Values{}
    94  	q.Set("since", ts)
    95  	_, body, err := req.Get("/events?" + q.Encode())
    96  	assert.NilError(t, err)
    97  	defer body.Close()
    98  
    99  	dec := json.NewDecoder(body)
   100  	var containerCreateEvent *jsonmessage.JSONMessage
   101  	for {
   102  		var event jsonmessage.JSONMessage
   103  		if err := dec.Decode(&event); err != nil {
   104  			if err == io.EOF {
   105  				break
   106  			}
   107  			t.Fatal(err)
   108  		}
   109  		if event.Status == "create" && event.ID == cID {
   110  			containerCreateEvent = &event
   111  			break
   112  		}
   113  	}
   114  
   115  	assert.Check(t, containerCreateEvent != nil)
   116  	assert.Check(t, is.Equal("create", containerCreateEvent.Status))
   117  	assert.Check(t, is.Equal(cID, containerCreateEvent.ID))
   118  	assert.Check(t, is.Equal("busybox", containerCreateEvent.From))
   119  }