test_superblocks.toml 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. # simple formatting test
  2. [cases.test_superblocks_format]
  3. code = '''
  4. lfs_t lfs;
  5. lfs_format(&lfs, cfg) => 0;
  6. '''
  7. # formatting from interpretting a previous superblock block_count
  8. [cases.test_superblocks_format_unknown_block_count]
  9. code = '''
  10. lfs_t lfs;
  11. lfs_format(&lfs, cfg) => 0;
  12. assert(lfs.block_count == cfg->block_count);
  13. memset(&lfs, 0, sizeof(lfs));
  14. struct lfs_config tweaked_cfg = *cfg;
  15. tweaked_cfg.block_count = 0;
  16. lfs_format(&lfs, &tweaked_cfg) => 0;
  17. assert(lfs.block_count == cfg->block_count);
  18. '''
  19. # mount/unmount
  20. [cases.test_superblocks_mount]
  21. code = '''
  22. lfs_t lfs;
  23. lfs_format(&lfs, cfg) => 0;
  24. lfs_mount(&lfs, cfg) => 0;
  25. lfs_unmount(&lfs) => 0;
  26. '''
  27. # mount/unmount from interpretting a previous superblock block_count
  28. [cases.test_superblocks_mount_unknown_block_count]
  29. code = '''
  30. lfs_t lfs;
  31. lfs_format(&lfs, cfg) => 0;
  32. memset(&lfs, 0, sizeof(lfs));
  33. struct lfs_config tweaked_cfg = *cfg;
  34. tweaked_cfg.block_count = 0;
  35. lfs_mount(&lfs, &tweaked_cfg) => 0;
  36. assert(lfs.block_count == cfg->block_count);
  37. '''
  38. # reentrant format
  39. [cases.test_superblocks_reentrant_format]
  40. reentrant = true
  41. code = '''
  42. lfs_t lfs;
  43. int err = lfs_mount(&lfs, cfg);
  44. if (err) {
  45. lfs_format(&lfs, cfg) => 0;
  46. lfs_mount(&lfs, cfg) => 0;
  47. }
  48. lfs_unmount(&lfs) => 0;
  49. '''
  50. # invalid mount
  51. [cases.test_superblocks_invalid_mount]
  52. code = '''
  53. lfs_t lfs;
  54. lfs_mount(&lfs, cfg) => LFS_ERR_CORRUPT;
  55. '''
  56. # test we can read superblock info through lfs_fs_stat
  57. [cases.test_superblocks_stat]
  58. if = 'DISK_VERSION == 0'
  59. code = '''
  60. lfs_t lfs;
  61. lfs_format(&lfs, cfg) => 0;
  62. // test we can mount and read fsinfo
  63. lfs_mount(&lfs, cfg) => 0;
  64. struct lfs_fsinfo fsinfo;
  65. lfs_fs_stat(&lfs, &fsinfo) => 0;
  66. assert(fsinfo.disk_version == LFS_DISK_VERSION);
  67. assert(fsinfo.name_max == LFS_NAME_MAX);
  68. assert(fsinfo.file_max == LFS_FILE_MAX);
  69. assert(fsinfo.attr_max == LFS_ATTR_MAX);
  70. lfs_unmount(&lfs) => 0;
  71. '''
  72. [cases.test_superblocks_stat_tweaked]
  73. if = 'DISK_VERSION == 0'
  74. defines.TWEAKED_NAME_MAX = 63
  75. defines.TWEAKED_FILE_MAX = '(1 << 16)-1'
  76. defines.TWEAKED_ATTR_MAX = 512
  77. code = '''
  78. // create filesystem with tweaked params
  79. struct lfs_config tweaked_cfg = *cfg;
  80. tweaked_cfg.name_max = TWEAKED_NAME_MAX;
  81. tweaked_cfg.file_max = TWEAKED_FILE_MAX;
  82. tweaked_cfg.attr_max = TWEAKED_ATTR_MAX;
  83. lfs_t lfs;
  84. lfs_format(&lfs, &tweaked_cfg) => 0;
  85. // test we can mount and read these params with the original config
  86. lfs_mount(&lfs, cfg) => 0;
  87. struct lfs_fsinfo fsinfo;
  88. lfs_fs_stat(&lfs, &fsinfo) => 0;
  89. assert(fsinfo.disk_version == LFS_DISK_VERSION);
  90. assert(fsinfo.name_max == TWEAKED_NAME_MAX);
  91. assert(fsinfo.file_max == TWEAKED_FILE_MAX);
  92. assert(fsinfo.attr_max == TWEAKED_ATTR_MAX);
  93. lfs_unmount(&lfs) => 0;
  94. '''
  95. # expanding superblock
  96. [cases.test_superblocks_expand]
  97. defines.BLOCK_CYCLES = [32, 33, 1]
  98. defines.N = [10, 100, 1000]
  99. code = '''
  100. lfs_t lfs;
  101. lfs_format(&lfs, cfg) => 0;
  102. lfs_mount(&lfs, cfg) => 0;
  103. for (int i = 0; i < N; i++) {
  104. lfs_file_t file;
  105. lfs_file_open(&lfs, &file, "dummy",
  106. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  107. lfs_file_close(&lfs, &file) => 0;
  108. struct lfs_info info;
  109. lfs_stat(&lfs, "dummy", &info) => 0;
  110. assert(strcmp(info.name, "dummy") == 0);
  111. assert(info.type == LFS_TYPE_REG);
  112. lfs_remove(&lfs, "dummy") => 0;
  113. }
  114. lfs_unmount(&lfs) => 0;
  115. // one last check after power-cycle
  116. lfs_mount(&lfs, cfg) => 0;
  117. lfs_file_t file;
  118. lfs_file_open(&lfs, &file, "dummy",
  119. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  120. lfs_file_close(&lfs, &file) => 0;
  121. struct lfs_info info;
  122. lfs_stat(&lfs, "dummy", &info) => 0;
  123. assert(strcmp(info.name, "dummy") == 0);
  124. assert(info.type == LFS_TYPE_REG);
  125. lfs_unmount(&lfs) => 0;
  126. '''
  127. # expanding superblock with power cycle
  128. [cases.test_superblocks_expand_power_cycle]
  129. defines.BLOCK_CYCLES = [32, 33, 1]
  130. defines.N = [10, 100, 1000]
  131. code = '''
  132. lfs_t lfs;
  133. lfs_format(&lfs, cfg) => 0;
  134. for (int i = 0; i < N; i++) {
  135. lfs_mount(&lfs, cfg) => 0;
  136. // remove lingering dummy?
  137. struct lfs_info info;
  138. int err = lfs_stat(&lfs, "dummy", &info);
  139. assert(err == 0 || (err == LFS_ERR_NOENT && i == 0));
  140. if (!err) {
  141. assert(strcmp(info.name, "dummy") == 0);
  142. assert(info.type == LFS_TYPE_REG);
  143. lfs_remove(&lfs, "dummy") => 0;
  144. }
  145. lfs_file_t file;
  146. lfs_file_open(&lfs, &file, "dummy",
  147. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  148. lfs_file_close(&lfs, &file) => 0;
  149. lfs_stat(&lfs, "dummy", &info) => 0;
  150. assert(strcmp(info.name, "dummy") == 0);
  151. assert(info.type == LFS_TYPE_REG);
  152. lfs_unmount(&lfs) => 0;
  153. }
  154. // one last check after power-cycle
  155. lfs_mount(&lfs, cfg) => 0;
  156. struct lfs_info info;
  157. lfs_stat(&lfs, "dummy", &info) => 0;
  158. assert(strcmp(info.name, "dummy") == 0);
  159. assert(info.type == LFS_TYPE_REG);
  160. lfs_unmount(&lfs) => 0;
  161. '''
  162. # reentrant expanding superblock
  163. [cases.test_superblocks_reentrant_expand]
  164. defines.BLOCK_CYCLES = [2, 1]
  165. defines.N = 24
  166. reentrant = true
  167. code = '''
  168. lfs_t lfs;
  169. int err = lfs_mount(&lfs, cfg);
  170. if (err) {
  171. lfs_format(&lfs, cfg) => 0;
  172. lfs_mount(&lfs, cfg) => 0;
  173. }
  174. for (int i = 0; i < N; i++) {
  175. // remove lingering dummy?
  176. struct lfs_info info;
  177. err = lfs_stat(&lfs, "dummy", &info);
  178. assert(err == 0 || (err == LFS_ERR_NOENT && i == 0));
  179. if (!err) {
  180. assert(strcmp(info.name, "dummy") == 0);
  181. assert(info.type == LFS_TYPE_REG);
  182. lfs_remove(&lfs, "dummy") => 0;
  183. }
  184. lfs_file_t file;
  185. lfs_file_open(&lfs, &file, "dummy",
  186. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  187. lfs_file_close(&lfs, &file) => 0;
  188. lfs_stat(&lfs, "dummy", &info) => 0;
  189. assert(strcmp(info.name, "dummy") == 0);
  190. assert(info.type == LFS_TYPE_REG);
  191. }
  192. lfs_unmount(&lfs) => 0;
  193. // one last check after power-cycle
  194. lfs_mount(&lfs, cfg) => 0;
  195. struct lfs_info info;
  196. lfs_stat(&lfs, "dummy", &info) => 0;
  197. assert(strcmp(info.name, "dummy") == 0);
  198. assert(info.type == LFS_TYPE_REG);
  199. lfs_unmount(&lfs) => 0;
  200. '''