Techdebt: skip tests when docker is not running (#6026)

This commit is contained in:
Hans Donner 2023-03-12 17:54:50 +01:00 committed by GitHub
parent 0d7cec26b7
commit 18ec0c5467
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 109 additions and 13 deletions

View File

@ -36,10 +36,10 @@ format:
test-only:
rm -f .coverage
rm -rf cover
pytest -sv --cov=moto --cov-report xml ./tests/ $(TEST_EXCLUDE)
pytest -sv -rs --cov=moto --cov-report xml ./tests/ $(TEST_EXCLUDE)
# https://github.com/aws/aws-xray-sdk-python/issues/196 - Run these tests separately without Coverage enabled
pytest -sv ./tests/test_xray
MOTO_CALL_RESET_API=false pytest --cov=moto --cov-report xml --cov-append -n 4 $(PARALLEL_TESTS)
pytest -sv -rs ./tests/test_xray
MOTO_CALL_RESET_API=false pytest -rs --cov=moto --cov-report xml --cov-append -n 4 $(PARALLEL_TESTS)
test: lint test-only

View File

@ -59,7 +59,6 @@ from tempfile import TemporaryDirectory
logger = logging.getLogger(__name__)
docker_3 = docker.__version__[0] >= "3"
@ -830,6 +829,7 @@ class LambdaFunction(CloudFormationModel, DockerModel):
except docker.errors.DockerException as e:
# Docker itself is probably not running - there will be no Lambda-logs to handle
msg = f"error running docker: {e}"
logger.error(msg)
self.save_logs(msg)
return msg, True, ""

View File

@ -32,6 +32,9 @@ ENABLE_AMI_VALIDATION = bool(os.environ.get("MOTO_ENABLE_AMI_VALIDATION", False)
PRETTIFY_RESPONSES = bool(os.environ.get("MOTO_PRETTIFY_RESPONSES", False))
# Fully skip test that require docker
SKIP_REQUIRES_DOCKER = bool(os.environ.get("TESTS_SKIP_REQUIRES_DOCKER", False))
def get_sf_execution_history_type():
"""

View File

@ -1,6 +1,7 @@
coverage
pytest
pytest-cov
pytest-ordering
pytest-xdist
surer
freezegun

View File

@ -211,7 +211,8 @@ universal=1
[tool:pytest]
markers =
network: marks tests which require network connection
network: requires network connection
requires_docker: requires running docker
[coverage:run]
relative_files = True

8
tests/markers.py Normal file
View File

@ -0,0 +1,8 @@
import pytest
from moto import settings
requires_docker = pytest.mark.requires_docker
if settings.SKIP_REQUIRES_DOCKER:
requires_docker = pytest.mark.skip(reason="running docker required")

View File

@ -14,6 +14,7 @@ from .utilities import (
wait_for_log_msg,
get_test_zip_file_error,
)
from ..markers import requires_docker
_lambda_region = "us-west-2"
boto3.setup_default_session(region_name=_lambda_region)
@ -54,6 +55,7 @@ def test_create_event_source_mapping():
@mock_logs
@mock_lambda
@mock_sqs
@requires_docker
def test_invoke_function_from_sqs(key):
function_name = str(uuid4())[0:6]
sqs = boto3.resource("sqs", region_name="us-east-1")
@ -98,6 +100,7 @@ def test_invoke_function_from_sqs(key):
@mock_logs
@mock_lambda
@mock_dynamodb
@requires_docker
def test_invoke_function_from_dynamodb_put():
dynamodb = boto3.client("dynamodb", region_name="us-east-1")
table_name = str(uuid4())[0:6] + "_table"
@ -149,6 +152,7 @@ def test_invoke_function_from_dynamodb_put():
@mock_logs
@mock_lambda
@mock_dynamodb
@requires_docker
def test_invoke_function_from_dynamodb_update():
dynamodb = boto3.client("dynamodb", region_name="us-east-1")
table_name = str(uuid4())[0:6] + "_table"
@ -210,6 +214,7 @@ def test_invoke_function_from_dynamodb_update():
@mock_logs
@mock_lambda
@mock_sqs
@requires_docker
def test_invoke_function_from_sqs_exception():
function_name = str(uuid4())[0:6]
logs_conn = boto3.client("logs", region_name="us-east-1")
@ -274,6 +279,7 @@ def test_invoke_function_from_sqs_exception():
@mock_logs
@mock_sns
@mock_lambda
@requires_docker
def test_invoke_function_from_sns():
logs_conn = boto3.client("logs", region_name=_lambda_region)
sns_conn = boto3.client("sns", region_name=_lambda_region)

View File

@ -20,6 +20,7 @@ from .utilities import (
get_lambda_using_network_mode,
get_test_zip_largeresponse,
)
from ..markers import requires_docker
_lambda_region = "us-west-2"
boto3.setup_default_session(region_name=_lambda_region)
@ -27,6 +28,7 @@ boto3.setup_default_session(region_name=_lambda_region)
@pytest.mark.network
@mock_lambda
@requires_docker
def test_invoke_function_that_throws_error():
conn = boto3.client("lambda", _lambda_region)
function_name = str(uuid4())[0:6]
@ -61,6 +63,7 @@ def test_invoke_function_that_throws_error():
@pytest.mark.parametrize("invocation_type", [None, "RequestResponse"])
@pytest.mark.parametrize("key", ["FunctionName", "FunctionArn"])
@mock_lambda
@requires_docker
def test_invoke_requestresponse_function(invocation_type, key):
conn = boto3.client("lambda", _lambda_region)
function_name = str(uuid4())[0:6]
@ -118,6 +121,7 @@ def test_invoke_requestresponse_function(invocation_type, key):
@pytest.mark.network
@mock_lambda
@requires_docker
def test_invoke_event_function():
conn = boto3.client("lambda", _lambda_region)
function_name = str(uuid4())[0:6]
@ -211,6 +215,7 @@ def test_invoke_lambda_using_networkmode():
@pytest.mark.network
@mock_lambda
@requires_docker
def test_invoke_function_with_multiple_files_in_zip():
conn = boto3.client("lambda", _lambda_region)
function_name = str(uuid4())[0:6]
@ -237,6 +242,7 @@ def test_invoke_function_with_multiple_files_in_zip():
@pytest.mark.network
@mock_lambda
@requires_docker
def test_invoke_dryrun_function():
conn = boto3.client("lambda", _lambda_region)
function_name = str(uuid4())[0:6]
@ -300,6 +306,7 @@ if settings.TEST_SERVER_MODE:
@pytest.mark.network
@mock_lambda
@requires_docker
def test_invoke_lambda_error():
lambda_fx = """
def lambda_handler(event, context):
@ -335,6 +342,7 @@ def lambda_handler(event, context):
@pytest.mark.network
@pytest.mark.parametrize("key", ["FunctionName", "FunctionArn"])
@mock_lambda
@requires_docker
def test_invoke_async_function(key):
conn = boto3.client("lambda", _lambda_region)
function_name = str(uuid4())[0:6]
@ -360,6 +368,7 @@ def test_invoke_async_function(key):
@pytest.mark.network
@mock_lambda
@requires_docker
def test_invoke_function_large_response():
# AWS Lambda should only return bodies smaller than 6 MB
conn = boto3.client("lambda", _lambda_region)

View File

@ -8,6 +8,8 @@ import pytest
import time
from uuid import uuid4
from ..markers import requires_docker
@mock_logs
@mock_ec2
@ -94,6 +96,7 @@ def test_submit_job_by_name():
@mock_iam
@mock_batch
@pytest.mark.network
@requires_docker
def test_submit_job():
ec2_client, iam_client, _, logs_client, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)
@ -158,6 +161,7 @@ def test_submit_job():
@mock_iam
@mock_batch
@pytest.mark.network
@requires_docker
def test_submit_job_multinode():
ec2_client, iam_client, _, logs_client, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)
@ -224,6 +228,7 @@ def test_submit_job_multinode():
@mock_iam
@mock_batch
@pytest.mark.network
@requires_docker
def test_list_jobs():
ec2_client, iam_client, _, _, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)
@ -290,6 +295,7 @@ def test_list_jobs():
@mock_ecs
@mock_iam
@mock_batch
@requires_docker
def test_terminate_job():
ec2_client, iam_client, _, logs_client, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)
@ -396,6 +402,7 @@ def test_cancel_pending_job():
@mock_ecs
@mock_iam
@mock_batch
@requires_docker
def test_cancel_running_job():
"""
Test verifies that the moment the job has started, we can't cancel anymore
@ -476,6 +483,7 @@ def _wait_for_job_statuses(client, job_id, statuses, seconds_to_wait=30):
@mock_ecs
@mock_iam
@mock_batch
@requires_docker
def test_failed_job():
ec2_client, iam_client, _, _, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)
@ -509,6 +517,7 @@ def test_failed_job():
@mock_ecs
@mock_iam
@mock_batch
@requires_docker
def test_dependencies():
ec2_client, iam_client, _, logs_client, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)
@ -595,6 +604,7 @@ def retrieve_all_streams(log_stream_name, logs_client):
@mock_ecs
@mock_iam
@mock_batch
@requires_docker
def test_failed_dependencies():
ec2_client, iam_client, _, _, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)
@ -694,6 +704,7 @@ def test_failed_dependencies():
@mock_ecs
@mock_iam
@mock_batch
@requires_docker
def test_container_overrides():
"""
Test if container overrides have any effect.
@ -969,6 +980,7 @@ def test_register_job_definition_with_timeout():
@mock_batch
@mock_ec2
@mock_iam
@requires_docker
def test_submit_job_with_timeout():
ec2_client, iam_client, _, _, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)
@ -992,6 +1004,7 @@ def test_submit_job_with_timeout():
@mock_batch
@mock_ec2
@mock_iam
@requires_docker
def test_submit_job_with_timeout_set_at_definition():
ec2_client, iam_client, _, _, batch_client = _get_clients()
_, _, _, iam_arn = _setup(ec2_client, iam_client)

