mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 00:32:38 +01:00 
			
		
		
		
	As an embedded library, littlefs's configuration straddles two worlds.
In most cases the configuration is usually constant at build time, but
when integrated into OSs, the configuration needs to be dynamically
configurable.
To help with this, littlefs has a separate lfs_config struct that can be
placed into ROM when possible.
But you know what's better than ROM configuration? Truely inlinable
static configuration known at compile-time. In addition to avoiding the
RAM cost, compile-time configuration allows for additional compiler
optimizations, such as constexpr-elimination and removal of unused
code-paths.
So how to enable static configuration?
1. define LFS_STATICCFG
2. implement callbacks as global functions:
   - lfs_read
   - lfs_prog
   - lfs_erase
   - lfs_sync
2. define the now-required constants that configure littlefs:
   - LFS_READ_SIZE
   - LFS_PROG_SIZE
   - LFS_BLOCK_SIZE
   - LFS_BLOCK_COUNT
   - LFS_BLOCK_CYCLES
   - LFS_CACHE_SIZE
   - LFS_LOOKAHEAD_SIZE
   - LFS_READ_BUFFER (optional)
   - LFS_PROG_BUFFER (optional)
   - LFS_LOOKAHEAD_BUFFER (optional)
   - LFS_NAME_MAX (optional)
   - LFS_FILE_MAX (optional)
   - LFS_ATTR_MAX (optional)
Note, there is a separate configuration for the file configuration, this
can be enabled/disabled independently of LFS_STATICCFG. You will likely
want to define this as well if you are looking for the smallest code
size.
In order to avoid a mess of #ifdefs, the internals of littlefs use a
simple macro that redirects to either the dynamic or static config at
compile time:
    #ifdef LFS_STATICCFG
    #define LFS_CFG_READ_SIZE(lfs) ((void)lfs, LFS_READ_SIZE)
    #else
    #define LFS_CFG_READ_SIZE(lfs) lfs->cfg->read_size
    #endif
Unfortunately it does look like there still may be a lot of issues
related to warnings of comparisons against constants... If only C had
a way to ignore warnings on individual statements...
Original idea by apmorton
		
	
		
			
				
	
	
		
			612 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			TOML
		
	
	
	
	
	
			
		
		
	
	
			612 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			TOML
		
	
	
	
	
	
| # These tests are for some specific corner cases with neighboring inline files.
 | |
| # Note that these tests are intended for 512 byte inline sizes. They should
 | |
| # still pass with other inline sizes but wouldn't be testing anything.
 | |
| 
 | |
| define.LFS_CACHE_SIZE = 512
 | |
| if = 'LFS_CACHE_SIZE % LFS_PROG_SIZE == 0 && LFS_CACHE_SIZE == 512'
 | |
| 
 | |
| [[case]] # entry grow test
 | |
| code = '''
 | |
|     uint8_t wbuffer[1024];
 | |
|     uint8_t rbuffer[1024];
 | |
| 
 | |
|     lfs_formatcfg(&lfs, &cfg) => 0;
 | |
|     lfs_mountcfg(&lfs, &cfg) => 0;
 | |
| 
 | |
|     // write hi0 20
 | |
|     sprintf(path, "hi0"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 20
 | |
|     sprintf(path, "hi1"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi2 20
 | |
|     sprintf(path, "hi2"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi3 20
 | |
|     sprintf(path, "hi3"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi1 20
 | |
|     sprintf(path, "hi1"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi0 20
 | |
|     sprintf(path, "hi0"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi2 20
 | |
|     sprintf(path, "hi2"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi3 20
 | |
|     sprintf(path, "hi3"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| '''
 | |
| 
 | |
| [[case]] # entry shrink test
 | |
| code = '''
 | |
|     uint8_t wbuffer[1024];
 | |
|     uint8_t rbuffer[1024];
 | |
| 
 | |
|     lfs_formatcfg(&lfs, &cfg) => 0;
 | |
|     lfs_mountcfg(&lfs, &cfg) => 0;
 | |
| 
 | |
|     // write hi0 20
 | |
|     sprintf(path, "hi0"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi2 20
 | |
|     sprintf(path, "hi2"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi3 20
 | |
|     sprintf(path, "hi3"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 20
 | |
|     sprintf(path, "hi1"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi0 20
 | |
|     sprintf(path, "hi0"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi1 20
 | |
|     sprintf(path, "hi1"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi2 20
 | |
|     sprintf(path, "hi2"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi3 20
 | |
|     sprintf(path, "hi3"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| '''
 | |
| 
 | |
| [[case]] # entry spill test
 | |
