mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 08:42:40 +01:00 
			
		
		
		
	A rather humorous issue, we accidentally ended up mixing our file namespace with our superblocks. This meant if we created a file named "littlefs" it would reference the superblock and all sorts of things would break. Fixing this also highlighted another issue, the fact that the superblock always needs to come before any file entries in the directory. I didn't account for this in the initial B-tree design, but we need a higher ordering for superblocks + children + files than just name. To fix this I added ordering information in the 2 bits currently unused in the tag type. Though note that the size of these fields are flexible. 9-bit type field: [--- 9 ---] [1|- 3 -|- 2 -|- 3 -] ^ ^ ^ ^- type-specific info | | \------- ordering info | \------------- subtype \----------------- user bit
		
			
				
	
	
		
			170 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| set -eu
 | |
| 
 | |
| echo "=== Path tests ==="
 | |
| rm -rf blocks
 | |
| tests/test.py << TEST
 | |
|     lfs_format(&lfs, &cfg) => 0;
 | |
| TEST
 | |
| 
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_mkdir(&lfs, "tea") => 0;
 | |
|     lfs_mkdir(&lfs, "coffee") => 0;
 | |
|     lfs_mkdir(&lfs, "soda") => 0;
 | |
|     lfs_mkdir(&lfs, "tea/hottea") => 0;
 | |
|     lfs_mkdir(&lfs, "tea/warmtea") => 0;
 | |
|     lfs_mkdir(&lfs, "tea/coldtea") => 0;
 | |
|     lfs_mkdir(&lfs, "coffee/hotcoffee") => 0;
 | |
|     lfs_mkdir(&lfs, "coffee/warmcoffee") => 0;
 | |
|     lfs_mkdir(&lfs, "coffee/coldcoffee") => 0;
 | |
|     lfs_mkdir(&lfs, "soda/hotsoda") => 0;
 | |
|     lfs_mkdir(&lfs, "soda/warmsoda") => 0;
 | |
|     lfs_mkdir(&lfs, "soda/coldsoda") => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Root path tests ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_stat(&lfs, "tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "/tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
| 
 | |
|     lfs_mkdir(&lfs, "/milk1") => 0;
 | |
|     lfs_stat(&lfs, "/milk1", &info) => 0;
 | |
|     strcmp(info.name, "milk1") => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Redundant slash path tests ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_stat(&lfs, "/tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "//tea//hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "///tea///hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
| 
 | |
|     lfs_mkdir(&lfs, "///milk2") => 0;
 | |
|     lfs_stat(&lfs, "///milk2", &info) => 0;
 | |
|     strcmp(info.name, "milk2") => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Dot path tests ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_stat(&lfs, "./tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "/./tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "/././tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "/./tea/./hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
| 
 | |
|     lfs_mkdir(&lfs, "/./milk3") => 0;
 | |
|     lfs_stat(&lfs, "/./milk3", &info) => 0;
 | |
|     strcmp(info.name, "milk3") => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Dot dot path tests ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_stat(&lfs, "coffee/../tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "tea/coldtea/../hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "coffee/coldcoffee/../../tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "coffee/../soda/../tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
| 
 | |
|     lfs_mkdir(&lfs, "coffee/../milk4") => 0;
 | |
|     lfs_stat(&lfs, "coffee/../milk4", &info) => 0;
 | |
|     strcmp(info.name, "milk4") => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Trailing dot path tests ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_stat(&lfs, "tea/hottea/", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "tea/hottea/.", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "tea/hottea/./.", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
|     lfs_stat(&lfs, "tea/hottea/..", &info) => 0;
 | |
|     strcmp(info.name, "tea") => 0;
 | |
|     lfs_stat(&lfs, "tea/hottea/../.", &info) => 0;
 | |
|     strcmp(info.name, "tea") => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Root dot dot path tests ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_stat(&lfs, "coffee/../../../../../../tea/hottea", &info) => 0;
 | |
|     strcmp(info.name, "hottea") => 0;
 | |
| 
 | |
|     lfs_mkdir(&lfs, "coffee/../../../../../../milk5") => 0;
 | |
|     lfs_stat(&lfs, "coffee/../../../../../../milk5", &info) => 0;
 | |
|     strcmp(info.name, "milk5") => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Root tests ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_stat(&lfs, "/", &info) => 0;
 | |
|     info.type => LFS_TYPE_DIR;
 | |
|     strcmp(info.name, "/") => 0;
 | |
| 
 | |
|     lfs_mkdir(&lfs, "/") => LFS_ERR_EXIST;
 | |
|     lfs_file_open(&lfs, &file[0], "/", LFS_O_WRONLY | LFS_O_CREAT)
 | |
|         => LFS_ERR_ISDIR;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Sketchy path tests ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_mkdir(&lfs, "dirt/ground") => LFS_ERR_NOENT;
 | |
|     lfs_mkdir(&lfs, "dirt/ground/earth") => LFS_ERR_NOENT;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Superblock conflict test ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     lfs_mkdir(&lfs, "littlefs") => 0;
 | |
|     lfs_remove(&lfs, "littlefs") => 0;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Max path test ---"
 | |
| tests/test.py << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     memset(buffer, 'w', LFS_NAME_MAX+1);
 | |
|     buffer[LFS_NAME_MAX+2] = '\0';
 | |
|     lfs_mkdir(&lfs, (char*)buffer) => LFS_ERR_NAMETOOLONG;
 | |
|     lfs_file_open(&lfs, &file[0], (char*)buffer,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NAMETOOLONG;
 | |
| 
 | |
|     memcpy(buffer, "coffee/", strlen("coffee/"));
 | |
|     memset(buffer+strlen("coffee/"), 'w', LFS_NAME_MAX+1);
 | |
|     buffer[strlen("coffee/")+LFS_NAME_MAX+2] = '\0';
 | |
|     lfs_mkdir(&lfs, (char*)buffer) => LFS_ERR_NAMETOOLONG;
 | |
|     lfs_file_open(&lfs, &file[0], (char*)buffer,
 | |
|             LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NAMETOOLONG;
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| 
 | |
| echo "--- Results ---"
 | |
| tests/stats.py
 |