name: Run fvt tests

on:
    push:
    pull_request:
    release:
        types:
            - published
            - prereleased

jobs:
    fvt_tests_with_edgex:
        runs-on: ubuntu-latest

        steps:
        - uses: actions/setup-go@v1
          with:
            go-version: '1.13.10'
        - uses: actions/setup-java@v1
          with:
            java-version: '8' # The JDK version to make available on the path.
            java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
            architecture: x64 # (x64 or x86) - defaults to x64
        - name: install jmeter
          timeout-minutes: 10
          env:
            JMETER_VERSION: 5.2.1
          run: |
            wget -O /tmp/apache-jmeter.tgz http://us.mirrors.quenda.co/apache//jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
            cd /tmp && tar -xvf apache-jmeter.tgz
            echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
            echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
            wget -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-1.13-jar-with-dependencies.jar https://github.com/emqx/mqtt-jmeter/raw/master/Download/v1.13.0/mqtt-xmeter-1.13-jar-with-dependencies.jar
            ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
        - name: install emqx
          env:
            EMQX_VERSION: v4.0.2
          run: |
            wget -O emqx.deb https://www.emqx.io/downloads/broker/v4.0.2/emqx-ubuntu18.04-${EMQX_VERSION}_amd64.deb
            sudo dpkg -i emqx.deb
        - uses: actions/checkout@v2
        - name: build kuiper
          run: |
            sudo apt update && sudo apt install pkg-config libczmq-dev -y
            make build_with_edgex
            go build --buildmode=plugin -o plugins/sources/Zmq.so plugins/sources/zmq.go
        - name: run edgex && emqx && kuiper
          run: |
            sudo ./fvt_scripts/setup_env.sh
            ln -s _build/kuiper-$(git describe --tags --always)-$(uname -s | tr "[A-Z]" "[a-z]")-x86_64/log kuiper_logs
        - name: run fvt tests
          timeout-minutes: 5
          run: ./fvt_scripts/run_jmeter.sh with_edgex=true
        - uses: actions/upload-artifact@v1
          if: always()
          with:
            name: kuiper_logs_with_edgex
            path: ./kuiper_logs
        - uses: actions/upload-artifact@v1
          if: always()
          with:
            name: jmeter_logs_with_edgex
            path: ./jmeter_logs
        - name: check logs
          run: |
            sudo apt update && sudo apt install -y libxml2-utils
            cd jmeter_logs
            if [ ! -z "$(cat *.jtl| grep '<failure>' | awk -F '>' '{print $2}' | awk -F '<' '{print $1}' | grep true)" ] ||
               [ "$(xmllint --format --xpath '/testResults/sample/@rc' $(ls *.jtl) | sed -r 's/ /\n/g;' | sort -u | grep -E 'rc=\"[45][0-9][0-9]\"|rc=\"\"')" != "" ]; then
                echo -e "---------------------------------------------\n"
                echo "FVT tests error"
                exit 1
            fi
            
    fvt_tests_without_edgex:
        runs-on: ubuntu-latest

        steps:
        - uses: actions/setup-go@v1
          with:
            go-version: '1.13.10'
        - uses: actions/setup-java@v1
          with:
            java-version: '8' # The JDK version to make available on the path.
            java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
            architecture: x64 # (x64 or x86) - defaults to x64
        - name: install jmeter
          timeout-minutes: 10
          env:
            JMETER_VERSION: 5.2.1
          run: |
            wget -O /tmp/apache-jmeter.tgz http://us.mirrors.quenda.co/apache//jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
            cd /tmp && tar -xvf apache-jmeter.tgz
            echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
            echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
            wget -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-1.13-jar-with-dependencies.jar https://github.com/emqx/mqtt-jmeter/raw/master/Download/v1.13.0/mqtt-xmeter-1.13-jar-with-dependencies.jar
            ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
        - name: install emqx
          env:
            EMQX_VERSION: v4.0.2
          run: |
            wget -O emqx.deb https://www.emqx.io/downloads/broker/v4.0.2/emqx-ubuntu18.04-${EMQX_VERSION}_amd64.deb
            sudo dpkg -i emqx.deb
        - uses: actions/checkout@v2
        - name: build kuiper
          run: |
            sudo apt update && sudo apt install pkg-config libczmq-dev -y
            make
            go build --buildmode=plugin -o plugins/sources/Zmq.so plugins/sources/zmq.go
        - name: run edgex && emqx && kuiper
          run: |
            sudo ./fvt_scripts/setup_env.sh
            ln -s _build/kuiper-$(git describe --tags --always)-$(uname -s | tr "[A-Z]" "[a-z]")-x86_64/log kuiper_logs
        - name: run fvt tests
          timeout-minutes: 5
          run: ./fvt_scripts/run_jmeter.sh with_edgex=false
        - uses: actions/upload-artifact@v1
          if: always()
          with:
            name: kuiper_logs_without_edgex
            path: ./kuiper_logs
        - uses: actions/upload-artifact@v1
          if: always()
          with:
            name: jmeter_logs_without_edgex
            path: ./jmeter_logs
        - name: check logs
          run: |
            sudo apt update && sudo apt install -y libxml2-utils
            cd jmeter_logs
            if [ ! -z "$(cat *.jtl| grep '<failure>' | awk -F '>' '{print $2}' | awk -F '<' '{print $1}' | grep true)" ] ||
               [ "$(xmllint --format --xpath '/testResults/sample/@rc' $(ls *.jtl) | sed -r 's/ /\n/g;' | sort -u | grep -E 'rc=\"[45][0-9][0-9]\"|rc=\"\"')" != "" ]; then
                echo -e "---------------------------------------------\n"
                echo "FVT tests error"
                exit 1
            fi

    fvt_tests_for_container_in_helm:
      runs-on: ubuntu-latest

      steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-java@v1
        with:
          java-version: '8' # The JDK version to make available on the path.
          java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
          architecture: x64 # (x64 or x86) - defaults to x64
      - name: install jmeter
        timeout-minutes: 10
        env:
          JMETER_VERSION: 5.2.1
        run: |
          wget -O /tmp/apache-jmeter.tgz http://us.mirrors.quenda.co/apache//jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
          cd /tmp && tar -xvf apache-jmeter.tgz
          echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
          echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
          wget -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-1.13-jar-with-dependencies.jar https://github.com/emqx/mqtt-jmeter/raw/master/Download/v1.13.0/mqtt-xmeter-1.13-jar-with-dependencies.jar
          ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
      - name: setup jmeter
        timeout-minutes: 10
        run: |
          wget -O "/opt/jmeter/lib/json-lib-2.4-jdk15.jar" https://repo1.maven.org/maven2/net/sf/json-lib/json-lib/2.4/json-lib-2.4-jdk15.jar
          wget -O "/opt/jmeter/lib/commons-beanutils-1.8.0.jar" https://repo1.maven.org/maven2/commons-beanutils/commons-beanutils/1.8.0/commons-beanutils-1.8.0.jar
          wget -O "/opt/jmeter/lib/commons-collections-3.2.1.jar" https://repo1.maven.org/maven2/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar
          wget -O "/opt/jmeter/lib/commons-lang-2.5.jar" https://repo1.maven.org/maven2/commons-lang/commons-lang/2.5/commons-lang-2.5.jar
          wget -O "/opt/jmeter/lib/commons-logging-1.1.1.jar" https://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar
          wget -O "/opt/jmeter/lib/ezmorph-1.0.6.jar" https://repo1.maven.org/maven2/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6.jar
      - name: install docker
        run: |
          sudo apt-get remove docker docker-engine docker.io containerd runc
          sudo apt-get update
          sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
          curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
          sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
          sudo apt-get update
          sudo apt-get install docker-ce docker-ce-cli containerd.io
      - name: install k3s
        env:
          KUBECONFIG: "/etc/rancher/k3s/k3s.yaml"
        run: |
          sudo sh -c "echo \"127.0.0.1 $(hostname)\" >> /etc/hosts"
          curl -sfL https://get.k3s.io | sh -
          sudo chmod 644 /etc/rancher/k3s/k3s.yaml
          kubectl cluster-info
      - name: install helm
        run: |
          curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
          sudo chmod 700 get_helm.sh
          sudo ./get_helm.sh
          helm version
      - name: build kuiper for docker
        run: sudo docker build --no-cache -t emqx/kuiper:$(git describe --tags --alway)-alpine -f deploy/docker/Dockerfile-alpine .
      - name: run emqx on chart
        env:
          KUBECONFIG: "/etc/rancher/k3s/k3s.yaml"
        timeout-minutes: 5
        run: |
          helm repo add emqx https://repos.emqx.io/charts
          helm repo update
          helm install emqx --set replicaCount=1 emqx/emqx
          while [ "$(kubectl get StatefulSet -l app.kubernetes.io/name=emqx -o jsonpath='{.items[0].status.replicas}')" \
            != "$(kubectl get StatefulSet -l app.kubernetes.io/name=emqx -o jsonpath='{.items[0].status.readyReplicas}')" ]; do
            echo "waiting emqx started"
            sleep 10
          done
      - name: run kuiper for chart
        env:
          KUBECONFIG: "/etc/rancher/k3s/k3s.yaml"
        timeout-minutes: 5
        run: |
          version=$(git describe --tags --always)
          emqx_address=$(kubectl get svc --namespace default emqx -o jsonpath="{.spec.clusterIP}")
          
          sudo docker save emqx/kuiper:$version-alpine -o kuier.tar.gz
          sudo k3s ctr image import kuier.tar.gz
          
          sed -i -r "s/^appVersion: .*$/appVersion: ${version}/g" deploy/chart/kuiper/Chart.yaml
          sed -i -r 's/  pullPolicy: .*$/  pullPolicy: Never/g' deploy/chart/kuiper/values.yaml
          sed -i -r "s/      servers: \[.*\]$/      servers: \[tcp:\/\/${emqx_address}:1883\]/g" deploy/chart/kuiper/values.yaml
          
          helm install kuiper deploy/chart/kuiper
          while [ "$(kubectl get StatefulSet -l app.kubernetes.io/name=kuiper -o jsonpath='{.items[0].status.replicas}')" \
            != "$(kubectl get StatefulSet -l app.kubernetes.io/name=kuiper -o jsonpath='{.items[0].status.readyReplicas}')" ]; do
            echo "waiting kuiper started"
            sleep 10
          done
          kuiper_address=$(kubectl get svc --namespace default kuiper -o jsonpath="{.spec.clusterIP}")
          if [ $(curl -w %{http_code} -fsSL -o /dev/null $kuiper_address:9081) != 200 ];then exit 1; fi
      - name: check kuiper
        env:
          KUBECONFIG: "/etc/rancher/k3s/k3s.yaml"
        timeout-minutes: 5
        run: |
          emqx_address=$(kubectl get svc --namespace default emqx -o jsonpath="{.spec.clusterIP}")
          kuiper_address=$(kubectl get svc --namespace default kuiper -o jsonpath="{.spec.clusterIP}")
          /opt/jmeter/bin/jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t fvt_scripts/select_aggr_rule.jmx -Dsrv=${kuiper_address} -Dmqtt_srv=${emqx_address} -l jmeter_logs/select_aggr_rule.jtl -j jmeter_logs/select_aggr_rule.log
          mkdir -p kuiper_logs
          kubectl exec kuiper-0 -- cat /kuiper/log/stream.log > kuiper_logs/stream.log
      - uses: actions/upload-artifact@v1
        if: always()
        with:
          name: kuiper_logs_with_helm
          path: ./kuiper_logs
      - uses: actions/upload-artifact@v1
        if: always()
        with:
          name: jmeter_logs_with_helm
          path: ./jmeter_logs
      - name: check logs
        run: |
          sudo apt update && sudo apt install -y libxml2-utils
          cd jmeter_logs
          if [ ! -z "$(cat *.jtl| grep '<failure>' | awk -F '>' '{print $2}' | awk -F '<' '{print $1}' | grep true)" ] ||
             [ "$(xmllint --format --xpath '/testResults/sample/@rc' $(ls *.jtl) | sed -r 's/ /\n/g;' | sort -u | grep -E 'rc=\"[45][0-9][0-9]\"|rc=\"\"')" != "" ]; then
              echo -e "---------------------------------------------\n"
              echo "FVT tests error"
              exit 1
          fi