github.com/rsampaio/docker@v0.7.2-0.20150827203920-fdc73cc3fc31/daemon/events/events_test.go (about)

     1  package events
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/docker/docker/pkg/jsonmessage"
     8  )
     9  
    10  func TestEventsLog(t *testing.T) {
    11  	e := New()
    12  	_, l1 := e.Subscribe()
    13  	_, l2 := e.Subscribe()
    14  	defer e.Evict(l1)
    15  	defer e.Evict(l2)
    16  	count := e.SubscribersCount()
    17  	if count != 2 {
    18  		t.Fatalf("Must be 2 subscribers, got %d", count)
    19  	}
    20  	e.Log("test", "cont", "image")
    21  	select {
    22  	case msg := <-l1:
    23  		jmsg, ok := msg.(*jsonmessage.JSONMessage)
    24  		if !ok {
    25  			t.Fatalf("Unexpected type %T", msg)
    26  		}
    27  		if len(e.events) != 1 {
    28  			t.Fatalf("Must be only one event, got %d", len(e.events))
    29  		}
    30  		if jmsg.Status != "test" {
    31  			t.Fatalf("Status should be test, got %s", jmsg.Status)
    32  		}
    33  		if jmsg.ID != "cont" {
    34  			t.Fatalf("ID should be cont, got %s", jmsg.ID)
    35  		}
    36  		if jmsg.From != "image" {
    37  			t.Fatalf("From should be image, got %s", jmsg.From)
    38  		}
    39  	case <-time.After(1 * time.Second):
    40  		t.Fatal("Timeout waiting for broadcasted message")
    41  	}
    42  	select {
    43  	case msg := <-l2:
    44  		jmsg, ok := msg.(*jsonmessage.JSONMessage)
    45  		if !ok {
    46  			t.Fatalf("Unexpected type %T", msg)
    47  		}
    48  		if len(e.events) != 1 {
    49  			t.Fatalf("Must be only one event, got %d", len(e.events))
    50  		}
    51  		if jmsg.Status != "test" {
    52  			t.Fatalf("Status should be test, got %s", jmsg.Status)
    53  		}
    54  		if jmsg.ID != "cont" {
    55  			t.Fatalf("ID should be cont, got %s", jmsg.ID)
    56  		}
    57  		if jmsg.From != "image" {
    58  			t.Fatalf("From should be image, got %s", jmsg.From)
    59  		}
    60  	case <-time.After(1 * time.Second):
    61  		t.Fatal("Timeout waiting for broadcasted message")
    62  	}
    63  }
    64  
    65  func TestEventsLogTimeout(t *testing.T) {
    66  	e := New()
    67  	_, l := e.Subscribe()
    68  	defer e.Evict(l)
    69  
    70  	c := make(chan struct{})
    71  	go func() {
    72  		e.Log("test", "cont", "image")
    73  		close(c)
    74  	}()
    75  
    76  	select {
    77  	case <-c:
    78  	case <-time.After(time.Second):
    79  		t.Fatal("Timeout publishing message")
    80  	}
    81  }
    82  
    83  func TestEventsCap(t *testing.T) {
    84  	e := New()
    85  	for i := 0; i < eventsLimit+1; i++ {
    86  		e.Log("action", "id", "from")
    87  	}
    88  	// let all events go through
    89  	time.Sleep(1 * time.Second)
    90  
    91  	current, l := e.Subscribe()
    92  	if len(current) != eventsLimit {
    93  		t.Fatalf("Must be %d events, got %d", eventsLimit, len(current))
    94  	}
    95  	if len(e.events) != eventsLimit {
    96  		t.Fatalf("Must be %d events, got %d", eventsLimit, len(e.events))
    97  	}
    98  
    99  	for i := 0; i < 10; i++ {
   100  		e.Log("action", "id", "from")
   101  	}
   102  	// let all events go through
   103  	time.Sleep(1 * time.Second)
   104  
   105  	var msgs []*jsonmessage.JSONMessage
   106  	for len(msgs) < 10 {
   107  		select {
   108  		case m := <-l:
   109  			jm, ok := (m).(*jsonmessage.JSONMessage)
   110  			if !ok {
   111  				t.Fatalf("Unexpected type %T", m)
   112  			}
   113  			msgs = append(msgs, jm)
   114  		default:
   115  			t.Fatalf("There is no enough events in channel")
   116  		}
   117  	}
   118  }