Skip to content

Commit d225798

Browse files
committed
Tests for reading config values.
1 parent 95cb0d6 commit d225798

File tree

2 files changed

+214
-38
lines changed

2 files changed

+214
-38
lines changed

datadog_lambda/config.py

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,21 @@
99

1010
def _get_env(key, default=None, cast=None):
1111
"""Get an environment variable with a default value."""
12-
val = os.environ.get(key, default)
13-
if cast is not None:
14-
try:
15-
val = cast(val)
16-
except ValueError:
17-
raise ValueError(f"Invalid value for {key}: {val}")
18-
return cast(default)
19-
return val
12+
prop_key = f"_{key}"
2013

14+
@property
15+
def _getter(self):
16+
if not hasattr(self, prop_key):
17+
val = os.environ.get(key, default)
18+
if cast is not None:
19+
try:
20+
val = cast(val)
21+
except ValueError:
22+
raise ValueError(f"Invalid value for {key}: {val}")
23+
return cast(default)
24+
return getattr(self, prop_key)
25+
26+
return _getter
2127

2228
def as_bool(val):
2329
"""Convert a string to a boolean."""
@@ -32,38 +38,40 @@ def as_bool(val):
3238
raise ValueError(f"Invalid boolean value: {val}")
3339

3440

35-
class config:
41+
class Config:
42+
43+
def __init__(self):
44+
self.function_name = os.environ.get("AWS_LAMBDA_FUNCTION_NAME")
45+
self.flush_to_log = os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true"
46+
self.trace_enabled = os.environ.get("DD_TRACE_ENABLED", "true").lower() == "true"
47+
self.cold_start_tracing = (
48+
os.environ.get("DD_COLD_START_TRACING", "true").lower() == "true"
49+
)
50+
self.is_gov_region = os.environ.get("AWS_REGION", "").startswith("us-gov-")
51+
self.fips_mode_enabled = (
52+
os.environ.get(
53+
"DD_LAMBDA_FIPS_MODE",
54+
"true" if self.is_gov_region else "false",
55+
).lower()
56+
== "true"
57+
)
58+
self.flush_in_thread = os.environ.get("DD_FLUSH_IN_THREAD", "").lower() == "true"
59+
self.enhanced_metrics_enabled = (
60+
os.environ.get("DD_ENHANCED_METRICS", "true").lower() == "true"
61+
)
62+
self.is_in_tests = os.environ.get("DD_INTEGRATION_TEST", "false").lower() == "true"
63+
self.add_span_pointers = os.environ.get(
64+
"DD_BOTOCORE_ADD_SPAN_POINTERS", "true"
65+
).lower() in ("true", "1")
66+
self.otel_enabled = os.environ.get("DD_TRACE_OTEL_ENABLED", "false").lower() == "true"
67+
self.is_lambda_context = bool(self.function_name)
68+
self.telemetry_enabled = (
69+
os.environ.get("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "false").lower()
70+
== "true"
71+
)
3672

37-
function_name = os.environ.get("AWS_LAMBDA_FUNCTION_NAME")
38-
flush_to_log = os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true"
39-
trace_enabled = os.environ.get("DD_TRACE_ENABLED", "true").lower() == "true"
40-
cold_start_tracing = (
41-
os.environ.get("DD_COLD_START_TRACING", "true").lower() == "true"
42-
)
43-
is_gov_region = os.environ.get("AWS_REGION", "").startswith("us-gov-")
44-
fips_mode_enabled = (
45-
os.environ.get(
46-
"DD_LAMBDA_FIPS_MODE",
47-
"true" if is_gov_region else "false",
48-
).lower()
49-
== "true"
50-
)
51-
log_level = (os.environ.get("DD_LOG_LEVEL") or "INFO").upper()
52-
flush_in_thread = os.environ.get("DD_FLUSH_IN_THREAD", "").lower() == "true"
53-
enhanced_metrics_enabled = (
54-
os.environ.get("DD_ENHANCED_METRICS", "true").lower() == "true"
55-
)
56-
is_in_tests = os.environ.get("DD_INTEGRATION_TEST", "false").lower() == "true"
57-
add_span_pointers = os.environ.get(
58-
"DD_BOTOCORE_ADD_SPAN_POINTERS", "true"
59-
).lower() in ("true", "1")
60-
otel_enabled = os.environ.get("DD_TRACE_OTEL_ENABLED", "false").lower() == "true"
61-
is_lambda_context = bool(function_name)
62-
telemetry_enabled = (
63-
os.environ.get("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "false").lower()
64-
== "true"
65-
)
6673

74+
config = Config()
6775

6876
if config.is_gov_region or config.fips_mode_enabled:
6977
logger = logging.getLogger(__name__)

tests/test_config.py

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
import pytest
2+
3+
from datadog_lambda.config import Config
4+
5+
6+
_test_config_from_environ = (
7+
("AWS_LAMBDA_FUNCTION_NAME", "function_name", None, None),
8+
("AWS_LAMBDA_FUNCTION_NAME", "function_name", "", ""),
9+
("AWS_LAMBDA_FUNCTION_NAME", "function_name", "my_function", "my_function"),
10+
11+
("DD_FLUSH_TO_LOG", "flush_to_log", None, False),
12+
("DD_FLUSH_TO_LOG", "flush_to_log", "", False),
13+
("DD_FLUSH_TO_LOG", "flush_to_log", "true", True),
14+
("DD_FLUSH_TO_LOG", "flush_to_log", "TRUE", True),
15+
("DD_FLUSH_TO_LOG", "flush_to_log", "false", False),
16+
("DD_FLUSH_TO_LOG", "flush_to_log", "FALSE", False),
17+
("DD_FLUSH_TO_LOG", "flush_to_log", "1", False),
18+
("DD_FLUSH_TO_LOG", "flush_to_log", "0", False),
19+
("DD_FLUSH_TO_LOG", "flush_to_log", "purple", False),
20+
21+
("DD_TRACE_ENABLED", "trace_enabled", None, True),
22+
("DD_TRACE_ENABLED", "trace_enabled", "", False),
23+
("DD_TRACE_ENABLED", "trace_enabled", "true", True),
24+
("DD_TRACE_ENABLED", "trace_enabled", "TRUE", True),
25+
("DD_TRACE_ENABLED", "trace_enabled", "false", False),
26+
("DD_TRACE_ENABLED", "trace_enabled", "FALSE", False),
27+
("DD_TRACE_ENABLED", "trace_enabled", "1", False),
28+
("DD_TRACE_ENABLED", "trace_enabled", "0", False),
29+
("DD_TRACE_ENABLED", "trace_enabled", "purple", False),
30+
31+
("DD_COLD_START_TRACING", "cold_start_tracing", None, True),
32+
("DD_COLD_START_TRACING", "cold_start_tracing", "", False),
33+
("DD_COLD_START_TRACING", "cold_start_tracing", "true", True),
34+
("DD_COLD_START_TRACING", "cold_start_tracing", "TRUE", True),
35+
("DD_COLD_START_TRACING", "cold_start_tracing", "false", False),
36+
("DD_COLD_START_TRACING", "cold_start_tracing", "FALSE", False),
37+
("DD_COLD_START_TRACING", "cold_start_tracing", "1", False),
38+
("DD_COLD_START_TRACING", "cold_start_tracing", "0", False),
39+
("DD_COLD_START_TRACING", "cold_start_tracing", "purple", False),
40+
41+
("AWS_REGION", "is_gov_region", None, False),
42+
("AWS_REGION", "is_gov_region", "", False),
43+
("AWS_REGION", "is_gov_region", "us-gov-1", True),
44+
("AWS_REGION", "is_gov_region", "us-est-1", False),
45+
46+
("DD_FLUSH_IN_THREAD", "flush_in_thread", None, False),
47+
("DD_FLUSH_IN_THREAD", "flush_in_thread", "", False),
48+
("DD_FLUSH_IN_THREAD", "flush_in_thread", "true", True),
49+
("DD_FLUSH_IN_THREAD", "flush_in_thread", "TRUE", True),
50+
("DD_FLUSH_IN_THREAD", "flush_in_thread", "false", False),
51+
("DD_FLUSH_IN_THREAD", "flush_in_thread", "FALSE", False),
52+
("DD_FLUSH_IN_THREAD", "flush_in_thread", "1", False),
53+
("DD_FLUSH_IN_THREAD", "flush_in_thread", "0", False),
54+
("DD_FLUSH_IN_THREAD", "flush_in_thread", "purple", False),
55+
56+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", None, True),
57+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", "", False),
58+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", "true", True),
59+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", "TRUE", True),
60+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", "false", False),
61+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", "FALSE", False),
62+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", "1", False),
63+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", "0", False),
64+
("DD_ENHANCED_METRICS", "enhanced_metrics_enabled", "purple", False),
65+
66+
("DD_INTEGRATION_TEST", "is_in_tests", None, False),
67+
("DD_INTEGRATION_TEST", "is_in_tests", "", False),
68+
("DD_INTEGRATION_TEST", "is_in_tests", "true", True),
69+
("DD_INTEGRATION_TEST", "is_in_tests", "TRUE", True),
70+
("DD_INTEGRATION_TEST", "is_in_tests", "false", False),
71+
("DD_INTEGRATION_TEST", "is_in_tests", "FALSE", False),
72+
("DD_INTEGRATION_TEST", "is_in_tests", "1", False),
73+
("DD_INTEGRATION_TEST", "is_in_tests", "0", False),
74+
("DD_INTEGRATION_TEST", "is_in_tests", "purple", False),
75+
76+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", None, True),
77+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", "", False),
78+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", "true", True),
79+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", "TRUE", True),
80+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", "false", False),
81+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", "FALSE", False),
82+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", "1", True),
83+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", "0", False),
84+
("DD_BOTOCORE_ADD_SPAN_POINTERS", "add_span_pointers", "purple", False),
85+
86+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", None, False),
87+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", "", False),
88+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", "true", True),
89+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", "TRUE", True),
90+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", "false", False),
91+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", "FALSE", False),
92+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", "1", False),
93+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", "0", False),
94+
("DD_TRACE_OTEL_ENABLED", "otel_enabled", "purple", False),
95+
96+
("AWS_LAMBDA_FUNCTION_NAME", "is_lambda_context", None, False),
97+
("AWS_LAMBDA_FUNCTION_NAME", "is_lambda_context", "", False),
98+
("AWS_LAMBDA_FUNCTION_NAME", "is_lambda_context", "my_function", True),
99+
100+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", None, False),
101+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", "", False),
102+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", "true", True),
103+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", "TRUE", True),
104+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", "false", False),
105+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", "FALSE", False),
106+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", "1", False),
107+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", "0", False),
108+
("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "telemetry_enabled", "purple", False),
109+
)
110+
111+
@pytest.mark.parametrize('env_key,conf_key,env_val,conf_val', _test_config_from_environ)
112+
def test_config_from_environ(env_key, conf_key, env_val, conf_val, monkeypatch):
113+
if env_val is not None:
114+
monkeypatch.setenv(env_key, env_val)
115+
config = Config()
116+
assert getattr(config, conf_key) == conf_val
117+
118+
119+
_test_fips_mode_from_environ = (
120+
(None, None, False),
121+
(None, "", False),
122+
(None, "us-gov-1", True),
123+
(None, "us-east-1", False),
124+
125+
("", None, False),
126+
("", "", False),
127+
("", "us-gov-1", False),
128+
("", "us-east-1", False),
129+
130+
("true", None, True),
131+
("true", "", True),
132+
("true", "us-gov-1", True),
133+
("true", "us-east-1", True),
134+
135+
("TRUE", None, True),
136+
("TRUE", "", True),
137+
("TRUE", "us-gov-1", True),
138+
("TRUE", "us-east-1", True),
139+
140+
("false", None, False),
141+
("false", "", False),
142+
("false", "us-gov-1", False),
143+
("false", "us-east-1", False),
144+
145+
("FALSE", None, False),
146+
("FALSE", "", False),
147+
("FALSE", "us-gov-1", False),
148+
("FALSE", "us-east-1", False),
149+
150+
151+
("1", None, False),
152+
("1", "", False),
153+
("1", "us-gov-1", False),
154+
("1", "us-east-1", False),
155+
156+
("0", None, False),
157+
("0", "", False),
158+
("0", "us-gov-1", False),
159+
("0", "us-east-1", False),
160+
)
161+
162+
@pytest.mark.parametrize('fips_mode,region,conf_val', _test_fips_mode_from_environ)
163+
def test_fips_mode_from_environ(fips_mode, region, conf_val, monkeypatch):
164+
if fips_mode is not None:
165+
monkeypatch.setenv("DD_LAMBDA_FIPS_MODE", fips_mode)
166+
if region is not None:
167+
monkeypatch.setenv("AWS_REGION", region)
168+
assert Config().fips_mode_enabled == conf_val

0 commit comments

Comments
 (0)