Skip to content

Commit 349021a

Browse files
committed
chore: seperate test cant using race
1 parent 8bec674 commit 349021a

2 files changed

Lines changed: 133 additions & 124 deletions

File tree

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
//go:build !race
2+
3+
package btrfs
4+
5+
import (
6+
"bytes"
7+
"fmt"
8+
"os"
9+
"os/exec"
10+
"path"
11+
"strings"
12+
"testing"
13+
)
14+
15+
// dependencies: btrfs-progs, libbtrfs-dev
16+
// permission: root, loop device
17+
func TestSubVolDelete(t *testing.T) {
18+
if os.Getuid() != 0 {
19+
t.Skip("test requires root")
20+
}
21+
22+
// Helpers
23+
runCmd := func(name string, arg ...string) error {
24+
cmd := exec.Command(name, arg...)
25+
var stderr bytes.Buffer
26+
cmd.Stderr = &stderr
27+
if err := cmd.Run(); err != nil {
28+
return fmt.Errorf("command '%s %s' failed: %v, stderr: %s", name, strings.Join(arg, " "), err, stderr.String())
29+
}
30+
return nil
31+
}
32+
qgroupShow := func(mountPath string) string {
33+
cmd := exec.Command("btrfs", "qgroup", "show", mountPath)
34+
var out bytes.Buffer
35+
cmd.Stdout = &out
36+
cmd.Run()
37+
return out.String()
38+
}
39+
40+
// parepare btrfs using loop device
41+
baseDir, err := os.MkdirTemp("/mnt", "btrfs-test-")
42+
if err != nil {
43+
t.Fatalf("Failed to create base temp dir: %v", err)
44+
}
45+
defer os.RemoveAll(baseDir)
46+
47+
mnt := path.Join(baseDir, "mountpoint")
48+
if err := os.Mkdir(mnt, 0o755); err != nil {
49+
t.Fatalf("Failed to create mountpoint dir: %v", err)
50+
}
51+
52+
blockFile := path.Join(baseDir, "btrfs.img")
53+
if err := runCmd("dd", "if=/dev/zero", "of="+blockFile, "bs=1M", "count=120", "status=none"); err != nil {
54+
t.Skipf("Failed to create block file: %v", err)
55+
}
56+
57+
if err := runCmd("mkfs.btrfs", "-f", blockFile); err != nil {
58+
t.Skipf("Failed to format to btrfs: %v", err)
59+
}
60+
61+
findLoopCmd := exec.Command("losetup", "-f")
62+
var loopDevBytes bytes.Buffer
63+
findLoopCmd.Stdout = &loopDevBytes
64+
if err := findLoopCmd.Run(); err != nil {
65+
t.Skipf("Failed to find a loop device with 'losetup -f': %v", err)
66+
}
67+
loopDev := strings.TrimSpace(loopDevBytes.String())
68+
if loopDev == "" {
69+
t.Skip("No available loop devices found")
70+
}
71+
72+
if err := runCmd("losetup", loopDev, blockFile); err != nil {
73+
t.Skipf("Failed to setup loop device with 'losetup %s %s': %v", loopDev, blockFile, err)
74+
}
75+
defer runCmd("losetup", "-d", loopDev)
76+
77+
if err := runCmd("mount", loopDev, mnt); err != nil {
78+
t.Skipf("Failed to mount loop device %s: %v", loopDev, err)
79+
}
80+
defer runCmd("umount", mnt)
81+
82+
d := &Driver{home: mnt}
83+
if err := d.enableQuota(); err != nil {
84+
t.Skipf("Failed to enable qgroup using API: %v", err)
85+
}
86+
87+
t.Run("subVolDelete", func(t *testing.T) {
88+
subvolName := "subvol1"
89+
subvolPath := path.Join(mnt, subvolName)
90+
if err := subvolCreate(mnt, subvolName); err != nil {
91+
t.Fatalf("Failed to create subvolume using API: %v", err)
92+
}
93+
94+
if err := d.subvolRescanQuota(); err != nil {
95+
t.Fatalf("Failed to rescan quota using API: %v", err)
96+
}
97+
98+
qtreeid, err := subvolLookupQgroup(subvolPath)
99+
if err != nil {
100+
t.Fatalf("Failed to lookup qgroup for subvolume using API: %v", err)
101+
}
102+
qgroupID := fmt.Sprintf("0/%d", qtreeid)
103+
t.Logf("subvolume %s has qgroup ID %s", subvolPath, qgroupID)
104+
105+
if !strings.Contains(qgroupShow(mnt), qgroupID) {
106+
t.Fatalf("qgroup %s was not created for subvolume %s", qgroupID, subvolPath)
107+
}
108+
109+
if err := subvolDelete(mnt, subvolName, true); err != nil {
110+
t.Fatalf("Failed to delete subvolume using API: %v", err)
111+
}
112+
113+
if err := d.subvolRescanQuota(); err != nil {
114+
t.Fatalf("Failed to rescan quota after delete using API: %v", err)
115+
}
116+
117+
qgroupInfo := qgroupShow(mnt)
118+
t.Logf("Current qgroup info:\n%s", qgroupInfo)
119+
120+
if strings.Contains(qgroupInfo, qgroupID) && !strings.Contains(qgroupInfo, "under deletion") {
121+
t.Fatalf("qgroup %s was not marked as 'under deletion' for subvolume %s", qgroupID, subvolPath)
122+
}
123+
124+
runCmd("btrfs", "qgroup", "clear-stale", mnt)
125+
126+
qgroupInfo = qgroupShow(mnt)
127+
t.Logf("Current qgroup info after clearing stale:\n%s", qgroupInfo)
128+
129+
if strings.Contains(qgroupInfo, qgroupID) {
130+
t.Fatalf("qgroup %s was not deleted for subvolume %s", qgroupID, subvolPath)
131+
}
132+
})
133+
}

