name: CI emscripten

# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:


env:
  PYODIDE_VERSION: 0.58.4
  # PYTHON_VERSION and EMSCRIPTEN_VERSION are determined by PYODIDE_VERSION.
  # The appropriate versions can be found in the Pyodide repodata.json
  # "info" field, or in Makefile.envs:
  # https://github.com/pyodide/pyodide/blob/main/Makefile.envs#L2
  PYTHON_VERSION: 3.12.7
  EMSCRIPTEN_VERSION: 3.1.58
  EM_CACHE_FOLDER: emsdk-cache

jobs:
  setup-emsdk-cache:
    runs-on: ubuntu-22.04
    steps:
      - name: Setup cache
        uses: actions/cache@v4
        with:
          path: ${{ env.EM_CACHE_FOLDER }}
          key: ${{ env.EMSCRIPTEN_VERSION }}

      - name: Setup emsdk
        uses: mymindstorm/setup-emsdk@v14
        with:
          version: ${{ env.EMSCRIPTEN_VERSION }}
          actions-cache-folder: ${{ env.EM_CACHE_FOLDER }}

  test-dejagnu:
    runs-on: ubuntu-24.04
    needs: [setup-emsdk-cache]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.PYTHON_VERSION }}

      - name: Setup cache
        uses: actions/cache@v4
        with:
          path: ${{ env.EM_CACHE_FOLDER }}
          key: ${{ env.EMSCRIPTEN_VERSION }}

      - name: Setup emsdk
        uses: mymindstorm/setup-emsdk@v14
        with:
          version: ${{ env.EMSCRIPTEN_VERSION }}
          actions-cache-folder: ${{ env.EM_CACHE_FOLDER }}

      - name: Install dependencies
        run: sudo apt-get install dejagnu libltdl-dev

      - name: Run tests
        run: testsuite/emscripten/node-tests.sh

      - name: Install rlgl and run
        run: |
          wget -qO - https://rl.gl/cli/rlgl-linux-amd64.tgz | \
               tar --strip-components=2 -xvzf - ./rlgl/rlgl;
          ./rlgl l --key=0LIBFFI-0LIBFFI-0LIBFFI-0LIBFFI https://rl.gl
          ./rlgl e -l project=libffi -l sha=${GITHUB_SHA:0:7} -l CC='emcc' -l host=wasm32-unknown-linux --policy=https://github.com/libffi/rlgl-policy.git testsuite/libffi.log
          exit $?

  build:
    runs-on: ubuntu-24.04
    needs: [setup-emsdk-cache]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup cache
        uses: actions/cache@v4
        with:
          path: ${{ env.EM_CACHE_FOLDER }}
          key: ${{ env.EMSCRIPTEN_VERSION }}

      - name: Setup emsdk
        uses: mymindstorm/setup-emsdk@v12
        with:
          version: ${{ env.EMSCRIPTEN_VERSION }}
          actions-cache-folder: ${{ env.EM_CACHE_FOLDER }}

      - name: Install dependencies
        run: sudo apt-get install libltdl-dev

      - name: Build
        run: ./testsuite/emscripten/build.sh

      - name: Build tests
        run: |
          cp -r testsuite/libffi.call testsuite/libffi.call.test
          cp -r testsuite/libffi.closures testsuite/libffi.closures.test
          ./testsuite/emscripten/build-tests.sh testsuite/libffi.call.test
          ./testsuite/emscripten/build-tests.sh testsuite/libffi.closures.test

      - name: Store artifacts
        uses: actions/upload-artifact@v4
        with:
          name: built-tests
          path: ./testsuite/libffi.c*/

  test:
    strategy:
      matrix:
        browser: ["chrome"]
        # FIXME: selenium can't find gecko driver for "firefox"
    runs-on: ubuntu-24.04
    needs: [build]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Download build artifact
        uses: actions/download-artifact@v4
        with:
          name: built-tests
          path: ./testsuite/

      - uses: conda-incubator/setup-miniconda@v3
        with:
          activate-environment: pyodide-env
          python-version: ${{ env.PYTHON_VERSION }}
          channels: conda-forge

      - name: Install test dependencies
        run: pip install pytest-pyodide==${{ env.PYODIDE_VERSION }}

      - name: Run tests
        run: |
          cd testsuite/emscripten/
          mkdir test-results
          pytest \
            --junitxml=test-results/junit.xml \
              test_libffi.py \
              -k ${{ matrix.browser }} \
              -s

      - name: Install rlgl and run
        if: success() || failure()
        run: |
          wget -qO - https://rl.gl/cli/rlgl-linux-amd64.tgz | \
               tar --strip-components=2 -xvzf - ./rlgl/rlgl;
          ./rlgl l --key=0LIBFFI-0LIBFFI-0LIBFFI-0LIBFFI https://rl.gl
          ./rlgl e -l project=libffi -l sha=${GITHUB_SHA:0:7} -l CC='emcc' -l host=${{ matrix.browser }} --policy=https://github.com/libffi/rlgl-policy.git testsuite/emscripten/test-results/junit.xml
          exit $?
