File: test_crt.py

package info (click to toggle)
python-boto3 1.37.9-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,868 kB
  • sloc: python: 13,931; javascript: 192; makefile: 170
file content (89 lines) | stat: -rw-r--r-- 2,778 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# https://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file 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.

from contextlib import ContextDecorator

import pytest
from botocore.compat import HAS_CRT
from botocore.credentials import Credentials

from boto3.s3.transfer import (
    TransferConfig,
    create_transfer_manager,
    has_minimum_crt_version,
)
from tests import mock, requires_crt

if HAS_CRT:
    from s3transfer.crt import CRTTransferManager


class MockOptimizedInstance(ContextDecorator):
    """Helper class to simulate a CRT optimized EC2 instance."""

    DEFAULT_LOCK_MOCK = mock.Mock()

    def __init__(self, lock=DEFAULT_LOCK_MOCK, optimized=True):
        self.acquire_process_lock = mock.patch(
            'boto3.crt.acquire_crt_s3_process_lock'
        )
        self.acquire_process_lock.return_value = lock
        self.is_optimized = mock.patch('awscrt.s3.is_optimized_for_system')
        self.is_optimized.return_value = optimized

    def __enter__(self, *args, **kwargs):
        self.acquire_process_lock.start()
        self.is_optimized.start()

    def __exit__(self, *args, **kwargs):
        self.acquire_process_lock.stop()
        self.is_optimized.stop()


def create_mock_client(region_name='us-west-2'):
    client = mock.Mock()
    client.meta.region_name = region_name
    client._get_credentials.return_value = Credentials(
        'access', 'secret', 'token'
    )
    return client


class TestS3TransferWithCRT:
    @requires_crt()
    @MockOptimizedInstance()
    def test_create_transfer_manager_on_optimized_instance(self):
        client = create_mock_client()
        config = TransferConfig()
        transfer_manager = create_transfer_manager(client, config)
        assert isinstance(transfer_manager, CRTTransferManager)

    @requires_crt()
    def test_minimum_crt_version(self):
        assert has_minimum_crt_version((0, 16, 12)) is True

    @pytest.mark.parametrize(
        "bad_version",
        (
            None,
            "0.1.0-dev",
            "0.20",
            object(),
        ),
    )
    @requires_crt()
    def test_minimum_crt_version_bad_crt_version(self, bad_version):
        with mock.patch("awscrt.__version__") as vers:
            vers.return_value = bad_version

            assert has_minimum_crt_version((0, 16, 12)) is False