test_superblocks.toml 5.5 KB

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