2021-08-23 09:14:53 -04:00
|
|
|
//go:build linux
|
2016-10-17 00:30:16 -04:00
|
|
|
// +build linux
|
|
|
|
|
2018-02-05 16:05:59 -05:00
|
|
|
package fsutils // import "github.com/docker/docker/pkg/fsutils"
|
2016-10-17 00:30:16 -04:00
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"testing"
|
2017-05-23 10:22:32 -04:00
|
|
|
|
|
|
|
"golang.org/x/sys/unix"
|
2016-10-17 00:30:16 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
func testSupportsDType(t *testing.T, expected bool, mkfsCommand string, mkfsArg ...string) {
|
|
|
|
// check whether mkfs is installed
|
|
|
|
if _, err := exec.LookPath(mkfsCommand); err != nil {
|
|
|
|
t.Skipf("%s not installed: %v", mkfsCommand, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// create a sparse image
|
|
|
|
imageSize := int64(32 * 1024 * 1024)
|
|
|
|
imageFile, err := ioutil.TempFile("", "fsutils-image")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
imageFileName := imageFile.Name()
|
|
|
|
defer os.Remove(imageFileName)
|
|
|
|
if _, err = imageFile.Seek(imageSize-1, 0); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if _, err = imageFile.Write([]byte{0}); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if err = imageFile.Close(); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// create a mountpoint
|
|
|
|
mountpoint, err := ioutil.TempDir("", "fsutils-mountpoint")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer os.RemoveAll(mountpoint)
|
|
|
|
|
|
|
|
// format the image
|
|
|
|
args := append(mkfsArg, imageFileName)
|
|
|
|
t.Logf("Executing `%s %v`", mkfsCommand, args)
|
|
|
|
out, err := exec.Command(mkfsCommand, args...).CombinedOutput()
|
|
|
|
if len(out) > 0 {
|
|
|
|
t.Log(string(out))
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// loopback-mount the image.
|
2017-05-23 10:22:32 -04:00
|
|
|
// for ease of setting up loopback device, we use os/exec rather than unix.Mount
|
2016-10-17 00:30:16 -04:00
|
|
|
out, err = exec.Command("mount", "-o", "loop", imageFileName, mountpoint).CombinedOutput()
|
|
|
|
if len(out) > 0 {
|
|
|
|
t.Log(string(out))
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
t.Skip("skipping the test because mount failed")
|
|
|
|
}
|
|
|
|
defer func() {
|
2017-05-23 10:22:32 -04:00
|
|
|
if err := unix.Unmount(mountpoint, 0); err != nil {
|
2016-10-17 00:30:16 -04:00
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
// check whether it supports d_type
|
|
|
|
result, err := SupportsDType(mountpoint)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
t.Logf("Supports d_type: %v", result)
|
|
|
|
if result != expected {
|
|
|
|
t.Fatalf("expected %v, got %v", expected, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSupportsDTypeWithFType0XFS(t *testing.T) {
|
|
|
|
testSupportsDType(t, false, "mkfs.xfs", "-m", "crc=0", "-n", "ftype=0")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSupportsDTypeWithFType1XFS(t *testing.T) {
|
|
|
|
testSupportsDType(t, true, "mkfs.xfs", "-m", "crc=0", "-n", "ftype=1")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSupportsDTypeWithExt4(t *testing.T) {
|
|
|
|
testSupportsDType(t, true, "mkfs.ext4")
|
|
|
|
}
|