package daemon // import "github.com/docker/docker/daemon" import ( "testing" "time" containertypes "github.com/docker/docker/api/types/container" eventtypes "github.com/docker/docker/api/types/events" "github.com/docker/docker/container" "github.com/docker/docker/daemon/events" ) func TestLogContainerEventCopyLabels(t *testing.T) { e := events.New() _, l, _ := e.Subscribe() defer e.Evict(l) ctr := &container.Container{ ID: "container_id", Name: "container_name", Config: &containertypes.Config{ Image: "image_name", Labels: map[string]string{ "node": "1", "os": "alpine", }, }, } daemon := &Daemon{ EventsService: e, } daemon.LogContainerEvent(ctr, eventtypes.ActionCreate) if _, mutated := ctr.Config.Labels["image"]; mutated { t.Fatalf("Expected to not mutate the container labels, got %q", ctr.Config.Labels) } validateTestAttributes(t, l, map[string]string{ "node": "1", "os": "alpine", }) } func TestLogContainerEventWithAttributes(t *testing.T) { e := events.New() _, l, _ := e.Subscribe() defer e.Evict(l) ctr := &container.Container{ ID: "container_id", Name: "container_name", Config: &containertypes.Config{ Labels: map[string]string{ "node": "1", "os": "alpine", }, }, } daemon := &Daemon{ EventsService: e, } daemon.LogContainerEventWithAttributes(ctr, eventtypes.ActionCreate, map[string]string{ "node": "2", "foo": "bar", }) validateTestAttributes(t, l, map[string]string{ "node": "1", "foo": "bar", }) } func validateTestAttributes(t *testing.T, l chan interface{}, expectedAttributesToTest map[string]string) { select { case ev := <-l: event, ok := ev.(eventtypes.Message) if !ok { t.Fatalf("Unexpected event message: %q", ev) } for key, expected := range expectedAttributesToTest { actual, ok := event.Actor.Attributes[key] if !ok || actual != expected { t.Fatalf("Expected value for key %s to be %s, but was %s (event:%v)", key, expected, actual, event) } } case <-time.After(10 * time.Second): t.Fatal("LogEvent test timed out") } }