From cc440f9c12587918aab3ecd68cb2e4ca4ce7bf4a Mon Sep 17 00:00:00 2001 From: "a.berezin" Date: Fri, 28 Jun 2024 15:15:25 +0300 Subject: [PATCH] [#261] Update nested test to check keys Signed-off-by: a.berezin --- .../services/s3_gate/test_s3_bucket.py | 10 +++---- .../services/s3_gate/test_s3_multipart.py | 28 +++++++++++-------- .../services/s3_gate/test_s3_object.py | 21 +++++++++----- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/pytest_tests/testsuites/services/s3_gate/test_s3_bucket.py b/pytest_tests/testsuites/services/s3_gate/test_s3_bucket.py index 1aca47e..f851168 100644 --- a/pytest_tests/testsuites/services/s3_gate/test_s3_bucket.py +++ b/pytest_tests/testsuites/services/s3_gate/test_s3_bucket.py @@ -62,10 +62,10 @@ class TestS3GateBucket: s3_client.head_bucket(bucket_1) - with reporter.step(f"Delete empty bucket {bucket_2}"): + with reporter.step("Delete empty bucket_2"): s3_client.delete_bucket(bucket_2) - with reporter.step(f"Check bucket {bucket_2} deleted"): + with reporter.step("Check bucket_2 is deleted"): with pytest.raises(Exception, match=r".*Not Found.*"): s3_client.head_bucket(bucket_2) @@ -73,14 +73,14 @@ class TestS3GateBucket: assert bucket_1 in buckets, f"Expected bucket {bucket_1} is in the list" assert bucket_2 not in buckets, f"Expected bucket {bucket_2} is not in the list" - with reporter.step(f"Delete object from {bucket_1}"): + with reporter.step("Delete object from bucket_1"): s3_client.delete_object(bucket_1, file_name, version_id) s3_helper.check_objects_in_bucket(s3_client, bucket_1, expected_objects=[]) - with reporter.step(f"Delete bucket {bucket_1}"): + with reporter.step("Delete bucket_1"): s3_client.delete_bucket(bucket_1) - with reporter.step(f"Check bucket {bucket_1} deleted"): + with reporter.step("Check bucket_1 deleted"): with pytest.raises(Exception, match=r".*Not Found.*"): s3_client.head_bucket(bucket_1) diff --git a/pytest_tests/testsuites/services/s3_gate/test_s3_multipart.py b/pytest_tests/testsuites/services/s3_gate/test_s3_multipart.py index 8f984e7..d8fad51 100644 --- a/pytest_tests/testsuites/services/s3_gate/test_s3_multipart.py +++ b/pytest_tests/testsuites/services/s3_gate/test_s3_multipart.py @@ -7,6 +7,7 @@ from frostfs_testlib.steps.s3 import s3_helper from frostfs_testlib.storage.dataclasses.object_size import ObjectSize from frostfs_testlib.storage.dataclasses.wallet import WalletInfo from frostfs_testlib.testing.cluster_test_base import ClusterTestBase +from frostfs_testlib.testing.test_control import wait_for_success from frostfs_testlib.utils.file_utils import generate_file, get_file_hash, split_file PART_SIZE = 5 * 1024 * 1024 @@ -68,11 +69,11 @@ class TestS3GateMultipart(ClusterTestBase): with reporter.step("Delete the object"): s3_client.delete_object(bucket, object_key, version_id) - with reporter.step("List objects in the bucket, expect to be empty"): + with reporter.step("There should be no objects in bucket"): objects_list = s3_client.list_objects(bucket) assert not objects_list, f"Expected empty bucket, got {objects_list}" - with reporter.step("List objects in the container via rpc, expect to be empty"): + with reporter.step("There should be no objects in container"): objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint) assert len(objects) == 0, f"Expected no objects in container, got\n{objects}" @@ -92,7 +93,7 @@ class TestS3GateMultipart(ClusterTestBase): files_count = len(to_upload) upload_key = "multipart_abort" - with reporter.step(f"Get related container_id for bucket '{bucket}'"): + with reporter.step("Get related container_id for bucket"): for cluster_node in self.cluster.cluster_nodes: container_id = search_container_by_name(bucket, cluster_node) if container_id: @@ -101,15 +102,15 @@ class TestS3GateMultipart(ClusterTestBase): with reporter.step("Create multipart upload"): upload_id = s3_client.create_multipart_upload(bucket, upload_key) - with reporter.step(f"Upload {files_count} files to multipart upload"): + with reporter.step(f"Upload {files_count} parts to multipart upload"): for i, file in enumerate(to_upload, 1): s3_client.upload_part(bucket, upload_key, upload_id, i, file) - with reporter.step(f"Check that we have {files_count} files in bucket"): + with reporter.step(f"There should be {files_count} objects in bucket"): parts = s3_client.list_parts(bucket, upload_key, upload_id) assert len(parts) == files_count, f"Expected {files_count} parts, got\n{parts}" - with reporter.step(f"Check that we have {files_count} files in container '{container_id}'"): + with reporter.step(f"There should be {files_count} objects in container"): objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint) assert len(objects) == files_count, f"Expected {files_count} objects in container, got\n{objects}" @@ -118,13 +119,18 @@ class TestS3GateMultipart(ClusterTestBase): uploads = s3_client.list_multipart_uploads(bucket) assert not uploads, f"Expected no uploads in bucket {bucket}" - with reporter.step("Check that we have no files in bucket since upload was aborted"): + with reporter.step("There should be no objects in bucket"): with pytest.raises(Exception, match=self.NO_SUCH_UPLOAD): s3_client.list_parts(bucket, upload_key, upload_id) - with reporter.step("Check that we have no files in container since upload was aborted"): - objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint) - assert len(objects) == 0, f"Expected no objects in container, got\n{objects}" + with reporter.step("There should be no objects in container"): + + @wait_for_success(120, 10) + def check_no_objects(): + objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint) + assert len(objects) == 0, f"Expected no objects in container, got\n{objects}" + + check_no_objects() @allure.title("Upload Part Copy (s3_client={s3_client})") @pytest.mark.parametrize("versioning_status", [VersioningStatus.ENABLED], indirect=True) @@ -159,6 +165,6 @@ class TestS3GateMultipart(ClusterTestBase): s3_client.complete_multipart_upload(bucket, object_key, upload_id, parts) assert len(got_parts) == len(part_files), f"Expected {parts_count} parts, got\n{got_parts}" - with reporter.step("Check we can get whole object from bucket"): + with reporter.step("Get whole object from bucket"): got_object = s3_client.get_object(bucket, object_key) assert get_file_hash(got_object) == get_file_hash(file_name_large) diff --git a/pytest_tests/testsuites/services/s3_gate/test_s3_object.py b/pytest_tests/testsuites/services/s3_gate/test_s3_object.py index 1765f29..7b0f6e1 100644 --- a/pytest_tests/testsuites/services/s3_gate/test_s3_object.py +++ b/pytest_tests/testsuites/services/s3_gate/test_s3_object.py @@ -884,17 +884,24 @@ class TestS3GateObject: self, s3_client: S3ClientWrapper, bucket: str, - temp_directory, simple_object_size: ObjectSize, ): - path = "/".join(["".join(random.choices(string.ascii_letters, k=3)) for _ in range(10)]) - file_path_1 = TestFile(os.path.join(temp_directory, path, "test_file_1")) - generate_file_with_content(simple_object_size.value, file_path=file_path_1) - file_name = s3_helper.object_key_from_file_path(file_path_1) + key_characters_sample = string.ascii_letters + string.digits + "._-" with reporter.step("Put object"): - s3_client.put_object(bucket, file_path_1) - s3_helper.check_objects_in_bucket(s3_client, bucket, [file_name]) + test_file = generate_file(simple_object_size.value) + obj_key = ( + "/" + + "/".join(["".join(random.choices(key_characters_sample, k=5)) for _ in range(10)]) + + "/test_file_1" + ) + s3_client.put_object(bucket, test_file, obj_key) + + with reporter.step("Check object can be downloaded"): + s3_client.get_object(bucket, obj_key) + + with reporter.step("Check object listing"): + s3_helper.check_objects_in_bucket(s3_client, bucket, [obj_key]) @allure.title("Delete non-existing object from empty bucket (s3_client={s3_client})") def test_s3_delete_non_existing_object(self, s3_client: S3ClientWrapper, bucket: str):