Browse Source

Fix TestEventsImageImport racy, fixes #12499

Signed-off-by: Antonio Murdaca <me@runcom.ninja>
Antonio Murdaca 10 years ago
parent
commit
eeb8ceb9ed
1 changed files with 32 additions and 11 deletions
  1. 32 11
      integration-cli/docker_cli_events_test.go

+ 32 - 11
integration-cli/docker_cli_events_test.go

@@ -204,6 +204,31 @@ func (s *DockerSuite) TestEventsImagePull(c *check.C) {
 func (s *DockerSuite) TestEventsImageImport(c *check.C) {
 	since := daemonTime(c).Unix()
 
+	id := make(chan string)
+	eventImport := make(chan struct{})
+	eventsCmd := exec.Command(dockerBinary, "events", "--since", strconv.FormatInt(since, 10))
+	stdout, err := eventsCmd.StdoutPipe()
+	if err != nil {
+		c.Fatal(err)
+	}
+	err = eventsCmd.Start()
+	if err != nil {
+		c.Fatal(err)
+	}
+	defer eventsCmd.Process.Kill()
+
+	go func() {
+		containerID := <-id
+
+		matchImport := regexp.MustCompile(containerID + `: import$`)
+		scanner := bufio.NewScanner(stdout)
+		for scanner.Scan() {
+			if matchImport.MatchString(scanner.Text()) {
+				close(eventImport)
+			}
+		}
+	}()
+
 	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
 	out, _, err := runCommandWithOutput(runCmd)
 	if err != nil {
@@ -218,19 +243,15 @@ func (s *DockerSuite) TestEventsImageImport(c *check.C) {
 	if err != nil {
 		c.Errorf("import failed with errors: %v, output: %q", err, out)
 	}
+	newContainerID := strings.TrimSpace(out)
+	id <- newContainerID
 
-	eventsCmd := exec.Command(dockerBinary, "events",
-		fmt.Sprintf("--since=%d", since),
-		fmt.Sprintf("--until=%d", daemonTime(c).Unix()))
-	out, _, _ = runCommandWithOutput(eventsCmd)
-
-	events := strings.Split(strings.TrimSpace(out), "\n")
-	event := strings.TrimSpace(events[len(events)-1])
-
-	if !strings.HasSuffix(event, ": import") {
-		c.Fatalf("Missing import event - got:%q", event)
+	select {
+	case <-time.After(5 * time.Second):
+		c.Fatal("failed to observe image import in timely fashion")
+	case <-eventImport:
+		// ignore, done
 	}
-
 }
 
 func (s *DockerSuite) TestEventsFilters(c *check.C) {