test_dirs.toml 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838
  1. [[case]] # root
  2. code = '''
  3. lfs_format(&lfs, &cfg) => 0;
  4. lfs_mount(&lfs, &cfg) => 0;
  5. lfs_dir_open(&lfs, &dir, "/") => 0;
  6. lfs_dir_read(&lfs, &dir, &info) => 1;
  7. assert(info.type == LFS_TYPE_DIR);
  8. assert(strcmp(info.name, ".") == 0);
  9. lfs_dir_read(&lfs, &dir, &info) => 1;
  10. assert(info.type == LFS_TYPE_DIR);
  11. assert(strcmp(info.name, "..") == 0);
  12. lfs_dir_read(&lfs, &dir, &info) => 0;
  13. lfs_dir_close(&lfs, &dir) => 0;
  14. lfs_unmount(&lfs) => 0;
  15. '''
  16. [[case]] # many directory creation
  17. code = '''
  18. lfs_format(&lfs, &cfg) => 0;
  19. lfs_mount(&lfs, &cfg) => 0;
  20. for (int i = 0; i < N; i++) {
  21. sprintf(path, "dir%03d", i);
  22. lfs_mkdir(&lfs, path) => 0;
  23. }
  24. lfs_unmount(&lfs) => 0;
  25. lfs_mount(&lfs, &cfg) => 0;
  26. lfs_dir_open(&lfs, &dir, "/") => 0;
  27. lfs_dir_read(&lfs, &dir, &info) => 1;
  28. assert(info.type == LFS_TYPE_DIR);
  29. assert(strcmp(info.name, ".") == 0);
  30. lfs_dir_read(&lfs, &dir, &info) => 1;
  31. assert(info.type == LFS_TYPE_DIR);
  32. assert(strcmp(info.name, "..") == 0);
  33. for (int i = 0; i < N; i++) {
  34. sprintf(path, "dir%03d", i);
  35. lfs_dir_read(&lfs, &dir, &info) => 1;
  36. assert(info.type == LFS_TYPE_DIR);
  37. assert(strcmp(info.name, path) == 0);
  38. }
  39. lfs_dir_read(&lfs, &dir, &info) => 0;
  40. lfs_dir_close(&lfs, &dir) => 0;
  41. lfs_unmount(&lfs) => 0;
  42. '''
  43. define.N = 'range(0, 100, 3)'
  44. [[case]] # many directory removal
  45. code = '''
  46. lfs_format(&lfs, &cfg) => 0;
  47. lfs_mount(&lfs, &cfg) => 0;
  48. for (int i = 0; i < N; i++) {
  49. sprintf(path, "removeme%03d", i);
  50. lfs_mkdir(&lfs, path) => 0;
  51. }
  52. lfs_unmount(&lfs) => 0;
  53. lfs_mount(&lfs, &cfg) => 0;
  54. lfs_dir_open(&lfs, &dir, "/") => 0;
  55. lfs_dir_read(&lfs, &dir, &info) => 1;
  56. assert(info.type == LFS_TYPE_DIR);
  57. assert(strcmp(info.name, ".") == 0);
  58. lfs_dir_read(&lfs, &dir, &info) => 1;
  59. assert(info.type == LFS_TYPE_DIR);
  60. assert(strcmp(info.name, "..") == 0);
  61. for (int i = 0; i < N; i++) {
  62. sprintf(path, "removeme%03d", i);
  63. lfs_dir_read(&lfs, &dir, &info) => 1;
  64. assert(info.type == LFS_TYPE_DIR);
  65. assert(strcmp(info.name, path) == 0);
  66. }
  67. lfs_dir_read(&lfs, &dir, &info) => 0;
  68. lfs_dir_close(&lfs, &dir) => 0;
  69. lfs_unmount(&lfs);
  70. lfs_mount(&lfs, &cfg) => 0;
  71. for (int i = 0; i < N; i++) {
  72. sprintf(path, "removeme%03d", i);
  73. lfs_remove(&lfs, path) => 0;
  74. }
  75. lfs_unmount(&lfs);
  76. lfs_mount(&lfs, &cfg) => 0;
  77. lfs_dir_open(&lfs, &dir, "/") => 0;
  78. lfs_dir_read(&lfs, &dir, &info) => 1;
  79. assert(info.type == LFS_TYPE_DIR);
  80. assert(strcmp(info.name, ".") == 0);
  81. lfs_dir_read(&lfs, &dir, &info) => 1;
  82. assert(info.type == LFS_TYPE_DIR);
  83. assert(strcmp(info.name, "..") == 0);
  84. lfs_dir_read(&lfs, &dir, &info) => 0;
  85. lfs_dir_close(&lfs, &dir) => 0;
  86. lfs_unmount(&lfs) => 0;
  87. '''
  88. define.N = 'range(3, 100, 11)'
  89. [[case]] # many directory rename
  90. code = '''
  91. lfs_format(&lfs, &cfg) => 0;
  92. lfs_mount(&lfs, &cfg) => 0;
  93. for (int i = 0; i < N; i++) {
  94. sprintf(path, "test%03d", i);
  95. lfs_mkdir(&lfs, path) => 0;
  96. }
  97. lfs_unmount(&lfs) => 0;
  98. lfs_mount(&lfs, &cfg) => 0;
  99. lfs_dir_open(&lfs, &dir, "/") => 0;
  100. lfs_dir_read(&lfs, &dir, &info) => 1;
  101. assert(info.type == LFS_TYPE_DIR);
  102. assert(strcmp(info.name, ".") == 0);
  103. lfs_dir_read(&lfs, &dir, &info) => 1;
  104. assert(info.type == LFS_TYPE_DIR);
  105. assert(strcmp(info.name, "..") == 0);
  106. for (int i = 0; i < N; i++) {
  107. sprintf(path, "test%03d", i);
  108. lfs_dir_read(&lfs, &dir, &info) => 1;
  109. assert(info.type == LFS_TYPE_DIR);
  110. assert(strcmp(info.name, path) == 0);
  111. }
  112. lfs_dir_read(&lfs, &dir, &info) => 0;
  113. lfs_dir_close(&lfs, &dir) => 0;
  114. lfs_unmount(&lfs);
  115. lfs_mount(&lfs, &cfg) => 0;
  116. for (int i = 0; i < N; i++) {
  117. char oldpath[128];
  118. char newpath[128];
  119. sprintf(oldpath, "test%03d", i);
  120. sprintf(newpath, "tedd%03d", i);
  121. lfs_rename(&lfs, oldpath, newpath) => 0;
  122. }
  123. lfs_unmount(&lfs);
  124. lfs_mount(&lfs, &cfg) => 0;
  125. lfs_dir_open(&lfs, &dir, "/") => 0;
  126. lfs_dir_read(&lfs, &dir, &info) => 1;
  127. assert(info.type == LFS_TYPE_DIR);
  128. assert(strcmp(info.name, ".") == 0);
  129. lfs_dir_read(&lfs, &dir, &info) => 1;
  130. assert(info.type == LFS_TYPE_DIR);
  131. assert(strcmp(info.name, "..") == 0);
  132. for (int i = 0; i < N; i++) {
  133. sprintf(path, "tedd%03d", i);
  134. lfs_dir_read(&lfs, &dir, &info) => 1;
  135. assert(info.type == LFS_TYPE_DIR);
  136. assert(strcmp(info.name, path) == 0);
  137. }
  138. lfs_dir_read(&lfs, &dir, &info) => 0;
  139. lfs_dir_close(&lfs, &dir) => 0;
  140. lfs_unmount(&lfs);
  141. '''
  142. define.N = 'range(3, 100, 11)'
  143. [[case]] # reentrant many directory creation/rename/removal
  144. code = '''
  145. err = lfs_mount(&lfs, &cfg);
  146. if (err) {
  147. lfs_format(&lfs, &cfg) => 0;
  148. lfs_mount(&lfs, &cfg) => 0;
  149. }
  150. for (int i = 0; i < N; i++) {
  151. sprintf(path, "hi%03d", i);
  152. err = lfs_mkdir(&lfs, path);
  153. assert(err == 0 || err == LFS_ERR_EXIST);
  154. }
  155. for (int i = 0; i < N; i++) {
  156. sprintf(path, "hello%03d", i);
  157. err = lfs_remove(&lfs, path);
  158. assert(err == 0 || err == LFS_ERR_NOENT);
  159. }
  160. lfs_dir_open(&lfs, &dir, "/") => 0;
  161. lfs_dir_read(&lfs, &dir, &info) => 1;
  162. assert(info.type == LFS_TYPE_DIR);
  163. assert(strcmp(info.name, ".") == 0);
  164. lfs_dir_read(&lfs, &dir, &info) => 1;
  165. assert(info.type == LFS_TYPE_DIR);
  166. assert(strcmp(info.name, "..") == 0);
  167. for (int i = 0; i < N; i++) {
  168. sprintf(path, "hi%03d", i);
  169. lfs_dir_read(&lfs, &dir, &info) => 1;
  170. assert(info.type == LFS_TYPE_DIR);
  171. assert(strcmp(info.name, path) == 0);
  172. }
  173. lfs_dir_read(&lfs, &dir, &info) => 0;
  174. lfs_dir_close(&lfs, &dir) => 0;
  175. for (int i = 0; i < N; i++) {
  176. char oldpath[128];
  177. char newpath[128];
  178. sprintf(oldpath, "hi%03d", i);
  179. sprintf(newpath, "hello%03d", i);
  180. // YES this can overwrite an existing newpath
  181. lfs_rename(&lfs, oldpath, newpath) => 0;
  182. }
  183. lfs_dir_open(&lfs, &dir, "/") => 0;
  184. lfs_dir_read(&lfs, &dir, &info) => 1;
  185. assert(info.type == LFS_TYPE_DIR);
  186. assert(strcmp(info.name, ".") == 0);
  187. lfs_dir_read(&lfs, &dir, &info) => 1;
  188. assert(info.type == LFS_TYPE_DIR);
  189. assert(strcmp(info.name, "..") == 0);
  190. for (int i = 0; i < N; i++) {
  191. sprintf(path, "hello%03d", i);
  192. lfs_dir_read(&lfs, &dir, &info) => 1;
  193. assert(info.type == LFS_TYPE_DIR);
  194. assert(strcmp(info.name, path) == 0);
  195. }
  196. lfs_dir_read(&lfs, &dir, &info) => 0;
  197. lfs_dir_close(&lfs, &dir) => 0;
  198. for (int i = 0; i < N; i++) {
  199. sprintf(path, "hello%03d", i);
  200. lfs_remove(&lfs, path) => 0;
  201. }
  202. lfs_dir_open(&lfs, &dir, "/") => 0;
  203. lfs_dir_read(&lfs, &dir, &info) => 1;
  204. assert(info.type == LFS_TYPE_DIR);
  205. assert(strcmp(info.name, ".") == 0);
  206. lfs_dir_read(&lfs, &dir, &info) => 1;
  207. assert(info.type == LFS_TYPE_DIR);
  208. assert(strcmp(info.name, "..") == 0);
  209. lfs_dir_read(&lfs, &dir, &info) => 0;
  210. lfs_dir_close(&lfs, &dir) => 0;
  211. lfs_unmount(&lfs) => 0;
  212. '''
  213. define.N = [5, 25]
  214. reentrant = true
  215. [[case]] # file creation
  216. code = '''
  217. lfs_format(&lfs, &cfg) => 0;
  218. lfs_mount(&lfs, &cfg) => 0;
  219. for (int i = 0; i < N; i++) {
  220. sprintf(path, "file%03d", i);
  221. lfs_file_open(&lfs, &file, path,
  222. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  223. lfs_file_close(&lfs, &file) => 0;
  224. }
  225. lfs_unmount(&lfs) => 0;
  226. lfs_mount(&lfs, &cfg) => 0;
  227. lfs_dir_open(&lfs, &dir, "/") => 0;
  228. lfs_dir_read(&lfs, &dir, &info) => 1;
  229. assert(info.type == LFS_TYPE_DIR);
  230. assert(strcmp(info.name, ".") == 0);
  231. lfs_dir_read(&lfs, &dir, &info) => 1;
  232. assert(info.type == LFS_TYPE_DIR);
  233. assert(strcmp(info.name, "..") == 0);
  234. for (int i = 0; i < N; i++) {
  235. sprintf(path, "file%03d", i);
  236. lfs_dir_read(&lfs, &dir, &info) => 1;
  237. assert(info.type == LFS_TYPE_REG);
  238. assert(strcmp(info.name, path) == 0);
  239. }
  240. lfs_dir_read(&lfs, &dir, &info) => 0;
  241. lfs_dir_close(&lfs, &dir) => 0;
  242. lfs_unmount(&lfs);
  243. '''
  244. define.N = 'range(3, 100, 11)'
  245. [[case]] # file removal
  246. code = '''
  247. lfs_format(&lfs, &cfg) => 0;
  248. lfs_mount(&lfs, &cfg) => 0;
  249. for (int i = 0; i < N; i++) {
  250. sprintf(path, "removeme%03d", i);
  251. lfs_file_open(&lfs, &file, path,
  252. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  253. lfs_file_close(&lfs, &file) => 0;
  254. }
  255. lfs_unmount(&lfs) => 0;
  256. lfs_mount(&lfs, &cfg) => 0;
  257. lfs_dir_open(&lfs, &dir, "/") => 0;
  258. lfs_dir_read(&lfs, &dir, &info) => 1;
  259. assert(info.type == LFS_TYPE_DIR);
  260. assert(strcmp(info.name, ".") == 0);
  261. lfs_dir_read(&lfs, &dir, &info) => 1;
  262. assert(info.type == LFS_TYPE_DIR);
  263. assert(strcmp(info.name, "..") == 0);
  264. for (int i = 0; i < N; i++) {
  265. sprintf(path, "removeme%03d", i);
  266. lfs_dir_read(&lfs, &dir, &info) => 1;
  267. assert(info.type == LFS_TYPE_REG);
  268. assert(strcmp(info.name, path) == 0);
  269. }
  270. lfs_dir_read(&lfs, &dir, &info) => 0;
  271. lfs_dir_close(&lfs, &dir) => 0;
  272. lfs_unmount(&lfs);
  273. lfs_mount(&lfs, &cfg) => 0;
  274. for (int i = 0; i < N; i++) {
  275. sprintf(path, "removeme%03d", i);
  276. lfs_remove(&lfs, path) => 0;
  277. }
  278. lfs_unmount(&lfs);
  279. lfs_mount(&lfs, &cfg) => 0;
  280. lfs_dir_open(&lfs, &dir, "/") => 0;
  281. lfs_dir_read(&lfs, &dir, &info) => 1;
  282. assert(info.type == LFS_TYPE_DIR);
  283. assert(strcmp(info.name, ".") == 0);
  284. lfs_dir_read(&lfs, &dir, &info) => 1;
  285. assert(info.type == LFS_TYPE_DIR);
  286. assert(strcmp(info.name, "..") == 0);
  287. lfs_dir_read(&lfs, &dir, &info) => 0;
  288. lfs_dir_close(&lfs, &dir) => 0;
  289. lfs_unmount(&lfs) => 0;
  290. '''
  291. define.N = 'range(0, 100, 3)'
  292. [[case]] # file rename
  293. code = '''
  294. lfs_format(&lfs, &cfg) => 0;
  295. lfs_mount(&lfs, &cfg) => 0;
  296. for (int i = 0; i < N; i++) {
  297. sprintf(path, "test%03d", i);
  298. lfs_file_open(&lfs, &file, path,
  299. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  300. lfs_file_close(&lfs, &file) => 0;
  301. }
  302. lfs_unmount(&lfs) => 0;
  303. lfs_mount(&lfs, &cfg) => 0;
  304. lfs_dir_open(&lfs, &dir, "/") => 0;
  305. lfs_dir_read(&lfs, &dir, &info) => 1;
  306. assert(info.type == LFS_TYPE_DIR);
  307. assert(strcmp(info.name, ".") == 0);
  308. lfs_dir_read(&lfs, &dir, &info) => 1;
  309. assert(info.type == LFS_TYPE_DIR);
  310. assert(strcmp(info.name, "..") == 0);
  311. for (int i = 0; i < N; i++) {
  312. sprintf(path, "test%03d", i);
  313. lfs_dir_read(&lfs, &dir, &info) => 1;
  314. assert(info.type == LFS_TYPE_REG);
  315. assert(strcmp(info.name, path) == 0);
  316. }
  317. lfs_dir_read(&lfs, &dir, &info) => 0;
  318. lfs_dir_close(&lfs, &dir) => 0;
  319. lfs_unmount(&lfs);
  320. lfs_mount(&lfs, &cfg) => 0;
  321. for (int i = 0; i < N; i++) {
  322. char oldpath[128];
  323. char newpath[128];
  324. sprintf(oldpath, "test%03d", i);
  325. sprintf(newpath, "tedd%03d", i);
  326. lfs_rename(&lfs, oldpath, newpath) => 0;
  327. }
  328. lfs_unmount(&lfs);
  329. lfs_mount(&lfs, &cfg) => 0;
  330. lfs_dir_open(&lfs, &dir, "/") => 0;
  331. lfs_dir_read(&lfs, &dir, &info) => 1;
  332. assert(info.type == LFS_TYPE_DIR);
  333. assert(strcmp(info.name, ".") == 0);
  334. lfs_dir_read(&lfs, &dir, &info) => 1;
  335. assert(info.type == LFS_TYPE_DIR);
  336. assert(strcmp(info.name, "..") == 0);
  337. for (int i = 0; i < N; i++) {
  338. sprintf(path, "tedd%03d", i);
  339. lfs_dir_read(&lfs, &dir, &info) => 1;
  340. assert(info.type == LFS_TYPE_REG);
  341. assert(strcmp(info.name, path) == 0);
  342. }
  343. lfs_dir_read(&lfs, &dir, &info) => 0;
  344. lfs_dir_close(&lfs, &dir) => 0;
  345. lfs_unmount(&lfs);
  346. '''
  347. define.N = 'range(0, 100, 3)'
  348. [[case]] # reentrant file creation/rename/removal
  349. code = '''
  350. err = lfs_mount(&lfs, &cfg);
  351. if (err) {
  352. lfs_format(&lfs, &cfg) => 0;
  353. lfs_mount(&lfs, &cfg) => 0;
  354. }
  355. for (int i = 0; i < N; i++) {
  356. sprintf(path, "hi%03d", i);
  357. lfs_file_open(&lfs, &file, path, LFS_O_CREAT | LFS_O_WRONLY) => 0;
  358. lfs_file_close(&lfs, &file) => 0;
  359. }
  360. for (int i = 0; i < N; i++) {
  361. sprintf(path, "hello%03d", i);
  362. err = lfs_remove(&lfs, path);
  363. assert(err == 0 || err == LFS_ERR_NOENT);
  364. }
  365. lfs_dir_open(&lfs, &dir, "/") => 0;
  366. lfs_dir_read(&lfs, &dir, &info) => 1;
  367. assert(info.type == LFS_TYPE_DIR);
  368. assert(strcmp(info.name, ".") == 0);
  369. lfs_dir_read(&lfs, &dir, &info) => 1;
  370. assert(info.type == LFS_TYPE_DIR);
  371. assert(strcmp(info.name, "..") == 0);
  372. for (int i = 0; i < N; i++) {
  373. sprintf(path, "hi%03d", i);
  374. lfs_dir_read(&lfs, &dir, &info) => 1;
  375. assert(info.type == LFS_TYPE_REG);
  376. assert(strcmp(info.name, path) == 0);
  377. }
  378. lfs_dir_read(&lfs, &dir, &info) => 0;
  379. lfs_dir_close(&lfs, &dir) => 0;
  380. for (int i = 0; i < N; i++) {
  381. char oldpath[128];
  382. char newpath[128];
  383. sprintf(oldpath, "hi%03d", i);
  384. sprintf(newpath, "hello%03d", i);
  385. // YES this can overwrite an existing newpath
  386. lfs_rename(&lfs, oldpath, newpath) => 0;
  387. }
  388. lfs_dir_open(&lfs, &dir, "/") => 0;
  389. lfs_dir_read(&lfs, &dir, &info) => 1;
  390. assert(info.type == LFS_TYPE_DIR);
  391. assert(strcmp(info.name, ".") == 0);
  392. lfs_dir_read(&lfs, &dir, &info) => 1;
  393. assert(info.type == LFS_TYPE_DIR);
  394. assert(strcmp(info.name, "..") == 0);
  395. for (int i = 0; i < N; i++) {
  396. sprintf(path, "hello%03d", i);
  397. lfs_dir_read(&lfs, &dir, &info) => 1;
  398. assert(info.type == LFS_TYPE_REG);
  399. assert(strcmp(info.name, path) == 0);
  400. }
  401. lfs_dir_read(&lfs, &dir, &info) => 0;
  402. lfs_dir_close(&lfs, &dir) => 0;
  403. for (int i = 0; i < N; i++) {
  404. sprintf(path, "hello%03d", i);
  405. lfs_remove(&lfs, path) => 0;
  406. }
  407. lfs_dir_open(&lfs, &dir, "/") => 0;
  408. lfs_dir_read(&lfs, &dir, &info) => 1;
  409. assert(info.type == LFS_TYPE_DIR);
  410. assert(strcmp(info.name, ".") == 0);
  411. lfs_dir_read(&lfs, &dir, &info) => 1;
  412. assert(info.type == LFS_TYPE_DIR);
  413. assert(strcmp(info.name, "..") == 0);
  414. lfs_dir_read(&lfs, &dir, &info) => 0;
  415. lfs_dir_close(&lfs, &dir) => 0;
  416. lfs_unmount(&lfs) => 0;
  417. '''
  418. define.N = [5, 25]
  419. reentrant = true
  420. [[case]] # nested directories
  421. code = '''
  422. lfs_format(&lfs, &cfg) => 0;
  423. lfs_mount(&lfs, &cfg) => 0;
  424. lfs_mkdir(&lfs, "potato") => 0;
  425. lfs_file_open(&lfs, &file, "burito",
  426. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  427. lfs_file_close(&lfs, &file) => 0;
  428. lfs_unmount(&lfs) => 0;
  429. lfs_mount(&lfs, &cfg) => 0;
  430. lfs_mkdir(&lfs, "potato/baked") => 0;
  431. lfs_mkdir(&lfs, "potato/sweet") => 0;
  432. lfs_mkdir(&lfs, "potato/fried") => 0;
  433. lfs_unmount(&lfs) => 0;
  434. lfs_mount(&lfs, &cfg) => 0;
  435. lfs_dir_open(&lfs, &dir, "potato") => 0;
  436. lfs_dir_read(&lfs, &dir, &info) => 1;
  437. assert(strcmp(info.name, ".") == 0);
  438. info.type => LFS_TYPE_DIR;
  439. lfs_dir_read(&lfs, &dir, &info) => 1;
  440. assert(strcmp(info.name, "..") == 0);
  441. info.type => LFS_TYPE_DIR;
  442. lfs_dir_read(&lfs, &dir, &info) => 1;
  443. assert(strcmp(info.name, "baked") == 0);
  444. info.type => LFS_TYPE_DIR;
  445. lfs_dir_read(&lfs, &dir, &info) => 1;
  446. assert(strcmp(info.name, "fried") == 0);
  447. info.type => LFS_TYPE_DIR;
  448. lfs_dir_read(&lfs, &dir, &info) => 1;
  449. assert(strcmp(info.name, "sweet") == 0);
  450. info.type => LFS_TYPE_DIR;
  451. lfs_dir_read(&lfs, &dir, &info) => 0;
  452. lfs_dir_close(&lfs, &dir) => 0;
  453. lfs_unmount(&lfs) => 0;
  454. // try removing?
  455. lfs_mount(&lfs, &cfg) => 0;
  456. lfs_remove(&lfs, "potato") => LFS_ERR_NOTEMPTY;
  457. lfs_unmount(&lfs) => 0;
  458. // try renaming?
  459. lfs_mount(&lfs, &cfg) => 0;
  460. lfs_rename(&lfs, "potato", "coldpotato") => 0;
  461. lfs_unmount(&lfs) => 0;
  462. lfs_mount(&lfs, &cfg) => 0;
  463. lfs_rename(&lfs, "coldpotato", "warmpotato") => 0;
  464. lfs_rename(&lfs, "warmpotato", "hotpotato") => 0;
  465. lfs_unmount(&lfs) => 0;
  466. lfs_mount(&lfs, &cfg) => 0;
  467. lfs_remove(&lfs, "potato") => LFS_ERR_NOENT;
  468. lfs_remove(&lfs, "coldpotato") => LFS_ERR_NOENT;
  469. lfs_remove(&lfs, "warmpotato") => LFS_ERR_NOENT;
  470. lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY;
  471. lfs_unmount(&lfs) => 0;
  472. // try cross-directory renaming
  473. lfs_mount(&lfs, &cfg) => 0;
  474. lfs_mkdir(&lfs, "coldpotato") => 0;
  475. lfs_rename(&lfs, "hotpotato/baked", "coldpotato/baked") => 0;
  476. lfs_rename(&lfs, "coldpotato", "hotpotato") => LFS_ERR_NOTEMPTY;
  477. lfs_remove(&lfs, "coldpotato") => LFS_ERR_NOTEMPTY;
  478. lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY;
  479. lfs_rename(&lfs, "hotpotato/fried", "coldpotato/fried") => 0;
  480. lfs_rename(&lfs, "coldpotato", "hotpotato") => LFS_ERR_NOTEMPTY;
  481. lfs_remove(&lfs, "coldpotato") => LFS_ERR_NOTEMPTY;
  482. lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY;
  483. lfs_rename(&lfs, "hotpotato/sweet", "coldpotato/sweet") => 0;
  484. lfs_rename(&lfs, "coldpotato", "hotpotato") => 0;
  485. lfs_remove(&lfs, "coldpotato") => LFS_ERR_NOENT;
  486. lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY;
  487. lfs_unmount(&lfs) => 0;
  488. lfs_mount(&lfs, &cfg) => 0;
  489. lfs_dir_open(&lfs, &dir, "hotpotato") => 0;
  490. lfs_dir_read(&lfs, &dir, &info) => 1;
  491. assert(strcmp(info.name, ".") == 0);
  492. info.type => LFS_TYPE_DIR;
  493. lfs_dir_read(&lfs, &dir, &info) => 1;
  494. assert(strcmp(info.name, "..") == 0);
  495. info.type => LFS_TYPE_DIR;
  496. lfs_dir_read(&lfs, &dir, &info) => 1;
  497. assert(strcmp(info.name, "baked") == 0);
  498. info.type => LFS_TYPE_DIR;
  499. lfs_dir_read(&lfs, &dir, &info) => 1;
  500. assert(strcmp(info.name, "fried") == 0);
  501. info.type => LFS_TYPE_DIR;
  502. lfs_dir_read(&lfs, &dir, &info) => 1;
  503. assert(strcmp(info.name, "sweet") == 0);
  504. info.type => LFS_TYPE_DIR;
  505. lfs_dir_read(&lfs, &dir, &info) => 0;
  506. lfs_dir_close(&lfs, &dir) => 0;
  507. lfs_unmount(&lfs) => 0;
  508. // final remove
  509. lfs_mount(&lfs, &cfg) => 0;
  510. lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY;
  511. lfs_remove(&lfs, "hotpotato/baked") => 0;
  512. lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY;
  513. lfs_remove(&lfs, "hotpotato/fried") => 0;
  514. lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY;
  515. lfs_remove(&lfs, "hotpotato/sweet") => 0;
  516. lfs_remove(&lfs, "hotpotato") => 0;
  517. lfs_unmount(&lfs) => 0;
  518. lfs_mount(&lfs, &cfg) => 0;
  519. lfs_dir_open(&lfs, &dir, "/") => 0;
  520. lfs_dir_read(&lfs, &dir, &info) => 1;
  521. assert(strcmp(info.name, ".") == 0);
  522. info.type => LFS_TYPE_DIR;
  523. lfs_dir_read(&lfs, &dir, &info) => 1;
  524. assert(strcmp(info.name, "..") == 0);
  525. info.type => LFS_TYPE_DIR;
  526. lfs_dir_read(&lfs, &dir, &info) => 1;
  527. assert(strcmp(info.name, "burito") == 0);
  528. info.type => LFS_TYPE_REG;
  529. lfs_dir_read(&lfs, &dir, &info) => 0;
  530. lfs_dir_close(&lfs, &dir) => 0;
  531. lfs_unmount(&lfs) => 0;
  532. '''
  533. [[case]] # recursive remove
  534. code = '''
  535. lfs_format(&lfs, &cfg) => 0;
  536. lfs_mount(&lfs, &cfg) => 0;
  537. lfs_mkdir(&lfs, "prickly-pear") => 0;
  538. for (int i = 0; i < N; i++) {
  539. sprintf(path, "prickly-pear/cactus%03d", i);
  540. lfs_mkdir(&lfs, path) => 0;
  541. }
  542. lfs_dir_open(&lfs, &dir, "prickly-pear") => 0;
  543. lfs_dir_read(&lfs, &dir, &info) => 1;
  544. assert(info.type == LFS_TYPE_DIR);
  545. assert(strcmp(info.name, ".") == 0);
  546. lfs_dir_read(&lfs, &dir, &info) => 1;
  547. assert(info.type == LFS_TYPE_DIR);
  548. assert(strcmp(info.name, "..") == 0);
  549. for (int i = 0; i < N; i++) {
  550. sprintf(path, "cactus%03d", i);
  551. lfs_dir_read(&lfs, &dir, &info) => 1;
  552. assert(info.type == LFS_TYPE_DIR);
  553. assert(strcmp(info.name, path) == 0);
  554. }
  555. lfs_dir_read(&lfs, &dir, &info) => 0;
  556. lfs_dir_close(&lfs, &dir) => 0;
  557. lfs_unmount(&lfs);
  558. lfs_mount(&lfs, &cfg) => 0;
  559. lfs_remove(&lfs, "prickly-pear") => LFS_ERR_NOTEMPTY;
  560. lfs_dir_open(&lfs, &dir, "prickly-pear") => 0;
  561. lfs_dir_read(&lfs, &dir, &info) => 1;
  562. assert(info.type == LFS_TYPE_DIR);
  563. assert(strcmp(info.name, ".") == 0);
  564. lfs_dir_read(&lfs, &dir, &info) => 1;
  565. assert(info.type == LFS_TYPE_DIR);
  566. assert(strcmp(info.name, "..") == 0);
  567. for (int i = 0; i < N; i++) {
  568. sprintf(path, "cactus%03d", i);
  569. lfs_dir_read(&lfs, &dir, &info) => 1;
  570. assert(info.type == LFS_TYPE_DIR);
  571. assert(strcmp(info.name, path) == 0);
  572. sprintf(path, "prickly-pear/%s", info.name);
  573. lfs_remove(&lfs, path) => 0;
  574. }
  575. lfs_dir_read(&lfs, &dir, &info) => 0;
  576. lfs_dir_close(&lfs, &dir) => 0;
  577. lfs_remove(&lfs, "prickly-pear") => 0;
  578. lfs_remove(&lfs, "prickly-pear") => LFS_ERR_NOENT;
  579. lfs_unmount(&lfs) => 0;
  580. lfs_mount(&lfs, &cfg) => 0;
  581. lfs_remove(&lfs, "prickly-pear") => LFS_ERR_NOENT;
  582. lfs_unmount(&lfs) => 0;
  583. '''
  584. define.N = [10, 100]
  585. [[case]] # other error cases
  586. code = '''
  587. lfs_format(&lfs, &cfg) => 0;
  588. lfs_mount(&lfs, &cfg) => 0;
  589. lfs_mkdir(&lfs, "potato") => 0;
  590. lfs_file_open(&lfs, &file, "burito",
  591. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  592. lfs_file_close(&lfs, &file) => 0;
  593. lfs_unmount(&lfs) => 0;
  594. lfs_mount(&lfs, &cfg) => 0;
  595. lfs_mkdir(&lfs, "potato") => LFS_ERR_EXIST;
  596. lfs_mkdir(&lfs, "burito") => LFS_ERR_EXIST;
  597. lfs_file_open(&lfs, &file, "burito",
  598. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_EXIST;
  599. lfs_file_open(&lfs, &file, "potato",
  600. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_EXIST;
  601. lfs_dir_open(&lfs, &dir, "tomato") => LFS_ERR_NOENT;
  602. lfs_dir_open(&lfs, &dir, "burito") => LFS_ERR_NOTDIR;
  603. lfs_file_open(&lfs, &file, "tomato", LFS_O_RDONLY) => LFS_ERR_NOENT;
  604. lfs_file_open(&lfs, &file, "potato", LFS_O_RDONLY) => LFS_ERR_ISDIR;
  605. lfs_file_open(&lfs, &file, "tomato", LFS_O_WRONLY) => LFS_ERR_NOENT;
  606. lfs_file_open(&lfs, &file, "potato", LFS_O_WRONLY) => LFS_ERR_ISDIR;
  607. lfs_file_open(&lfs, &file, "potato",
  608. LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR;
  609. lfs_mkdir(&lfs, "/") => LFS_ERR_EXIST;
  610. lfs_file_open(&lfs, &file, "/",
  611. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_EXIST;
  612. lfs_file_open(&lfs, &file, "/", LFS_O_RDONLY) => LFS_ERR_ISDIR;
  613. lfs_file_open(&lfs, &file, "/", LFS_O_WRONLY) => LFS_ERR_ISDIR;
  614. lfs_file_open(&lfs, &file, "/",
  615. LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR;
  616. // check that errors did not corrupt directory
  617. lfs_dir_open(&lfs, &dir, "/") => 0;
  618. lfs_dir_read(&lfs, &dir, &info) => 1;
  619. assert(info.type == LFS_TYPE_DIR);
  620. assert(strcmp(info.name, ".") == 0);
  621. lfs_dir_read(&lfs, &dir, &info) => 1;
  622. assert(info.type == LFS_TYPE_DIR);
  623. assert(strcmp(info.name, "..") == 0);
  624. lfs_dir_read(&lfs, &dir, &info) => 1;
  625. assert(info.type == LFS_TYPE_REG);
  626. assert(strcmp(info.name, "burito") == 0);
  627. lfs_dir_read(&lfs, &dir, &info) => 1;
  628. assert(info.type == LFS_TYPE_DIR);
  629. assert(strcmp(info.name, "potato") == 0);
  630. lfs_dir_read(&lfs, &dir, &info) => 0;
  631. lfs_dir_close(&lfs, &dir) => 0;
  632. lfs_unmount(&lfs) => 0;
  633. // or on disk
  634. lfs_mount(&lfs, &cfg) => 0;
  635. lfs_dir_open(&lfs, &dir, "/") => 0;
  636. lfs_dir_read(&lfs, &dir, &info) => 1;
  637. assert(info.type == LFS_TYPE_DIR);
  638. assert(strcmp(info.name, ".") == 0);
  639. lfs_dir_read(&lfs, &dir, &info) => 1;
  640. assert(info.type == LFS_TYPE_DIR);
  641. assert(strcmp(info.name, "..") == 0);
  642. lfs_dir_read(&lfs, &dir, &info) => 1;
  643. assert(info.type == LFS_TYPE_REG);
  644. assert(strcmp(info.name, "burito") == 0);
  645. lfs_dir_read(&lfs, &dir, &info) => 1;
  646. assert(info.type == LFS_TYPE_DIR);
  647. assert(strcmp(info.name, "potato") == 0);
  648. lfs_dir_read(&lfs, &dir, &info) => 0;
  649. lfs_dir_close(&lfs, &dir) => 0;
  650. lfs_unmount(&lfs) => 0;
  651. '''
  652. [[case]] # directory seek
  653. code = '''
  654. lfs_format(&lfs, &cfg) => 0;
  655. lfs_mount(&lfs, &cfg) => 0;
  656. lfs_mkdir(&lfs, "hello") => 0;
  657. for (int i = 0; i < COUNT; i++) {
  658. sprintf(path, "hello/kitty%03d", i);
  659. lfs_mkdir(&lfs, path) => 0;
  660. }
  661. lfs_unmount(&lfs) => 0;
  662. for (int j = 2; j < COUNT; j++) {
  663. lfs_mount(&lfs, &cfg) => 0;
  664. lfs_dir_open(&lfs, &dir, "hello") => 0;
  665. lfs_dir_read(&lfs, &dir, &info) => 1;
  666. assert(strcmp(info.name, ".") == 0);
  667. assert(info.type == LFS_TYPE_DIR);
  668. lfs_dir_read(&lfs, &dir, &info) => 1;
  669. assert(strcmp(info.name, "..") == 0);
  670. assert(info.type == LFS_TYPE_DIR);
  671. lfs_soff_t pos;
  672. for (int i = 0; i < j; i++) {
  673. sprintf(path, "kitty%03d", i);
  674. lfs_dir_read(&lfs, &dir, &info) => 1;
  675. assert(strcmp(info.name, path) == 0);
  676. assert(info.type == LFS_TYPE_DIR);
  677. pos = lfs_dir_tell(&lfs, &dir);
  678. assert(pos >= 0);
  679. }
  680. lfs_dir_seek(&lfs, &dir, pos) => 0;
  681. sprintf(path, "kitty%03d", j);
  682. lfs_dir_read(&lfs, &dir, &info) => 1;
  683. assert(strcmp(info.name, path) == 0);
  684. assert(info.type == LFS_TYPE_DIR);
  685. lfs_dir_rewind(&lfs, &dir) => 0;
  686. sprintf(path, "kitty%03d", 0);
  687. lfs_dir_read(&lfs, &dir, &info) => 1;
  688. assert(strcmp(info.name, ".") == 0);
  689. assert(info.type == LFS_TYPE_DIR);
  690. lfs_dir_read(&lfs, &dir, &info) => 1;
  691. assert(strcmp(info.name, "..") == 0);
  692. assert(info.type == LFS_TYPE_DIR);
  693. lfs_dir_read(&lfs, &dir, &info) => 1;
  694. assert(strcmp(info.name, path) == 0);
  695. assert(info.type == LFS_TYPE_DIR);
  696. lfs_dir_seek(&lfs, &dir, pos) => 0;
  697. sprintf(path, "kitty%03d", j);
  698. lfs_dir_read(&lfs, &dir, &info) => 1;
  699. assert(strcmp(info.name, path) == 0);
  700. assert(info.type == LFS_TYPE_DIR);
  701. lfs_dir_close(&lfs, &dir) => 0;
  702. lfs_unmount(&lfs) => 0;
  703. }
  704. '''
  705. define.COUNT = [4, 128, 132]
  706. [[case]] # root seek
  707. code = '''
  708. lfs_format(&lfs, &cfg) => 0;
  709. lfs_mount(&lfs, &cfg) => 0;
  710. for (int i = 0; i < COUNT; i++) {
  711. sprintf(path, "hi%03d", i);
  712. lfs_mkdir(&lfs, path) => 0;
  713. }
  714. lfs_unmount(&lfs) => 0;
  715. for (int j = 2; j < COUNT; j++) {
  716. lfs_mount(&lfs, &cfg) => 0;
  717. lfs_dir_open(&lfs, &dir, "/") => 0;
  718. lfs_dir_read(&lfs, &dir, &info) => 1;
  719. assert(strcmp(info.name, ".") == 0);
  720. assert(info.type == LFS_TYPE_DIR);
  721. lfs_dir_read(&lfs, &dir, &info) => 1;
  722. assert(strcmp(info.name, "..") == 0);
  723. assert(info.type == LFS_TYPE_DIR);
  724. lfs_soff_t pos;
  725. for (int i = 0; i < j; i++) {
  726. sprintf(path, "hi%03d", i);
  727. lfs_dir_read(&lfs, &dir, &info) => 1;
  728. assert(strcmp(info.name, path) == 0);
  729. assert(info.type == LFS_TYPE_DIR);
  730. pos = lfs_dir_tell(&lfs, &dir);
  731. assert(pos >= 0);
  732. }
  733. lfs_dir_seek(&lfs, &dir, pos) => 0;
  734. sprintf(path, "hi%03d", j);
  735. lfs_dir_read(&lfs, &dir, &info) => 1;
  736. assert(strcmp(info.name, path) == 0);
  737. assert(info.type == LFS_TYPE_DIR);
  738. lfs_dir_rewind(&lfs, &dir) => 0;
  739. sprintf(path, "hi%03d", 0);
  740. lfs_dir_read(&lfs, &dir, &info) => 1;
  741. assert(strcmp(info.name, ".") == 0);
  742. assert(info.type == LFS_TYPE_DIR);
  743. lfs_dir_read(&lfs, &dir, &info) => 1;
  744. assert(strcmp(info.name, "..") == 0);
  745. assert(info.type == LFS_TYPE_DIR);
  746. lfs_dir_read(&lfs, &dir, &info) => 1;
  747. assert(strcmp(info.name, path) == 0);
  748. assert(info.type == LFS_TYPE_DIR);
  749. lfs_dir_seek(&lfs, &dir, pos) => 0;
  750. sprintf(path, "hi%03d", j);
  751. lfs_dir_read(&lfs, &dir, &info) => 1;
  752. assert(strcmp(info.name, path) == 0);
  753. assert(info.type == LFS_TYPE_DIR);
  754. lfs_dir_close(&lfs, &dir) => 0;
  755. lfs_unmount(&lfs) => 0;
  756. }
  757. '''
  758. define.COUNT = [4, 128, 132]