name: Tests

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master
      - develop
  workflow_dispatch:

jobs:
  scan-build:
    name: Clang Static Analyzer
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest

    steps:
      - uses: actions/checkout@v3

      - name: Build with Clang Static Analyzer
        run: |
          make clean
          scan-build --use-cc=clang -analyze-headers -enable-checker security -enable-checker unix -enable-checker valist -o scan-build --status-bugs make default

      - uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: scan-build
          path: scan-build

# =====================================================
#            ZEMU TESTS
# =====================================================

  building_for_e2e_zemu_tests:
    name: Building binaries for E2E Zemu tests
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest

    steps:
      - uses: actions/checkout@v3

      - name: Build testing binaries
        run: |
          git config --global --add safe.directory "$GITHUB_WORKSPACE"
          cd tests/zemu/ && ./build_local_test_elfs.sh

      - name: Upload app binaries
        uses: actions/upload-artifact@v3
        with:
          name: e2e_zemu_elfs
          path: ./tests/zemu/elfs/

  jobs-e2e-zemu-tests:
    name: E2E Zemu tests
    needs: [building_for_e2e_zemu_tests]
    runs-on: ubuntu-latest

    steps:
      - name: Test
        run: |
          id
          echo $HOME
          echo $DISPLAY

      - name: Checkout
        uses: actions/checkout@v3

      - run: sudo apt-get update -y && sudo apt-get install -y libusb-1.0.0 libudev-dev

      - name: Install NodeJS
        uses: actions/setup-node@v3
        with:
          node-version: "16"

      - name: Install yarn
        run: npm install -g yarn

      - name: Build/Install build js deps
        run: cd tests/zemu/ && yarn install

      - name: Create tmp folder for artifacts
        run: mkdir tests/zemu/elfs

      - name: Download app binaries
        uses: actions/download-artifact@v3
        with:
          path: tmp/

      - name: Gather elfs
        run: cp `find tmp/e2e_zemu_elfs/ -name "*.elf"` tests/zemu/elfs/

      - name: Run zemu tests
        run: cd tests/zemu/ && yarn test

# =====================================================
#            SPECULOS TESTS
# =====================================================


  building_for_e2e_speculos_tests:
    name: Building binaries for E2E Speculos tests
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest

    steps:
      - uses: actions/checkout@v3

      - name: Build testing binaries
        run: |
          mkdir tests/speculos/elfs
          make clean && make -j DEBUG=1 NFT_STAGING_KEY=1 BOLOS_SDK=$NANOS_SDK && mv bin/app.elf tests/speculos/elfs/nanos.elf
          make clean && make -j DEBUG=1 NFT_STAGING_KEY=1 BOLOS_SDK=$NANOX_SDK && mv bin/app.elf tests/speculos/elfs/nanox.elf
          make clean && make -j DEBUG=1 NFT_STAGING_KEY=1 BOLOS_SDK=$NANOSP_SDK && mv bin/app.elf tests/speculos/elfs/nanosp.elf

      - name: Upload app binaries
        uses: actions/upload-artifact@v3
        with:
          name: e2e_speculos_elfs
          path: ./tests/speculos/elfs


  jobs-e2e-speculos-tests:
    name: Speculos tests
    strategy:
      fail-fast: false
      matrix:
        model: ["nanosp", "nanos", "nanox"]

    needs: [building_for_e2e_speculos_tests]
    runs-on: ubuntu-latest

    steps:
      - name: Clone
        uses: actions/checkout@v3

      - name: Create tmp folder for artifacts
        run: mkdir tests/speculos/elfs

      - name: Download app binaries
        uses: actions/download-artifact@v3
        with:
          path: tmp/

      - name: Gather elfs
        run: cp `find tmp/e2e_speculos_elfs/ -name "*.elf"` tests/speculos/elfs/

      - name: Install dependencies
        run: |
          cd tests/speculos
          sudo apt-get update && sudo apt-get install -y qemu-user-static
          pip install -r requirements.txt

      - name: Run speculos tests
        run: |
          cd tests/speculos
          pytest --model ${{ matrix.model }} --path ./elfs/${{ matrix.model }}.elf --display headless


# =====================================================
#            RAGGER TESTS
# =====================================================

  build_ragger_elfs:
    name: Build app for Ragger tests
    uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1
    with:
      upload_app_binaries_artifact: "ragger_elfs"
      flags: "DEBUG=1 CAL_TEST_KEY=1 DOMAIN_NAME_TEST_KEY=1 SET_PLUGIN_TEST_KEY=1 NFT_TEST_KEY=1"

  jobs-ragger-tests:
    name: Run Ragger tests
    needs: build_ragger_elfs
    uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1
    with:
      download_app_binaries_artifact: "ragger_elfs"
      test_dir: tests/ragger
