test_powerloss.toml 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # There are already a number of tests that test general operations under
  2. # power-loss (see the reentrant attribute). These tests are for explicitly
  3. # testing specific corner cases.
  4. # only a revision count
  5. [cases.test_powerloss_only_rev]
  6. code = '''
  7. lfs_t lfs;
  8. lfs_format(&lfs, cfg) => 0;
  9. lfs_mount(&lfs, cfg) => 0;
  10. lfs_mkdir(&lfs, "notebook") => 0;
  11. lfs_file_t file;
  12. lfs_file_open(&lfs, &file, "notebook/paper",
  13. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  14. char buffer[256];
  15. strcpy(buffer, "hello");
  16. lfs_size_t size = strlen("hello");
  17. for (int i = 0; i < 5; i++) {
  18. lfs_file_write(&lfs, &file, buffer, size) => size;
  19. lfs_file_sync(&lfs, &file) => 0;
  20. }
  21. lfs_file_close(&lfs, &file) => 0;
  22. char rbuffer[256];
  23. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  24. for (int i = 0; i < 5; i++) {
  25. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  26. assert(memcmp(rbuffer, buffer, size) == 0);
  27. }
  28. lfs_file_close(&lfs, &file) => 0;
  29. lfs_unmount(&lfs) => 0;
  30. // get pair/rev count
  31. lfs_mount(&lfs, cfg) => 0;
  32. lfs_dir_t dir;
  33. lfs_dir_open(&lfs, &dir, "notebook") => 0;
  34. lfs_block_t pair[2] = {dir.m.pair[0], dir.m.pair[1]};
  35. uint32_t rev = dir.m.rev;
  36. lfs_dir_close(&lfs, &dir) => 0;
  37. lfs_unmount(&lfs) => 0;
  38. // write just the revision count
  39. uint8_t bbuffer[BLOCK_SIZE];
  40. cfg->read(cfg, pair[1], 0, bbuffer, BLOCK_SIZE) => 0;
  41. memcpy(bbuffer, &(uint32_t){lfs_tole32(rev+1)}, sizeof(uint32_t));
  42. cfg->erase(cfg, pair[1]) => 0;
  43. cfg->prog(cfg, pair[1], 0, bbuffer, BLOCK_SIZE) => 0;
  44. lfs_mount(&lfs, cfg) => 0;
  45. // can read?
  46. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  47. for (int i = 0; i < 5; i++) {
  48. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  49. assert(memcmp(rbuffer, buffer, size) == 0);
  50. }
  51. lfs_file_close(&lfs, &file) => 0;
  52. // can write?
  53. lfs_file_open(&lfs, &file, "notebook/paper",
  54. LFS_O_WRONLY | LFS_O_APPEND) => 0;
  55. strcpy(buffer, "goodbye");
  56. size = strlen("goodbye");
  57. for (int i = 0; i < 5; i++) {
  58. lfs_file_write(&lfs, &file, buffer, size) => size;
  59. lfs_file_sync(&lfs, &file) => 0;
  60. }
  61. lfs_file_close(&lfs, &file) => 0;
  62. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  63. strcpy(buffer, "hello");
  64. size = strlen("hello");
  65. for (int i = 0; i < 5; i++) {
  66. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  67. assert(memcmp(rbuffer, buffer, size) == 0);
  68. }
  69. strcpy(buffer, "goodbye");
  70. size = strlen("goodbye");
  71. for (int i = 0; i < 5; i++) {
  72. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  73. assert(memcmp(rbuffer, buffer, size) == 0);
  74. }
  75. lfs_file_close(&lfs, &file) => 0;
  76. lfs_unmount(&lfs) => 0;
  77. '''
  78. # partial prog, may not be byte in order!
  79. [cases.test_powerloss_partial_prog]
  80. if = '''
  81. PROG_SIZE < BLOCK_SIZE
  82. && (DISK_VERSION == 0 || DISK_VERSION >= 0x00020001)
  83. '''
  84. defines.BYTE_OFF = ["0", "PROG_SIZE-1", "PROG_SIZE/2"]
  85. defines.BYTE_VALUE = [0x33, 0xcc]
  86. in = "lfs.c"
  87. code = '''
  88. lfs_t lfs;
  89. lfs_format(&lfs, cfg) => 0;
  90. lfs_mount(&lfs, cfg) => 0;
  91. lfs_mkdir(&lfs, "notebook") => 0;
  92. lfs_file_t file;
  93. lfs_file_open(&lfs, &file, "notebook/paper",
  94. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  95. char buffer[256];
  96. strcpy(buffer, "hello");
  97. lfs_size_t size = strlen("hello");
  98. for (int i = 0; i < 5; i++) {
  99. lfs_file_write(&lfs, &file, buffer, size) => size;
  100. lfs_file_sync(&lfs, &file) => 0;
  101. }
  102. lfs_file_close(&lfs, &file) => 0;
  103. char rbuffer[256];
  104. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  105. for (int i = 0; i < 5; i++) {
  106. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  107. assert(memcmp(rbuffer, buffer, size) == 0);
  108. }
  109. lfs_file_close(&lfs, &file) => 0;
  110. lfs_unmount(&lfs) => 0;
  111. // imitate a partial prog, value should not matter, if littlefs
  112. // doesn't notice the partial prog testbd will assert
  113. // get offset to next prog
  114. lfs_mount(&lfs, cfg) => 0;
  115. lfs_dir_t dir;
  116. lfs_dir_open(&lfs, &dir, "notebook") => 0;
  117. lfs_block_t block = dir.m.pair[0];
  118. lfs_off_t off = dir.m.off;
  119. lfs_dir_close(&lfs, &dir) => 0;
  120. lfs_unmount(&lfs) => 0;
  121. // tweak byte
  122. uint8_t bbuffer[BLOCK_SIZE];
  123. cfg->read(cfg, block, 0, bbuffer, BLOCK_SIZE) => 0;
  124. bbuffer[off + BYTE_OFF] = BYTE_VALUE;
  125. cfg->erase(cfg, block) => 0;
  126. cfg->prog(cfg, block, 0, bbuffer, BLOCK_SIZE) => 0;
  127. lfs_mount(&lfs, cfg) => 0;
  128. // can read?
  129. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  130. for (int i = 0; i < 5; i++) {
  131. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  132. assert(memcmp(rbuffer, buffer, size) == 0);
  133. }
  134. lfs_file_close(&lfs, &file) => 0;
  135. // can write?
  136. lfs_file_open(&lfs, &file, "notebook/paper",
  137. LFS_O_WRONLY | LFS_O_APPEND) => 0;
  138. strcpy(buffer, "goodbye");
  139. size = strlen("goodbye");
  140. for (int i = 0; i < 5; i++) {
  141. lfs_file_write(&lfs, &file, buffer, size) => size;
  142. lfs_file_sync(&lfs, &file) => 0;
  143. }
  144. lfs_file_close(&lfs, &file) => 0;
  145. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  146. strcpy(buffer, "hello");
  147. size = strlen("hello");
  148. for (int i = 0; i < 5; i++) {
  149. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  150. assert(memcmp(rbuffer, buffer, size) == 0);
  151. }
  152. strcpy(buffer, "goodbye");
  153. size = strlen("goodbye");
  154. for (int i = 0; i < 5; i++) {
  155. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  156. assert(memcmp(rbuffer, buffer, size) == 0);
  157. }
  158. lfs_file_close(&lfs, &file) => 0;
  159. lfs_unmount(&lfs) => 0;
  160. '''