Skip to content

Commit eb56933

Browse files
committed
Speed up test by bundling bazel commands together
1 parent e30fb90 commit eb56933

6 files changed

Lines changed: 94 additions & 93 deletions

File tree

test/common/base.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
Base for unit and functional tests
1717
"""
1818

19+
from curses import noecho
1920
import logging
2021
import os
2122
import re
@@ -66,6 +67,10 @@ class TestBase(unittest.TestCase):
6667
__test_path__: Optional[str] = None
6768
BAZEL_BIN_DIR: Optional[str] = None
6869
BAZEL_TESTLOGS_DIR: Optional[str] = None
70+
BUILD_TARGET: Optional[list[str]] = None
71+
PASSING_TARGET: Optional[list[str]] = None
72+
FAILING_TARGET: Optional[list[str]] = None
73+
BAZEL_CMD_ARGS: str = ""
6974

7075
@classmethod
7176
def setUpClass(cls):
@@ -99,6 +104,44 @@ def setUpClass(cls):
99104
# Save environment and location
100105
cls.save_env = os.environ
101106
cls.save_cwd = os.getcwd()
107+
cls.run_command("pwd")
108+
logging.debug(os.getcwd())
109+
if cls.BUILD_TARGET:
110+
cmd = (
111+
f"bazel build {' '.join(cls.BUILD_TARGET)} {cls.BAZEL_CMD_ARGS}"
112+
)
113+
logging.debug(cmd)
114+
ret, stdout, stderr = cls.run_command(cmd)
115+
assert ret == 0, f"stdout:\n{stdout}\nstderr:\n{stderr}"
116+
if cls.PASSING_TARGET:
117+
cmd = (
118+
f"bazel test {' '.join(cls.PASSING_TARGET)} "
119+
f"{cls.BAZEL_CMD_ARGS}"
120+
)
121+
logging.debug(cmd)
122+
ret, stdout, stderr = cls.run_command(cmd)
123+
assert ret == 0, f"stdout:\n{stdout}\nstderr:\n{stderr}"
124+
if cls.FAILING_TARGET:
125+
# The FAILED report will always be displayed with an absolute path
126+
for target in cls.FAILING_TARGET:
127+
if not target.startswith("//"):
128+
assert (
129+
False
130+
), f"Target must be given with absolute path! {target}"
131+
cmd = (
132+
f"bazel test {' '.join(cls.FAILING_TARGET)} "
133+
f"{cls.BAZEL_CMD_ARGS}"
134+
)
135+
logging.debug(cmd)
136+
ret, stdout, stderr = cls.run_command(cmd)
137+
assert (
138+
ret == 3
139+
), f"return code: {ret}\nstdout:\n{stdout}\nstderr:\n{stderr}"
140+
for target in cls.FAILING_TARGET:
141+
pattern = re.compile(rf"{re.escape(target)}\s+FAILED")
142+
assert pattern.search(
143+
stdout
144+
), f"stdout:\n{stdout}\nstderr:\n{stderr}"
102145

103146
@classmethod
104147
def tearDownClass(cls):
@@ -188,7 +231,7 @@ def start_codechecker_server(cls):
188231
"8001", # user running unittest must make this port free!
189232
]
190233
# pylint: disable=consider-using-with
191-
cls.devnull = open(os.devnull, "w", encoding='utf-8')
234+
cls.devnull = open(os.devnull, "w", encoding="utf-8")
192235
# pylint: disable=consider-using-with
193236
cls.server_process: subprocess.Popen = subprocess.Popen(
194237
server_command, stdout=cls.devnull

test/unit/compile_flags/test_compile_flags.py

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,14 @@ class TestBasic(TestBase):
3535
BAZEL_TESTLOGS_DIR = os.path.join(
3636
"../../..", "bazel-testlogs", "test", "unit", "compile_flags"
3737
)
38+
BUILD_TARGET = [
39+
"//test/unit/compile_flags:compile_commands_filter",
40+
"//test/unit/compile_flags:per_file_filter",
41+
]
42+
BAZEL_CMD_ARGS = "--cxxopt=__CXX__ --conlyopt=__CONLY__"
3843

3944
def test_bazel_test_compile_commands_filter(self):
4045
"""Test: bazel test :compile_commands_filter"""
41-
build_cmd = (
42-
"bazel build "
43-
+ "//test/unit/compile_flags:compile_commands_filter "
44-
+ "--cxxopt=__CXX__ --conlyopt=__CONLY__"
45-
)
46-
exit_code, _, stderr = self.run_command(build_cmd)
47-
self.assertEqual(0, exit_code, stderr)
4846
compile_commands = os.path.join(
4947
self.BAZEL_BIN_DIR, # pyright: ignore
5048
"compile_commands_filter",
@@ -75,13 +73,6 @@ def test_bazel_test_compile_commands_filter(self):
7573

7674
def test_bazel_test_per_file_filter(self):
7775
"""Test: bazel test :per_file_filter"""
78-
build_cmd = (
79-
"bazel build "
80-
+ "//test/unit/compile_flags:per_file_filter "
81-
+ "--cxxopt=__CXX__ --conlyopt=__CONLY__"
82-
)
83-
exit_code, _, stderr = self.run_command(build_cmd)
84-
self.assertEqual(0, exit_code, stderr)
8576
compile_commands = os.path.join(
8677
self.BAZEL_BIN_DIR, # pyright: ignore
8778
"per_file_filter",

test/unit/config/test_config.py

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,19 @@ class TestConfig(TestBase):
3131
BAZEL_TESTLOGS_DIR = os.path.join(
3232
"../../..", "bazel-testlogs", "test", "unit", "config"
3333
)
34+
BUILD_TARGET = [
35+
"//test/unit/config:codechecker_json",
36+
"//test/unit/config:codechecker_yaml",
37+
]
38+
PASSING_TARGET = [
39+
"//test/unit/config:codechecker_test_json",
40+
"//test/unit/config:codechecker_test_yaml",
41+
"//test/unit/config:per_file_test_json",
42+
"//test/unit/config:per_file_test_yaml",
43+
]
3444

3545
def test_codechecker_json(self):
3646
"""Test: bazel build //test/unit/config:codechecker_json"""
37-
ret, _, stderr = self.run_command(
38-
"bazel build //test/unit/config:codechecker_json"
39-
)
40-
self.assertEqual(ret, 0, stderr)
4147
copied_config = os.path.join(
4248
self.BAZEL_BIN_DIR, # type: ignore
4349
"codechecker_json",
@@ -47,10 +53,6 @@ def test_codechecker_json(self):
4753

4854
def test_codechecker_yaml(self):
4955
"""Test: bazel build //test/unit/config:codechecker_yaml"""
50-
ret, _, stderr = self.run_command(
51-
"bazel build //test/unit/config:codechecker_yaml"
52-
)
53-
self.assertEqual(ret, 0, stderr)
5456
copied_config = os.path.join(
5557
self.BAZEL_BIN_DIR, # type: ignore
5658
"codechecker_yaml",
@@ -60,11 +62,6 @@ def test_codechecker_yaml(self):
6062

6163
def test_codechecker_test_json(self):
6264
"""Test: bazel test //test/unit/config:codechecker_test_json"""
63-
ret, _, stderr = self.run_command(
64-
"bazel test //test/unit/config:codechecker_test_json"
65-
)
66-
# Should not find the division by zero bug
67-
self.assertEqual(ret, 0, stderr)
6865
copied_config = os.path.join(
6966
self.BAZEL_BIN_DIR, # type: ignore
7067
"codechecker_test_json",
@@ -76,11 +73,6 @@ def test_codechecker_test_json(self):
7673

7774
def test_codechecker_test_yaml(self):
7875
"""Test: bazel test //test/unit/config:codechecker_test_yaml"""
79-
ret, _, stderr = self.run_command(
80-
"bazel test //test/unit/config:codechecker_test_yaml"
81-
)
82-
# Should not find the division by zero bug
83-
self.assertEqual(ret, 0, stderr)
8476
copied_config = os.path.join(
8577
self.BAZEL_BIN_DIR, # type: ignore
8678
"codechecker_test_yaml",
@@ -90,11 +82,6 @@ def test_codechecker_test_yaml(self):
9082

9183
def test_per_file_test_json(self):
9284
"""Test: bazel test //test/unit/config:per_file_test_json"""
93-
ret, _, stderr = self.run_command(
94-
"bazel test //test/unit/config:per_file_test_json"
95-
)
96-
# Should not find the division by zero bug
97-
self.assertEqual(ret, 0, stderr)
9885
copied_config = os.path.join(
9986
self.BAZEL_BIN_DIR, # type: ignore
10087
"per_file_test_json",
@@ -104,11 +91,6 @@ def test_per_file_test_json(self):
10491

10592
def test_per_file_test_yaml(self):
10693
"""Test: bazel test //test/unit/config:per_file_test_yaml"""
107-
ret, _, stderr = self.run_command(
108-
"bazel test //test/unit/config:per_file_test_yaml"
109-
)
110-
# Should not find the division by zero bug
111-
self.assertEqual(ret, 0, stderr)
11294
copied_config = os.path.join(
11395
self.BAZEL_BIN_DIR, # type: ignore
11496
"per_file_test_yaml",

test/unit/generated_files/test_generated_files.py

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,25 @@ class TestGeneratedFiles(TestBase):
3030
BAZEL_TESTLOGS_DIR = os.path.join(
3131
"../../..", "bazel-testlogs", "test", "unit", "generated_files"
3232
)
33+
FAILING_TARGET = [
34+
"//test/unit/generated_files:codechecker_genrule_header",
35+
"//test/unit/generated_files:codechecker_genrule_source",
36+
"//test/unit/generated_files:per_file_genrule_header",
37+
"//test/unit/generated_files:per_file_genrule_source",
38+
]
39+
BUILD_TARGET = [
40+
"//test/unit/generated_files:compile_commands_genrule_source",
41+
"//test/unit/generated_files:compile_commands_genrule_header",
42+
]
3343

3444
def test_genrule_header_codechecker(self):
3545
"""
3646
Test: bazel test //test/unit/generated_files:codechecker_genrule_header
3747
"""
38-
ret, _, stderr = self.run_command(
39-
"bazel test //test/unit/generated_files:codechecker_genrule_header"
40-
)
41-
self.assertEqual(ret, 3, stderr)
4248
test_log = os.path.join(
4349
self.BAZEL_TESTLOGS_DIR, # type: ignore
4450
"codechecker_genrule_header",
45-
"test.log"
51+
"test.log",
4652
)
4753
self.assertTrue(os.path.exists(test_log))
4854
self.assertTrue(
@@ -55,14 +61,10 @@ def test_genrule_source_codechecker(self):
5561
"""
5662
Test: bazel test //test/unit/generated_files:codechecker_genrule_source
5763
"""
58-
ret, _, stderr = self.run_command(
59-
"bazel test //test/unit/generated_files:codechecker_genrule_source"
60-
)
61-
self.assertEqual(ret, 3, stderr)
6264
test_log = os.path.join(
6365
self.BAZEL_TESTLOGS_DIR, # type: ignore
6466
"codechecker_genrule_source",
65-
"test.log"
67+
"test.log",
6668
)
6769
self.assertTrue(os.path.exists(test_log))
6870
self.assertTrue(
@@ -75,14 +77,10 @@ def test_genrule_header_per_file(self):
7577
"""
7678
Test: bazel test //test/unit/generated_files:per_file_genrule_header
7779
"""
78-
ret, _, stderr = self.run_command(
79-
"bazel test //test/unit/generated_files:per_file_genrule_header"
80-
)
81-
self.assertEqual(ret, 3, stderr)
8280
test_log = os.path.join(
8381
self.BAZEL_TESTLOGS_DIR, # type: ignore
8482
"per_file_genrule_header",
85-
"test.log"
83+
"test.log",
8684
)
8785
self.assertTrue(os.path.exists(test_log))
8886
self.assertTrue(
@@ -95,10 +93,6 @@ def test_genrule_source_per_file(self):
9593
"""
9694
Test: bazel test //test/unit/generated_files:per_file_genrule_source
9795
"""
98-
ret, _, stderr = self.run_command(
99-
"bazel test //test/unit/generated_files:per_file_genrule_source"
100-
)
101-
self.assertEqual(ret, 3, stderr)
10296
test_log = os.path.join(
10397
self.BAZEL_TESTLOGS_DIR, # type: ignore
10498
"per_file_genrule_source",
@@ -117,15 +111,10 @@ def test_genrule_source_compile_commands(self):
117111
bazel build //test/unit/generated_files:compile_commands_genrule_source
118112
"""
119113
target = "genrule_source"
120-
ret, _, stderr = self.run_command(
121-
"bazel build "
122-
+ f"//test/unit/generated_files:compile_commands_{target}"
123-
)
124-
self.assertEqual(ret, 0, stderr)
125114
compile_commands = os.path.join(
126115
self.BAZEL_BIN_DIR, # type: ignore
127116
f"compile_commands_{target}",
128-
"compile_commands.json"
117+
"compile_commands.json",
129118
)
130119
self.assertTrue(os.path.exists(compile_commands))
131120
self.assertTrue(
@@ -140,15 +129,10 @@ def test_genrule_header_compile_commands(self):
140129
bazel build //test/unit/generated_files:compile_commands_genrule_header
141130
"""
142131
target = "genrule_header"
143-
ret, _, stderr = self.run_command(
144-
"bazel build "
145-
f"//test/unit/generated_files:compile_commands_{target}"
146-
)
147-
self.assertEqual(ret, 0, stderr)
148132
compile_commands = os.path.join(
149133
self.BAZEL_BIN_DIR, # type: ignore
150134
f"compile_commands_{target}",
151-
"compile_commands.json"
135+
"compile_commands.json",
152136
)
153137
self.assertTrue(os.path.exists(compile_commands))
154138
self.assertTrue(

test/unit/implementation_deps/test_implementation_deps.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,20 @@ class TestImplementationDeps(TestBase):
3131
BAZEL_TESTLOGS_DIR = os.path.join(
3232
"../../..", "bazel-testlogs", "test", "unit", "implementation_deps"
3333
)
34+
BAZEL_CMD_ARGS = "--experimental_cc_implementation_deps"
35+
FAILING_TARGET = [
36+
"//test/unit/implementation_deps:codechecker_implementation_deps",
37+
"//test/unit/implementation_deps:per_file_implementation_deps",
38+
]
39+
BUILD_TARGET = [
40+
":compile_commands_implementation_deps",
41+
]
3442

3543
def test_codechecker_implementation_deps(self):
3644
"""
3745
Test: bazel test --experimental_cc_implementation_deps
3846
//test/unit/implementation_deps:codechecker_implementation_deps
3947
"""
40-
ret, _, stderr = self.run_command(
41-
"bazel test --experimental_cc_implementation_deps "
42-
"//test/unit/implementation_deps:codechecker_implementation_deps"
43-
)
44-
self.assertEqual(ret, 3, stderr)
4548
test_log = os.path.join(
4649
self.BAZEL_TESTLOGS_DIR, # type: ignore
4750
"codechecker_implementation_deps",
@@ -59,11 +62,6 @@ def test_per_file_implementation_deps(self):
5962
Test: bazel test --experimental_cc_implementation_deps
6063
//test/unit/implementation_deps:pre_file_implementation_deps
6164
"""
62-
ret, _, stderr = self.run_command(
63-
"bazel test --experimental_cc_implementation_deps "
64-
"//test/unit/implementation_deps:per_file_implementation_deps"
65-
)
66-
self.assertEqual(ret, 3, stderr)
6765
test_log = os.path.join(
6866
self.BAZEL_TESTLOGS_DIR, # type: ignore
6967
"per_file_implementation_deps",
@@ -81,11 +79,6 @@ def test_compile_commands_implementation_deps(self):
8179
Test: bazel build --experimental_cc_implementation_deps
8280
//test/unit/implementation_deps:compile_commands_implementation_deps
8381
"""
84-
ret, _, stderr = self.run_command(
85-
"bazel build --experimental_cc_implementation_deps //test/unit/"
86-
"implementation_deps:compile_commands_implementation_deps"
87-
)
88-
self.assertEqual(ret, 0, stderr)
8982
compile_commands = os.path.join(
9083
self.BAZEL_BIN_DIR, # type: ignore
9184
"compile_commands_implementation_deps",

test/unit/template/test_template.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,21 @@
2323

2424
class TestTemplate(TestBase):
2525
"""TODO: Add a description"""
26+
2627
# Set working directory
2728
__test_path__ = os.path.dirname(os.path.abspath(__file__))
2829
# TODO: fix folder name
29-
BAZEL_BIN_DIR = os.path.join("../../..", "bazel-bin", "test",
30-
"unit", "my_test_folder")
31-
BAZEL_TESTLOGS_DIR = os.path.join("../../..", "bazel-testlogs", "test",
32-
"unit", "my_test_folder")
30+
BAZEL_BIN_DIR = os.path.join(
31+
"../../..", "bazel-bin", "test", "unit", "my_test_folder"
32+
)
33+
BAZEL_TESTLOGS_DIR = os.path.join(
34+
"../../..", "bazel-testlogs", "test", "unit", "my_test_folder"
35+
)
36+
# TODO: define bazel targets
37+
BUILD_TARGET = [] # Targets to be build with bazel build
38+
PASSING_TARGET = [] # Targets to be build with bazel test and pass
39+
FAILING_TARGET = [] # Targets to be build with bazel test and fail
40+
BAZEL_CMD_ARGS = "" # Arguments to be given to the bazel commands
3341

3442
@final
3543
@classmethod

0 commit comments

Comments
 (0)