From ce9e2d800a1c3789276b999bc9257b2a4ec317d8 Mon Sep 17 00:00:00 2001
From: Brian Goff <cpuguy83@gmail.com>
Date: Tue, 19 Apr 2016 17:16:18 -0400
Subject: [PATCH] Containerize `TestDaemonNoSpaceLeftOnDeviceError`

Why? Because the `mount` here will sometimes fail when run in
`debian:jessie`, which is what the environrment hosting the test suite
is running if run from the `Makefile`.
Also, why the heck not containerize it, all the things.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
(cherry picked from commit 59b83d8aae106cdc4042c29c900069fc804b2b68)
---
 integration-cli/docker_cli_daemon_test.go | 36 +++++++++++------------
 1 file changed, 17 insertions(+), 19 deletions(-)

diff --git a/integration-cli/docker_cli_daemon_test.go b/integration-cli/docker_cli_daemon_test.go
index 661fbc4ca5..348653bf45 100644
--- a/integration-cli/docker_cli_daemon_test.go
+++ b/integration-cli/docker_cli_daemon_test.go
@@ -21,6 +21,7 @@ import (
 	"time"
 
 	"github.com/docker/docker/pkg/integration/checker"
+	"github.com/docker/docker/pkg/mount"
 	"github.com/docker/go-units"
 	"github.com/docker/libnetwork/iptables"
 	"github.com/docker/libtrust"
@@ -1849,31 +1850,28 @@ func (s *DockerDaemonSuite) TestBridgeIPIsExcludedFromAllocatorPool(c *check.C)
 }
 
 // Test daemon for no space left on device error
-func (s *DockerDaemonSuite) TestDaemonNoSpaceleftOnDeviceError(c *check.C) {
+func (s *DockerDaemonSuite) TestDaemonNoSpaceLeftOnDeviceError(c *check.C) {
 	testRequires(c, SameHostDaemon, DaemonIsLinux, Network)
 
+	testDir, err := ioutil.TempDir("", "no-space-left-on-device-test")
+	c.Assert(err, checker.IsNil)
+	defer os.RemoveAll(testDir)
+	c.Assert(mount.MakeRShared(testDir), checker.IsNil)
+	defer mount.Unmount(testDir)
+	defer mount.Unmount(filepath.Join(testDir, "test-mount"))
+
 	// create a 2MiB image and mount it as graph root
-	cmd := exec.Command("dd", "of=/tmp/testfs.img", "bs=1M", "seek=2", "count=0")
-	if err := cmd.Run(); err != nil {
-		c.Fatalf("dd failed: %v", err)
-	}
-	cmd = exec.Command("mkfs.ext4", "-F", "/tmp/testfs.img")
-	if err := cmd.Run(); err != nil {
-		c.Fatalf("mkfs.ext4 failed: %v", err)
-	}
-	cmd = exec.Command("mkdir", "-p", "/tmp/testfs-mount")
-	if err := cmd.Run(); err != nil {
-		c.Fatalf("mkdir failed: %v", err)
-	}
-	cmd = exec.Command("mount", "-t", "ext4", "-no", "loop,rw", "/tmp/testfs.img", "/tmp/testfs-mount")
-	if err := cmd.Run(); err != nil {
-		c.Fatalf("mount failed: %v", err)
-	}
-	err := s.d.Start("--graph", "/tmp/testfs-mount")
+	// Why in a container? Because `mount` sometimes behaves weirdly and often fails outright on this test in debian:jessie (which is what the test suite runs under if run from the Makefile)
+	dockerCmd(c, "run", "--rm", "-v", testDir+":/test", "busybox", "sh", "-c", "dd of=/test/testfs.img bs=1M seek=2 count=0")
+	out, _, err := runCommandWithOutput(exec.Command("mkfs.ext4", "-F", filepath.Join(testDir, "testfs.img"))) // `mkfs.ext4` is not in busybox
+	c.Assert(err, checker.IsNil, check.Commentf(out))
+	dockerCmd(c, "run", "--privileged", "--rm", "-v", testDir+":/test:shared", "busybox", "sh", "-c", "mkdir -p /test/test-mount && mount -t ext4 -no loop,rw /test/testfs.img /test/test-mount")
+
+	err = s.d.Start("--graph", filepath.Join(testDir, "test-mount"))
 	c.Assert(err, check.IsNil)
 
 	// pull a repository large enough to fill the mount point
-	out, err := s.d.Cmd("pull", "registry:2")
+	out, err = s.d.Cmd("pull", "registry:2")
 	c.Assert(out, checker.Contains, "no space left on device")
 }