|
@@ -0,0 +1,248 @@
|
|
|
|
|
+# These tests don't really test littlefs at all, they are here only to make
|
|
|
|
|
+# sure the underlying block device is working.
|
|
|
|
|
+#
|
|
|
|
|
+# Note we use 251, a prime, in places to avoid aliasing powers of 2.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+[cases.one_block]
|
|
|
|
|
+defines.READ = ['READ_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+defines.PROG = ['PROG_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+code = '''
|
|
|
|
|
+ uint8_t buffer[lfs_max(READ, PROG)];
|
|
|
|
|
+
|
|
|
|
|
+ // write data
|
|
|
|
|
+ cfg->erase(cfg, 0) => 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += PROG) {
|
|
|
|
|
+ for (lfs_off_t j = 0; j < PROG; j++) {
|
|
|
|
|
+ buffer[j] = (i+j) % 251;
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg->prog(cfg, 0, i, buffer, PROG) => 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read data
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, 0, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+'''
|
|
|
|
|
+
|
|
|
|
|
+[cases.two_block]
|
|
|
|
|
+defines.READ = ['READ_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+defines.PROG = ['PROG_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+code = '''
|
|
|
|
|
+ uint8_t buffer[lfs_max(READ, PROG)];
|
|
|
|
|
+ lfs_block_t block;
|
|
|
|
|
+
|
|
|
|
|
+ // write block 0
|
|
|
|
|
+ block = 0;
|
|
|
|
|
+ cfg->erase(cfg, block) => 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += PROG) {
|
|
|
|
|
+ for (lfs_off_t j = 0; j < PROG; j++) {
|
|
|
|
|
+ buffer[j] = (block+i+j) % 251;
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg->prog(cfg, block, i, buffer, PROG) => 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read block 0
|
|
|
|
|
+ block = 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // write block 1
|
|
|
|
|
+ block = 1;
|
|
|
|
|
+ cfg->erase(cfg, block) => 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += PROG) {
|
|
|
|
|
+ for (lfs_off_t j = 0; j < PROG; j++) {
|
|
|
|
|
+ buffer[j] = (block+i+j) % 251;
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg->prog(cfg, block, i, buffer, PROG) => 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read block 1
|
|
|
|
|
+ block = 1;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read block 0 again
|
|
|
|
|
+ block = 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+'''
|
|
|
|
|
+
|
|
|
|
|
+[cases.last_block]
|
|
|
|
|
+defines.READ = ['READ_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+defines.PROG = ['PROG_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+code = '''
|
|
|
|
|
+ uint8_t buffer[lfs_max(READ, PROG)];
|
|
|
|
|
+ lfs_block_t block;
|
|
|
|
|
+
|
|
|
|
|
+ // write block 0
|
|
|
|
|
+ block = 0;
|
|
|
|
|
+ cfg->erase(cfg, block) => 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += PROG) {
|
|
|
|
|
+ for (lfs_off_t j = 0; j < PROG; j++) {
|
|
|
|
|
+ buffer[j] = (block+i+j) % 251;
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg->prog(cfg, block, i, buffer, PROG) => 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read block 0
|
|
|
|
|
+ block = 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // write block n-1
|
|
|
|
|
+ block = cfg->block_count-1;
|
|
|
|
|
+ cfg->erase(cfg, block) => 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += PROG) {
|
|
|
|
|
+ for (lfs_off_t j = 0; j < PROG; j++) {
|
|
|
|
|
+ buffer[j] = (block+i+j) % 251;
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg->prog(cfg, block, i, buffer, PROG) => 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read block n-1
|
|
|
|
|
+ block = cfg->block_count-1;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read block 0 again
|
|
|
|
|
+ block = 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+'''
|
|
|
|
|
+
|
|
|
|
|
+[cases.powers_of_two]
|
|
|
|
|
+defines.READ = ['READ_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+defines.PROG = ['PROG_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+code = '''
|
|
|
|
|
+ uint8_t buffer[lfs_max(READ, PROG)];
|
|
|
|
|
+
|
|
|
|
|
+ // write/read every power of 2
|
|
|
|
|
+ lfs_block_t block = 1;
|
|
|
|
|
+ while (block < cfg->block_count) {
|
|
|
|
|
+ // write
|
|
|
|
|
+ cfg->erase(cfg, block) => 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += PROG) {
|
|
|
|
|
+ for (lfs_off_t j = 0; j < PROG; j++) {
|
|
|
|
|
+ buffer[j] = (block+i+j) % 251;
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg->prog(cfg, block, i, buffer, PROG) => 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ block *= 2;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read every power of 2 again
|
|
|
|
|
+ block = 1;
|
|
|
|
|
+ while (block < cfg->block_count) {
|
|
|
|
|
+ // read
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ block *= 2;
|
|
|
|
|
+ }
|
|
|
|
|
+'''
|
|
|
|
|
+
|
|
|
|
|
+[cases.fibonacci]
|
|
|
|
|
+defines.READ = ['READ_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+defines.PROG = ['PROG_SIZE', 'BLOCK_SIZE']
|
|
|
|
|
+code = '''
|
|
|
|
|
+ uint8_t buffer[lfs_max(READ, PROG)];
|
|
|
|
|
+
|
|
|
|
|
+ // write/read every fibonacci number on our device
|
|
|
|
|
+ lfs_block_t block = 1;
|
|
|
|
|
+ lfs_block_t block_ = 1;
|
|
|
|
|
+ while (block < cfg->block_count) {
|
|
|
|
|
+ // write
|
|
|
|
|
+ cfg->erase(cfg, block) => 0;
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += PROG) {
|
|
|
|
|
+ for (lfs_off_t j = 0; j < PROG; j++) {
|
|
|
|
|
+ buffer[j] = (block+i+j) % 251;
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg->prog(cfg, block, i, buffer, PROG) => 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ lfs_block_t nblock = block + block_;
|
|
|
|
|
+ block_ = block;
|
|
|
|
|
+ block = nblock;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read every fibonacci number again
|
|
|
|
|
+ block = 1;
|
|
|
|
|
+ block_ = 1;
|
|
|
|
|
+ while (block < cfg->block_count) {
|
|
|
|
|
+ // read
|
|
|
|
|
+ for (lfs_off_t i = 0; i < cfg->block_size; i += READ) {
|
|
|
|
|
+ cfg->read(cfg, block, i, buffer, READ) => 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (lfs_off_t j = 0; j < READ; j++) {
|
|
|
|
|
+ LFS_ASSERT(buffer[j] == (block+i+j) % 251);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ lfs_block_t nblock = block + block_;
|
|
|
|
|
+ block_ = block;
|
|
|
|
|
+ block = nblock;
|
|
|
|
|
+ }
|
|
|
|
|
+'''
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|