#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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: Test

on:
  pull_request:
    paths-ignore:
      - '**/*.md'
      - 'dolphinscheduler-ui'
  push:
    paths-ignore:
      - '**/*.md'
      - 'dolphinscheduler-ui'
    branches:
      - dev

env:
  LOG_DIR: /tmp/dolphinscheduler

concurrency:
  group: unit-test-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  unit-test:
    name: Unit Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - name: Sanity Check
        uses: ./.github/actions/sanity-check
      - name: Set up JDK 1.8
        uses: actions/setup-java@v2
        with:
          java-version: 8
          distribution: 'adopt'
      - uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven

      - name: Run Unit tests
        run: ./mvnw clean verify -B -Dmaven.test.skip=false
      - name: Upload coverage report to codecov
        run: CODECOV_TOKEN="09c2663f-b091-4258-8a47-c981827eb29a" bash <(curl -s https://codecov.io/bash)

      # Set up JDK 11 for SonarCloud.
      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: 11
          distribution: 'adopt'
      - name: Run SonarCloud Analysis
        run: >
          ./mvnw --batch-mode verify sonar:sonar
          -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
          -Dmaven.test.skip=true
          -Dcheckstyle.skip=true
          -Dsonar.host.url=https://sonarcloud.io
          -Dsonar.organization=apache
          -Dsonar.core.codeCoveragePlugin=jacoco
          -Dsonar.projectKey=apache-dolphinscheduler
          -Dsonar.login=e4058004bc6be89decf558ac819aa1ecbee57682
          -Dsonar.exclusions=dolphinscheduler-ui/src/**/i18n/locale/*.js
          -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

      - name: Collect logs
        continue-on-error: true
        run: |
          mkdir -p ${LOG_DIR}
          docker-compose -f $(pwd)/docker/docker-swarm/docker-compose.yml logs dolphinscheduler-postgresql > ${LOG_DIR}/db.txt

      - name: Upload logs
        uses: actions/upload-artifact@v2
        continue-on-error: true
        with:
          name: unit-test-logs
          path: ${LOG_DIR}
