Skip to content

Commit eeb462e

Browse files
authored
fix: Avoid creating unnecessary DebugSettings objects when --debug (aws#2750)
* fix: Avoid creating unnecessary DebugSettings objects when --debug present * Add unit tests * Move unit tests to pre-exist file
1 parent 55064d3 commit eeb462e

File tree

2 files changed

+59
-16
lines changed

2 files changed

+59
-16
lines changed

samcli/local/docker/lambda_debug_settings.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ def get_debug_settings(debug_port, debug_args_list, _container_env_vars, runtime
5050
if not _container_env_vars:
5151
_container_env_vars = dict()
5252

53+
# The value of entrypoint_mapping is a callable instead of DebugSettings
54+
# so that DebugSetting objects are not always created.
5355
entrypoint_mapping = {
54-
Runtime.java8.value: DebugSettings(
56+
Runtime.java8.value: lambda: DebugSettings(
5557
entry,
5658
container_env_vars={
5759
"_JAVA_OPTIONS": "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,quiet=y,"
@@ -61,7 +63,7 @@ def get_debug_settings(debug_port, debug_args_list, _container_env_vars, runtime
6163
**_container_env_vars,
6264
},
6365
),
64-
Runtime.java8al2.value: DebugSettings(
66+
Runtime.java8al2.value: lambda: DebugSettings(
6567
entry,
6668
container_env_vars={
6769
"_JAVA_OPTIONS": "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,quiet=y,"
@@ -71,7 +73,7 @@ def get_debug_settings(debug_port, debug_args_list, _container_env_vars, runtime
7173
**_container_env_vars,
7274
},
7375
),
74-
Runtime.java11.value: DebugSettings(
76+
Runtime.java11.value: lambda: DebugSettings(
7577
entry,
7678
container_env_vars={
7779
"_JAVA_OPTIONS": "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,quiet=y,"
@@ -81,15 +83,15 @@ def get_debug_settings(debug_port, debug_args_list, _container_env_vars, runtime
8183
**_container_env_vars,
8284
},
8385
),
84-
Runtime.dotnetcore21.value: DebugSettings(
86+
Runtime.dotnetcore21.value: lambda: DebugSettings(
8587
entry + ["/var/runtime/bootstrap"] + debug_args_list,
8688
container_env_vars={"_AWS_LAMBDA_DOTNET_DEBUGGING": "1", **_container_env_vars},
8789
),
88-
Runtime.dotnetcore31.value: DebugSettings(
90+
Runtime.dotnetcore31.value: lambda: DebugSettings(
8991
entry + ["/var/runtime/bootstrap"] + debug_args_list,
9092
container_env_vars={"_AWS_LAMBDA_DOTNET_DEBUGGING": "1", **_container_env_vars},
9193
),
92-
Runtime.go1x.value: DebugSettings(
94+
Runtime.go1x.value: lambda: DebugSettings(
9395
entry,
9496
container_env_vars={
9597
"_AWS_LAMBDA_GO_DEBUGGING": "1",
@@ -99,7 +101,7 @@ def get_debug_settings(debug_port, debug_args_list, _container_env_vars, runtime
99101
**_container_env_vars,
100102
},
101103
),
102-
Runtime.nodejs10x.value: DebugSettings(
104+
Runtime.nodejs10x.value: lambda: DebugSettings(
103105
entry
104106
+ ["/var/lang/bin/node"]
105107
+ debug_args_list
@@ -112,7 +114,7 @@ def get_debug_settings(debug_port, debug_args_list, _container_env_vars, runtime
112114
**_container_env_vars,
113115
},
114116
),
115-
Runtime.nodejs12x.value: DebugSettings(
117+
Runtime.nodejs12x.value: lambda: DebugSettings(
116118
entry
117119
+ ["/var/lang/bin/node"]
118120
+ debug_args_list
@@ -125,7 +127,7 @@ def get_debug_settings(debug_port, debug_args_list, _container_env_vars, runtime
125127
**_container_env_vars,
126128
},
127129
),
128-
Runtime.nodejs14x.value: DebugSettings(
130+
Runtime.nodejs14x.value: lambda: DebugSettings(
129131
entry
130132
+ ["/var/lang/bin/node"]
131133
+ debug_args_list
@@ -138,25 +140,25 @@ def get_debug_settings(debug_port, debug_args_list, _container_env_vars, runtime
138140
**_container_env_vars,
139141
},
140142
),
141-
Runtime.python27.value: DebugSettings(
143+
Runtime.python27.value: lambda: DebugSettings(
142144
entry + ["/usr/bin/python2.7"] + debug_args_list + ["/var/runtime/awslambda/bootstrap.py"],
143145
container_env_vars=_container_env_vars,
144146
),
145-
Runtime.python36.value: DebugSettings(
147+
Runtime.python36.value: lambda: DebugSettings(
146148
entry + ["/var/lang/bin/python3.6"] + debug_args_list + ["/var/runtime/awslambda/bootstrap.py"],
147149
container_env_vars=_container_env_vars,
148150
),
149-
Runtime.python37.value: DebugSettings(
151+
Runtime.python37.value: lambda: DebugSettings(
150152
entry + ["/var/lang/bin/python3.7"] + debug_args_list + ["/var/runtime/bootstrap"],
151153
container_env_vars=_container_env_vars,
152154
),
153-
Runtime.python38.value: DebugSettings(
155+
Runtime.python38.value: lambda: DebugSettings(
154156
entry + ["/var/lang/bin/python3.8"] + debug_args_list + ["/var/runtime/bootstrap.py"],
155157
container_env_vars=_container_env_vars,
156158
),
157159
}
158160
try:
159-
return entrypoint_mapping[runtime]
161+
return entrypoint_mapping[runtime]()
160162
except KeyError as ex:
161163
if not runtime:
162164
LOG.debug("Passing entrypoint as specified in template")

tests/unit/local/docker/test_lambda_debug_settings.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,25 @@
11
from unittest import TestCase
2-
from unittest.mock import patch
2+
from unittest.mock import patch, Mock
33

44
from parameterized import parameterized
55

6-
from samcli.local.docker.lambda_debug_settings import LambdaDebugSettings
6+
from samcli.local.docker.lambda_debug_settings import DebuggingNotSupported, LambdaDebugSettings, Runtime
7+
8+
_DEBUG_RUNTIMES = [
9+
Runtime.java8,
10+
Runtime.java8al2,
11+
Runtime.java11,
12+
Runtime.dotnetcore21,
13+
Runtime.dotnetcore31,
14+
Runtime.go1x,
15+
Runtime.nodejs10x,
16+
Runtime.nodejs12x,
17+
Runtime.nodejs14x,
18+
Runtime.python27,
19+
Runtime.python36,
20+
Runtime.python37,
21+
Runtime.python38,
22+
]
723

824

925
class TestLambdaDebugSettings(TestCase):
@@ -32,3 +48,28 @@ def test_unrecognized_delve_api_version_parsing(self, debug_arg_list):
3248
warning_mock.assert_called_once_with(
3349
'Ignoring unrecognized arguments: %s. Only "-delveAPI" is supported.', debug_arg_list
3450
)
51+
52+
@parameterized.expand([(runtime,) for runtime in _DEBUG_RUNTIMES])
53+
@patch("samcli.local.docker.lambda_debug_settings.DebugSettings")
54+
def test_only_one_debug_setting_is_created(self, runtime, debug_settings_mock):
55+
LambdaDebugSettings.get_debug_settings(1234, [], {}, runtime.value, {})
56+
debug_settings_mock.assert_called_once()
57+
58+
@parameterized.expand([(runtime,) for runtime in Runtime if runtime not in _DEBUG_RUNTIMES])
59+
@patch("samcli.local.docker.lambda_debug_settings.DebugSettings")
60+
def test_debugging_not_supported_raised(self, runtime, debug_settings_mock):
61+
with self.assertRaises(DebuggingNotSupported):
62+
LambdaDebugSettings.get_debug_settings(1234, [], {}, runtime.value, {})
63+
debug_settings_mock.assert_not_called()
64+
65+
@patch("samcli.local.docker.lambda_debug_settings.LambdaDebugSettings.parse_go_delve_api_version")
66+
def test_parse_go_delve_api_version_called_for_go_runtimes(self, parse_go_delve_api_version_mock):
67+
debug_args_list = Mock()
68+
LambdaDebugSettings.get_debug_settings(1234, debug_args_list, {}, Runtime.go1x.value, {})
69+
parse_go_delve_api_version_mock.assert_called_once_with(debug_args_list)
70+
71+
@parameterized.expand([(runtime,) for runtime in _DEBUG_RUNTIMES if runtime != Runtime.go1x])
72+
@patch("samcli.local.docker.lambda_debug_settings.LambdaDebugSettings.parse_go_delve_api_version")
73+
def test_parse_go_delve_api_version_not_called_for_other_runtimes(self, runtime, parse_go_delve_api_version_mock):
74+
LambdaDebugSettings.get_debug_settings(1234, [], {}, runtime.value, {})
75+
parse_go_delve_api_version_mock.assert_not_called()

0 commit comments

Comments
 (0)