name: compile and unit test on foreign arch
on:
  push:
    branches:
      - master
      - queue
      - tip
      - 'stable-*'
    paths:
      - '.github/workflows/foreign.yaml'
      - '**.h'
      - '**.c'
      - '**Makefile*'
      - '**.mk'
  pull_request:
    branches:
      - master
      - queue
      - 'stable-*'
    paths:
      - '.github/workflows/foreign.yaml'
      - '**.h'
      - '**.c'
      - '**Makefile*'
      - '**.mk'

jobs:

  cross-build:
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        os: [bullseye, bookworm, trixie, sid]
        arch: [ppc64le, arm64, s390x]
        exclude:
          - os: bullseye
            arch: ppc64le
          - os: bullseye
            arch: s390x
    container: ghcr.io/mwilck/multipath-cross-debian_cross-${{ matrix.os }}-${{ matrix.arch }}
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: build
        run: make -j$(nproc) -Orecurse test-progs.tar
      - name: upload binary archive
        uses: actions/upload-artifact@v4
        with:
          name: cross-${{ matrix.os }}-${{ matrix.arch }}
          path: test-progs.tar
          overwrite: true

  test:
    runs-on: ubuntu-24.04
    needs: cross-build
    strategy:
      fail-fast: false
      matrix:
        os: [bullseye, bookworm, trixie, sid]
        arch: [ppc64le, arm64, s390x]
        exclude:
          - os: bullseye
            arch: ppc64le
          - os: bullseye
            arch: s390x
    steps:
      - name: set container arch
        run: echo CONTAINER_ARCH="${{ matrix.arch }}" >> $GITHUB_ENV
        if: ${{ matrix.arch != 'armhf' }}
      - name: set container arch
        run: echo CONTAINER_ARCH="arm/v7" >> $GITHUB_ENV
        if: ${{ matrix.arch == 'armhf' }}
      - name: download binary archive
        uses: actions/download-artifact@v4
        with:
          name: cross-${{ matrix.os }}-${{ matrix.arch }}
      - name: unpack binary archive
        run: tar xfv test-progs.tar
      - name: enable foreign arch
        uses: docker/setup-qemu-action@v2
        with:
          image: tonistiigi/binfmt:latest
      - name: run tests
        uses: mosteo-actions/docker-run@v1
        with:
          image: ghcr.io/mwilck/multipath-run-debian-${{ matrix.os }}
          guest-dir: /__w/multipath-tools/multipath-tools
          host-dir: ${{ github.workspace }}
          command: -C tests
          params: >
            --workdir /__w/multipath-tools/multipath-tools
            --platform linux/${{ env.CONTAINER_ARCH }}
          pull-params: "--platform linux/${{ env.CONTAINER_ARCH }}"

  root-test:
    runs-on: ubuntu-24.04
    needs: cross-build
    strategy:
      fail-fast: false
      matrix:
        os: [bullseye, bookworm, trixie, sid]
        arch: [ppc64le, arm64, s390x]
        exclude:
          - os: bullseye
            arch: ppc64le
          - os: bullseye
            arch: s390x
    steps:
      - name: mpath
        run: sudo modprobe dm_multipath
      - name: brd
        run: sudo modprobe brd rd_nr=1 rd_size=65536
      - name: set container arch
        run: echo CONTAINER_ARCH="${{ matrix.arch }}" >> $GITHUB_ENV
        if: ${{ matrix.arch != 'armhf' }}
      - name: set container arch
        run: echo CONTAINER_ARCH="arm/v7" >> $GITHUB_ENV
        if: ${{ matrix.arch == 'armhf' }}
      - name: download binary archive
        uses: actions/download-artifact@v4
        with:
          name: cross-${{ matrix.os }}-${{ matrix.arch }}
      - name: unpack binary archive
        run: tar xfv test-progs.tar
      - name: enable foreign arch
        uses: docker/setup-qemu-action@v2
        with:
          image: tonistiigi/binfmt:latest
      - name: run tests
        uses: mosteo-actions/docker-run@v1
        with:
          image: ghcr.io/mwilck/multipath-run-debian-${{ matrix.os }}
          guest-dir: /__w/multipath-tools/multipath-tools
          host-dir: ${{ github.workspace }}
          command: -C tests dmevents.out
          params: >
            --workdir /__w/multipath-tools/multipath-tools
            --platform linux/${{ env.CONTAINER_ARCH }}
            --privileged
            -v /dev/ram0:/dev/ram0 -e DIO_TEST_DEV=/dev/ram0
          pull-params: "--platform linux/${{ env.CONTAINER_ARCH }}"
        id: root-test
        continue-on-error: true
      - name: show root test output
        run: for o in tests/*.out; do echo "===== $o ====="; cat "$o"; done
      - name: fail
        run: /bin/false
        if: ${{ steps.root-test.outcome == 'failure' }}
