Skip to content

Commit e2cae93

Browse files
committed
Update CLI cp and mv tests
Update the tests to account for different operations being called, since multipart upload is now not necessary.
1 parent c60c6af commit e2cae93

File tree

2 files changed

+23
-132
lines changed

2 files changed

+23
-132
lines changed

tests/functional/s3/test_cp_command.py

Lines changed: 11 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -387,90 +387,32 @@ def test_no_overwrite_flag_multipart_upload_when_object_exists_on_target(
387387
def test_no_overwrite_flag_on_copy_when_small_object_does_not_exist_on_target(
388388
self,
389389
):
390-
cmdline = f'{self.prefix} s3://bucket1/key.txt s3://bucket/key1.txt --no-overwrite'
391-
# Set up responses for multipart copy (since no-overwrite always uses multipart)
390+
full_path = self.files.create_file('foo.txt', 'mycontent')
391+
cmdline = '%s %s s3://bucket/key.txt --no-overwrite' % (self.prefix, full_path)
392392
self.parsed_responses = [
393-
self.head_object_response(), # HeadObject to get source metadata
394-
self.create_mpu_response('foo'), # CreateMultipartUpload response
395-
self.upload_part_copy_response(), # UploadPartCopy response
396-
{}, # CompleteMultipartUpload response
393+
{'ETag': '"c8afdb36c52cf4727836669019e69222"'}
397394
]
398395
self.run_cmd(cmdline, expected_rc=0)
399-
# Verify all multipart operations were called
400-
self.assertEqual(len(self.operations_called), 4)
401-
self.assertEqual(self.operations_called[0][0].name, 'HeadObject')
402-
self.assertEqual(
403-
self.operations_called[1][0].name, 'CreateMultipartUpload'
404-
)
405-
self.assertEqual(self.operations_called[2][0].name, 'UploadPartCopy')
396+
# The only operation we should have called is PutObject.
406397
self.assertEqual(
407-
self.operations_called[3][0].name, 'CompleteMultipartUpload'
398+
len(self.operations_called), 1, self.operations_called
408399
)
409-
# Verify the IfNoneMatch condition was set in the CompleteMultipartUpload request
410-
self.assertEqual(self.operations_called[3][1]['IfNoneMatch'], '*')
400+
self.assertEqual(self.operations_called[0][0].name, 'PutObject')
401+
self.assertEqual(self.operations_called[0][1]['IfNoneMatch'], '*')
411402

412403
def test_no_overwrite_flag_on_copy_when_small_object_exists_on_target(
413404
self,
414405
):
415406
cmdline = f'{self.prefix} s3://bucket1/key.txt s3://bucket/key.txt --no-overwrite'
416-
# Set up responses for multipart copy (since no-overwrite always uses multipart)
417-
self.parsed_responses = [
418-
self.head_object_response(), # HeadObject to get source metadata
419-
self.create_mpu_response('foo'), # CreateMultipartUpload response
420-
self.upload_part_copy_response(), # UploadPartCopy response
421-
self.precondition_failed_error_response(), # CompleteMultipartUpload
422-
{}, # AbortMultipartUpload response
423-
]
424-
self.run_cmd(cmdline, expected_rc=0)
425-
# Verify all multipart operations were called
426-
self.assertEqual(len(self.operations_called), 5)
427-
self.assertEqual(self.operations_called[0][0].name, 'HeadObject')
428-
self.assertEqual(
429-
self.operations_called[1][0].name, 'CreateMultipartUpload'
430-
)
431-
self.assertEqual(self.operations_called[2][0].name, 'UploadPartCopy')
432-
self.assertEqual(
433-
self.operations_called[3][0].name, 'CompleteMultipartUpload'
434-
)
435-
self.assertEqual(
436-
self.operations_called[4][0].name, 'AbortMultipartUpload'
437-
)
438-
# Verify the IfNoneMatch condition was set in the CompleteMultipartUpload request
439-
self.assertEqual(self.operations_called[3][1]['IfNoneMatch'], '*')
440-
441-
def test_no_overwrite_flag_on_copy_when_zero_size_object_exists_at_destination(
442-
self,
443-
):
444-
cmdline = f'{self.prefix} s3://bucket1/file.txt s3://bucket2/file.txt --no-overwrite'
445407
self.parsed_responses = [
446-
self.head_object_response(
447-
ContentLength=0
448-
), # Source object (zero size)
449-
self.head_object_response(), # Checking the object at destination
408+
self.head_object_response(ContentLength=5),
409+
self.precondition_failed_error_response(),
450410
]
451411
self.run_cmd(cmdline, expected_rc=0)
452412
self.assertEqual(len(self.operations_called), 2)
453413
self.assertEqual(self.operations_called[0][0].name, 'HeadObject')
454-
self.assertEqual(self.operations_called[1][0].name, 'HeadObject')
455-
456-
def test_no_overwrite_flag_on_copy_when_zero_size_object_not_exists_at_destination(
457-
self,
458-
):
459-
cmdline = f'{self.prefix} s3://bucket1/file.txt s3://bucket2/file1.txt --no-overwrite'
460-
self.parsed_responses = [
461-
self.head_object_response(
462-
ContentLength=0
463-
), # Source object (zero size)
464-
{
465-
'Error': {'Code': '404', 'Message': 'Not Found'}
466-
}, # At destination object does not exists
467-
self.copy_object_response(), # Copy Request when object does not exists
468-
]
469-
self.run_cmd(cmdline, expected_rc=0)
470-
self.assertEqual(len(self.operations_called), 3)
471-
self.assertEqual(self.operations_called[0][0].name, 'HeadObject')
472-
self.assertEqual(self.operations_called[1][0].name, 'HeadObject')
473-
self.assertEqual(self.operations_called[2][0].name, 'CopyObject')
414+
self.assertEqual(self.operations_called[1][0].name, 'CopyObject')
415+
self.assertEqual(self.operations_called[1][1]['IfNoneMatch'], '*')
474416

475417
def test_no_overwrite_flag_on_copy_when_large_object_exists_on_target(
476418
self,

tests/functional/s3/test_mv_command.py

Lines changed: 12 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -423,26 +423,21 @@ def test_mv_no_overwrite_flag_on_copy_when_small_object_does_not_exist_on_target
423423
# Set up responses for multipart copy (since no-overwrite always uses multipart)
424424
self.parsed_responses = [
425425
self.head_object_response(), # HeadObject to get source metadata
426-
self.create_mpu_response('foo'), # CreateMultipartUpload response
427-
self.upload_part_copy_response(), # UploadPartCopy response
428-
{}, # CompleteMultipartUpload response
429-
self.delete_object_response(), # DeleteObject (for move operation)
426+
self.copy_object_response(),
427+
self.delete_object_response(),
430428
]
431429
self.run_cmd(cmdline, expected_rc=0)
432430
# Verify all multipart copy operations were called
433-
self.assertEqual(len(self.operations_called), 5)
434-
self.assertEqual(len(self.operations_called), 5)
431+
self.assertEqual(len(self.operations_called), 3)
435432
self.assertEqual(self.operations_called[0][0].name, 'HeadObject')
436433
self.assertEqual(
437-
self.operations_called[1][0].name, 'CreateMultipartUpload'
434+
self.operations_called[1][0].name, 'CopyObject'
438435
)
439-
self.assertEqual(self.operations_called[2][0].name, 'UploadPartCopy')
436+
self.assertEqual(self.operations_called[1][1]['IfNoneMatch'], '*')
437+
440438
self.assertEqual(
441-
self.operations_called[3][0].name, 'CompleteMultipartUpload'
439+
self.operations_called[2][0].name, 'DeleteObject'
442440
)
443-
self.assertEqual(self.operations_called[4][0].name, 'DeleteObject')
444-
# Verify the IfNoneMatch condition was set in the CompleteMultipartUpload request
445-
self.assertEqual(self.operations_called[3][1]['IfNoneMatch'], '*')
446441

447442
def test_mv_no_overwrite_flag_on_copy_when_small_object_exists_on_target(
448443
self,
@@ -451,65 +446,19 @@ def test_mv_no_overwrite_flag_on_copy_when_small_object_exists_on_target(
451446
# Set up responses for multipart copy (since no-overwrite always uses multipart)
452447
self.parsed_responses = [
453448
self.head_object_response(), # HeadObject to get source metadata
454-
self.create_mpu_response('foo'), # CreateMultipartUpload response
455-
self.upload_part_copy_response(), # UploadPartCopy response
456-
self.precondition_failed_error_response(), # CompleteMultipartUpload response
457-
{}, # AbortMultipart
449+
self.precondition_failed_error_response(), # CopyObject response
458450
]
459451
self.run_cmd(cmdline, expected_rc=0)
460452
# Set up the response to simulate a PreconditionFailed error
461453
self.http_response.status_code = 412
462-
# Verify all multipart copy operations were called
463-
self.assertEqual(len(self.operations_called), 5)
454+
# Verify all copy operations were called
455+
self.assertEqual(len(self.operations_called), 2)
464456
self.assertEqual(self.operations_called[0][0].name, 'HeadObject')
465457
self.assertEqual(
466-
self.operations_called[1][0].name, 'CreateMultipartUpload'
467-
)
468-
self.assertEqual(self.operations_called[2][0].name, 'UploadPartCopy')
469-
self.assertEqual(
470-
self.operations_called[3][0].name, 'CompleteMultipartUpload'
471-
)
472-
self.assertEqual(
473-
self.operations_called[4][0].name, 'AbortMultipartUpload'
458+
self.operations_called[1][0].name, 'CopyObject'
474459
)
475460
# Verify the IfNoneMatch condition was set in the CompleteMultipartUpload request
476-
self.assertEqual(self.operations_called[3][1]['IfNoneMatch'], '*')
477-
478-
def test_no_overwrite_flag_on_copy_when_zero_size_object_exists_at_destination(
479-
self,
480-
):
481-
cmdline = f'{self.prefix} s3://bucket1/file.txt s3://bucket2/file.txt --no-overwrite'
482-
self.parsed_responses = [
483-
self.head_object_response(
484-
ContentLength=0
485-
), # Source object (zero size)
486-
self.head_object_response(), # Checking the object at destination
487-
]
488-
self.run_cmd(cmdline, expected_rc=0)
489-
self.assertEqual(len(self.operations_called), 2)
490-
self.assertEqual(self.operations_called[0][0].name, 'HeadObject')
491-
self.assertEqual(self.operations_called[1][0].name, 'HeadObject')
492-
493-
def test_no_overwrite_flag_on_copy_when_zero_size_object_not_exists_at_destination(
494-
self,
495-
):
496-
cmdline = f'{self.prefix} s3://bucket1/file.txt s3://bucket2/file1.txt --no-overwrite'
497-
self.parsed_responses = [
498-
self.head_object_response(
499-
ContentLength=0
500-
), # Source object (zero size)
501-
{
502-
'Error': {'Code': '404', 'Message': 'Not Found'}
503-
}, # At destination object does not exists
504-
self.copy_object_response(), # Copy Request when object does not exists
505-
self.delete_object_response(), # Delete Request for move object
506-
]
507-
self.run_cmd(cmdline, expected_rc=0)
508-
self.assertEqual(len(self.operations_called), 4)
509-
self.assertEqual(self.operations_called[0][0].name, 'HeadObject')
510-
self.assertEqual(self.operations_called[1][0].name, 'HeadObject')
511-
self.assertEqual(self.operations_called[2][0].name, 'CopyObject')
512-
self.assertEqual(self.operations_called[3][0].name, 'DeleteObject')
461+
self.assertEqual(self.operations_called[1][1]['IfNoneMatch'], '*')
513462

514463
def test_mv_no_overwrite_flag_when_large_object_exists_on_target(self):
515464
cmdline = f'{self.prefix} s3://bucket1/key1.txt s3://bucket/key1.txt --no-overwrite'

0 commit comments

Comments
 (0)