Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/file-server/btrfs/test/setup.ts
1543 views
1
import {
2
filesystem,
3
type Filesystem,
4
} from "@cocalc/file-server/btrfs/filesystem";
5
import { chmod, mkdtemp, mkdir, rm, stat } from "node:fs/promises";
6
import { tmpdir } from "node:os";
7
import { join } from "path";
8
import { until } from "@cocalc/util/async-utils";
9
import { sudo } from "../util";
10
export { sudo };
11
export { delay } from "awaiting";
12
13
export let fs: Filesystem;
14
let tempDir;
15
16
const TEMP_PREFIX = "cocalc-test-btrfs-";
17
18
async function ensureMoreLoops() {
19
// to run tests, this is helpful
20
//for i in $(seq 8 63); do sudo mknod -m660 /dev/loop$i b 7 $i; sudo chown root:disk /dev/loop$i; done
21
for (let i = 0; i < 64; i++) {
22
try {
23
await stat(`/dev/loop${i}`);
24
continue;
25
} catch {}
26
try {
27
// also try/catch this because ensureMoreLoops happens in parallel many times at once...
28
await sudo({
29
command: "mknod",
30
args: ["-m660", `/dev/loop${i}`, "b", "7", `${i}`],
31
});
32
} catch {}
33
await sudo({ command: "chown", args: ["root:disk", `/dev/loop${i}`] });
34
}
35
}
36
37
export async function before() {
38
try {
39
const command = `umount ${join(tmpdir(), TEMP_PREFIX)}*/mnt`;
40
// attempt to unmount any mounts left from previous runs.
41
// TODO: this could impact runs in parallel
42
await sudo({ command, bash: true });
43
} catch {}
44
await ensureMoreLoops();
45
tempDir = await mkdtemp(join(tmpdir(), TEMP_PREFIX));
46
// Set world read/write/execute
47
await chmod(tempDir, 0o777);
48
const mount = join(tempDir, "mnt");
49
await mkdir(mount);
50
await chmod(mount, 0o777);
51
fs = await filesystem({
52
device: join(tempDir, "btrfs.img"),
53
formatIfNeeded: true,
54
mount: join(tempDir, "mnt"),
55
});
56
}
57
58
export async function after() {
59
await until(async () => {
60
try {
61
await fs.unmount();
62
return true;
63
} catch {
64
return false;
65
}
66
});
67
await rm(tempDir, { force: true, recursive: true });
68
}
69
70