View File

@ -60,17 +60,17 @@ def test_submit_job_by_name():
job_id = resp["jobId"]
resp_jobs = batch_client.describe_jobs(jobs=[job_id])
assert len(resp_jobs["jobs"]) == 1
len(resp_jobs["jobs"]).should.equal(1)
job = resp_jobs["jobs"][0]
job["jobId"].should.equal(job_id)
job["jobQueue"].should.equal(queue_arn)
job["jobDefinition"].should.equal(job_definition_arn)
job["status"].should.equal("SUCCEEDED")
job.should.contain("container")
job["container"].should.contain("command")
job["container"].should.contain("logStreamName")
assert job["jobId"] == job_id
assert job["jobQueue"] == queue_arn
assert job["jobDefinition"] == job_definition_arn
assert job["status"] == "SUCCEEDED"
assert "container" in job
assert "command" in job["container"]
assert "logStreamName" in job["container"]
@mock_batch_simple

View File

@ -11,6 +11,7 @@ from unittest import SkipTest
from uuid import uuid4
from tests.test_awslambda.utilities import wait_for_log_msg
from .fixtures.custom_lambda import get_template, get_template_for_unknown_lambda
from ..markers import requires_docker
def get_lambda_code():
@ -77,6 +78,7 @@ def test_create_custom_lambda_resource():
@mock_lambda
@mock_logs
@mock_s3
@requires_docker
def test_create_custom_lambda_resource__verify_cfnresponse_failed():
#########
# Integration test using a Custom Resource

