aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/shell/integration/bazel_testjobs_test.sh
blob: 59848c7f022b2eccc3f5eb7b80def22b6fa6a6a0 (plain)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/bash
#
# Copyright 2016 The Bazel Authors. All rights reserved.
#
# 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.

# --- begin runfiles.bash initialization ---
# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
set -euo pipefail
if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
  if [[ -f "$0.runfiles_manifest" ]]; then
    export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest"
  elif [[ -f "$0.runfiles/MANIFEST" ]]; then
    export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST"
  elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
    export RUNFILES_DIR="$0.runfiles"
  fi
fi
if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
  source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
  source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
            "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
else
  echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
  exit 1
fi
# --- end runfiles.bash initialization ---

source "$(rlocation "io_bazel/src/test/shell/integration_test_setup.sh")" \
  || { echo "integration_test_setup.sh not found!" >&2; exit 1; }

case "$(uname -s | tr [:upper:] [:lower:])" in
msys*|mingw*|cygwin*)
  declare -r is_windows=true
  ;;
*)
  declare -r is_windows=false
  ;;
esac

if "$is_windows"; then
  export MSYS_NO_PATHCONV=1
  export MSYS2_ARG_CONV_EXCL="*"
fi

add_to_bazelrc "test --nocache_test_results"

# End of preamble.

function create_test_files() {
  # We use this directory as a communication mechanism between test runs. Each
  # test adds a unique file to the directory and then removes it.
  local -r testfiles="$(mktemp -d "$TEST_TMPDIR/tmp.XXXXXXXX")"

  if [[ ! -d dir ]]; then
    mkdir dir
  fi

  cat <<EOF > dir/test.sh
#!/bin/sh

z=\$(mktemp "$testfiles/tmp.XXXXXXXX")

# Try to ensure other test runs have started too.
sleep 1

numtestfiles=\$(ls -1 "$testfiles/" | wc -l)

# The tests below are configured to prevent more than 3 tests from running at
# once. This block returns an error code from this script if it observes more
# than 3 files in the \$testfiles/ directory.
if [[ "\${numtestfiles}" -gt 3 ]] ; then
  echo "Found \${numtestfiles} test files, but there should be 3 at max."
  exit 1
fi

# Try to ensure that we don't remove the test file before other runs have a
# chance to inspect the file.
sleep 1

rm \${z}
EOF

  chmod +x dir/test.sh

  cat <<EOF > dir/BUILD
sh_test(
  name = "test",
  srcs = [ "test.sh" ],
  size = "small",
  tags = [ "local" ],
)
EOF
}

function test_local_test_jobs_constrains_test_execution() {
  create_test_files
  # 3 local test jobs, so no more than 3 tests in parallel.
  bazel test --local_test_jobs=3 --local_resources=10000,10,100 --runs_per_test=10 \
      //dir:test >& $TEST_log || fail "Expected success"
}

function test_no_local_test_jobs_causes_local_resources_to_constrain_test_execution() {
  create_test_files
  # unlimited local test jobs, so local resources enforces 3 tests in parallel.
  bazel test --local_resources=10000,3,100 --runs_per_test=10 \
      //dir:test >& $TEST_log || fail "Expected success"
}

function test_local_test_jobs_exceeds_jobs_causes_warning() {
  create_test_files
  # 10 local test jobs, but only 3 jobs, so warning is printed, and only 3 tests run concurrently
  bazel test --jobs=3 --local_test_jobs=10 --local_resources=10000,10,100 --runs_per_test=10 \
      //dir:test >& $TEST_log || fail "Expected success"

  expect_log 'High value for --local_test_jobs'
}

function test_negative_local_test_jobs_causes_warning() {
  create_test_files
  bazel test --local_test_jobs=-1 --local_resources=10000,10,100 --runs_per_test=10 \
      //dir:test >& $TEST_log && fail "Expected test failure"

  expect_log 'Invalid parameter for --local_test_jobs'
}

run_suite "Tests for --local_test_jobs option."