-
Notifications
You must be signed in to change notification settings - Fork 764
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added a simple test that the block device works
On one hand this seems like the wrong place for these tests, on the other hand, it's good to know that the block device is behaving as expected when debugging the filesystem. Maybe this should be moved to an external program for users to test their block devices in the future?
- Loading branch information
Showing
1 changed file
with
248 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
''' | ||
|
||
|
||
|
||
|