This is an automated email from the ASF dual-hosted git repository. ephraimanierobi pushed a commit to branch v2-8-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 7937cba0dc7e2d6db80209cfaf80aafe1d3b1a4c Author: Riyas P K <16943217+rp...@users.noreply.github.com> AuthorDate: Wed Nov 22 06:08:45 2023 +0530 Add missing docker test_exceptions.py (#35674) * test case for docker exceptions * removed docker test exception * re-wrote test case based on feedback --- tests/always/test_project_structure.py | 1 - tests/providers/docker/test_exceptions.py | 80 +++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/tests/always/test_project_structure.py b/tests/always/test_project_structure.py index a58f33d755..967c3ecbb5 100644 --- a/tests/always/test_project_structure.py +++ b/tests/always/test_project_structure.py @@ -108,7 +108,6 @@ class TestProjectStructure: "tests/providers/cncf/kubernetes/utils/test_xcom_sidecar.py", "tests/providers/daskexecutor/executors/test_dask_executor.py", "tests/providers/databricks/hooks/test_databricks_base.py", - "tests/providers/docker/test_exceptions.py", "tests/providers/google/cloud/fs/test_gcs.py", "tests/providers/google/cloud/links/test_automl.py", "tests/providers/google/cloud/links/test_base.py", diff --git a/tests/providers/docker/test_exceptions.py b/tests/providers/docker/test_exceptions.py new file mode 100644 index 0000000000..1f3653c39d --- /dev/null +++ b/tests/providers/docker/test_exceptions.py @@ -0,0 +1,80 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Test for Exceptions used by Docker provider.""" + +from __future__ import annotations + +from unittest import mock + +import pytest +from docker import APIClient + +from airflow.providers.docker.exceptions import ( + DockerContainerFailedException, + DockerContainerFailedSkipException, +) +from airflow.providers.docker.operators.docker import DockerOperator + +FAILED_MESSAGE = {"StatusCode": 1} +FAILED_LOGS = ["unicode container log 😁 ", b"byte string container log"] +EXPECTED_MESSAGE = f"Docker container failed: {FAILED_MESSAGE}" +FAILED_SKIP_MESSAGE = {"StatusCode": 2} +SKIP_ON_EXIT_CODE = 2 +EXPECTED_SKIP_MESSAGE = f"Docker container returned exit code {[SKIP_ON_EXIT_CODE]}. Skipping." + + +@pytest.mark.parametrize( + "failed_msg, log_line, expected_message, skip_on_exit_code", + [ + (FAILED_MESSAGE, FAILED_LOGS, EXPECTED_MESSAGE, None), + (FAILED_SKIP_MESSAGE, FAILED_LOGS, EXPECTED_SKIP_MESSAGE, SKIP_ON_EXIT_CODE), + ], +) +class TestDockerContainerExceptions: + @pytest.fixture(autouse=True, scope="function") + def setup_patchers(self, docker_api_client_patcher): + self.client_mock = mock.MagicMock(spec=APIClient) + self.client_mock.wait.return_value = {"StatusCode": 0} + self.log_messages = ["container log 😁 ", b"byte string container log"] + self.client_mock.attach.return_value = self.log_messages + + self.client_mock.logs.side_effect = ( + lambda **kwargs: iter(self.log_messages[-kwargs["tail"] :]) + if "tail" in kwargs + else iter(self.log_messages) + ) + + docker_api_client_patcher.return_value = self.client_mock + + def test_docker_failed_exception(self, failed_msg, log_line, expected_message, skip_on_exit_code): + self.client_mock.attach.return_value = log_line + self.client_mock.wait.return_value = failed_msg + + operator = DockerOperator( + image="ubuntu", owner="unittest", task_id="unittest", skip_on_exit_code=skip_on_exit_code + ) + + if skip_on_exit_code: + with pytest.raises(DockerContainerFailedSkipException) as raised_exception: + operator.execute(None) + else: + with pytest.raises(DockerContainerFailedException) as raised_exception: + operator.execute(None) + + assert str(raised_exception.value) == expected_message + assert raised_exception.value.logs == [log_line[0].strip(), log_line[1].decode("utf-8")]