From 966f71751d2121a5932545ba13d003a99aeb80b0 Mon Sep 17 00:00:00 2001 From: Santiago Mola Date: Mon, 10 Feb 2025 17:42:13 +0100 Subject: [PATCH] [java] Check Java logs --- tests/test_library_logs.py | 53 +++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/tests/test_library_logs.py b/tests/test_library_logs.py index 7604d749cf..2aa576eed9 100644 --- a/tests/test_library_logs.py +++ b/tests/test_library_logs.py @@ -3,14 +3,25 @@ # Copyright 2021 Datadog, Inc. from utils import context, interfaces, irrelevant, features +import itertools +import re +from typing import Pattern + + +def matches_any(patterns: list[Pattern], string: str): + for pattern in patterns: + if re.fullmatch(pattern, string): + return True + return False @features.not_reported class Test_NoExceptions: - """There is not exception in dotnet-tracer-managed log files""" + """No unexpected exceptions or errors.""" @irrelevant(context.library != "dotnet", reason="only for .NET") def test_dotnet(self): + """There is not exception in dotnet-tracer-managed log files""" interfaces.library_dotnet_managed.assert_absence( pattern=r"[A-Za-z]+\.[A-Za-z]*Exception", allowed_patterns=[ @@ -18,3 +29,43 @@ def test_dotnet(self): r"Logger retrieved for: Datadog.Trace.Debugger.ExceptionAutoInstrumentation.ExceptionDebugging", # pylint: disable=line-too-long ], ) + + @irrelevant(context.library != "java", reason="only for Java") + def test_java_logs(self): + """Test Java logs for unexpected errors.""" + java_allowed_patterns: list[Pattern] | list[str] = [ + r".*" + + re.escape( + "Skipped authentication, auth=org.springframework.security.authentication.AnonymousAuthenticationToken" + ), + # APPSEC-56726: + r".*" + re.escape("Attempt to replace context value for Address{key='usr.login'}"), + # APPSEC-56727: + r".*org.hsqldb.HsqlException.*", + # APPSEC-56728: + r".*getWriter.* has already been called for this response.*", + # APPSEC-56729: + r".*java.lang.NullPointerException: null.*at com.datadoghq.system_tests.iast.utils.SqlExamples.fetchUsers.*", + ] + java_allowed_patterns = [re.compile(p, re.MULTILINE | re.DOTALL) for p in java_allowed_patterns] + logs = list(interfaces.library_stdout.get_data()) + logs = list({l["raw"] for l in logs}) + logs = [l for l in logs if "ERROR" in l] + logs = [l for l in logs if not matches_any(java_allowed_patterns, l)] + assert not logs + + @irrelevant(context.library != "java", reason="only for Java") + def test_java_telemetry_logs(self): + """Test Java telemetry logs for unexpected errors.""" + java_allowed_patterns: list[Pattern] | list[str] = [ + re.escape("Skipped authentication, auth={}"), + # APPSEC-56726 + re.escape("Attempt to replace context value for {}"), + ] + java_allowed_patterns = [re.compile(p, re.MULTILINE | re.DOTALL) for p in java_allowed_patterns] + data = interfaces.library.get_telemetry_data() + data = [d["request"]["content"] for d in data] + data = [d["payload"]["logs"] for d in data if d.get("request_type") == "logs"] + data = list(itertools.chain(*data)) + data = [d for d in data if not matches_any(java_allowed_patterns, d["message"])] + assert not data