mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 08:42:40 +01:00 
			
		
		
		
	Moved .travis.yml over to use the new test framework. A part of this involved testing all of the configurations ran on the old framework and deciding which to carry over. The new framework duplicates some of the cases tested by the configurations so some configurations could be dropped. The .travis.yml includes some extreme ones, such as no inline files, relocations every cycle, no intrinsics, power-loss every byte, unaligned block_count and lookahead, and odd read_sizes. There were several configurations were some tests failed because of limitations in the tests themselves, so many conditions were added to make sure the configurations can run on as many tests as possible.
		
			
				
	
	
		
			328 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			328 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| # Environment variables
 | |
| env:
 | |
|   global:
 | |
|     - CFLAGS=-Werror
 | |
|     - MAKEFLAGS=-j
 | |
| 
 | |
| # Common test script
 | |
| script:
 | |
|   # make sure example can at least compile
 | |
|   - sed -n '/``` c/,/```/{/```/d; p;}' README.md > test.c &&
 | |
|     make all CFLAGS+="
 | |
|         -Duser_provided_block_device_read=NULL
 | |
|         -Duser_provided_block_device_prog=NULL
 | |
|         -Duser_provided_block_device_erase=NULL
 | |
|         -Duser_provided_block_device_sync=NULL
 | |
|         -include stdio.h"
 | |
| 
 | |
|   # run tests
 | |
|   - make clean test TFLAGS+="-nrk"
 | |
| 
 | |
|   # common real-life geometries
 | |
|   # NOR flash: read/prog = 1 block = 4KiB
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_READ_SIZE=1 -DLFS_BLOCK_SIZE=4096"
 | |
|   # SD card: read/prog = 512 block = 512
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_READ_SIZE=512 -DLFS_BLOCK_SIZE=512"
 | |
|   # NAND flash: read/prog = 4KiB block = 32KiB
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_READ_SIZE=4096 -DLFS_BLOCK_SIZE=\(32*1024\)"
 | |
| 
 | |
|   # other extreme geometries for corner cases
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_NO_INTRINSICS"
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_INLINE_MAX=0"
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_READ_SIZE=1 -DLFS_CACHE_SIZE=1"
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_BLOCK_CYCLES=1"
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_BLOCK_COUNT=1023 -DLFS_LOOKAHEAD_SIZE=256"
 | |
|   - make clean test TFLAGS+="-nrk -DLFS_READ_SIZE=11 -DLFS_BLOCK_SIZE=704"
 | |
| 
 | |
|   # compile and find the code size with the smallest configuration
 | |
|   - make clean size
 | |
|         OBJ="$(ls lfs*.c | sed 's/\.c/\.o/' | tr '\n' ' ')"
 | |
|         CFLAGS+="-DLFS_NO_ASSERT -DLFS_NO_DEBUG -DLFS_NO_WARN -DLFS_NO_ERROR"
 | |
|         | tee sizes
 | |
| 
 | |
|   # update status if we succeeded, compare with master if possible
 | |
|   - |
 | |
|     if [ "$TRAVIS_TEST_RESULT" -eq 0 ]
 | |
|     then
 | |
|         CURR=$(tail -n1 sizes | awk '{print $1}')
 | |
