github.com/ruphin/docker@v1.10.1/daemon/events/events_test.go (about)

     1  package events
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/docker/engine-api/types/events"
     9  )
    10  
    11  func TestEventsLog(t *testing.T) {
    12  	e := New()
    13  	_, l1, _ := e.Subscribe()
    14  	_, l2, _ := e.Subscribe()
    15  	defer e.Evict(l1)
    16  	defer e.Evict(l2)
    17  	count := e.SubscribersCount()
    18  	if count != 2 {
    19  		t.Fatalf("Must be 2 subscribers, got %d", count)
    20  	}
    21  	actor := events.Actor{
    22  		ID:         "cont",
    23  		Attributes: map[string]string{"image": "image"},
    24  	}
    25  	e.Log("test", events.ContainerEventType, actor)
    26  	select {
    27  	case msg := <-l1:
    28  		jmsg, ok := msg.(events.Message)
    29  		if !ok {
    30  			t.Fatalf("Unexpected type %T", msg)
    31  		}
    32  		if len(e.events) != 1 {
    33  			t.Fatalf("Must be only one event, got %d", len(e.events))
    34  		}
    35  		if jmsg.Status != "test" {
    36  			t.Fatalf("Status should be test, got %s", jmsg.Status)
    37  		}
    38  		if jmsg.ID != "cont" {
    39  			t.Fatalf("ID should be cont, got %s", jmsg.ID)
    40  		}
    41  		if jmsg.From != "image" {
    42  			t.Fatalf("From should be image, got %s", jmsg.From)
    43  		}
    44  	case <-time.After(1 * time.Second):
    45  		t.Fatal("Timeout waiting for broadcasted message")
    46  	}
    47  	select {
    48  	case msg := <-l2:
    49  		jmsg, ok := msg.(events.Message)
    50  		if !ok {
    51  			t.Fatalf("Unexpected type %T", msg)
    52  		}
    53  		if len(e.events) != 1 {
    54  			t.Fatalf("Must be only one event, got %d", len(e.events))
    55  		}
    56  		if jmsg.Status != "test" {
    57  			t.Fatalf("Status should be test, got %s", jmsg.Status)
    58  		}
    59  		if jmsg.ID != "cont" {
    60  			t.Fatalf("ID should be cont, got %s", jmsg.ID)
    61  		}
    62  		if jmsg.From != "image" {
    63  			t.Fatalf("From should be image, got %s", jmsg.From)
    64  		}
    65  	case <-time.After(1 * time.Second):
    66  		t.Fatal("Timeout waiting for broadcasted message")
    67  	}
    68  }
    69  
    70  func TestEventsLogTimeout(t *testing.T) {
    71  	e := New()
    72  	_, l, _ := e.Subscribe()
    73  	defer e.Evict(l)
    74  
    75  	c := make(chan struct{})
    76  	go func() {
    77  		actor := events.Actor{
    78  			ID: "image",
    79  		}
    80  		e.Log("test", events.ImageEventType, actor)
    81  		close(c)
    82  	}()
    83  
    84  	select {
    85  	case <-c:
    86  	case <-time.After(time.Second):
    87  		t.Fatal("Timeout publishing message")
    88  	}
    89  }
    90  
    91  func TestLogEvents(t *testing.T) {
    92  	e := New()
    93  
    94  	for i := 0; i < eventsLimit+16; i++ {
    95  		action := fmt.Sprintf("action_%d", i)
    96  		id := fmt.Sprintf("cont_%d", i)
    97  		from := fmt.Sprintf("image_%d", i)
    98  
    99  		actor := events.Actor{
   100  			ID:         id,
   101  			Attributes: map[string]string{"image": from},
   102  		}
   103  		e.Log(action, events.ContainerEventType, actor)
   104  	}
   105  	time.Sleep(50 * time.Millisecond)
   106  	current, l, _ := e.Subscribe()
   107  	for i := 0; i < 10; i++ {
   108  		num := i + eventsLimit + 16
   109  		action := fmt.Sprintf("action_%d", num)
   110  		id := fmt.Sprintf("cont_%d", num)
   111  		from := fmt.Sprintf("image_%d", num)
   112  
   113  		actor := events.Actor{
   114  			ID:         id,
   115  			Attributes: map[string]string{"image": from},
   116  		}
   117  		e.Log(action, events.ContainerEventType, actor)
   118  	}
   119  	if len(e.events) != eventsLimit {
   120  		t.Fatalf("Must be %d events, got %d", eventsLimit, len(e.events))
   121  	}
   122  
   123  	var msgs []events.Message
   124  	for len(msgs) < 10 {
   125  		m := <-l
   126  		jm, ok := (m).(events.Message)
   127  		if !ok {
   128  			t.Fatalf("Unexpected type %T", m)
   129  		}
   130  		msgs = append(msgs, jm)
   131  	}
   132  	if len(current) != eventsLimit {
   133  		t.Fatalf("Must be %d events, got %d", eventsLimit, len(current))
   134  	}
   135  	first := current[0]
   136  	if first.Status != "action_16" {
   137  		t.Fatalf("First action is %s, must be action_16", first.Status)
   138  	}
   139  	last := current[len(current)-1]
   140  	if last.Status != "action_79" {
   141  		t.Fatalf("Last action is %s, must be action_79", last.Status)
   142  	}
   143  
   144  	firstC := msgs[0]
   145  	if firstC.Status != "action_80" {
   146  		t.Fatalf("First action is %s, must be action_80", firstC.Status)
   147  	}
   148  	lastC := msgs[len(msgs)-1]
   149  	if lastC.Status != "action_89" {
   150  		t.Fatalf("Last action is %s, must be action_89", lastC.Status)
   151  	}
   152  }