123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- //go:build linux
- package vfs // import "github.com/docker/docker/daemon/graphdriver/vfs"
- import (
- "archive/tar"
- "bytes"
- "errors"
- "io"
- "os"
- "path/filepath"
- "syscall"
- "testing"
- "github.com/moby/sys/mount"
- "gotest.tools/v3/assert"
- "github.com/docker/docker/daemon/graphdriver"
- "github.com/docker/docker/daemon/graphdriver/graphtest"
- )
- // This avoids creating a new driver for each test if all tests are run
- // Make sure to put new tests between TestVfsSetup and TestVfsTeardown
- func TestVfsSetup(t *testing.T) {
- graphtest.GetDriver(t, "vfs")
- }
- func TestVfsCreateEmpty(t *testing.T) {
- graphtest.DriverTestCreateEmpty(t, "vfs")
- }
- func TestVfsCreateBase(t *testing.T) {
- graphtest.DriverTestCreateBase(t, "vfs")
- }
- func TestVfsCreateSnap(t *testing.T) {
- graphtest.DriverTestCreateSnap(t, "vfs")
- }
- func TestVfsSetQuota(t *testing.T) {
- graphtest.DriverTestSetQuota(t, "vfs", false)
- }
- func TestVfsTeardown(t *testing.T) {
- graphtest.PutDriver(t)
- }
- func TestXattrUnsupportedByBackingFS(t *testing.T) {
- rootdir := t.TempDir()
- // The ramfs filesystem is unconditionally compiled into the kernel,
- // and does not support extended attributes.
- err := mount.Mount("ramfs", rootdir, "ramfs", "")
- if errors.Is(err, syscall.EPERM) {
- t.Skip("test requires the ability to mount a filesystem")
- }
- assert.NilError(t, err)
- defer mount.Unmount(rootdir)
- var buf bytes.Buffer
- tw := tar.NewWriter(&buf)
- const (
- filename = "test.txt"
- content = "hello world\n"
- )
- assert.NilError(t, tw.WriteHeader(&tar.Header{
- Name: filename,
- Mode: 0o644,
- Size: int64(len(content)),
- PAXRecords: map[string]string{
- "SCHILY.xattr.user.test": "helloxattr",
- },
- }))
- _, err = io.WriteString(tw, content)
- assert.NilError(t, err)
- assert.NilError(t, tw.Close())
- testlayer := buf.Bytes()
- for _, tt := range []struct {
- name string
- opts []string
- expectErrIs error
- }{
- {
- name: "Default",
- expectErrIs: syscall.EOPNOTSUPP,
- },
- {
- name: "vfs.xattrs=i_want_broken_containers",
- opts: []string{"vfs.xattrs=i_want_broken_containers"},
- },
- } {
- t.Run(tt.name, func(t *testing.T) {
- subdir := filepath.Join(rootdir, tt.name)
- assert.NilError(t, os.Mkdir(subdir, 0o755))
- d, err := graphdriver.GetDriver("vfs", nil,
- graphdriver.Options{DriverOptions: tt.opts, Root: subdir})
- assert.NilError(t, err)
- defer d.Cleanup()
- assert.NilError(t, d.Create("test", "", nil))
- _, err = d.ApplyDiff("test", "", bytes.NewReader(testlayer))
- assert.ErrorIs(t, err, tt.expectErrIs)
- if err == nil {
- path, err := d.Get("test", "")
- assert.NilError(t, err)
- defer d.Put("test")
- actual, err := os.ReadFile(filepath.Join(path, filename))
- assert.NilError(t, err)
- assert.Equal(t, string(actual), content)
- }
- })
- }
- }
|