|         PREV=$(curl -u "$GEKY_BOT_STATUSES" https://api.github.com/repos/$TRAVIS_REPO_SLUG/status/master \
 | |
|             | jq -re "select(.sha != \"$TRAVIS_COMMIT\")
 | |
|                 | .statuses[] | select(.context == \"$STAGE/$NAME\").description
 | |
|                 | capture(\"code size is (?<size>[0-9]+)\").size" \
 | |
|             || echo 0)
 | |
| 
 | |
|         STATUS="Passed, code size is ${CURR}B"
 | |
|         if [ "$PREV" -ne 0 ]
 | |
|         then
 | |
|             STATUS="$STATUS ($(python -c "print '%+.2f' % (100*($CURR-$PREV)/$PREV.0)")%)"
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
| # CI matrix
 | |
| jobs:
 | |
|   include:
 | |
|     # native testing
 | |
|     - stage: test
 | |
|       env:
 | |
|         - STAGE=test
 | |
|         - NAME=littlefs-x86
 | |
| 
 | |
|     # cross-compile with ARM (thumb mode)
 | |
|     - stage: test
 | |
|       env:
 | |
|         - STAGE=test
 | |
|         - NAME=littlefs-arm
 | |
|         - CC="arm-linux-gnueabi-gcc --static -mthumb"
 | |
|         - TFLAGS="-e qemu-arm"
 | |
|       install:
 | |
|         - sudo apt-get install
 | |
|               gcc-arm-linux-gnueabi
 | |
|               libc6-dev-armel-cross
 | |
|               qemu-user
 | |
|         - arm-linux-gnueabi-gcc --version
 | |
|         - qemu-arm -version
 | |
| 
 | |
|     # cross-compile with PowerPC
 | |
|     - stage: test
 | |
|       env:
 | |
|         - STAGE=test
 | |
|         - NAME=littlefs-powerpc
 | |
|         - CC="powerpc-linux-gnu-gcc --static"
 | |
|         - TFLAGS="-e qemu-ppc"
 | |
|       install:
 | |
|         - sudo apt-get install
 | |
|               gcc-powerpc-linux-gnu
 | |
|               libc6-dev-powerpc-cross
 | |
|               qemu-user
 | |
|         - powerpc-linux-gnu-gcc --version
 | |
|         - qemu-ppc -version
 | |
| 
 | |
|     # cross-compile with MIPS
 | |
|     - stage: test
 | |
|       env:
 | |
|         - STAGE=test
 | |
|         - NAME=littlefs-mips
 | |
|         - CC="mips-linux-gnu-gcc --static"
 | |
|         - TFLAGS="-e qemu-mips"
 | |
|       install:
 | |
|         - sudo apt-get install
 | |
|               gcc-mips-linux-gnu
 | |
|               libc6-dev-mips-cross
 | |
|               qemu-user
 | |
|         - mips-linux-gnu-gcc --version
 | |
|         - qemu-mips -version
 | |
| 
 | |
|     # test under valgrind, checking for memory errors
 | |
|     - stage: test
 | |
|       env:
 | |
|         - STAGE=test
 | |
|         - NAME=littlefs-valgrind
 | |
|         - TFLAGS="--valgrind"
 | |
|       install:
 | |
|         - sudo apt-get install valgrind
 | |
|         - valgrind --version
 | |
| 
 | |
|     # self-host with littlefs-fuse for fuzz test
 | |
|     - stage: test
 | |
|       env:
 | |
|         - STAGE=test
 | |
|         - NAME=littlefs-fuse
 | |
|       if: branch !~ -prefix$
 | |
|       install:
 | |
|         - sudo apt-get install libfuse-dev
 | |
|         - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2
 | |
|         - fusermount -V
 | |
|         - gcc --version
 | |
|       before_script:
 | |
|         # setup disk for littlefs-fuse
 | |
|         - rm -rf littlefs-fuse/littlefs/*
 | |
|         - cp -r $(git ls-tree --name-only HEAD) littlefs-fuse/littlefs
 | |
| 
 | |
|         - mkdir mount
 | |
|         - sudo chmod a+rw /dev/loop0
 | |
|         - dd if=/dev/zero bs=512 count=4096 of=disk
 | |
|         - losetup /dev/loop0 disk
 | |
|       script:
 | |
|         # self-host test
 | |
|         - make -C littlefs-fuse
 | |
| 
 | |
|         - littlefs-fuse/lfs --format /dev/loop0
 | |
|         - littlefs-fuse/lfs /dev/loop0 mount
 | |
| 
 | |
|         - ls mount
 | |
|         - mkdir mount/littlefs
 | |
|         - cp -r $(git ls-tree --name-only HEAD) mount/littlefs
 | |
|         - cd mount/littlefs
 | |
|         - stat .
 | |
|         - ls -flh
 | |
|         - make -B test_dirs test_files QUIET=1
 | |
| 
 | |
|     # self-host with littlefs-fuse for fuzz test
 | |
|     - stage: test
 | |
|       env:
 | |
|         - STAGE=test
 | |
|         - NAME=littlefs-migration
 | |
|       if: branch !~ -prefix$
 | |
|       install:
 | |
|         - sudo apt-get install libfuse-dev
 | |
|         - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2 v2
 | |
|         - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v1 v1
 | |
|         - fusermount -V
 | |
|         - gcc --version
 | |
|       before_script:
 | |
|         # setup disk for littlefs-fuse
 | |
|         - rm -rf v2/littlefs/*
 | |
|         - cp -r $(git ls-tree --name-only HEAD) v2/littlefs
 | |
| 
 | |
|         - mkdir mount
 | |
|         - sudo chmod a+rw /dev/loop0
 | |
|         - dd if=/dev/zero bs=512 count=4096 of=disk
 | |
|         - losetup /dev/loop0 disk
 | |
|       script:
 | |
|         # compile v1 and v2
 | |
|         - make -C v1
 | |
|         - make -C v2
 | |
| 
 | |
|         # run self-host test with v1
 | |
|         - v1/lfs --format /dev/loop0
 | |
|         - v1/lfs /dev/loop0 mount
 | |
| 
 | |
|         - ls mount
 | |
|         - mkdir mount/littlefs
 | |
|         - cp -r $(git ls-tree --name-only HEAD) mount/littlefs
 | |
|         - cd mount/littlefs
 | |
|         - stat .
 | |
|         - ls -flh
 | |
|         - make -B test_dirs test_files QUIET=1
 | |
| 
 | |
|         # attempt to migrate
 | |
|         - cd ../..
 | |
|         - fusermount -u mount
 | |
| 
 | |
|         - v2/lfs --migrate /dev/loop0
 | |
|         - v2/lfs /dev/loop0 mount
 | |
| 
 | |
|         # run self-host test with v2 right where we left off
 | |
|         - ls mount
 | |
|         - cd mount/littlefs
 | |
|         - stat .
 | |
|         - ls -flh
 | |
|         - make -B test_dirs test_files QUIET=1
 | |
| 
 | |
|     # Automatically create releases
 | |
|     - stage: deploy
 | |
|       env:
 | |
|         - STAGE=deploy
 | |
|         - NAME=deploy
 | |
|       script:
 | |
|         - |
 | |
|           bash << 'SCRIPT'
 | |
|           set -ev
 | |
|           # Find version defined in lfs.h
 | |
|           LFS_VERSION=$(grep -ox '#define LFS_VERSION .*' lfs.h | cut -d ' ' -f3)
 | |
|           LFS_VERSION_MAJOR=$((0xffff & ($LFS_VERSION >> 16)))
 | |
|           LFS_VERSION_MINOR=$((0xffff & ($LFS_VERSION >>  0)))
 | |
|           # Grab latests patch from repo tags, default to 0, needs finagling
 | |
|           # to get past github's pagination api
 | |
|           PREV_URL=https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs/tags/v$LFS_VERSION_MAJOR.$LFS_VERSION_MINOR.
 | |
|           PREV_URL=$(curl -u "$GEKY_BOT_RELEASES" "$PREV_URL" -I \
 | |
|               | sed -n '/^Link/{s/.*<\(.*\)>; rel="last"/\1/;p;q0};$q1' \
 | |
|               || echo $PREV_URL)
 | |
|           LFS_VERSION_PATCH=$(curl -u "$GEKY_BOT_RELEASES" "$PREV_URL" \
 | |
|               | jq 'map(.ref | match("\\bv.*\\..*\\.(.*)$";"g")
 | |
|                   .captures[].string | tonumber) | max + 1' \
 | |
|               || echo 0)
 | |
|           # We have our new version
 | |
|           LFS_VERSION="v$LFS_VERSION_MAJOR.$LFS_VERSION_MINOR.$LFS_VERSION_PATCH"
 | |
|           echo "VERSION $LFS_VERSION"
 | |
|           # Check that we're the most recent commit
 | |
|           CURRENT_COMMIT=$(curl -f -u "$GEKY_BOT_RELEASES" \
 | |
|               https://api.github.com/repos/$TRAVIS_REPO_SLUG/commits/master \
 | |
|               | jq -re '.sha')
 | |
|           [ "$TRAVIS_COMMIT" == "$CURRENT_COMMIT" ] || exit 0
 | |
|           # Create major branch
 | |
|           git branch v$LFS_VERSION_MAJOR HEAD
 | |
|           # Create major prefix branch
 | |
|           git config user.name "geky bot"
 | |
|           git config user.email "bot@geky.net"
 | |
|           git fetch https://github.com/$TRAVIS_REPO_SLUG.git \
 | |
|               --depth=50 v$LFS_VERSION_MAJOR-prefix || true
 | |
|           ./scripts/prefix.py lfs$LFS_VERSION_MAJOR
 | |
|           git branch v$LFS_VERSION_MAJOR-prefix $( \
 | |
|               git commit-tree $(git write-tree) \
 | |
|                   $(git rev-parse --verify -q FETCH_HEAD | sed -e 's/^/-p /') \
 | |
|                   -p HEAD \
 | |
|                   -m "Generated v$LFS_VERSION_MAJOR prefixes")
 | |
|           git reset --hard
 | |
|           # Update major version branches (vN and vN-prefix)
 | |
|           git push --atomic https://$GEKY_BOT_RELEASES@github.com/$TRAVIS_REPO_SLUG.git \
 | |
|               v$LFS_VERSION_MAJOR \
 | |
|               v$LFS_VERSION_MAJOR-prefix
 | |
|           # Build release notes
 | |
|           PREV=$(git tag --sort=-v:refname -l "v*" | head -1)
 | |
|           if [ ! -z "$PREV" ]
 | |
|           then
 | |
|               echo "PREV $PREV"
 | |
|               CHANGES=$(git log --oneline $PREV.. --grep='^Merge' --invert-grep)
 | |
|               printf "CHANGES\n%s\n\n" "$CHANGES"
 | |
|           fi
 | |
|           case ${GEKY_BOT_DRAFT:-minor} in
 | |
|               true)  DRAFT=true ;;
 | |
|               minor) DRAFT=$(jq -R 'endswith(".0")' <<< "$LFS_VERSION") ;;
 | |
|               false) DRAFT=false ;;
 | |
|           esac
 | |
|           # Create the release and patch version tag (vN.N.N)
 | |
|           curl -f -u "$GEKY_BOT_RELEASES" -X POST \
 | |
|               https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases \
 | |
|               -d "{
 | |
|                   \"tag_name\": \"$LFS_VERSION\",
 | |
|                   \"name\": \"${LFS_VERSION%.0}\",
 | |
|                   \"target_commitish\": \"$TRAVIS_COMMIT\",
 | |
|                   \"draft\": $DRAFT,
 | |
|                   \"body\": $(jq -sR '.' <<< "$CHANGES")
 | |
|               }" #"
 | |
|           SCRIPT
 | |
| 
 | |
| # Manage statuses
 | |
| before_install:
 | |
|   - |
 | |
|     curl -u "$GEKY_BOT_STATUSES" -X POST \
 | |
|         https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \
 | |
|         -d "{
 | |
|             \"context\": \"$STAGE/$NAME\",
 | |
|             \"state\": \"pending\",
 | |
|             \"description\": \"${STATUS:-In progress}\",
 | |
|             \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\"
 | |
|         }"
 | |
|   - sudo apt-get install python3-pip
 | |
|   - sudo pip3 install toml
 | |
|   
 | |
| 
 | |
| after_failure:
 | |
|   - |
 | |
|     curl -u "$GEKY_BOT_STATUSES" -X POST \
 | |
|         https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \
 | |
|         -d "{
 | |
|             \"context\": \"$STAGE/$NAME\",
 | |
|             \"state\": \"failure\",
 | |
|             \"description\": \"${STATUS:-Failed}\",
 | |
|             \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\"
 | |
|         }"
 | |
| 
 | |
| after_success:
 | |
|   - |
 | |
|     curl -u "$GEKY_BOT_STATUSES" -X POST \
 | |
|         https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \
 | |
|         -d "{
 | |
|             \"context\": \"$STAGE/$NAME\",
 | |
|             \"state\": \"success\",
 | |
|             \"description\": \"${STATUS:-Passed}\",
 | |
|             \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\"
 | |
|         }"
 | |
| 
 | |
| # Job control
 | |
| stages:
 | |
|     - name: test
 | |
|     - name: deploy
 | |
|       if: branch = master AND type = push
 |