#-------------------------------------------------------------
#
# 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: Component Test

on: [push, pull_request]

jobs:
  componentTests:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
    name: Component Tests ${{ matrix.os }}
    steps:
    - name: Checkout Repository
      uses: actions/checkout@v2

    - name: Setup Java 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8

    - name: Cache Maven Dependencies
      uses: actions/cache@v1
      with:
        path: ~/.m2/repository
        key: ${{ runner.os }}-maven-test-${{ hashFiles('**/pom.xml') }}
        restore-keys: |
          ${{ runner.os }}-maven-test-

    - name: Component Tests
      run: |
        log="/tmp/sysdstest.log"
        echo "Starting Tests"
        mvn test -D maven.test.skip=false -Dtest=org.apache.sysds.test.component.*.** 2>&1 > $log
        grep_args="SUCCESS"
        grepvals="$( tail -n 100 $log | grep $grep_args)"
        if [[ $grepvals == *"SUCCESS"* ]]; then
        	echo "--------------------- last 100 lines from test ------------------------"
        	tail -n 100 $log
        	echo "------------------ last 100 lines from test end -----------------------"
        	exit 0
        else
        	echo "\n $(cat $log)"
        	exit 1
        fi