storage/drivers/btrfs/btrfs_test.go

Lines changed: 0 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33
package btrfs
44

55
import (
6-
"bytes"
7-
"fmt"
86
"os"
9-
"os/exec"
107
"path"
11-
"strings"
128
"testing"
139

1410
graphdriver "go.podman.io/storage/drivers"
@@ -81,123 +77,3 @@ func TestBtrfsListLayers(t *testing.T) {
8177
func TestBtrfsTeardown(t *testing.T) {
8278
graphtest.PutDriver(t)
8379
}
84-
85-
// dependencies: btrfs-progs, libbtrfs-dev
86-
// permission: root, loop device
87-
func TestSubVolDelete(t *testing.T) {
88-
if os.Getuid() != 0 {
89-
t.Skip("test requires root")
90-
}
91-
92-
// Helpers
93-
runCmd := func(name string, arg ...string) error {
94-
cmd := exec.Command(name, arg...)
95-
var stderr bytes.Buffer
96-
cmd.Stderr = &stderr
97-
if err := cmd.Run(); err != nil {
98-
return fmt.Errorf("command '%s %s' failed: %v, stderr: %s", name, strings.Join(arg, " "), err, stderr.String())
99-
}
100-
return nil
101-
}
102-
qgroupShow := func(mountPath string) string {
103-
cmd := exec.Command("btrfs", "qgroup", "show", mountPath)
104-
var out bytes.Buffer
105-
cmd.Stdout = &out
106-
cmd.Run()
107-
return out.String()
108-
}
109-
110-
// parepare btrfs using loop device
111-
baseDir, err := os.MkdirTemp("/mnt", "btrfs-test-")
112-
if err != nil {
113-
t.Fatalf("Failed to create base temp dir: %v", err)
114-
}
115-
defer os.RemoveAll(baseDir)
116-
117-
mnt := path.Join(baseDir, "mountpoint")
118-
if err := os.Mkdir(mnt, 0o755); err != nil {
119-
t.Fatalf("Failed to create mountpoint dir: %v", err)
120-
}
121-
122-
blockFile := path.Join(baseDir, "btrfs.img")
123-
if err := runCmd("dd", "if=/dev/zero", "of="+blockFile, "bs=1M", "count=120", "status=none"); err != nil {
124-
t.Skipf("Failed to create block file: %v", err)
125-
}
126-
127-
if err := runCmd("mkfs.btrfs", "-f", blockFile); err != nil {
128-
t.Skipf("Failed to format to btrfs: %v", err)
129-
}
130-
131-
findLoopCmd := exec.Command("losetup", "-f")
132-
var loopDevBytes bytes.Buffer
133-
findLoopCmd.Stdout = &loopDevBytes
134-
if err := findLoopCmd.Run(); err != nil {
135-
t.Skipf("Failed to find a loop device with 'losetup -f': %v", err)
136-
}
137-
loopDev := strings.TrimSpace(loopDevBytes.String())
138-
if loopDev == "" {
139-
t.Skip("No available loop devices found")
140-
}
141-
142-
if err := runCmd("losetup", loopDev, blockFile); err != nil {
143-
t.Skipf("Failed to setup loop device with 'losetup %s %s': %v", loopDev, blockFile, err)
144-
}
145-
defer runCmd("losetup", "-d", loopDev)
146-
147-
if err := runCmd("mount", loopDev, mnt); err != nil {
148-
t.Skipf("Failed to mount loop device %s: %v", loopDev, err)
149-
}
150-
defer runCmd("umount", mnt)
151-
152-
d := &Driver{home: mnt}
153-
if err := d.enableQuota(); err != nil {
154-
t.Skipf("Failed to enable qgroup using API: %v", err)
155-
}
156-
157-
t.Run("subVolDelete", func(t *testing.T) {
158-
subvolName := "subvol1"
159-
subvolPath := path.Join(mnt, subvolName)
160-
if err := subvolCreate(mnt, subvolName); err != nil {
161-
t.Fatalf("Failed to create subvolume using API: %v", err)
162-
}
163-
164-
if err := d.subvolRescanQuota(); err != nil {
165-
t.Fatalf("Failed to rescan quota using API: %v", err)
166-
}
167-
168-
qtreeid, err := subvolLookupQgroup(subvolPath)
169-
if err != nil {
170-
t.Fatalf("Failed to lookup qgroup for subvolume using API: %v", err)
171-
}
172-
qgroupID := fmt.Sprintf("0/%d", qtreeid)
173-
t.Logf("subvolume %s has qgroup ID %s", subvolPath, qgroupID)
174-
175-
if !strings.Contains(qgroupShow(mnt), qgroupID) {
176-
t.Fatalf("qgroup %s was not created for subvolume %s", qgroupID, subvolPath)
177-
}
178-
179-
if err := subvolDelete(mnt, subvolName, true); err != nil {
180-
t.Fatalf("Failed to delete subvolume using API: %v", err)
181-
}
182-
183-
if err := d.subvolRescanQuota(); err != nil {
184-
t.Fatalf("Failed to rescan quota after delete using API: %v", err)
185-
}
186-
187-
qgroupInfo := qgroupShow(mnt)
188-
t.Logf("Current qgroup info:\n%s", qgroupInfo)
189-
190-
if strings.Contains(qgroupInfo, qgroupID) && !strings.Contains(qgroupInfo, "under deletion") {
191-
t.Fatalf("qgroup %s was not marked as 'under deletion' for subvolume %s", qgroupID, subvolPath)
192-
}
193-
194-
runCmd("btrfs", "qgroup", "clear-stale", mnt)
195-
196-
qgroupInfo = qgroupShow(mnt)
197-
t.Logf("Current qgroup info after clearing stale:\n%s", qgroupInfo)
198-
199-
if strings.Contains(qgroupInfo, qgroupID) {
200-
t.Fatalf("qgroup %s was not deleted for subvolume %s", qgroupID, subvolPath)
201-
}
202-
})
203-
}

0 commit comments

Comments
 (0)