test_interspersed.toml 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. [[case]] # interspersed file test
  2. define.SIZE = [10, 100]
  3. define.FILES = [4, 10, 26]
  4. code = '''
  5. lfs_file_t files[FILES];
  6. const char alphas[] = "abcdefghijklmnopqrstuvwxyz";
  7. lfs_format(&lfs, &cfg) => 0;
  8. lfs_mount(&lfs, &cfg) => 0;
  9. for (int j = 0; j < FILES; j++) {
  10. sprintf(path, "%c", alphas[j]);
  11. lfs_file_open(&lfs, &files[j], path,
  12. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  13. }
  14. for (int i = 0; i < SIZE; i++) {
  15. for (int j = 0; j < FILES; j++) {
  16. lfs_file_write(&lfs, &files[j], &alphas[j], 1) => 1;
  17. }
  18. }
  19. for (int j = 0; j < FILES; j++) {
  20. lfs_file_close(&lfs, &files[j]);
  21. }
  22. lfs_dir_open(&lfs, &dir, "/") => 0;
  23. lfs_dir_read(&lfs, &dir, &info) => 1;
  24. assert(strcmp(info.name, ".") == 0);
  25. assert(info.type == LFS_TYPE_DIR);
  26. lfs_dir_read(&lfs, &dir, &info) => 1;
  27. assert(strcmp(info.name, "..") == 0);
  28. assert(info.type == LFS_TYPE_DIR);
  29. for (int j = 0; j < FILES; j++) {
  30. sprintf(path, "%c", alphas[j]);
  31. lfs_dir_read(&lfs, &dir, &info) => 1;
  32. assert(strcmp(info.name, path) == 0);
  33. assert(info.type == LFS_TYPE_REG);
  34. assert(info.size == SIZE);
  35. }
  36. lfs_dir_read(&lfs, &dir, &info) => 0;
  37. lfs_dir_close(&lfs, &dir) => 0;
  38. for (int j = 0; j < FILES; j++) {
  39. sprintf(path, "%c", alphas[j]);
  40. lfs_file_open(&lfs, &files[j], path, LFS_O_RDONLY) => 0;
  41. }
  42. for (int i = 0; i < 10; i++) {
  43. for (int j = 0; j < FILES; j++) {
  44. lfs_file_read(&lfs, &files[j], buffer, 1) => 1;
  45. assert(buffer[0] == alphas[j]);
  46. }
  47. }
  48. for (int j = 0; j < FILES; j++) {
  49. lfs_file_close(&lfs, &files[j]);
  50. }
  51. lfs_unmount(&lfs) => 0;
  52. '''
  53. [[case]] # interspersed remove file test
  54. define.SIZE = [10, 100]
  55. define.FILES = [4, 10, 26]
  56. code = '''
  57. const char alphas[] = "abcdefghijklmnopqrstuvwxyz";
  58. lfs_format(&lfs, &cfg) => 0;
  59. lfs_mount(&lfs, &cfg) => 0;
  60. for (int j = 0; j < FILES; j++) {
  61. sprintf(path, "%c", alphas[j]);
  62. lfs_file_open(&lfs, &file, path,
  63. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  64. for (int i = 0; i < SIZE; i++) {
  65. lfs_file_write(&lfs, &file, &alphas[j], 1) => 1;
  66. }
  67. lfs_file_close(&lfs, &file);
  68. }
  69. lfs_unmount(&lfs) => 0;
  70. lfs_mount(&lfs, &cfg) => 0;
  71. lfs_file_open(&lfs, &file, "zzz", LFS_O_WRONLY | LFS_O_CREAT) => 0;
  72. for (int j = 0; j < FILES; j++) {
  73. lfs_file_write(&lfs, &file, (const void*)"~", 1) => 1;
  74. lfs_file_sync(&lfs, &file) => 0;
  75. sprintf(path, "%c", alphas[j]);
  76. lfs_remove(&lfs, path) => 0;
  77. }
  78. lfs_file_close(&lfs, &file);
  79. lfs_dir_open(&lfs, &dir, "/") => 0;
  80. lfs_dir_read(&lfs, &dir, &info) => 1;
  81. assert(strcmp(info.name, ".") == 0);
  82. assert(info.type == LFS_TYPE_DIR);
  83. lfs_dir_read(&lfs, &dir, &info) => 1;
  84. assert(strcmp(info.name, "..") == 0);
  85. assert(info.type == LFS_TYPE_DIR);
  86. lfs_dir_read(&lfs, &dir, &info) => 1;
  87. assert(strcmp(info.name, "zzz") == 0);
  88. assert(info.type == LFS_TYPE_REG);
  89. assert(info.size == FILES);
  90. lfs_dir_read(&lfs, &dir, &info) => 0;
  91. lfs_dir_close(&lfs, &dir) => 0;
  92. lfs_file_open(&lfs, &file, "zzz", LFS_O_RDONLY) => 0;
  93. for (int i = 0; i < FILES; i++) {
  94. lfs_file_read(&lfs, &file, buffer, 1) => 1;
  95. assert(buffer[0] == '~');
  96. }
  97. lfs_file_close(&lfs, &file);
  98. lfs_unmount(&lfs) => 0;
  99. '''
  100. [[case]] # remove inconveniently test
  101. define.SIZE = [10, 100]
  102. code = '''
  103. lfs_format(&lfs, &cfg) => 0;
  104. lfs_mount(&lfs, &cfg) => 0;
  105. lfs_file_t files[3];
  106. lfs_file_open(&lfs, &files[0], "e", LFS_O_WRONLY | LFS_O_CREAT) => 0;
  107. lfs_file_open(&lfs, &files[1], "f", LFS_O_WRONLY | LFS_O_CREAT) => 0;
  108. lfs_file_open(&lfs, &files[2], "g", LFS_O_WRONLY | LFS_O_CREAT) => 0;
  109. for (int i = 0; i < SIZE/2; i++) {
  110. lfs_file_write(&lfs, &files[0], (const void*)"e", 1) => 1;
  111. lfs_file_write(&lfs, &files[1], (const void*)"f", 1) => 1;
  112. lfs_file_write(&lfs, &files[2], (const void*)"g", 1) => 1;
  113. }
  114. lfs_remove(&lfs, "f") => 0;
  115. for (int i = 0; i < SIZE/2; i++) {
  116. lfs_file_write(&lfs, &files[0], (const void*)"e", 1) => 1;
  117. lfs_file_write(&lfs, &files[1], (const void*)"f", 1) => 1;
  118. lfs_file_write(&lfs, &files[2], (const void*)"g", 1) => 1;
  119. }
  120. lfs_file_close(&lfs, &files[0]);
  121. lfs_file_close(&lfs, &files[1]);
  122. lfs_file_close(&lfs, &files[2]);
  123. lfs_dir_open(&lfs, &dir, "/") => 0;
  124. lfs_dir_read(&lfs, &dir, &info) => 1;
  125. assert(strcmp(info.name, ".") == 0);
  126. assert(info.type == LFS_TYPE_DIR);
  127. lfs_dir_read(&lfs, &dir, &info) => 1;
  128. assert(strcmp(info.name, "..") == 0);
  129. assert(info.type == LFS_TYPE_DIR);
  130. lfs_dir_read(&lfs, &dir, &info) => 1;
  131. assert(strcmp(info.name, "e") == 0);
  132. assert(info.type == LFS_TYPE_REG);
  133. assert(info.size == SIZE);
  134. lfs_dir_read(&lfs, &dir, &info) => 1;
  135. assert(strcmp(info.name, "g") == 0);
  136. assert(info.type == LFS_TYPE_REG);
  137. assert(info.size == SIZE);
  138. lfs_dir_read(&lfs, &dir, &info) => 0;
  139. lfs_dir_close(&lfs, &dir) => 0;
  140. lfs_file_open(&lfs, &files[0], "e", LFS_O_RDONLY) => 0;
  141. lfs_file_open(&lfs, &files[1], "g", LFS_O_RDONLY) => 0;
  142. for (int i = 0; i < SIZE; i++) {
  143. lfs_file_read(&lfs, &files[0], buffer, 1) => 1;
  144. assert(buffer[0] == 'e');
  145. lfs_file_read(&lfs, &files[1], buffer, 1) => 1;
  146. assert(buffer[0] == 'g');
  147. }
  148. lfs_file_close(&lfs, &files[0]);
  149. lfs_file_close(&lfs, &files[1]);
  150. lfs_unmount(&lfs) => 0;
  151. '''
  152. [[case]] # reentrant interspersed file test
  153. define.SIZE = [10, 100]
  154. define.FILES = [4, 10, 26]
  155. reentrant = true
  156. code = '''
  157. lfs_file_t files[FILES];
  158. const char alphas[] = "abcdefghijklmnopqrstuvwxyz";
  159. err = lfs_mount(&lfs, &cfg);
  160. if (err) {
  161. lfs_format(&lfs, &cfg) => 0;
  162. lfs_mount(&lfs, &cfg) => 0;
  163. }
  164. for (int j = 0; j < FILES; j++) {
  165. sprintf(path, "%c", alphas[j]);
  166. lfs_file_open(&lfs, &files[j], path,
  167. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  168. }
  169. for (int i = 0; i < SIZE; i++) {
  170. for (int j = 0; j < FILES; j++) {
  171. size = lfs_file_size(&lfs, &files[j]);
  172. assert((int)size >= 0);
  173. if ((int)size <= i) {
  174. lfs_file_write(&lfs, &files[j], &alphas[j], 1) => 1;
  175. lfs_file_sync(&lfs, &files[j]) => 0;
  176. }
  177. }
  178. }
  179. for (int j = 0; j < FILES; j++) {
  180. lfs_file_close(&lfs, &files[j]);
  181. }
  182. lfs_dir_open(&lfs, &dir, "/") => 0;
  183. lfs_dir_read(&lfs, &dir, &info) => 1;
  184. assert(strcmp(info.name, ".") == 0);
  185. assert(info.type == LFS_TYPE_DIR);
  186. lfs_dir_read(&lfs, &dir, &info) => 1;
  187. assert(strcmp(info.name, "..") == 0);
  188. assert(info.type == LFS_TYPE_DIR);
  189. for (int j = 0; j < FILES; j++) {
  190. sprintf(path, "%c", alphas[j]);
  191. lfs_dir_read(&lfs, &dir, &info) => 1;
  192. assert(strcmp(info.name, path) == 0);
  193. assert(info.type == LFS_TYPE_REG);
  194. assert(info.size == SIZE);
  195. }
  196. lfs_dir_read(&lfs, &dir, &info) => 0;
  197. lfs_dir_close(&lfs, &dir) => 0;
  198. for (int j = 0; j < FILES; j++) {
  199. sprintf(path, "%c", alphas[j]);
  200. lfs_file_open(&lfs, &files[j], path, LFS_O_RDONLY) => 0;
  201. }
  202. for (int i = 0; i < 10; i++) {
  203. for (int j = 0; j < FILES; j++) {
  204. lfs_file_read(&lfs, &files[j], buffer, 1) => 1;
  205. assert(buffer[0] == alphas[j]);
  206. }
  207. }
  208. for (int j = 0; j < FILES; j++) {
  209. lfs_file_close(&lfs, &files[j]);
  210. }
  211. lfs_unmount(&lfs) => 0;
  212. '''