This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new f5a2a44b6a4 fix flaky test (#60398)
f5a2a44b6a4 is described below

commit f5a2a44b6a40547706bee1fec30109428f6d810c
Author: Henry Chen <[email protected]>
AuthorDate: Thu Jan 15 04:12:42 2026 +0800

    fix flaky test (#60398)
    
    * fix flaky test
    
    * Add a new assertion
    
    * Use list to log reason_msg
---
 .../src/airflow/providers/amazon/aws/hooks/s3.py   | 22 ++++++++++---------
 .../amazon/tests/unit/amazon/aws/hooks/test_s3.py  | 25 ++++++++++++----------
 2 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py 
b/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
index f24cebc8be6..909423c06d3 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
@@ -1743,29 +1743,31 @@ class S3Hook(AwsBaseHook):
 
     def _sync_to_local_dir_if_changed(self, s3_bucket, s3_object, 
local_target_path: Path):
         should_download = False
-        download_msg = ""
+        download_logs: list[str] = []
+        download_log_params: list[Any] = []
+
         if not local_target_path.exists():
             should_download = True
-            download_msg = f"Local file {local_target_path} does not exist."
+            download_logs.append("Local file %s does not exist.")
+            download_log_params.append(local_target_path)
         else:
             local_stats = local_target_path.stat()
-
             if s3_object.size != local_stats.st_size:
                 should_download = True
-                download_msg = (
-                    f"S3 object size ({s3_object.size}) and local file size 
({local_stats.st_size}) differ."
-                )
+                download_logs.append("S3 object size (%s) and local file size 
(%s) differ.")
+                download_log_params.extend([s3_object.size, 
local_stats.st_size])
 
             s3_last_modified = s3_object.last_modified
             if local_stats.st_mtime < s3_last_modified.timestamp():
                 should_download = True
-                download_msg = f"S3 object last modified 
({s3_last_modified.microsecond}) and local file last modified 
({local_stats.st_mtime}) differ."
+                download_logs.append("S3 object last modified (%s) and local 
file last modified (%s) differ.")
+                download_log_params.extend([s3_last_modified.timestamp(), 
local_stats.st_mtime])
 
         if should_download:
             s3_bucket.download_file(s3_object.key, local_target_path)
-            self.log.debug(
-                "%s Downloaded %s to %s", download_msg, s3_object.key, 
local_target_path.as_posix()
-            )
+            download_logs.append("Downloaded %s to %s")
+            download_log_params.extend([s3_object.key, 
local_target_path.as_posix()])
+            self.log.debug(" ".join(download_logs), *download_log_params)
         else:
             self.log.debug(
                 "Local file %s is up-to-date with S3 object %s. Skipping 
download.",
diff --git a/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py 
b/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
index 4b6dae9c206..ef3c9fddb8a 100644
--- a/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
+++ b/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
@@ -1799,9 +1799,9 @@ class TestAwsS3Hook:
         )
         logs_string = get_logs_string(hook.log.debug.call_args_list)
         assert f"Downloading data from s3://{s3_bucket}" in logs_string
-        assert f"does not exist. Downloaded dag_01.py to 
{sync_local_dir}/dag_01.py" in logs_string
-        assert "does not exist. Downloaded dag_01.py to" in logs_string
-        assert f"does not exist. Downloaded subproject1/dag_a.py to 
{sync_local_dir}" in logs_string
+        assert "does not exist" in logs_string
+        assert f"Downloaded dag_01.py to {sync_local_dir}/dag_01.py" in 
logs_string
+        assert f"Downloaded subproject1/dag_a.py to {sync_local_dir}" in 
logs_string
 
         # add new file to bucket and sync
         hook.log.debug = MagicMock()
@@ -1810,11 +1810,9 @@ class TestAwsS3Hook:
             bucket_name=s3_bucket, local_dir=sync_local_dir, s3_prefix="", 
delete_stale=True
         )
         logs_string = get_logs_string(hook.log.debug.call_args_list)
-        assert (
-            "subproject1/dag_b.py is up-to-date with S3 object 
subproject1/dag_b.py. Skipping download"
-            in logs_string
-        )
-        assert f"does not exist. Downloaded dag_03.py to 
{sync_local_dir}/dag_03.py" in logs_string
+        assert "is up-to-date with S3 object subproject1/dag_b.py" in 
logs_string
+        assert "does not exist" in logs_string
+        assert f"Downloaded dag_03.py to {sync_local_dir}/dag_03.py" in 
logs_string
         # read that file is donloaded and has same content
         assert Path(sync_local_dir).joinpath("dag_03.py").read_text() == "test 
data"
 
@@ -1837,8 +1835,12 @@ class TestAwsS3Hook:
             bucket_name=s3_bucket, local_dir=sync_local_dir, s3_prefix="", 
delete_stale=True
         )
         logs_string = get_logs_string(hook.log.debug.call_args_list)
-        assert "S3 object size" in logs_string
-        assert "differ. Downloaded dag_03.py to" in logs_string
+        # When file size differs, we should see size difference message
+        assert ("S3 object size" in logs_string and "differ" in logs_string) 
or (
+            "S3 object last modified" in logs_string
+        )
+        assert "Downloaded dag_03.py to" in logs_string
+        assert Path(sync_local_dir).joinpath("dag_03.py").read_text() == "test 
data-changed"
 
         local_file_same_size = Path(sync_local_dir).joinpath("dag_04.py")
         local_file_same_size.write_text("same size")
@@ -1853,9 +1855,10 @@ class TestAwsS3Hook:
             bucket_name=s3_bucket, local_dir=sync_local_dir, s3_prefix="", 
delete_stale=True
         )
         logs_string = get_logs_string(hook.log.debug.call_args_list)
+        # When file size is same but timestamp differs, we should see the 
timestamp difference message
         assert "S3 object last modified" in logs_string
         assert "local file last modified" in logs_string
-        assert "differ. Downloaded dag_04.py to" in logs_string
+        assert "Downloaded dag_04.py to" in logs_string
 
 
 @pytest.mark.parametrize(

Reply via email to