Skip to content

Commit c4155ec

Browse files
committed
test: more comprehensive integ tests
1 parent 3ce2cb3 commit c4155ec

2 files changed

Lines changed: 80 additions & 14 deletions

File tree

samcli/local/docker/image_build_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ def build_image(
203203
if process.returncode != 0:
204204
raise docker.errors.BuildError(f"Build failed with exit code {process.returncode}", build_log)
205205

206-
for log in build_log:
207-
yield log
206+
# Return a generator that yields the logs
207+
return (log for log in build_log)
208208

209209
@staticmethod
210210
def is_available(engine_type: str) -> Tuple[bool, Optional[str]]:

tests/integration/buildcmd/test_build_cmd.py

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,33 @@
4949

5050

5151
@skipIf(SKIP_DOCKER_TESTS, SKIP_DOCKER_MESSAGE)
52+
@parameterized_class(
53+
("use_buildkit",),
54+
[
55+
(False,),
56+
(True,),
57+
],
58+
)
59+
@pytest.mark.filterwarnings("ignore::ResourceWarning")
5260
class TestBuildingImageTypeLambdaDockerFileFailuresContainer(BuildIntegBase):
5361
template = "template_image.yaml"
5462

63+
def setUp(self):
64+
super().setUp()
65+
if self.use_buildkit:
66+
client = ContainerClientFactory.create_client()
67+
is_available, error_msg = CLIBuildClient.is_available(client.get_runtime_type())
68+
if not is_available:
69+
self.skipTest(f"Buildkit not available: {error_msg}")
70+
5571
def test_with_invalid_dockerfile_location(self):
5672
overrides = {
5773
"Runtime": "3.10",
5874
"Handler": "handler",
5975
"DockerFile": "ThisDockerfileDoesNotExist",
6076
"Tag": uuid4().hex,
6177
}
62-
cmdlist = self.get_command_list(parameter_overrides=overrides)
78+
cmdlist = self.get_command_list(parameter_overrides=overrides, use_buildkit=self.use_buildkit)
6379
command_result = run_command(cmdlist, cwd=self.working_dir)
6480

6581
# confirm build failed
@@ -80,7 +96,7 @@ def test_with_invalid_dockerfile_definition(self):
8096
"DockerFile": "InvalidDockerfile",
8197
"Tag": uuid4().hex,
8298
}
83-
cmdlist = self.get_command_list(parameter_overrides=overrides)
99+
cmdlist = self.get_command_list(parameter_overrides=overrides, use_buildkit=self.use_buildkit)
84100
command_result = run_command(cmdlist, cwd=self.working_dir)
85101

86102
# confirm build failed
@@ -89,29 +105,45 @@ def test_with_invalid_dockerfile_definition(self):
89105

90106

91107
@skipIf(SKIP_DOCKER_TESTS, SKIP_DOCKER_MESSAGE)
108+
@parameterized_class(
109+
("use_buildkit",),
110+
[
111+
(False,),
112+
(True,),
113+
],
114+
)
115+
@pytest.mark.filterwarnings("ignore::ResourceWarning")
92116
class TestLoadingImagesFromArchiveContainer(BuildIntegBase):
93117
template = "template_loadable_image.yaml"
94118

95119
FUNCTION_LOGICAL_ID = "ImageFunction"
96120

121+
def setUp(self):
122+
super().setUp()
123+
if self.use_buildkit:
124+
client = ContainerClientFactory.create_client()
125+
is_available, error_msg = CLIBuildClient.is_available(client.get_runtime_type())
126+
if not is_available:
127+
self.skipTest(f"Buildkit not available: {error_msg}")
128+
97129
def test_load_not_an_archive_passthrough(self):
98130
overrides = {"ImageUri": "./load_image_archive/this_file_does_not_exist.tar.gz"}
99-
cmdlist = self.get_command_list(parameter_overrides=overrides)
131+
cmdlist = self.get_command_list(parameter_overrides=overrides, use_buildkit=self.use_buildkit)
100132
command_result = run_command(cmdlist, cwd=self.working_dir)
101133

102134
self.assertEqual(command_result.process.returncode, 0)
103135

104136
def test_bad_image_archive_fails(self):
105137
overrides = {"ImageUri": "./load_image_archive/error.tar.gz"}
106-
cmdlist = self.get_command_list(parameter_overrides=overrides)
138+
cmdlist = self.get_command_list(parameter_overrides=overrides, use_buildkit=self.use_buildkit)
107139
command_result = run_command(cmdlist, cwd=self.working_dir)
108140

109141
self.assertEqual(command_result.process.returncode, 1)
110142
self.assertIn("unexpected EOF", command_result.stderr.decode())
111143

112144
def test_load_success(self):
113145
overrides = {"ImageUri": "./load_image_archive/archive.tar.gz"}
114-
cmdlist = self.get_command_list(parameter_overrides=overrides)
146+
cmdlist = self.get_command_list(parameter_overrides=overrides, use_buildkit=self.use_buildkit)
115147
command_result = run_command(cmdlist, cwd=self.working_dir)
116148

