@@ -142,9 +142,12 @@ class TestNonMultipartUpload(BaseUploadTest):
142142 __test__ = True
143143
144144 def add_put_object_response_with_default_expected_params (
145- self , extra_expected_params = None
145+ self , extra_expected_params = None , bucket = None
146146 ):
147- expected_params = {'Body' : ANY , 'Bucket' : self .bucket , 'Key' : self .key }
147+ if bucket is None :
148+ bucket = self .bucket
149+
150+ expected_params = {'Body' : ANY , 'Bucket' : bucket , 'Key' : self .key }
148151 if extra_expected_params :
149152 expected_params .update (extra_expected_params )
150153 upload_response = self .create_stubbed_responses ()[0 ]
@@ -167,9 +170,9 @@ def test_upload(self):
167170 self .assert_put_object_body_was_correct ()
168171
169172 def test_upload_with_checksum (self ):
170- self .extra_args ['ChecksumAlgorithm' ] = 'crc32 '
173+ self .extra_args ['ChecksumAlgorithm' ] = 'sha256 '
171174 self .add_put_object_response_with_default_expected_params (
172- extra_expected_params = {'ChecksumAlgorithm' : 'crc32 ' }
175+ extra_expected_params = {'ChecksumAlgorithm' : 'sha256 ' }
173176 )
174177 future = self .manager .upload (
175178 self .filename , self .bucket , self .key , self .extra_args
@@ -178,6 +181,21 @@ def test_upload_with_checksum(self):
178181 self .assert_expected_client_calls_were_correct ()
179182 self .assert_put_object_body_was_correct ()
180183
184+ def test_upload_with_s3express_default_checksum (self ):
185+ s3express_bucket = "mytestbucket--usw2-az6--x-s3"
186+ self .assertFalse ("ChecksumAlgorithm" in self .extra_args )
187+
188+ self .add_put_object_response_with_default_expected_params (
189+ extra_expected_params = {'ChecksumAlgorithm' : 'crc32' },
190+ bucket = s3express_bucket ,
191+ )
192+ future = self .manager .upload (
193+ self .filename , s3express_bucket , self .key , self .extra_args
194+ )
195+ future .result ()
196+ self .assert_expected_client_calls_were_correct ()
197+ self .assert_put_object_body_was_correct ()
198+
181199 def test_upload_for_fileobj (self ):
182200 self .add_put_object_response_with_default_expected_params ()
183201 with open (self .filename , 'rb' ) as f :
@@ -342,24 +360,34 @@ def assert_upload_part_bodies_were_correct(self):
342360 self .assertEqual (self .sent_bodies , expected_contents )
343361
344362 def add_create_multipart_response_with_default_expected_params (
345- self , extra_expected_params = None
363+ self ,
364+ extra_expected_params = None ,
365+ bucket = None ,
346366 ):
347- expected_params = {'Bucket' : self .bucket , 'Key' : self .key }
367+ if bucket is None :
368+ bucket = self .bucket
369+
370+ expected_params = {'Bucket' : bucket , 'Key' : self .key }
348371 if extra_expected_params :
349372 expected_params .update (extra_expected_params )
350373 response = self .create_stubbed_responses ()[0 ]
351374 response ['expected_params' ] = expected_params
352375 self .stubber .add_response (** response )
353376
354377 def add_upload_part_responses_with_default_expected_params (
355- self , extra_expected_params = None
378+ self ,
379+ extra_expected_params = None ,
380+ bucket = None ,
356381 ):
382+ if bucket is None :
383+ bucket = self .bucket
384+
357385 num_parts = 3
358386 upload_part_responses = self .create_stubbed_responses ()[1 :- 1 ]
359387 for i in range (num_parts ):
360388 upload_part_response = upload_part_responses [i ]
361389 expected_params = {
362- 'Bucket' : self . bucket ,
390+ 'Bucket' : bucket ,
363391 'Key' : self .key ,
364392 'UploadId' : self .multipart_id ,
365393 'Body' : ANY ,
@@ -378,10 +406,15 @@ def add_upload_part_responses_with_default_expected_params(
378406 self .stubber .add_response (** upload_part_response )
379407
380408 def add_complete_multipart_response_with_default_expected_params (
381- self , extra_expected_params = None
409+ self ,
410+ extra_expected_params = None ,
411+ bucket = None ,
382412 ):
413+ if bucket is None :
414+ bucket = self .bucket
415+
383416 expected_params = {
384- 'Bucket' : self . bucket ,
417+ 'Bucket' : bucket ,
385418 'Key' : self .key ,
386419 'UploadId' : self .multipart_id ,
387420 'MultipartUpload' : {
@@ -600,6 +633,54 @@ def test_multipart_upload_passes_checksums(self):
600633 future .result ()
601634 self .assert_expected_client_calls_were_correct ()
602635
636+ def test_multipart_upload_sets_s3express_default_checksum (self ):
637+ s3express_bucket = "mytestbucket--usw2-az6--x-s3"
638+ self .assertFalse ('ChecksumAlgorithm' in self .extra_args )
639+
640+ # ChecksumAlgorithm should be passed on the create_multipart call
641+ self .add_create_multipart_response_with_default_expected_params (
642+ extra_expected_params = {'ChecksumAlgorithm' : 'crc32' },
643+ bucket = s3express_bucket ,
644+ )
645+
646+ # ChecksumAlgorithm should be forwarded and a SHA1 will come back
647+ self .add_upload_part_responses_with_default_expected_params (
648+ extra_expected_params = {'ChecksumAlgorithm' : 'crc32' },
649+ bucket = s3express_bucket ,
650+ )
651+
652+ # The checksums should be used in the complete call like etags
653+ self .add_complete_multipart_response_with_default_expected_params (
654+ extra_expected_params = {
655+ 'MultipartUpload' : {
656+ 'Parts' : [
657+ {
658+ 'ETag' : 'etag-1' ,
659+ 'PartNumber' : 1 ,
660+ 'ChecksumCRC32' : 'sum1==' ,
661+ },
662+ {
663+ 'ETag' : 'etag-2' ,
664+ 'PartNumber' : 2 ,
665+ 'ChecksumCRC32' : 'sum2==' ,
666+ },
667+ {
668+ 'ETag' : 'etag-3' ,
669+ 'PartNumber' : 3 ,
670+ 'ChecksumCRC32' : 'sum3==' ,
671+ },
672+ ]
673+ }
674+ },
675+ bucket = s3express_bucket ,
676+ )
677+
678+ future = self .manager .upload (
679+ self .filename , s3express_bucket , self .key , self .extra_args
680+ )
681+ future .result ()
682+ self .assert_expected_client_calls_were_correct ()
683+
603684 def test_multipart_upload_with_ssec_args (self ):
604685 params = {
605686 'RequestPayer' : 'requester' ,
0 commit comments