# Copyright 2021 The Dapr Authors
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#     http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Auto Validate Examples

on:
  workflow_dispatch:
  push:
    branches:
      - master
      - release-*
    tags:
      - v*

  pull_request:
    branches:
    - master
    - release-*
jobs:
  validate:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false # Keep running if one leg fails.
      matrix:
        java: [ 17 ]
    env:
      GOVER: "1.20"
      GOOS: linux
      GOARCH: amd64
      GOPROXY: https://proxy.golang.org
      JDK_VER: ${{ matrix.java }}
      DAPR_CLI_VER: 1.14.0-rc.6
      DAPR_RUNTIME_VER: 1.14.0-rc.8
      DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v1.14.0-rc.3/install/install.sh
      DAPR_CLI_REF:
      DAPR_REF:
    steps:
      - uses: actions/checkout@v4
      - name: Set up OpenJDK ${{ env.JDK_VER }}
        uses: actions/setup-java@v4
        with:
          distribution: 'adopt'
          java-version: ${{ env.JDK_VER }}
      - name: Set up Dapr CLI
        run: wget -q ${{ env.DAPR_INSTALL_URL }} -O - | /bin/bash -s ${{ env.DAPR_CLI_VER }}
      - name: Set up Go ${{ env.GOVER }}
        if: env.DAPR_REF != '' || env.DAPR_CLI_REF != ''
        uses: actions/setup-go@v5
        with:
          go-version: ${{ env.GOVER }}
      - name: Checkout Dapr CLI repo to override dapr command.
        uses: actions/checkout@v4
        if: env.DAPR_CLI_REF != ''
        with:
          repository: dapr/cli
          ref: ${{ env.DAPR_CLI_REF }}
          path: cli
      - name: Checkout Dapr repo to override daprd.
        uses: actions/checkout@v4
        if: env.DAPR_REF != ''
        with:
          repository: dapr/dapr
          ref: ${{ env.DAPR_REF }}
          path: dapr
      - name: Build and override dapr cli with referenced commit.
        if: env.DAPR_CLI_REF != ''
        run: |
          cd cli
          make
          sudo cp dist/linux_amd64/release/dapr /usr/local/bin/dapr
          cd ..
      - name: Initialize Dapr runtime ${{ env.DAPR_RUNTIME_VER }}
        run: |
          dapr uninstall --all
          dapr init --runtime-version ${{ env.DAPR_RUNTIME_VER }}
      - name: Build and override daprd with referenced commit.
        if: env.DAPR_REF != ''
        run: |
          cd dapr
          make
          mkdir -p $HOME/.dapr/bin/
          cp dist/linux_amd64/release/daprd $HOME/.dapr/bin/daprd
          cd ..
      - name: Override placement service.
        if: env.DAPR_REF != ''
        run: |
          docker stop dapr_placement
          cd dapr
          ./dist/linux_amd64/release/placement &
      - name: Install utilities dependencies
        run: |
          echo "PATH=$PATH:$HOME/.local/bin" >> $GITHUB_ENV
          pip3 install setuptools wheel
          pip3 install mechanical-markdown
      - name: Verify scheduler is listening on port.
        run: sleep 30 && docker logs dapr_scheduler && nc -vz localhost 50006
      - name: Clean up files
        run: ./mvnw clean
      - name: Build sdk
        run: ./mvnw compile -q
      - name: Install jars
        run: ./mvnw install -q
      - name: Validate invoke http example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/invoke/http/README.md
      - name: Validate invoke grpc example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/invoke/grpc/README.md
      - name: Validate tracing example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/tracing/README.md
      - name: Validate expection handling example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/exception/README.md
      - name: Validate state example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/state/README.md
      - name: Validate pubsub example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/pubsub/README.md
      - name: Validate bindings HTTP example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/bindings/http/README.md
      - name: Validate secrets example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/secrets/README.md
      - name: Validate unit testing example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/unittesting/README.md
      - name: Validate Configuration API example
        working-directory: ./examples
        run: |
            mm.py ./src/main/java/io/dapr/examples/configuration/README.md
      - name: Validate actors example
        working-directory: ./examples
        run: |
            mm.py ./src/main/java/io/dapr/examples/actors/README.md
      - name: Validate query state HTTP example
        working-directory: ./examples
        run: |
            mm.py ./src/main/java/io/dapr/examples/querystate/README.md
      - name: Validate workflows example
        working-directory: ./examples
        run: |
          mm.py ./src/main/java/io/dapr/examples/workflows/README.md
