#!/bin/bash

# Copyright 2015 Open Networking Foundation (ONF)
#
# Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
# the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
# or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
#
#     TestON is free software: you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation, either version 2 of the License, or
#     (at your option) any later version.
#
#     TestON is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
#
#    Usage : ./findPatchScript.sh -t <testName> (optional choices : -n <# : number of run on each commit>
#                                                                   -s <# : number of commits to skip every iteration>

#source $ONOS_ROOT/tools/dev/bash_profile

#!/bin/bash
usage() { echo "Usage:$0 [-t <test_name>] Optional:{ -n <number_of_running_test_on_each_commit>
                                                       -s <number_of_skipping_commit> }"; 1>&2; exit 1;  }

NUM_RUN=1
SKIP_COMMIT=1
LOG_FILE="/home/sdn/OnosSystemTest/TestON/logs/findCommitLog.txt"
while getopts ":t:n:s:" ARGS; do
    case $ARGS in
        t)
            TESTNAME=${OPTARG}
            ;;
        n)
            NUM_RUN=${OPTARG}
            ((NUM_RUN > 0)) || usage
            ;;
        s)
            SKIP_COMMIT=${OPTARG}
            ((SKIP_COMMIT > 0)) || usage
            ;;
        *)
            usage
            ;;
    esac
done

if [ -z "${TESTNAME}" ]; then
    usage
fi

exportMsg() {
    echo "Log exported to $LOG_FILE"
}
runScript() {
    echo -n > "$LOG_FILE"
    PREVIOUS_COMMIT=""
    while true; do
        TEST_RESULT="1"
        for ((i=0; i < NUM_RUN; i++))
        do
            cd ~/onos
            COMMIT=$(git log -1 --pretty=fuller | grep -m1 -Po "(?<=commit\s)\w+")
            echo "Current Commit : $COMMIT"
            echo "Current Commit : $COMMIT" >> "$LOG_FILE"
            echo "1" > /tmp/findPatchResult.txt
            cd ~/OnosSystemTest/TestON/bin
            ./cleanup.sh
            ./cli.py run $TESTNAME
            TEST_RESULT=$(cat /tmp/findPatchResult.txt)
            echo $TEST_RESULT
            if [ "$TEST_RESULT" == "0" ]; then
                break
            fi
        done
        if [ "$TEST_RESULT" == "1" ]; then
            echo "Found the commit that has no problem : $(tput setaf 2)$COMMIT$(tput sgr 0)"
            echo "Found the commit that has no problem : $COMMIT" >> $LOG_FILE
            echo "Last commit that had a problem : $(tput setaf 1)$PREVIOUS_COMMIT$(tput sgr 0)"
            echo "Last commit that had a problem : $PREVIOUS_COMMIT" >> $LOG_FILE
            break
        fi

        cd ~/onos
        PREVIOUS_COMMIT=$COMMIT
        COMMIT=$(git log -1 --skip $SKIP_COMMIT --pretty=fuller | grep -m1 -Po "(?<=commit\s)\w+")
        echo "New commit to be tested : $COMMIT"
        echo "New commit to be tested : $COMMIT" >> $LOG_FILE
        STASH_RESULT=$(git stash)
        git checkout $COMMIT
        if [ "$STASH_RESULT" != "No local changes to save" ]; then
            git stash pop
        fi
    done
}

runScript
echo >> $LOG_FILE
echo >> $LOG_FILE
exportMsg
