Przeglądaj źródła

Merge pull request #10250 from crosbymichael/stats-test

Improve robustness of /stats api test
Alexander Morozov 10 lat temu
rodzic
commit
4aa60a902a
1 zmienionych plików z 31 dodań i 13 usunięć
  1. 31 13
      integration-cli/docker_api_containers_test.go

+ 31 - 13
integration-cli/docker_api_containers_test.go

@@ -256,28 +256,46 @@ func TestVolumesFromHasPriority(t *testing.T) {
 
 func TestGetContainerStats(t *testing.T) {
 	defer deleteAllContainers()
-	name := "statscontainer"
-
-	runCmd := exec.Command(dockerBinary, "run", "-d", "--name", name, "busybox", "top")
+	var (
+		name   = "statscontainer"
+		runCmd = exec.Command(dockerBinary, "run", "-d", "--name", name, "busybox", "top")
+	)
 	out, _, err := runCommandWithOutput(runCmd)
 	if err != nil {
 		t.Fatalf("Error on container creation: %v, output: %q", err, out)
 	}
+	type b struct {
+		body []byte
+		err  error
+	}
+	bc := make(chan b, 1)
 	go func() {
-		time.Sleep(4 * time.Second)
-		runCommand(exec.Command(dockerBinary, "kill", name))
-		runCommand(exec.Command(dockerBinary, "rm", name))
+		body, err := sockRequest("GET", "/containers/"+name+"/stats", nil)
+		bc <- b{body, err}
 	}()
 
-	body, err := sockRequest("GET", "/containers/"+name+"/stats", nil)
-	if err != nil {
-		t.Fatalf("GET containers/stats sockRequest failed: %v", err)
+	// allow some time to stream the stats from the container
+	time.Sleep(4 * time.Second)
+	if _, err := runCommand(exec.Command(dockerBinary, "rm", "-f", name)); err != nil {
+		t.Fatal(err)
 	}
 
-	dec := json.NewDecoder(bytes.NewBuffer(body))
-	var s *stats.Stats
-	if err := dec.Decode(&s); err != nil {
-		t.Fatal(err)
+	// collect the results from the stats stream or timeout and fail
+	// if the stream was not disconnected.
+	select {
+	case <-time.After(2 * time.Second):
+		t.Fatal("stream was not closed after container was removed")
+	case sr := <-bc:
+		if sr.err != nil {
+			t.Fatal(err)
+		}
+
+		dec := json.NewDecoder(bytes.NewBuffer(sr.body))
+		var s *stats.Stats
+		// decode only one object from the stream
+		if err := dec.Decode(&s); err != nil {
+			t.Fatal(err)
+		}
 	}
 	logDone("container REST API - check GET containers/stats")
 }