119ea8026Sopenharmony_ciname: test
219ea8026Sopenharmony_cion: [push, pull_request]
319ea8026Sopenharmony_ci
419ea8026Sopenharmony_cienv:
519ea8026Sopenharmony_ci  CFLAGS: -Werror
619ea8026Sopenharmony_ci  MAKEFLAGS: -j
719ea8026Sopenharmony_ci
819ea8026Sopenharmony_cijobs:
919ea8026Sopenharmony_ci  # run tests
1019ea8026Sopenharmony_ci  test:
1119ea8026Sopenharmony_ci    runs-on: ubuntu-18.04
1219ea8026Sopenharmony_ci    strategy:
1319ea8026Sopenharmony_ci      fail-fast: false
1419ea8026Sopenharmony_ci      matrix:
1519ea8026Sopenharmony_ci        arch: [x86_64, thumb, mips, powerpc]
1619ea8026Sopenharmony_ci
1719ea8026Sopenharmony_ci    steps:
1819ea8026Sopenharmony_ci      - uses: actions/checkout@v2
1919ea8026Sopenharmony_ci      - name: install
2019ea8026Sopenharmony_ci        run: |
2119ea8026Sopenharmony_ci          # need toml, also pip3 isn't installed by default?
2219ea8026Sopenharmony_ci          sudo apt-get update -qq
2319ea8026Sopenharmony_ci          sudo apt-get install -qq python3 python3-pip lcov
2419ea8026Sopenharmony_ci          sudo pip3 install toml
2519ea8026Sopenharmony_ci          gcc --version
2619ea8026Sopenharmony_ci
2719ea8026Sopenharmony_ci          # setup a ram-backed disk to speed up reentrant tests
2819ea8026Sopenharmony_ci          mkdir disks
2919ea8026Sopenharmony_ci          sudo mount -t tmpfs -o size=100m tmpfs disks
3019ea8026Sopenharmony_ci          TESTFLAGS="$TESTFLAGS --disk=disks/disk"
3119ea8026Sopenharmony_ci
3219ea8026Sopenharmony_ci          # collect coverage
3319ea8026Sopenharmony_ci          mkdir -p coverage
3419ea8026Sopenharmony_ci          TESTFLAGS="$TESTFLAGS --coverage=`
3519ea8026Sopenharmony_ci            `coverage/${{github.job}}-${{matrix.arch}}.info"
3619ea8026Sopenharmony_ci
3719ea8026Sopenharmony_ci          echo "TESTFLAGS=$TESTFLAGS" >> $GITHUB_ENV
3819ea8026Sopenharmony_ci
3919ea8026Sopenharmony_ci      # cross-compile with ARM Thumb (32-bit, little-endian)
4019ea8026Sopenharmony_ci      - name: install-thumb
4119ea8026Sopenharmony_ci        if: ${{matrix.arch == 'thumb'}}
4219ea8026Sopenharmony_ci        run: |
4319ea8026Sopenharmony_ci          sudo apt-get install -qq \
4419ea8026Sopenharmony_ci            gcc-arm-linux-gnueabi \
4519ea8026Sopenharmony_ci            libc6-dev-armel-cross \
4619ea8026Sopenharmony_ci            qemu-user
4719ea8026Sopenharmony_ci          echo "CC=arm-linux-gnueabi-gcc -mthumb --static" >> $GITHUB_ENV
4819ea8026Sopenharmony_ci          echo "EXEC=qemu-arm" >> $GITHUB_ENV
4919ea8026Sopenharmony_ci          arm-linux-gnueabi-gcc --version
5019ea8026Sopenharmony_ci          qemu-arm -version
5119ea8026Sopenharmony_ci      # cross-compile with MIPS (32-bit, big-endian)
5219ea8026Sopenharmony_ci      - name: install-mips
5319ea8026Sopenharmony_ci        if: ${{matrix.arch == 'mips'}}
5419ea8026Sopenharmony_ci        run: |
5519ea8026Sopenharmony_ci          sudo apt-get install -qq \
5619ea8026Sopenharmony_ci            gcc-mips-linux-gnu \
5719ea8026Sopenharmony_ci            libc6-dev-mips-cross \
5819ea8026Sopenharmony_ci            qemu-user
5919ea8026Sopenharmony_ci          echo "CC=mips-linux-gnu-gcc --static" >> $GITHUB_ENV
6019ea8026Sopenharmony_ci          echo "EXEC=qemu-mips" >> $GITHUB_ENV
6119ea8026Sopenharmony_ci          mips-linux-gnu-gcc --version
6219ea8026Sopenharmony_ci          qemu-mips -version
6319ea8026Sopenharmony_ci      # cross-compile with PowerPC (32-bit, big-endian)
6419ea8026Sopenharmony_ci      - name: install-powerpc
6519ea8026Sopenharmony_ci        if: ${{matrix.arch == 'powerpc'}}
6619ea8026Sopenharmony_ci        run: |
6719ea8026Sopenharmony_ci          sudo apt-get install -qq \
6819ea8026Sopenharmony_ci            gcc-powerpc-linux-gnu \
6919ea8026Sopenharmony_ci            libc6-dev-powerpc-cross \
7019ea8026Sopenharmony_ci            qemu-user
7119ea8026Sopenharmony_ci          echo "CC=powerpc-linux-gnu-gcc --static" >> $GITHUB_ENV
7219ea8026Sopenharmony_ci          echo "EXEC=qemu-ppc" >> $GITHUB_ENV
7319ea8026Sopenharmony_ci          powerpc-linux-gnu-gcc --version
7419ea8026Sopenharmony_ci          qemu-ppc -version
7519ea8026Sopenharmony_ci
7619ea8026Sopenharmony_ci      # make sure example can at least compile
7719ea8026Sopenharmony_ci      - name: test-example
7819ea8026Sopenharmony_ci        run: |
7919ea8026Sopenharmony_ci          sed -n '/``` c/,/```/{/```/d; p}' README.md > test.c
8019ea8026Sopenharmony_ci          make all CFLAGS+=" \
8119ea8026Sopenharmony_ci            -Duser_provided_block_device_read=NULL \
8219ea8026Sopenharmony_ci            -Duser_provided_block_device_prog=NULL \
8319ea8026Sopenharmony_ci            -Duser_provided_block_device_erase=NULL \
8419ea8026Sopenharmony_ci            -Duser_provided_block_device_sync=NULL \
8519ea8026Sopenharmony_ci            -include stdio.h"
8619ea8026Sopenharmony_ci          rm test.c
8719ea8026Sopenharmony_ci
8819ea8026Sopenharmony_ci      # test configurations
8919ea8026Sopenharmony_ci      # normal+reentrant tests
9019ea8026Sopenharmony_ci      - name: test-default
9119ea8026Sopenharmony_ci        run: |
9219ea8026Sopenharmony_ci          make clean
9319ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk"
9419ea8026Sopenharmony_ci      # NOR flash: read/prog = 1 block = 4KiB
9519ea8026Sopenharmony_ci      - name: test-nor
9619ea8026Sopenharmony_ci        run: |
9719ea8026Sopenharmony_ci          make clean
9819ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk \
9919ea8026Sopenharmony_ci            -DLFS_READ_SIZE=1 -DLFS_BLOCK_SIZE=4096"
10019ea8026Sopenharmony_ci      # SD/eMMC: read/prog = 512 block = 512
10119ea8026Sopenharmony_ci      - name: test-emmc
10219ea8026Sopenharmony_ci        run: |
10319ea8026Sopenharmony_ci          make clean
10419ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk \
10519ea8026Sopenharmony_ci            -DLFS_READ_SIZE=512 -DLFS_BLOCK_SIZE=512"
10619ea8026Sopenharmony_ci      # NAND flash: read/prog = 4KiB block = 32KiB
10719ea8026Sopenharmony_ci      - name: test-nand
10819ea8026Sopenharmony_ci        run: |
10919ea8026Sopenharmony_ci          make clean
11019ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk \
11119ea8026Sopenharmony_ci            -DLFS_READ_SIZE=4096 -DLFS_BLOCK_SIZE=\(32*1024\)"
11219ea8026Sopenharmony_ci      # other extreme geometries that are useful for various corner cases
11319ea8026Sopenharmony_ci      - name: test-no-intrinsics
11419ea8026Sopenharmony_ci        run: |
11519ea8026Sopenharmony_ci          make clean
11619ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk \
11719ea8026Sopenharmony_ci            -DLFS_NO_INTRINSICS"
11819ea8026Sopenharmony_ci      - name: test-byte-writes
11919ea8026Sopenharmony_ci        # it just takes too long to test byte-level writes when in qemu,
12019ea8026Sopenharmony_ci        # should be plenty covered by the other configurations
12119ea8026Sopenharmony_ci        if: ${{matrix.arch == 'x86_64'}}
12219ea8026Sopenharmony_ci        run: |
12319ea8026Sopenharmony_ci          make clean
12419ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk \
12519ea8026Sopenharmony_ci            -DLFS_READ_SIZE=1 -DLFS_CACHE_SIZE=1"
12619ea8026Sopenharmony_ci      - name: test-block-cycles
12719ea8026Sopenharmony_ci        run: |
12819ea8026Sopenharmony_ci          make clean
12919ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk \
13019ea8026Sopenharmony_ci            -DLFS_BLOCK_CYCLES=1"
13119ea8026Sopenharmony_ci      - name: test-odd-block-count
13219ea8026Sopenharmony_ci        run: |
13319ea8026Sopenharmony_ci          make clean
13419ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk \
13519ea8026Sopenharmony_ci            -DLFS_BLOCK_COUNT=1023 -DLFS_LOOKAHEAD_SIZE=256"
13619ea8026Sopenharmony_ci      - name: test-odd-block-size
13719ea8026Sopenharmony_ci        run: |
13819ea8026Sopenharmony_ci          make clean
13919ea8026Sopenharmony_ci          make test TESTFLAGS+="-nrk \
14019ea8026Sopenharmony_ci            -DLFS_READ_SIZE=11 -DLFS_BLOCK_SIZE=704"
14119ea8026Sopenharmony_ci
14219ea8026Sopenharmony_ci      # upload coverage for later coverage
14319ea8026Sopenharmony_ci      - name: upload-coverage
14419ea8026Sopenharmony_ci        uses: actions/upload-artifact@v2
14519ea8026Sopenharmony_ci        with:
14619ea8026Sopenharmony_ci          name: coverage
14719ea8026Sopenharmony_ci          path: coverage
14819ea8026Sopenharmony_ci          retention-days: 1
14919ea8026Sopenharmony_ci
15019ea8026Sopenharmony_ci      # update results
15119ea8026Sopenharmony_ci      - name: results-code
15219ea8026Sopenharmony_ci        run: |
15319ea8026Sopenharmony_ci          mkdir -p results
15419ea8026Sopenharmony_ci          make clean
15519ea8026Sopenharmony_ci          make code \
15619ea8026Sopenharmony_ci            CFLAGS+=" \
15719ea8026Sopenharmony_ci              -DLFS_NO_ASSERT \
15819ea8026Sopenharmony_ci              -DLFS_NO_DEBUG \
15919ea8026Sopenharmony_ci              -DLFS_NO_WARN \
16019ea8026Sopenharmony_ci              -DLFS_NO_ERROR" \
16119ea8026Sopenharmony_ci            CODEFLAGS+="-o results/code-${{matrix.arch}}.csv"
16219ea8026Sopenharmony_ci      - name: results-code-readonly
16319ea8026Sopenharmony_ci        run: |
16419ea8026Sopenharmony_ci          mkdir -p results
16519ea8026Sopenharmony_ci          make clean
16619ea8026Sopenharmony_ci          make code \
16719ea8026Sopenharmony_ci            CFLAGS+=" \
16819ea8026Sopenharmony_ci              -DLFS_NO_ASSERT \
16919ea8026Sopenharmony_ci              -DLFS_NO_DEBUG \
17019ea8026Sopenharmony_ci              -DLFS_NO_WARN \
17119ea8026Sopenharmony_ci              -DLFS_NO_ERROR \
17219ea8026Sopenharmony_ci              -DLFS_READONLY" \
17319ea8026Sopenharmony_ci            CODEFLAGS+="-o results/code-${{matrix.arch}}-readonly.csv"
17419ea8026Sopenharmony_ci      - name: results-code-threadsafe
17519ea8026Sopenharmony_ci        run: |
17619ea8026Sopenharmony_ci          mkdir -p results
17719ea8026Sopenharmony_ci          make clean
17819ea8026Sopenharmony_ci          make code \
17919ea8026Sopenharmony_ci            CFLAGS+=" \
18019ea8026Sopenharmony_ci              -DLFS_NO_ASSERT \
18119ea8026Sopenharmony_ci              -DLFS_NO_DEBUG \
18219ea8026Sopenharmony_ci              -DLFS_NO_WARN \
18319ea8026Sopenharmony_ci              -DLFS_NO_ERROR \
18419ea8026Sopenharmony_ci              -DLFS_THREADSAFE" \
18519ea8026Sopenharmony_ci            CODEFLAGS+="-o results/code-${{matrix.arch}}-threadsafe.csv"
18619ea8026Sopenharmony_ci      - name: results-code-migrate
18719ea8026Sopenharmony_ci        run: |
18819ea8026Sopenharmony_ci          mkdir -p results
18919ea8026Sopenharmony_ci          make clean
19019ea8026Sopenharmony_ci          make code \
19119ea8026Sopenharmony_ci            CFLAGS+=" \
19219ea8026Sopenharmony_ci              -DLFS_NO_ASSERT \
19319ea8026Sopenharmony_ci              -DLFS_NO_DEBUG \
19419ea8026Sopenharmony_ci              -DLFS_NO_WARN \
19519ea8026Sopenharmony_ci              -DLFS_NO_ERROR \
19619ea8026Sopenharmony_ci              -DLFS_MIGRATE" \
19719ea8026Sopenharmony_ci            CODEFLAGS+="-o results/code-${{matrix.arch}}-migrate.csv"
19819ea8026Sopenharmony_ci      - name: results-code-error-asserts
19919ea8026Sopenharmony_ci        run: |
20019ea8026Sopenharmony_ci          mkdir -p results
20119ea8026Sopenharmony_ci          make clean
20219ea8026Sopenharmony_ci          make code \
20319ea8026Sopenharmony_ci            CFLAGS+=" \
20419ea8026Sopenharmony_ci              -DLFS_NO_DEBUG \
20519ea8026Sopenharmony_ci              -DLFS_NO_WARN \
20619ea8026Sopenharmony_ci              -DLFS_NO_ERROR \
20719ea8026Sopenharmony_ci              -D'LFS_ASSERT(test)=do {if(!(test)) {return -1;}} while(0)'" \
20819ea8026Sopenharmony_ci            CODEFLAGS+="-o results/code-${{matrix.arch}}-error-asserts.csv"
20919ea8026Sopenharmony_ci      - name: upload-results
21019ea8026Sopenharmony_ci        uses: actions/upload-artifact@v2
21119ea8026Sopenharmony_ci        with:
21219ea8026Sopenharmony_ci          name: results
21319ea8026Sopenharmony_ci          path: results
21419ea8026Sopenharmony_ci      # limit reporting to Thumb, otherwise there would be too many numbers
21519ea8026Sopenharmony_ci      # flying around for the results to be easily readable
21619ea8026Sopenharmony_ci      - name: collect-status
21719ea8026Sopenharmony_ci        if: ${{matrix.arch == 'thumb'}}
21819ea8026Sopenharmony_ci        run: |
21919ea8026Sopenharmony_ci          mkdir -p status
22019ea8026Sopenharmony_ci          for f in $(shopt -s nullglob ; echo results/code*.csv)
22119ea8026Sopenharmony_ci          do
22219ea8026Sopenharmony_ci            export STEP="results-code$(
22319ea8026Sopenharmony_ci              echo $f | sed -n 's/.*code-.*-\(.*\).csv/-\1/p')"
22419ea8026Sopenharmony_ci            export CONTEXT="results / code$(
22519ea8026Sopenharmony_ci              echo $f | sed -n 's/.*code-.*-\(.*\).csv/ (\1)/p')"
22619ea8026Sopenharmony_ci            export PREV="$(curl -sS \
22719ea8026Sopenharmony_ci              "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/status/master" \
22819ea8026Sopenharmony_ci              | jq -re 'select(.sha != env.GITHUB_SHA) | .statuses[]
22919ea8026Sopenharmony_ci                | select(.context == env.CONTEXT).description
23019ea8026Sopenharmony_ci                | capture("Code size is (?<result>[0-9]+)").result' \
23119ea8026Sopenharmony_ci              || echo 0)"
23219ea8026Sopenharmony_ci            export DESCRIPTION="$(./scripts/code.py -u $f -s | awk '
23319ea8026Sopenharmony_ci              NR==2 {printf "Code size is %d B",$2}
23419ea8026Sopenharmony_ci              NR==2 && ENVIRON["PREV"]+0 != 0 {
23519ea8026Sopenharmony_ci                printf " (%+.1f%%)",100*($2-ENVIRON["PREV"])/ENVIRON["PREV"]}')"
23619ea8026Sopenharmony_ci            jq -n '{
23719ea8026Sopenharmony_ci              state: "success",
23819ea8026Sopenharmony_ci              context: env.CONTEXT,
23919ea8026Sopenharmony_ci              description: env.DESCRIPTION,
24019ea8026Sopenharmony_ci              target_job: "${{github.job}} (${{matrix.arch}})",
24119ea8026Sopenharmony_ci              target_step: env.STEP}' \
24219ea8026Sopenharmony_ci              | tee status/code$(
24319ea8026Sopenharmony_ci                echo $f | sed -n 's/.*code-.*-\(.*\).csv/-\1/p').json
24419ea8026Sopenharmony_ci          done
24519ea8026Sopenharmony_ci      - name: upload-status
24619ea8026Sopenharmony_ci        if: ${{matrix.arch == 'thumb'}}
24719ea8026Sopenharmony_ci        uses: actions/upload-artifact@v2
24819ea8026Sopenharmony_ci        with:
24919ea8026Sopenharmony_ci          name: status
25019ea8026Sopenharmony_ci          path: status
25119ea8026Sopenharmony_ci          retention-days: 1
25219ea8026Sopenharmony_ci
25319ea8026Sopenharmony_ci  # run under Valgrind to check for memory errors
25419ea8026Sopenharmony_ci  valgrind:
25519ea8026Sopenharmony_ci    runs-on: ubuntu-18.04
25619ea8026Sopenharmony_ci    steps:
25719ea8026Sopenharmony_ci      - uses: actions/checkout@v2
25819ea8026Sopenharmony_ci      - name: install
25919ea8026Sopenharmony_ci        run: |
26019ea8026Sopenharmony_ci          # need toml, also pip3 isn't installed by default?
26119ea8026Sopenharmony_ci          sudo apt-get update -qq
26219ea8026Sopenharmony_ci          sudo apt-get install -qq python3 python3-pip
26319ea8026Sopenharmony_ci          sudo pip3 install toml
26419ea8026Sopenharmony_ci      - name: install-valgrind
26519ea8026Sopenharmony_ci        run: |
26619ea8026Sopenharmony_ci          sudo apt-get update -qq
26719ea8026Sopenharmony_ci          sudo apt-get install -qq valgrind
26819ea8026Sopenharmony_ci          valgrind --version
26919ea8026Sopenharmony_ci      # normal tests, we don't need to test all geometries
27019ea8026Sopenharmony_ci      - name: test-valgrind
27119ea8026Sopenharmony_ci        run: make test TESTFLAGS+="-k --valgrind"
27219ea8026Sopenharmony_ci
27319ea8026Sopenharmony_ci  # self-host with littlefs-fuse for a fuzz-like test
27419ea8026Sopenharmony_ci  fuse:
27519ea8026Sopenharmony_ci    runs-on: ubuntu-18.04
27619ea8026Sopenharmony_ci    if: ${{!endsWith(github.ref, '-prefix')}}
27719ea8026Sopenharmony_ci    steps:
27819ea8026Sopenharmony_ci      - uses: actions/checkout@v2
27919ea8026Sopenharmony_ci      - name: install
28019ea8026Sopenharmony_ci        run: |
28119ea8026Sopenharmony_ci          # need toml, also pip3 isn't installed by default?
28219ea8026Sopenharmony_ci          sudo apt-get update -qq
28319ea8026Sopenharmony_ci          sudo apt-get install -qq python3 python3-pip libfuse-dev
28419ea8026Sopenharmony_ci          sudo pip3 install toml
28519ea8026Sopenharmony_ci          fusermount -V
28619ea8026Sopenharmony_ci          gcc --version
28719ea8026Sopenharmony_ci      - uses: actions/checkout@v2
28819ea8026Sopenharmony_ci        with:
28919ea8026Sopenharmony_ci          repository: littlefs-project/littlefs-fuse
29019ea8026Sopenharmony_ci          ref: v2
29119ea8026Sopenharmony_ci          path: littlefs-fuse
29219ea8026Sopenharmony_ci      - name: setup
29319ea8026Sopenharmony_ci        run: |
29419ea8026Sopenharmony_ci          # copy our new version into littlefs-fuse
29519ea8026Sopenharmony_ci          rm -rf littlefs-fuse/littlefs/*
29619ea8026Sopenharmony_ci          cp -r $(git ls-tree --name-only HEAD) littlefs-fuse/littlefs
29719ea8026Sopenharmony_ci
29819ea8026Sopenharmony_ci          # setup disk for littlefs-fuse
29919ea8026Sopenharmony_ci          mkdir mount
30019ea8026Sopenharmony_ci          sudo chmod a+rw /dev/loop0
30119ea8026Sopenharmony_ci          dd if=/dev/zero bs=512 count=128K of=disk
30219ea8026Sopenharmony_ci          losetup /dev/loop0 disk
30319ea8026Sopenharmony_ci      - name: test
30419ea8026Sopenharmony_ci        run: |
30519ea8026Sopenharmony_ci          # self-host test
30619ea8026Sopenharmony_ci          make -C littlefs-fuse
30719ea8026Sopenharmony_ci
30819ea8026Sopenharmony_ci          littlefs-fuse/lfs --format /dev/loop0
30919ea8026Sopenharmony_ci          littlefs-fuse/lfs /dev/loop0 mount
31019ea8026Sopenharmony_ci
31119ea8026Sopenharmony_ci          ls mount
31219ea8026Sopenharmony_ci          mkdir mount/littlefs
31319ea8026Sopenharmony_ci          cp -r $(git ls-tree --name-only HEAD) mount/littlefs
31419ea8026Sopenharmony_ci          cd mount/littlefs
31519ea8026Sopenharmony_ci          stat .
31619ea8026Sopenharmony_ci          ls -flh
31719ea8026Sopenharmony_ci          make -B test
31819ea8026Sopenharmony_ci
31919ea8026Sopenharmony_ci  # test migration using littlefs-fuse
32019ea8026Sopenharmony_ci  migrate:
32119ea8026Sopenharmony_ci    runs-on: ubuntu-18.04
32219ea8026Sopenharmony_ci    if: ${{!endsWith(github.ref, '-prefix')}}
32319ea8026Sopenharmony_ci    steps:
32419ea8026Sopenharmony_ci      - uses: actions/checkout@v2
32519ea8026Sopenharmony_ci      - name: install
32619ea8026Sopenharmony_ci        run: |
32719ea8026Sopenharmony_ci          # need toml, also pip3 isn't installed by default?
32819ea8026Sopenharmony_ci          sudo apt-get update -qq
32919ea8026Sopenharmony_ci          sudo apt-get install -qq python3 python3-pip libfuse-dev
33019ea8026Sopenharmony_ci          sudo pip3 install toml
33119ea8026Sopenharmony_ci          fusermount -V
33219ea8026Sopenharmony_ci          gcc --version
33319ea8026Sopenharmony_ci      - uses: actions/checkout@v2
33419ea8026Sopenharmony_ci        with:
33519ea8026Sopenharmony_ci          repository: littlefs-project/littlefs-fuse
33619ea8026Sopenharmony_ci          ref: v2
33719ea8026Sopenharmony_ci          path: v2
33819ea8026Sopenharmony_ci      - uses: actions/checkout@v2
33919ea8026Sopenharmony_ci        with:
34019ea8026Sopenharmony_ci          repository: littlefs-project/littlefs-fuse
34119ea8026Sopenharmony_ci          ref: v1
34219ea8026Sopenharmony_ci          path: v1
34319ea8026Sopenharmony_ci      - name: setup
34419ea8026Sopenharmony_ci        run: |
34519ea8026Sopenharmony_ci          # copy our new version into littlefs-fuse
34619ea8026Sopenharmony_ci          rm -rf v2/littlefs/*
34719ea8026Sopenharmony_ci          cp -r $(git ls-tree --name-only HEAD) v2/littlefs
34819ea8026Sopenharmony_ci
34919ea8026Sopenharmony_ci          # setup disk for littlefs-fuse
35019ea8026Sopenharmony_ci          mkdir mount
35119ea8026Sopenharmony_ci          sudo chmod a+rw /dev/loop0
35219ea8026Sopenharmony_ci          dd if=/dev/zero bs=512 count=128K of=disk
35319ea8026Sopenharmony_ci          losetup /dev/loop0 disk
35419ea8026Sopenharmony_ci      - name: test
35519ea8026Sopenharmony_ci        run: |
35619ea8026Sopenharmony_ci          # compile v1 and v2
35719ea8026Sopenharmony_ci          make -C v1
35819ea8026Sopenharmony_ci          make -C v2
35919ea8026Sopenharmony_ci
36019ea8026Sopenharmony_ci          # run self-host test with v1
36119ea8026Sopenharmony_ci          v1/lfs --format /dev/loop0
36219ea8026Sopenharmony_ci          v1/lfs /dev/loop0 mount
36319ea8026Sopenharmony_ci
36419ea8026Sopenharmony_ci          ls mount
36519ea8026Sopenharmony_ci          mkdir mount/littlefs
36619ea8026Sopenharmony_ci          cp -r $(git ls-tree --name-only HEAD) mount/littlefs
36719ea8026Sopenharmony_ci          cd mount/littlefs
36819ea8026Sopenharmony_ci          stat .
36919ea8026Sopenharmony_ci          ls -flh
37019ea8026Sopenharmony_ci          make -B test
37119ea8026Sopenharmony_ci
37219ea8026Sopenharmony_ci          # attempt to migrate
37319ea8026Sopenharmony_ci          cd ../..
37419ea8026Sopenharmony_ci          fusermount -u mount
37519ea8026Sopenharmony_ci
37619ea8026Sopenharmony_ci          v2/lfs --migrate /dev/loop0
37719ea8026Sopenharmony_ci          v2/lfs /dev/loop0 mount
37819ea8026Sopenharmony_ci
37919ea8026Sopenharmony_ci          # run self-host test with v2 right where we left off
38019ea8026Sopenharmony_ci          ls mount
38119ea8026Sopenharmony_ci          cd mount/littlefs
38219ea8026Sopenharmony_ci          stat .
38319ea8026Sopenharmony_ci          ls -flh
38419ea8026Sopenharmony_ci          make -B test
38519ea8026Sopenharmony_ci
38619ea8026Sopenharmony_ci  # collect coverage info
38719ea8026Sopenharmony_ci  coverage:
38819ea8026Sopenharmony_ci    runs-on: ubuntu-18.04
38919ea8026Sopenharmony_ci    needs: [test]
39019ea8026Sopenharmony_ci    steps:
39119ea8026Sopenharmony_ci      - uses: actions/checkout@v2
39219ea8026Sopenharmony_ci      - name: install
39319ea8026Sopenharmony_ci        run: |
39419ea8026Sopenharmony_ci          sudo apt-get update -qq
39519ea8026Sopenharmony_ci          sudo apt-get install -qq python3 python3-pip lcov
39619ea8026Sopenharmony_ci          sudo pip3 install toml
39719ea8026Sopenharmony_ci      # yes we continue-on-error nearly every step, continue-on-error
39819ea8026Sopenharmony_ci      # at job level apparently still marks a job as failed, which isn't
39919ea8026Sopenharmony_ci      # what we want
40019ea8026Sopenharmony_ci      - uses: actions/download-artifact@v2
40119ea8026Sopenharmony_ci        continue-on-error: true
40219ea8026Sopenharmony_ci        with:
40319ea8026Sopenharmony_ci          name: coverage
40419ea8026Sopenharmony_ci          path: coverage
40519ea8026Sopenharmony_ci      - name: results-coverage
40619ea8026Sopenharmony_ci        continue-on-error: true
40719ea8026Sopenharmony_ci        run: |
40819ea8026Sopenharmony_ci          mkdir -p results
40919ea8026Sopenharmony_ci          lcov $(for f in coverage/*.info ; do echo "-a $f" ; done) \
41019ea8026Sopenharmony_ci            -o results/coverage.info
41119ea8026Sopenharmony_ci          ./scripts/coverage.py results/coverage.info -o results/coverage.csv
41219ea8026Sopenharmony_ci      - name: upload-results
41319ea8026Sopenharmony_ci        uses: actions/upload-artifact@v2
41419ea8026Sopenharmony_ci        with:
41519ea8026Sopenharmony_ci          name: results
41619ea8026Sopenharmony_ci          path: results
41719ea8026Sopenharmony_ci      - name: collect-status
41819ea8026Sopenharmony_ci        run: |
41919ea8026Sopenharmony_ci          mkdir -p status
42019ea8026Sopenharmony_ci          [ -e results/coverage.csv ] || exit 0
42119ea8026Sopenharmony_ci          export STEP="results-coverage"
42219ea8026Sopenharmony_ci          export CONTEXT="results / coverage"
42319ea8026Sopenharmony_ci          export PREV="$(curl -sS \
42419ea8026Sopenharmony_ci            "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/status/master" \
42519ea8026Sopenharmony_ci            | jq -re 'select(.sha != env.GITHUB_SHA) | .statuses[]
42619ea8026Sopenharmony_ci              | select(.context == env.CONTEXT).description
42719ea8026Sopenharmony_ci              | capture("Coverage is (?<result>[0-9\\.]+)").result' \
42819ea8026Sopenharmony_ci            || echo 0)"
42919ea8026Sopenharmony_ci          export DESCRIPTION="$(
43019ea8026Sopenharmony_ci            ./scripts/coverage.py -u results/coverage.csv -s | awk -F '[ /%]+' '
43119ea8026Sopenharmony_ci              NR==2 {printf "Coverage is %.1f%% of %d lines",$4,$3}
43219ea8026Sopenharmony_ci              NR==2 && ENVIRON["PREV"]+0 != 0 {
43319ea8026Sopenharmony_ci                printf " (%+.1f%%)",$4-ENVIRON["PREV"]}')"
43419ea8026Sopenharmony_ci          jq -n '{
43519ea8026Sopenharmony_ci            state: "success",
43619ea8026Sopenharmony_ci            context: env.CONTEXT,
43719ea8026Sopenharmony_ci            description: env.DESCRIPTION,
43819ea8026Sopenharmony_ci            target_job: "${{github.job}}",
43919ea8026Sopenharmony_ci            target_step: env.STEP}' \
44019ea8026Sopenharmony_ci            | tee status/coverage.json
44119ea8026Sopenharmony_ci      - name: upload-status
44219ea8026Sopenharmony_ci        uses: actions/upload-artifact@v2
44319ea8026Sopenharmony_ci        with:
44419ea8026Sopenharmony_ci          name: status
44519ea8026Sopenharmony_ci          path: status
44619ea8026Sopenharmony_ci          retention-days: 1
447