#!/usr/bin/env bash
# Copyright 2019 The Kubernetes 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.

# This script checks whether e2e test code which contains `Expect()` but not use
# the e2e framework exists or not.
# Usage: `hack/verify-test-code.sh`.

set -o errexit
set -o nounset
set -o pipefail

KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
source "${KUBE_ROOT}/hack/lib/init.sh"
cd "${KUBE_ROOT}"

all_e2e_files=()
# NOTE: This checks e2e test code without the e2e framework which contains Expect().To(HaveOccurred())
kube::util::read-array all_e2e_files < <(find test/e2e{,_node,_kubeadm} -name '*.go' | grep -v 'test/e2e/framework/')
errors_expect_no_error=()
for file in "${all_e2e_files[@]}"
do
    if grep -E "Expect\(.*\)\.(NotTo|ToNot)\(.*HaveOccurred\(\)" "${file}" > /dev/null
    then
        errors_expect_no_error+=( "${file}" )
    fi
    if grep -E "Expect\(err\)\.To\(gomega\.BeNil\(\)\)" "${file}" > /dev/null
    then
        errors_expect_no_error+=( "${file}" )
    fi
done

all_e2e_framework_files=()
kube::util::read-array all_e2e_framework_files < <(find test/e2e/framework/ -name '*.go' | grep -v "_test.go")
errors_framework_contains_tests=()
for file in "${all_e2e_framework_files[@]}"
do
    if grep -E "(ConformanceIt\(.*, func\(\) {|ginkgo.It\(.*, func\(\) {)" "${file}" > /dev/null
    then
        errors_framework_contains_tests+=( "${file}" )
    fi
done

if [ ${#errors_expect_no_error[@]} -ne 0 ]; then
  {
    echo "Errors:"
    for err in "${errors_expect_no_error[@]}"; do
      echo "$err"
    done
    echo
    echo 'The above files need to use framework.ExpectNoError(err) instead of '
    echo 'Expect(err).NotTo(HaveOccurred()) or gomega.Expect(err).NotTo(gomega.HaveOccurred())'
    echo
  } >&2
  exit 1
fi

if [ ${#errors_framework_contains_tests[@]} -ne 0 ]; then
  {
    echo "Errors:"
    for err in "${errors_framework_contains_tests[@]}"; do
      echo "$err"
    done
    echo
    echo 'The above e2e framework files should not contain any e2e tests which are implemented '
    echo 'with framework.ConformanceIt() or ginkgo.It()'
    echo
  } >&2
  exit 1
fi

echo 'Congratulations!  All e2e test source files are valid.'
