mirror of
https://github.com/littlefs-project/littlefs.git
synced 2025-10-29 11:38:32 +00:00
The main benefit is small test ids everywhere, though this is with the downside of needing longer names to properly prefix and avoid collisions. But this fits into the rest of the scripts with globally unique names a bit better. This is a C project after all. The other small benefit is test generators may have an easier time since per-case symbols can expect to be unique.
249 lines
6.7 KiB
C
249 lines
6.7 KiB
C
# 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;
|
|
}
|
|
'''
|
|
|
|
|
|
|
|
|