From 5d3a9a0f2e5510e68040d252190070925ee89fd0 Mon Sep 17 00:00:00 2001
From: DCCooper <1866858@gmail.com>
Date: Mon, 1 Nov 2021 23:37:44 +0800
Subject: [PATCH 14/16] test: optimize scripts in hack

reason:
1. add framework for integration tests
2. shellcheck for scripts

Signed-off-by: DCCooper <1866858@gmail.com>
---
 Makefile                                      | 10 ++---
 hack/all_coverage.sh                          |  4 +-
 ...dv_coverage.sh => integration_coverage.sh} | 42 ++++++++++++-------
 hack/merge_coverage.sh                        | 30 ++++++-------
 hack/unit_test.sh                             | 10 ++---
 5 files changed, 53 insertions(+), 43 deletions(-)
 rename hack/{sdv_coverage.sh => integration_coverage.sh} (63%)

diff --git a/Makefile b/Makefile
index 73482a41..c5384e07 100644
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,7 @@ endif
 ##@ Help
 .PHONY: help
 help: ## Display the help info
-	@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf "  \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
+	@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf "  \033[36m%-25s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
 
 ##@ Build
 
@@ -118,14 +118,14 @@ test-unit-cover: ## Test unit case and generate coverage
 	@./hack/unit_test.sh cover
 	@echo "Unit test cover done!"
 
-.PHONY: test-sdv-cover
-test-sdv-cover: ## Test integration case and generate coverage
+.PHONY: test-integration-cover
+test-integration-cover: ## Test integration case and generate coverage
 	@echo "Integration test cover starting..."
-	@./hack/sdv_coverage.sh
+	@./hack/integration_coverage.sh
 	@echo "Integration test cover done!"
 
 .PHONY: test-cover
-test-cover: test-sdv-cover test-unit-cover ## Test both unit and sdv case and generate unity coverage
+test-cover: test-integration-cover test-unit-cover ## Test both unit and integration case and generate unity coverage
 	@echo "Test cover starting..."
 	@./hack/all_coverage.sh
 	@echo "Test cover done!"
diff --git a/hack/all_coverage.sh b/hack/all_coverage.sh
index 9f9eb5ff..0f23e9d4 100755
--- a/hack/all_coverage.sh
+++ b/hack/all_coverage.sh
@@ -20,7 +20,7 @@ SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" || exit; pwd)
 source "${SCRIPT_DIR}"/merge_coverage.sh
 
 unit_coverage=${PWD}/cover_unit_test_all.out
-sdv_coverage=${PWD}/cover_sdv_test_all.out
+integration_coverage=${PWD}/cover_integration_test_all.out
 output_file=${PWD}/cover_test_all
 
-merge_cover "${output_file}" "${sdv_coverage}" "${unit_coverage}"
+merge_cover "${output_file}" "${integration_coverage}" "${unit_coverage}"
diff --git a/hack/sdv_coverage.sh b/hack/integration_coverage.sh
similarity index 63%
rename from hack/sdv_coverage.sh
rename to hack/integration_coverage.sh
index 874d9373..7462c545 100755
--- a/hack/sdv_coverage.sh
+++ b/hack/integration_coverage.sh
@@ -12,7 +12,7 @@
 # Author: Xiang Li
 # Create: 2020-03-01
 # Description: shell script for coverage
-# Note: use this file by typing make test-sdv-cover or make test-cover
+# Note: use this file by typing make test-integration-cover or make test-cover
 #       Do not run this script directly
 
 project_root=${PWD}
@@ -26,9 +26,10 @@ go_test_cover_method="-covermode=set"
 main_pkg="${vendor_name}/${project_name}/${main_relative_path}"
 main_test_file=${project_root}/${main_relative_path}/main_test.go
 main_file=${project_root}/${main_relative_path}/main.go
