aboutsummaryrefslogtreecommitdiff
path: root/ci/common/suite.sh
blob: 46207754fa212747d5f9798a2c379a73527e2f44 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# HACK: get newline for use in strings given that "\n" and $'' do not work.
NL="$(printf '\nE')"
NL="${NL%E}"

FAILED=0

FAIL_SUMMARY=""

enter_suite() {
  local suite_name="$1"
  export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name"
}

exit_suite() {
  if test $FAILED -ne 0 ; then
    echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
    echo "${FAIL_SUMMARY}"
  fi
  export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
  if test "x$1" != "x--continue" ; then
    exit $FAILED
  fi
}

fail() {
  local allow_failure=
  if test "x$1" = "x--allow-failure" ; then
    shift
    allow_failure=A
  fi
  local test_name="$1"
  local fail_char="$allow_failure$2"
  local message="$3"

  : ${fail_char:=F}
  : ${message:=Test $test_name failed}

  local full_msg="$fail_char $NVIM_TEST_CURRENT_SUITE|$test_name :: $message"
  FAIL_SUMMARY="${FAIL_SUMMARY}${NL}${full_msg}"
  echo "Failed: $full_msg"
  if test "x$allow_failure" = "x" ; then
    FAILED=1
  fi
}

run_test() {
  local cmd="$1"
  test $# -gt 0 && shift
  local test_name="$1"
  : ${test_name:=$cmd}
  test $# -gt 0 && shift
  if ! eval "$cmd" ; then
    fail "${test_name}" "$@"
  fi
}

run_test_wd() {
  local timeout="$1"
  test $# -gt 0 && shift

  local cmd="$1"
  test $# -gt 0 && shift

  local restart_cmd="$1"
  : ${restart_cmd:=true}
  test $# -gt 0 && shift

  local test_name="$1"
  : ${test_name:=$cmd}
  test $# -gt 0 && shift

  local output_file="$(mktemp)"
  local status_file="$(mktemp)"

  local restarts=5
  local prev_tmpsize=-1
  while test $restarts -gt 0 ; do
    : > "${status_file}"
    (
      FAILED=0
      if ! (
        set -o pipefail
        eval "$cmd" 2>&1 | tee -a "$output_file"
      ) ; then
        fail "${test_name}" "$@"
      fi
      echo "$FAILED" > "$status_file"
    ) &
    local pid=$!
    while test "$(stat -c "%s" "$status_file")" -eq 0 ; do
      prev_tmpsize=$tmpsize
      sleep $timeout
      tmpsize="$(stat -c "%s" "$output_file")"
      if test $tempsize -eq $prev_temsize ; then
        # no output, assuming either hang or exit
        break
      fi
    done
    restarts=$[ restarts - 1 ]
    if test "$(stat -c "%s" "$status_file")" -eq 0 ; then
      # status file not updated, assuming hang
      kill -KILL $pid
      if test $restarts -eq 0 ; then
        fail "${test_name}" E "Test hang up"
      else
        echo "Test ${test_name} hang up, restarting"
        eval "$restart_cmd"
      fi
    else
      local new_failed="$(cat "$status_file")"
      if test "x$new_failed" != "x0" ; then
        fail "${test_name}" F "Test failed in run_test_wd"
      fi
      return 0
    fi
  done
}

succeeded() {
  return $FAILED
}