name: Magisk Build

on:
  push:
    branches: [master]
    paths:
      - "app/**"
      - "native/**"
      - "buildSrc/**"
      - "build.py"
      - "gradle.properties"
      - ".github/workflows/build.yml"
  pull_request:
    branches: [master]
  workflow_dispatch:

jobs:
  build:
    name: Build Magisk artifacts
    runs-on: macos-14
    strategy:
      fail-fast: false
    steps:
      - name: Check out
        uses: actions/checkout@v4
        with:
          submodules: "recursive"

      - name: Setup environment
        uses: ./.github/actions/setup
        with:
          is-asset-build: true

      - name: Build release
        run: ./build.py -vr all

      - name: Build debug
        run: ./build.py -v all

      - name: Stop gradle daemon
        run: ./gradlew --stop

      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ github.sha }}
          path: out
          compression-level: 9

      - name: Upload mapping and native debug symbols
        uses: actions/upload-artifact@v4
        with:
          name: ${{ github.sha }}-symbols
          path: app/apk/build/outputs
          compression-level: 9

  test-build:
    name: Test building on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [windows-latest, ubuntu-latest]
    steps:
      - name: Check out
        uses: actions/checkout@v4
        with:
          submodules: "recursive"

      - name: Setup environment
        uses: ./.github/actions/setup

      - name: Test build
        run: python build.py -v -c .github/ci.prop all

      - name: Stop gradle daemon
        run: ./gradlew --stop

  avd-test:
    name: Test API ${{ matrix.version }} (x86_64)
    runs-on: ubuntu-latest
    needs: build
    strategy:
      fail-fast: false
      matrix:
        version: [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]
        type: [""]
        include:
          - version: 35
            type: "google_apis"

    steps:
      - name: Check out
        uses: actions/checkout@v4

      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: ${{ github.sha }}
          path: out

      - name: Enable KVM group perms
        run: |
          echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
          sudo udevadm control --reload-rules
          sudo udevadm trigger --name-match=kvm

      - name: Run AVD test
        timeout-minutes: 10
        env:
          AVD_TEST_LOG: 1
        run: scripts/avd_test.sh ${{ matrix.version }} ${{ matrix.type }}

      - name: Upload logs on error
        if: ${{ failure() }}
        uses: actions/upload-artifact@v4
        with:
          name: "avd-logs-${{ matrix.version }}"
          path: |
            kernel.log
            logcat.log

  avd-test-32:
    name: Test API ${{ matrix.version }} (x86)
    runs-on: ubuntu-latest
    needs: build
    strategy:
      fail-fast: false
      matrix:
        version: [23, 24, 25, 26, 27, 28, 29, 30]

    steps:
      - name: Check out
        uses: actions/checkout@v4

      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: ${{ github.sha }}
          path: out

      - name: Enable KVM group perms
        run: |
          echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
          sudo udevadm control --reload-rules
          sudo udevadm trigger --name-match=kvm

      - name: Run AVD test
        timeout-minutes: 10
        env:
          FORCE_32_BIT: 1
          AVD_TEST_LOG: 1
        run: scripts/avd_test.sh ${{ matrix.version }}

      - name: Upload logs on error
        if: ${{ failure() }}
        uses: actions/upload-artifact@v4
        with:
          name: "avd32-logs-${{ matrix.version }}"
          path: |
            kernel.log
            logcat.log

  cf_test:
    name: Test ${{ matrix.device }}
    runs-on: ubuntu-24.04
    needs: build
    env:
      CF_HOME: /home/runner/aosp_cf_phone
    strategy:
      fail-fast: false
      matrix:
        include:
          - branch: "aosp-main"
            device: "aosp_cf_x86_64_phone"
          - branch: "aosp-main-throttled"
            device: "aosp_cf_x86_64_phone_pgagnostic"

    steps:
      - name: Check out
        uses: actions/checkout@v4

      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: ${{ github.sha }}
          path: out

      - name: Setup Cuttlefish environment
        run: |
          scripts/cuttlefish.sh setup
          scripts/cuttlefish.sh download ${{ matrix.branch }} ${{ matrix.device }}

      - name: Run Cuttlefish test
        timeout-minutes: 10
        run: su $USER -c 'scripts/cuttlefish.sh test'

      - name: Upload logs on error
        if: ${{ failure() }}
        uses: actions/upload-artifact@v4
        with:
          name: "cvd-logs-${{ matrix.device }}"
          path: |
            /home/runner/aosp_cf_phone/cuttlefish/instances/cvd-1/logs
            /home/runner/aosp_cf_phone/cuttlefish/instances/cvd-1/cuttlefish_config.json