-coverage_file=${project_root}/cover_sdv_test_all.out
-coverage_html=${project_root}/cover_sdv_test_all.html
-coverage_log=${project_root}/cover_sdv_test_all.log
+coverage_file=${project_root}/cover_integration_test_all.out
+coverage_html=${project_root}/cover_integration_test_all.html
+coverage_daemon_log=${project_root}/cover_integration_test_all_daemon.log
+coverage_client_log=${project_root}/cover_integration_test_all_client.log
 main_test_binary_file=${project_root}/main.test
 
 function precheck() {
@@ -44,10 +45,10 @@ function modify_main_test() {
     cp "${main_test_file}" "${main_test_file}".bk
     # delete Args field for main.go
     local comment_pattern="Args:  util.NoArgs"
-    sed -i "/$comment_pattern/s/^#*/\/\/ /" "${main_file}"
+    sed -i "/${comment_pattern}/s/^#*/\/\/ /" "${main_file}"
     # add new line for main_test.go
     code_snippet="func TestMain(t *testing.T) { main() }"
-    echo "$code_snippet" >> "${main_test_file}"
+    echo "${code_snippet}" >> "${main_test_file}"
 }
 
 function recover_main_test() {
@@ -56,12 +57,12 @@ function recover_main_test() {
 }
 
 function build_main_test_binary() {
-    pkgs=$(go list ${go_test_mod_method} "${project_root}"/... | grep -Ev ${exclude_pattern} | tr "\r\n" ",")
-    go test -coverpkg="${pkgs}" ${main_pkg} ${go_test_mod_method} ${go_test_cover_method} ${go_test_count_method} -c -o="${main_test_binary_file}"
+    pkgs=$(go list "${go_test_mod_method}" "${project_root}"/... | grep -Ev "${exclude_pattern}" | tr "\r\n" ",")
+    go test -coverpkg="${pkgs}" "${main_pkg}" "${go_test_mod_method}" "${go_test_cover_method}" "${go_test_count_method}" -c -o="${main_test_binary_file}" > /dev/null 2>&1
 }
 
 function run_main_test_binary() {
-    ${main_test_binary_file} -test.coverprofile="${coverage_file}" > "${coverage_log}" 2>&1 &
+    ${main_test_binary_file} -test.coverprofile="${coverage_file}" > "${coverage_daemon_log}" 2>&1 &
     main_test_pid=$!
     for _ in $(seq 1 10); do
         if isula-build info > /dev/null 2>&1; then
@@ -74,15 +75,22 @@ function run_main_test_binary() {
 
 function run_coverage_test() {
     # do cover tests
-    echo "sdv coverage test"
-    # cover_test_xxx
-    # cover_test_xxx
-    # cover_test_xxx
-    # cover_test_xxx
+    while IFS= read -r testfile; do
+        printf "%-60s" "test $(basename "${testfile}"): "
+        echo -e "\n$(basename "${testfile}"):" >> "${coverage_client_log}"
+        if ! bash "${testfile}" >> "${coverage_client_log}" 2>&1; then
+            echo "FAIL"
+            return_code=1
+        else
+            echo "PASS"
+        fi
+    done < <(find "${project_root}"/tests/src -maxdepth 1 -name "cover_test_*" -type f -print)
+    # shellcheck disable=SC2248
+    return ${return_code}
 }
 
 function finish_coverage_test() {
-    kill -15 $main_test_pid
+    kill -15 "${main_test_pid}"
 }
 
 function generate_coverage() {
@@ -90,7 +98,7 @@ function generate_coverage() {
 }
 
 function cleanup() {
-    rm "$main_test_binary_file"
+    rm "${main_test_binary_file}"
 }
 
 precheck
@@ -102,3 +110,5 @@ run_coverage_test
 finish_coverage_test
 generate_coverage
 cleanup
+# shellcheck disable=SC2248
+exit ${return_code}
diff --git a/hack/merge_coverage.sh b/hack/merge_coverage.sh
index 6e529a34..f043dfaf 100644
--- a/hack/merge_coverage.sh
+++ b/hack/merge_coverage.sh
@@ -24,32 +24,32 @@ function merge_cover() {
     output_coverage_file=${output_file_name}.out
     output_html_file=${output_file_name}.html
     output_merge_cover=${output_file_name}.merge
-    grep -r -h -v "^mode:" "${input_coverages[@]}" | sort > "$output_merge_cover"
+    grep -r -h -v "^mode:" "${input_coverages[@]}" | sort > "${output_merge_cover}"
     current=""
     count=0
-    echo "mode: set" > "$output_coverage_file"
+    echo "mode: set" > "${output_coverage_file}"
     # read the cover report from merge_cover, convert it, write to final coverage
     while read -r line; do
-        block=$(echo "$line" | cut -d ' ' -f1-2)
-        num=$(echo "$line" | cut -d ' ' -f3)
-        if [ "$current" == "" ]; then
-            current=$block
-            count=$num
-        elif [ "$block" == "$current" ]; then
+        block=$(echo "${line}" | cut -d ' ' -f1-2)
+        num=$(echo "${line}" | cut -d ' ' -f3)
+        if [ "${current}" == "" ]; then
+            current=${block}
+            count=${num}
+        elif [ "${block}" == "${current}" ]; then
             count=$((count + num))
         else
             # if the sorted two lines are not in the same code block, write the statics result of last code block to the final coverage
-            echo "$current" $count >> "${output_coverage_file}"
-            current=$block
-            count=$num
+            echo "${current} ${count}" >> "${output_coverage_file}"
+            current=${block}
+            count=${num}
         fi
-    done < "$output_merge_cover"
+    done < "${output_merge_cover}"
     rm -rf "${output_merge_cover}"
 
     # merge the results of last line to the final coverage
-    if [ "$current" != "" ]; then
-        echo "$current" "$count" >> "${output_coverage_file}"
+    if [ "${current}" != "" ]; then
+        echo "${current} ${count}" >> "${output_coverage_file}"
     fi
 
-    go tool cover -html="${output_coverage_file}" -o "$output_html_file"
+    go tool cover -html="${output_coverage_file}" -o "${output_html_file}"
 }
diff --git a/hack/unit_test.sh b/hack/unit_test.sh
index 94a44a95..161feb6b 100755
--- a/hack/unit_test.sh
+++ b/hack/unit_test.sh
@@ -47,20 +47,20 @@ function run_unit_test() {
     echo "Testing with args ${TEST_ARGS}"
 
     rm -f "${testlog}"
-    if [[ -n $run_coverage ]]; then
+    if [[ -n ${run_coverage} ]]; then
         mkdir -p "${covers_folder}"
     fi
-    for package in $(go list ${go_test_mod_method} ./... | grep -Ev ${exclude_pattern}); do
+    for package in $(go list "${go_test_mod_method}" ./... | grep -Ev "${exclude_pattern}"); do
         echo "Start to test: ${package}"
-        if [[ -n $run_coverage ]]; then
-            coverprofile_file="${covers_folder}/$(echo "$package" | tr / -).cover"
+        if [[ -n ${run_coverage} ]]; then
+            coverprofile_file="${covers_folder}/$(echo "${package}" | tr / -).cover"
             coverprofile_flag="-coverprofile=${coverprofile_file}"
             go_test_covermode_flag="-covermode=set"
             go_test_race_flag=""
         fi
         # TEST_ARGS is " -args SKIP_REG=foo", so no double quote for it
         # shellcheck disable=SC2086
-        go test -v ${go_test_race_flag} ${go_test_mod_method} ${coverprofile_flag} ${go_test_covermode_flag} -coverpkg=${package} ${go_test_count_method} ${go_test_timeout_flag} "${package}" ${TEST_ARGS} >> "${testlog}"
+        go test -v ${go_test_race_flag} "${go_test_mod_method}" ${coverprofile_flag} "${go_test_covermode_flag}" -coverpkg=${package} "${go_test_count_method}" "${go_test_timeout_flag}" "${package}" ${TEST_ARGS} >> "${testlog}"
     done
 
     if grep -E -- "--- FAIL:|^FAIL" "${testlog}"; then
-- 
2.27.0

