//go:build linux // +build linux package quota // import "github.com/docker/docker/quota" import ( "io" "io/ioutil" "os" "path/filepath" "testing" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) // 10MB const testQuotaSize = 10 * 1024 * 1024 func TestBlockDev(t *testing.T) { if msg, ok := CanTestQuota(); !ok { t.Skip(msg) } // get sparse xfs test image imageFileName, err := PrepareQuotaTestImage(t) if err != nil { t.Fatal(err) } defer os.Remove(imageFileName) t.Run("testBlockDevQuotaDisabled", WrapMountTest(imageFileName, false, testBlockDevQuotaDisabled)) t.Run("testBlockDevQuotaEnabled", WrapMountTest(imageFileName, true, testBlockDevQuotaEnabled)) t.Run("testSmallerThanQuota", WrapMountTest(imageFileName, true, WrapQuotaTest(testSmallerThanQuota))) t.Run("testBiggerThanQuota", WrapMountTest(imageFileName, true, WrapQuotaTest(testBiggerThanQuota))) t.Run("testRetrieveQuota", WrapMountTest(imageFileName, true, WrapQuotaTest(testRetrieveQuota))) } func testBlockDevQuotaDisabled(t *testing.T, mountPoint, backingFsDev, testDir string) { hasSupport, err := hasQuotaSupport(backingFsDev) assert.NilError(t, err) assert.Check(t, !hasSupport) } func testBlockDevQuotaEnabled(t *testing.T, mountPoint, backingFsDev, testDir string) { hasSupport, err := hasQuotaSupport(backingFsDev) assert.NilError(t, err) assert.Check(t, hasSupport) } func testSmallerThanQuota(t *testing.T, ctrl *Control, homeDir, testDir, testSubDir string) { assert.NilError(t, ctrl.SetQuota(testSubDir, Quota{testQuotaSize})) smallerThanQuotaFile := filepath.Join(testSubDir, "smaller-than-quota") assert.NilError(t, ioutil.WriteFile(smallerThanQuotaFile, make([]byte, testQuotaSize/2), 0644)) assert.NilError(t, os.Remove(smallerThanQuotaFile)) } func testBiggerThanQuota(t *testing.T, ctrl *Control, homeDir, testDir, testSubDir string) { // Make sure the quota is being enforced // TODO: When we implement this under EXT4, we need to shed CAP_SYS_RESOURCE, otherwise // we're able to violate quota without issue assert.NilError(t, ctrl.SetQuota(testSubDir, Quota{testQuotaSize})) biggerThanQuotaFile := filepath.Join(testSubDir, "bigger-than-quota") err := ioutil.WriteFile(biggerThanQuotaFile, make([]byte, testQuotaSize+1), 0644) assert.Assert(t, is.ErrorContains(err, "")) if err == io.ErrShortWrite { assert.NilError(t, os.Remove(biggerThanQuotaFile)) } } func testRetrieveQuota(t *testing.T, ctrl *Control, homeDir, testDir, testSubDir string) { // Validate that we can retrieve quota assert.NilError(t, ctrl.SetQuota(testSubDir, Quota{testQuotaSize})) var q Quota assert.NilError(t, ctrl.GetQuota(testSubDir, &q)) assert.Check(t, is.Equal(uint64(testQuotaSize), q.Size)) }