test_files.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #!/bin/bash
  2. set -eu
  3. export TEST_FILE=$0
  4. trap 'export TEST_LINE=$LINENO' DEBUG
  5. echo "=== File tests ==="
  6. SMALLSIZE=32
  7. MEDIUMSIZE=8192
  8. LARGESIZE=262144
  9. rm -rf blocks
  10. scripts/test.py << TEST
  11. lfs_format(&lfs, &cfg) => 0;
  12. TEST
  13. echo "--- Simple file test ---"
  14. scripts/test.py << TEST
  15. lfs_mount(&lfs, &cfg) => 0;
  16. lfs_file_open(&lfs, &file, "hello", LFS_O_WRONLY | LFS_O_CREAT) => 0;
  17. lfs_size_t size = strlen("Hello World!\n");
  18. uint8_t wbuffer[1024];
  19. memcpy(wbuffer, "Hello World!\n", size);
  20. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  21. lfs_file_close(&lfs, &file) => 0;
  22. lfs_file_open(&lfs, &file, "hello", LFS_O_RDONLY) => 0;
  23. size = strlen("Hello World!\n");
  24. uint8_t rbuffer[1024];
  25. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  26. memcmp(rbuffer, wbuffer, size) => 0;
  27. lfs_file_close(&lfs, &file) => 0;
  28. lfs_unmount(&lfs) => 0;
  29. TEST
  30. w_test() {
  31. scripts/test.py ${4:-} << TEST
  32. lfs_size_t size = $1;
  33. lfs_size_t chunk = 31;
  34. srand(0);
  35. lfs_mount(&lfs, &cfg) => 0;
  36. lfs_file_open(&lfs, &file, "$2",
  37. ${3:-LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC}) => 0;
  38. for (lfs_size_t i = 0; i < size; i += chunk) {
  39. chunk = (chunk < size - i) ? chunk : size - i;
  40. for (lfs_size_t b = 0; b < chunk; b++) {
  41. buffer[b] = rand() & 0xff;
  42. }
  43. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  44. }
  45. lfs_file_close(&lfs, &file) => 0;
  46. lfs_unmount(&lfs) => 0;
  47. TEST
  48. }
  49. r_test() {
  50. scripts/test.py << TEST
  51. lfs_size_t size = $1;
  52. lfs_size_t chunk = 29;
  53. srand(0);
  54. lfs_mount(&lfs, &cfg) => 0;
  55. lfs_stat(&lfs, "$2", &info) => 0;
  56. info.type => LFS_TYPE_REG;
  57. info.size => size;
  58. lfs_file_open(&lfs, &file, "$2", ${3:-LFS_O_RDONLY}) => 0;
  59. for (lfs_size_t i = 0; i < size; i += chunk) {
  60. chunk = (chunk < size - i) ? chunk : size - i;
  61. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  62. for (lfs_size_t b = 0; b < chunk && i+b < size; b++) {
  63. buffer[b] => rand() & 0xff;
  64. }
  65. }
  66. lfs_file_close(&lfs, &file) => 0;
  67. lfs_unmount(&lfs) => 0;
  68. TEST
  69. }
  70. echo "--- Small file test ---"
  71. w_test $SMALLSIZE smallavacado
  72. r_test $SMALLSIZE smallavacado
  73. echo "--- Medium file test ---"
  74. w_test $MEDIUMSIZE mediumavacado
  75. r_test $MEDIUMSIZE mediumavacado
  76. echo "--- Large file test ---"
  77. w_test $LARGESIZE largeavacado
  78. r_test $LARGESIZE largeavacado
  79. echo "--- Zero file test ---"
  80. w_test 0 noavacado
  81. r_test 0 noavacado
  82. echo "--- Truncate small test ---"
  83. w_test $SMALLSIZE mediumavacado
  84. r_test $SMALLSIZE mediumavacado
  85. w_test $MEDIUMSIZE mediumavacado
  86. r_test $MEDIUMSIZE mediumavacado
  87. echo "--- Truncate zero test ---"
  88. w_test $SMALLSIZE noavacado
  89. r_test $SMALLSIZE noavacado
  90. w_test 0 noavacado
  91. r_test 0 noavacado
  92. echo "--- Non-overlap check ---"
  93. r_test $SMALLSIZE smallavacado
  94. r_test $MEDIUMSIZE mediumavacado
  95. r_test $LARGESIZE largeavacado
  96. r_test 0 noavacado
  97. echo "--- Dir check ---"
  98. scripts/test.py << TEST
  99. lfs_mount(&lfs, &cfg) => 0;
  100. lfs_dir_open(&lfs, &dir, "/") => 0;
  101. lfs_dir_read(&lfs, &dir, &info) => 1;
  102. lfs_dir_read(&lfs, &dir, &info) => 1;
  103. lfs_dir_read(&lfs, &dir, &info) => 1;
  104. strcmp(info.name, "hello") => 0;
  105. info.type => LFS_TYPE_REG;
  106. info.size => strlen("Hello World!\n");
  107. lfs_dir_read(&lfs, &dir, &info) => 1;
  108. strcmp(info.name, "largeavacado") => 0;
  109. info.type => LFS_TYPE_REG;
  110. info.size => $LARGESIZE;
  111. lfs_dir_read(&lfs, &dir, &info) => 1;
  112. strcmp(info.name, "mediumavacado") => 0;
  113. info.type => LFS_TYPE_REG;
  114. info.size => $MEDIUMSIZE;
  115. lfs_dir_read(&lfs, &dir, &info) => 1;
  116. strcmp(info.name, "noavacado") => 0;
  117. info.type => LFS_TYPE_REG;
  118. info.size => 0;
  119. lfs_dir_read(&lfs, &dir, &info) => 1;
  120. strcmp(info.name, "smallavacado") => 0;
  121. info.type => LFS_TYPE_REG;
  122. info.size => $SMALLSIZE;
  123. lfs_dir_read(&lfs, &dir, &info) => 0;
  124. lfs_dir_close(&lfs, &dir) => 0;
  125. lfs_unmount(&lfs) => 0;
  126. TEST
  127. echo "--- Many files test ---"
  128. scripts/test.py << TEST
  129. lfs_format(&lfs, &cfg) => 0;
  130. TEST
  131. scripts/test.py << TEST
  132. // Create 300 files of 7 bytes
  133. lfs_mount(&lfs, &cfg) => 0;
  134. for (unsigned i = 0; i < 300; i++) {
  135. sprintf(path, "file_%03d", i);
  136. lfs_file_open(&lfs, &file, path,
  137. LFS_O_RDWR | LFS_O_CREAT | LFS_O_EXCL) => 0;
  138. lfs_size_t size = 7;
  139. uint8_t wbuffer[1024];
  140. uint8_t rbuffer[1024];
  141. snprintf((char*)wbuffer, size, "Hi %03d", i);
  142. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  143. lfs_file_rewind(&lfs, &file) => 0;
  144. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  145. memcmp(wbuffer, rbuffer, size) => 0;
  146. lfs_file_close(&lfs, &file) => 0;
  147. }
  148. lfs_unmount(&lfs) => 0;
  149. TEST
  150. echo "--- Many files with flush test ---"
  151. scripts/test.py << TEST
  152. lfs_format(&lfs, &cfg) => 0;
  153. TEST
  154. scripts/test.py << TEST
  155. // Create 300 files of 7 bytes
  156. lfs_mount(&lfs, &cfg) => 0;
  157. for (unsigned i = 0; i < 300; i++) {
  158. sprintf(path, "file_%03d", i);
  159. lfs_file_open(&lfs, &file, path,
  160. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  161. lfs_size_t size = 7;
  162. uint8_t wbuffer[1024];
  163. uint8_t rbuffer[1024];
  164. snprintf((char*)wbuffer, size, "Hi %03d", i);
  165. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  166. lfs_file_close(&lfs, &file) => 0;
  167. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  168. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  169. memcmp(wbuffer, rbuffer, size) => 0;
  170. lfs_file_close(&lfs, &file) => 0;
  171. }
  172. lfs_unmount(&lfs) => 0;
  173. TEST
  174. echo "--- Many files with power cycle test ---"
  175. scripts/test.py << TEST
  176. lfs_format(&lfs, &cfg) => 0;
  177. TEST
  178. scripts/test.py << TEST
  179. // Create 300 files of 7 bytes
  180. lfs_mount(&lfs, &cfg) => 0;
  181. for (unsigned i = 0; i < 300; i++) {
  182. sprintf(path, "file_%03d", i);
  183. lfs_file_open(&lfs, &file, path,
  184. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  185. lfs_size_t size = 7;
  186. uint8_t wbuffer[1024];
  187. uint8_t rbuffer[1024];
  188. snprintf((char*)wbuffer, size, "Hi %03d", i);
  189. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  190. lfs_file_close(&lfs, &file) => 0;
  191. lfs_unmount(&lfs) => 0;
  192. lfs_mount(&lfs, &cfg) => 0;
  193. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  194. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  195. memcmp(wbuffer, rbuffer, size) => 0;
  196. lfs_file_close(&lfs, &file) => 0;
  197. }
  198. lfs_unmount(&lfs) => 0;
  199. TEST
  200. scripts/results.py