mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	The main thing to consider was how lfs_dir_fetchwith reacts to corruption it finds and to make sure falling back to old values works correctly. Some of the tricky bits involved making sure we could fall back to both old commits and old metadata blocks while still handling things like synthetic moves correctly.
		
			
				
	
	
		
			118 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| set -eu
 | |
| 
 | |
| echo "=== Corrupt tests ==="
 | |
| 
 | |
| NAMEMULT=64
 | |
| FILEMULT=1
 | |
| 
 | |
| lfs_mktree() {
 | |
| tests/test.py ${1:-} << TEST
 | |
|     lfs_format(&lfs, &cfg) => 0;
 | |
| 
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     for (int i = 1; i < 10; i++) {
 | |
|         for (int j = 0; j < $NAMEMULT; j++) {
 | |
|             buffer[j] = '0'+i;
 | |
|         }
 | |
|         buffer[$NAMEMULT] = '\0';
 | |
|         lfs_mkdir(&lfs, (char*)buffer) => 0;
 | |
| 
 | |
|         buffer[$NAMEMULT] = '/';
 | |
|         for (int j = 0; j < $NAMEMULT; j++) {
 | |
|             buffer[j+$NAMEMULT+1] = '0'+i;
 | |
|         }
 | |
|         buffer[2*$NAMEMULT+1] = '\0';
 | |
|         lfs_file_open(&lfs, &file[0], (char*)buffer,
 | |
|                 LFS_O_WRONLY | LFS_O_CREAT) => 0;
 | |
|         
 | |
|         size = $NAMEMULT;
 | |
|         for (int j = 0; j < i*$FILEMULT; j++) {
 | |
|             lfs_file_write(&lfs, &file[0], buffer, size) => size;
 | |
|         }
 | |
| 
 | |
|         lfs_file_close(&lfs, &file[0]) => 0;
 | |
|     }
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| }
 | |
| 
 | |
| lfs_chktree() {
 | |
| tests/test.py ${1:-} << TEST
 | |
|     lfs_mount(&lfs, &cfg) => 0;
 | |
|     for (int i = 1; i < 10; i++) {
 | |
|         for (int j = 0; j < $NAMEMULT; j++) {
 | |
|             buffer[j] = '0'+i;
 | |
|         }
 | |
|         buffer[$NAMEMULT] = '\0';
 | |
|         lfs_stat(&lfs, (char*)buffer, &info) => 0;
 | |
|         info.type => LFS_TYPE_DIR;
 | |
| 
 | |
|         buffer[$NAMEMULT] = '/';
 | |
|         for (int j = 0; j < $NAMEMULT; j++) {
 | |
|             buffer[j+$NAMEMULT+1] = '0'+i;
 | |
|         }
 | |
|         buffer[2*$NAMEMULT+1] = '\0';
 | |
|         lfs_file_open(&lfs, &file[0], (char*)buffer, LFS_O_RDONLY) => 0;
 | |
|         
 | |
|         size = $NAMEMULT;
 | |
|         for (int j = 0; j < i*$FILEMULT; j++) {
 | |
|             lfs_file_read(&lfs, &file[0], rbuffer, size) => size;
 | |
|             memcmp(buffer, rbuffer, size) => 0;
 | |
|         }
 | |
| 
 | |
|         lfs_file_close(&lfs, &file[0]) => 0;
 | |
|     }
 | |
|     lfs_unmount(&lfs) => 0;
 | |
| TEST
 | |
| }
 | |
| 
 | |
| echo "--- Sanity check ---"
 | |
| rm -rf blocks
 | |
| lfs_mktree
 | |
| lfs_chktree
 | |
| 
 | |
| echo "--- Block corruption ---"
 | |
| for i in {2..33}
 | |
| do 
 | |
|     rm -rf blocks
 | |
|     mkdir blocks
 | |
|     ln -s /dev/zero blocks/$(printf '%x' $i)
 | |
|     lfs_mktree
 | |
|     lfs_chktree
 | |
| done
 | |
| 
 | |
| echo "--- Block persistance ---"
 | |
| for i in {2..33}
 | |
| do 
 | |
|     rm -rf blocks
 | |
|     mkdir blocks
 | |
|     lfs_mktree
 | |
|     chmod a-w blocks/$(printf '%x' $i) || true
 | |
|     lfs_mktree
 | |
|     lfs_chktree
 | |
| done
 | |
| 
 | |
| echo "--- Big region corruption ---"
 | |
| rm -rf blocks
 | |
| mkdir blocks
 | |
| for i in {2..255}
 | |
| do
 | |
|     ln -s /dev/zero blocks/$(printf '%x' $i)
 | |
| done
 | |
| lfs_mktree
 | |
| lfs_chktree
 | |
| 
 | |
| echo "--- Alternating corruption ---"
 | |
| rm -rf blocks
 | |
| mkdir blocks
 | |
| for i in {2..511..2}
 | |
| do
 | |
|     ln -s /dev/zero blocks/$(printf '%x' $i)
 | |
| done
 | |
| lfs_mktree
 | |
| lfs_chktree
 | |
| 
 | |
| echo "--- Results ---"
 | |
| tests/stats.py
 |