1#include "fs/ext2/tests/test_internal.h"
2
3TEST_GROUP_DEFINE(ext2, .intensity_desc = {
4 .curve = SCALE_PIECEWISE_LOG,
5 .unit = "ops",
6 });
7
8#define EXT2_ROOT struct vfs_node *root = global.root_node
9
10static void flush(void) {
11 struct ext2_fs *fs = global.root_node->fs_data;
12 struct block_device *d = fs->drive;
13
14 bio_sched_dispatch_all(disk: d);
15}
16
17TEST_DEFINE_INTEGRATION(ext2, stat, TEST_INTENSITY(1, 1, 16),
18 .required_fs = FS_EXT2) {
19 EXT2_ROOT;
20 TEST_ASSERT(!ERR_IS_FATAL(
21 root->ops->create(root, "ext2_stat_test", VFS_MODE_FILE)));
22
23 struct vfs_node *node;
24 struct vfs_dirent out;
25
26 TEST_ASSERT(
27 !ERR_IS_FATAL(root->ops->finddir(root, "ext2_stat_test", &out)));
28
29 node = out.node;
30 TEST_ASSERT_NONNULL(node);
31
32 struct vfs_stat empty_stat = {0};
33 struct vfs_stat stat_out = {0};
34 node->ops->stat(node, &stat_out);
35
36 /* this should return something */
37 TEST_ASSERT_NE(memcmp(&stat_out, &empty_stat, sizeof(struct vfs_stat)), 0);
38
39 flush();
40 return TEST_SUCCESS;
41}
42
43TEST_DEFINE_INTEGRATION(ext2, rename, TEST_INTENSITY(1, 1, 16),
44 .required_fs = FS_EXT2) {
45 EXT2_ROOT;
46 TEST_ASSERT(!ERR_IS_FATAL(
47 root->ops->create(root, "ext2_rename_test", VFS_MODE_FILE)));
48
49 struct vfs_dirent out;
50 struct vfs_node *node;
51
52 TEST_ASSERT(
53 !ERR_IS_FATAL(root->ops->finddir(root, "ext2_rename_test", &out)));
54
55 node = out.node;
56 TEST_ASSERT_NONNULL(node);
57
58 TEST_ASSERT(!ERR_IS_FATAL(node->ops->rename(root, "ext2_rename_test", root,
59 "ext2_rename_test2")));
60
61 enum err e = root->ops->finddir(root, "ext2_rename_test", &out);
62 TEST_ASSERT_EQ_S(e, ERR_NO_ENT);
63
64 TEST_ASSERT(
65 !ERR_IS_FATAL(root->ops->finddir(root, "ext2_rename_test2", &out)));
66
67 node = out.node;
68 TEST_ASSERT_NONNULL(node);
69
70 flush();
71 return TEST_SUCCESS;
72}
73
74TEST_DEFINE_INTEGRATION(ext2, chmod, TEST_INTENSITY(1, 1, 16),
75 .required_fs = FS_EXT2) {
76 EXT2_ROOT;
77 TEST_ASSERT(!ERR_IS_FATAL(
78 root->ops->create(root, "ext2_chmod_test", VFS_MODE_FILE)));
79
80 struct vfs_node *node;
81 struct vfs_dirent ent;
82
83 TEST_ASSERT(
84 !ERR_IS_FATAL(root->ops->finddir(root, "ext2_chmod_test", &ent)));
85
86 node = ent.node;
87 TEST_ASSERT_NONNULL(node);
88
89 TEST_ASSERT(
90 !ERR_IS_FATAL(root->ops->chmod(node, (uint16_t) VFS_MODE_O_EXEC)));
91 TEST_ASSERT(node->mode & VFS_MODE_O_EXEC);
92
93 TEST_ASSERT(
94 !ERR_IS_FATAL(root->ops->finddir(root, "ext2_chmod_test", &ent)));
95
96 node = ent.node;
97 TEST_ASSERT_NONNULL(node);
98 TEST_ASSERT(node->mode & VFS_MODE_O_EXEC);
99
100 flush();
101 return TEST_SUCCESS;
102}
103
104TEST_DEFINE_INTEGRATION(ext2, symlink, TEST_INTENSITY(1, 1, 16),
105 .required_fs = FS_EXT2) {
106 EXT2_ROOT;
107 TEST_ASSERT(
108 !ERR_IS_FATAL(root->ops->symlink(root, "/tmp", "ext2_symlink_test")));
109
110 struct vfs_dirent ent;
111 struct vfs_node *node;
112
113 TEST_ASSERT(
114 !ERR_IS_FATAL(root->ops->finddir(root, "ext2_symlink_test", &ent)));
115
116 node = ent.node;
117 TEST_ASSERT_NONNULL(node);
118
119 char *buf = valloc(5, ALLOC_ZERO);
120 TEST_ASSERT_NONNULL(buf);
121
122 TEST_ASSERT(!ERR_IS_FATAL(node->ops->readlink(node, buf, 4)));
123
124 TEST_ASSERT_STR_EQ(buf, "/tmp");
125
126 flush();
127 return TEST_SUCCESS;
128}
129
130TEST_DEFINE_INTEGRATION(ext2, mkdir_rmdir, TEST_INTENSITY(1, 1, 16),
131 .required_fs = FS_EXT2) {
132 EXT2_ROOT;
133 TEST_ASSERT(
134 !ERR_IS_FATAL(root->ops->mkdir(root, "ext2_dir_test", VFS_MODE_DIR)));
135
136 struct vfs_dirent ent;
137 struct vfs_node *node;
138
139 TEST_ASSERT(!ERR_IS_FATAL(root->ops->finddir(root, "ext2_dir_test", &ent)));
140
141 node = ent.node;
142 TEST_ASSERT_NONNULL(node);
143
144 TEST_ASSERT(!ERR_IS_FATAL(root->ops->rmdir(root, "ext2_dir_test")));
145
146 flush();
147 return TEST_SUCCESS;
148}
149