View File

@ -27,6 +27,7 @@ from moto import (
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
from tests import EXAMPLE_AMI_ID, EXAMPLE_AMI_ID2
from tests.markers import requires_docker
from tests.test_cloudformation.fixtures import fn_join, single_instance_with_ebs_volume
@ -179,6 +180,7 @@ def test_cloudformation_mapping_boto3():
@mock_cloudformation
@mock_lambda
@requires_docker
def test_lambda_function():
# switch this to python as backend lambda only supports python execution.
lambda_code = """

View File

@ -0,0 +1,36 @@
import logging
import pytest
from tests.markers import requires_docker
logger = logging.getLogger(__name__)
@requires_docker
@pytest.mark.run(order=0)
def test_docker_package_is_available():
try:
import docker # noqa: F401 # pylint: disable=unused-import
except ImportError as err:
logger.error("error running docker: %s", err)
assert False, (
"Docker package cannot be imported. "
+ f"This causes various tests to fail. Err: {err}"
)
@requires_docker
@pytest.mark.run(order=0)
def test_docker_is_running_and_available():
import docker
from docker.errors import DockerException
try:
docker.from_env()
except DockerException as err:
logger.error("error running docker: %s", err)
assert False, (
"Docker seems not to be running. "
+ f"This causes various tests to fail. Err: {err}"
)

View File

@ -3,6 +3,7 @@ import json
from moto import mock_events, mock_iam, mock_lambda, mock_logs, mock_s3
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
from ..markers import requires_docker
from ..test_awslambda.utilities import get_test_zip_file1, wait_for_log_msg
@ -11,6 +12,7 @@ from ..test_awslambda.utilities import get_test_zip_file1, wait_for_log_msg
@mock_lambda
@mock_logs
@mock_s3
@requires_docker
def test_creating_bucket__invokes_lambda():
iam_client = boto3.client("iam", "us-east-1")
lambda_client = boto3.client("lambda", "us-east-1")

View File

@ -13,6 +13,8 @@ from moto import mock_logs, mock_lambda, mock_iam, mock_firehose, mock_s3
from moto.core.utils import unix_time_millis
import pytest
from tests.markers import requires_docker
@mock_lambda
@mock_logs
@ -100,6 +102,7 @@ def test_put_subscription_filter_update():
@mock_lambda
@mock_logs
@pytest.mark.network
@requires_docker
def test_put_subscription_filter_with_lambda():
# given
region_name = "us-east-1"
@ -184,6 +187,7 @@ def test_put_subscription_filter_with_lambda():
@mock_lambda
@mock_logs
@pytest.mark.network
@requires_docker
def test_subscription_filter_applies_to_new_streams():
# given
region_name = "us-east-1"

View File

@ -1,3 +1,4 @@
from tests.markers import requires_docker
from tests.test_batch import _get_clients, _setup
from tests.test_batch.test_batch_jobs import prepare_job, _wait_for_job_status
@ -13,6 +14,7 @@ from unittest import SkipTest
@mock_ecs
@mock_iam
@mock_batch
@requires_docker
def test_cancel_pending_job():
if settings.TEST_SERVER_MODE:
raise SkipTest("Can't use state_manager in ServerMode directly")

View File

@ -3,6 +3,7 @@ import json
import pytest
from moto import mock_lambda, mock_logs, mock_s3, mock_sqs
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
from tests.markers import requires_docker
from tests.test_awslambda.utilities import (
get_test_zip_file_print_event,
get_role_name,
@ -26,6 +27,7 @@ REGION_NAME = "us-east-1"
(["s3:ObjectCreated:Post", "s3:ObjectCreated:*"], "ObjectCreated:Put"),
],
)
@requires_docker
def test_objectcreated_put__invokes_lambda(match_events, actual_event):
s3_res = boto3.resource("s3", region_name=REGION_NAME)
s3_client = boto3.client("s3", region_name=REGION_NAME)

View File

@ -7,6 +7,7 @@ import sure # noqa # pylint: disable=unused-import
import moto.server as server
from moto import mock_secretsmanager, mock_lambda, mock_iam, mock_logs, settings
from tests.markers import requires_docker
from tests.test_awslambda.test_lambda import get_test_zip_file1
DEFAULT_SECRET_NAME = "test-secret"
@ -456,6 +457,7 @@ if not settings.TEST_SERVER_MODE:
@mock_lambda
@mock_logs
@mock_secretsmanager
@requires_docker
def test_rotate_secret_lambda_invocations():
conn = boto3.client("iam", region_name="us-east-1")
logs_conn = boto3.client("logs", region_name="us-east-1")

View File

@ -4,6 +4,7 @@ import time
import uuid
from moto import mock_lambda, mock_sqs, mock_logs
from tests.markers import requires_docker
from tests.test_awslambda.test_lambda import get_test_zip_file1, get_role_name
from tests.test_awslambda.utilities import get_test_zip_file_print_event
@ -11,6 +12,7 @@ from tests.test_awslambda.utilities import get_test_zip_file_print_event
@mock_logs
@mock_lambda
@mock_sqs
@requires_docker
def test_invoke_function_from_sqs_queue():
logs_conn = boto3.client("logs", region_name="us-east-1")
sqs = boto3.resource("sqs", region_name="us-east-1")
@ -71,6 +73,7 @@ def test_invoke_function_from_sqs_queue():
@mock_logs
@mock_lambda
@mock_sqs
@requires_docker
def test_invoke_function_from_sqs_fifo_queue():
"""
Create a FIFO Queue