| code = '''
 | |
|     uint8_t wbuffer[1024];
 | |
|     uint8_t rbuffer[1024];
 | |
| 
 | |
|     lfs_formatcfg(&lfs, &cfg) => 0;
 | |
|     lfs_mountcfg(&lfs, &cfg) => 0;
 | |
| 
 | |
|     // write hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi2 200
 | |
|     sprintf(path, "hi2"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi2 200
 | |
|     sprintf(path, "hi2"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| '''
 | |
| 
 | |
| [[case]] # entry push spill test
 | |
| code = '''
 | |
|     uint8_t wbuffer[1024];
 | |
|     uint8_t rbuffer[1024];
 | |
| 
 | |
|     lfs_formatcfg(&lfs, &cfg) => 0;
 | |
|     lfs_mountcfg(&lfs, &cfg) => 0;
 | |
| 
 | |
|     // write hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 20
 | |
|     sprintf(path, "hi1"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi2 200
 | |
|     sprintf(path, "hi2"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi1 20
 | |
|     sprintf(path, "hi1"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi2 200
 | |
|     sprintf(path, "hi2"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| '''
 | |
| 
 | |
| [[case]] # entry push spill two test
 | |
| code = '''
 | |
|     uint8_t wbuffer[1024];
 | |
|     uint8_t rbuffer[1024];
 | |
| 
 | |
|     lfs_formatcfg(&lfs, &cfg) => 0;
 | |
|     lfs_mountcfg(&lfs, &cfg) => 0;
 | |
| 
 | |
|     // write hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 20
 | |
|     sprintf(path, "hi1"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi2 200
 | |
|     sprintf(path, "hi2"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi4 200
 | |
|     sprintf(path, "hi4"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi1 20
 | |
|     sprintf(path, "hi1"); size = 20;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     // read hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi2 200
 | |
|     sprintf(path, "hi2"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi4 200
 | |
|     sprintf(path, "hi4"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| '''
 | |
| 
 | |
| [[case]] # entry drop test
 | |
| code = '''
 | |
|     uint8_t wbuffer[1024];
 | |
|     uint8_t rbuffer[1024];
 | |
| 
 | |
|     lfs_formatcfg(&lfs, &cfg) => 0;
 | |
|     lfs_mountcfg(&lfs, &cfg) => 0;
 | |
| 
 | |
|     // write hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi1 200
 | |
|     sprintf(path, "hi1"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi2 200
 | |
|     sprintf(path, "hi2"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // write hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_remove(&lfs, "hi1") => 0;
 | |
|     lfs_stat(&lfs, "hi1", &info) => LFS_ERR_NOENT;
 | |
|     // read hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi2 200
 | |
|     sprintf(path, "hi2"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_remove(&lfs, "hi2") => 0;
 | |
|     lfs_stat(&lfs, "hi2", &info) => LFS_ERR_NOENT;
 | |
|     // read hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     // read hi3 200
 | |
|     sprintf(path, "hi3"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_remove(&lfs, "hi3") => 0;
 | |
|     lfs_stat(&lfs, "hi3", &info) => LFS_ERR_NOENT;
 | |
|     // read hi0 200
 | |
|     sprintf(path, "hi0"); size = 200;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_size(&lfs, &file) => size;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     lfs_remove(&lfs, "hi0") => 0;
 | |
|     lfs_stat(&lfs, "hi0", &info) => LFS_ERR_NOENT;
 | |
| 
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| '''
 | |
| 
 | |
| [[case]] # create too big
 | |
| code = '''
 | |
|     lfs_formatcfg(&lfs, &cfg) => 0;
 | |
| 
 | |
|     lfs_mountcfg(&lfs, &cfg) => 0;
 | |
|     memset(path, 'm', 200);
 | |
|     path[200] = '\0';
 | |
| 
 | |
|     size = 400;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     uint8_t wbuffer[1024];
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     size = 400;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     uint8_t rbuffer[1024];
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| '''
 | |
| 
 | |
| [[case]] # resize too big
 | |
| code = '''
 | |
|     lfs_formatcfg(&lfs, &cfg) => 0;
 | |
| 
 | |
|     lfs_mountcfg(&lfs, &cfg) => 0;
 | |
|     memset(path, 'm', 200);
 | |
|     path[200] = '\0';
 | |
| 
 | |
|     size = 40;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     uint8_t wbuffer[1024];
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     size = 40;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     uint8_t rbuffer[1024];
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     size = 400;
 | |
|     lfs_file_open(&lfs, &file, path,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
 | |
|     memset(wbuffer, 'c', size);
 | |
|     lfs_file_write(&lfs, &file, wbuffer, size) => size;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
| 
 | |
|     size = 400;
 | |
|     lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
 | |
|     lfs_file_read(&lfs, &file, rbuffer, size) => size;
 | |
|     memcmp(rbuffer, wbuffer, size) => 0;
 | |
|     lfs_file_close(&lfs, &file) => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| '''
 |