# 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.test_bd_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.test_bd_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.test_bd_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.test_bd_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.test_bd_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; } '''