117149
self.assertEqual(command_result.process.returncode, 0)
@@ -142,17 +174,28 @@ def test_load_success(self):
142174
"Skip build tests on windows when running in CI unless overridden",
143175
)
144176
@parameterized_class(
145-
("template", "prop"),
177+
("template", "prop", "use_buildkit"),
146178
[
147-
("template_local_prebuilt_image.yaml", "ImageUri"),
148-
("template_cfn_local_prebuilt_image.yaml", "Code.ImageUri"),
179+
("template_local_prebuilt_image.yaml", "ImageUri", False),
180+
("template_cfn_local_prebuilt_image.yaml", "Code.ImageUri", False),
181+
("template_local_prebuilt_image.yaml", "ImageUri", True),
182+
("template_cfn_local_prebuilt_image.yaml", "Code.ImageUri", True),
149183
],
150184
)
185+
@pytest.mark.filterwarnings("ignore::ResourceWarning")
151186
class TestSkipBuildingFunctionsWithLocalImageUriContainer(BuildIntegBase):
152187
EXPECTED_FILES_PROJECT_MANIFEST: Set[str] = set()
153188

154189
FUNCTION_LOGICAL_ID_IMAGE = "ImageFunction"
155190

191+
def setUp(self):
192+
super().setUp()
193+
if self.use_buildkit:
194+
client = ContainerClientFactory.create_client()
195+
is_available, error_msg = CLIBuildClient.is_available(client.get_runtime_type())
196+
if not is_available:
197+
self.skipTest(f"Buildkit not available: {error_msg}")
198+
156199
@parameterized.expand(["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"])
157200
def test_with_default_requirements(self, runtime):
158201
_tag = uuid4().hex
@@ -168,7 +211,7 @@ def test_with_default_requirements(self, runtime):
168211
"ImageUri": image_uri,
169212
"Handler": "main.handler",
170213
}
171-
cmdlist = self.get_command_list(parameter_overrides=overrides)
214+
cmdlist = self.get_command_list(parameter_overrides=overrides, use_buildkit=self.use_buildkit)
172215

173216
command_result = run_command(cmdlist, cwd=self.working_dir)
174217
self.assertEqual(command_result.process.returncode, 0)
@@ -1872,6 +1915,16 @@ def _verify_build_succeeds(self, build_dir):
18721915

18731916

18741917
@skipIf(SKIP_DOCKER_TESTS, SKIP_DOCKER_MESSAGE)
1918+
@parameterized_class(
1919+
("cached", "parallel", "use_custom_build_dir"),
1920+
[
1921+
(False, False, False), # Basic
1922+
(True, False, False), # With Caching
1923+
(False, True, False), # With parallelism
1924+
(False, False, True), # With custom build dir
1925+
],
1926+
)
1927+
@pytest.mark.filterwarnings("ignore::ResourceWarning")
18751928
class TestBuildImageWithBuildkit(BuildIntegBase):
18761929
"""Test building image functions with buildkit"""
18771930

@@ -1885,21 +1938,34 @@ def test_build_image_function_with_buildkit(self):
18851938
if not is_available:
18861939
self.skipTest(f"Buildkit not available: {error_msg}")
18871940

1941+
build_dir = self.custom_build_dir if self.use_custom_build_dir else None
1942+
18881943
tag = uuid4().hex
18891944
overrides = {
18901945
"Runtime": "3.12",
18911946
"Handler": "main.handler",
18921947
"DockerFile": "Dockerfile",
18931948
"Tag": tag,
18941949
}
1895-
cmdlist = self.get_command_list(parameter_overrides=overrides, use_buildkit=True)
1950+
cmdlist = self.get_command_list(
1951+
parameter_overrides=overrides,
1952+
use_buildkit=True,
1953+
cached=self.cached,
1954+
parallel=self.parallel,
1955+
build_dir=build_dir,
1956+
)
18961957

18971958
command_result = run_command(cmdlist, cwd=self.working_dir)
18981959
self.assertEqual(command_result.process.returncode, 0)
18991960

1961+
if self.use_custom_build_dir:
1962+
built_template = Path(self.custom_build_dir, "template.yaml")
1963+
else:
1964+
built_template = self.built_template
1965+
19001966
# Verify image was built
19011967
self._verify_image_build_artifact(
1902-
self.built_template,
1968+
built_template,
19031969
self.function_logical_id,
19041970
"ImageUri",
19051971
f"{self.function_logical_id.lower()}:{tag}",
@@ -1908,7 +1974,7 @@ def test_build_image_function_with_buildkit(self):
19081974
# Verify image works
19091975
expected = {"pi": "3.14"}
19101976
self._verify_invoke_built_function(
1911-
self.built_template,
1977+
built_template,
19121978
self.function_logical_id,
19131979
self._make_parameter_override_arg(overrides),
19141980
expected,

0 commit comments

Comments
 (0)