@@ -581,6 +581,140 @@ function ($args) use (&$actualRequest, $response) {
581581 $ this ->assertArrayNotHasKey ('crc32c ' , $ metadata );
582582 }
583583
584+ public function testInsertObjectWithUserProvidedHashes ()
585+ {
586+ $ rest = new Rest ();
587+ $ testData = 'some test data ' ;
588+ $ testStream = Utils::streamFor ($ testData );
589+ $ userCrc32c = 'user-crc ' ;
590+ $ userMd5 = 'user-md5 ' ;
591+ $ expectedHashHeader = 'md5= ' . $ userMd5 . ',crc32c= ' . $ userCrc32c ;
592+
593+ $ actualRequest = null ;
594+ $ response = new Response (200 , ['Location ' => 'http://www.mordor.com ' ], $ this ->successBody );
595+
596+ $ this ->requestWrapper ->send (
597+ Argument::type (RequestInterface::class),
598+ Argument::type ('array ' )
599+ )->will (
600+ function ($ args ) use (&$ actualRequest , $ response ) {
601+ $ actualRequest = $ args [0 ];
602+ return $ response ;
603+ }
604+ );
605+
606+ $ rest ->setRequestWrapper ($ this ->requestWrapper ->reveal ());
607+
608+ $ options = [
609+ 'bucket ' => 'my-test-bucket ' ,
610+ 'name ' => 'test-user-hash-file.txt ' ,
611+ 'data ' => $ testStream ,
612+ 'crc32c ' => $ userCrc32c ,
613+ 'md5 ' => $ userMd5 ,
614+ 'validate ' => true
615+ ];
616+
617+ $ uploader = $ rest ->insertObject ($ options );
618+ $ this ->assertInstanceOf (MultipartUploader::class, $ uploader );
619+ $ uploader ->upload ();
620+
621+ $ this ->assertNotNull ($ actualRequest );
622+ $ this ->assertTrue ($ actualRequest ->hasHeader ('X-Goog-Hash ' ));
623+ $ this ->assertEquals ([$ expectedHashHeader ], $ actualRequest ->getHeader ('X-Goog-Hash ' ));
624+
625+ list ($ contentType , $ metadata ) = $ this ->getContentTypeAndMetadata ($ actualRequest );
626+ $ this ->assertEquals ($ userMd5 , $ metadata ['md5Hash ' ]);
627+ $ this ->assertEquals ($ userCrc32c , $ metadata ['crc32c ' ]);
628+ }
629+
630+ public function testInsertObjectWithUserProvidedCrc32cOnly ()
631+ {
632+ $ rest = new Rest ();
633+ $ testData = 'some test data ' ;
634+ $ testStream = Utils::streamFor ($ testData );
635+ $ userCrc32c = 'user-crc ' ;
636+ $ expectedHashHeader = 'crc32c= ' . $ userCrc32c ;
637+
638+ $ actualRequest = null ;
639+ $ response = new Response (200 , ['Location ' => 'http://www.mordor.com ' ], $ this ->successBody );
640+
641+ $ this ->requestWrapper ->send (
642+ Argument::type (RequestInterface::class),
643+ Argument::type ('array ' )
644+ )->will (
645+ function ($ args ) use (&$ actualRequest , $ response ) {
646+ $ actualRequest = $ args [0 ];
647+ return $ response ;
648+ }
649+ );
650+
651+ $ rest ->setRequestWrapper ($ this ->requestWrapper ->reveal ());
652+
653+ $ options = [
654+ 'bucket ' => 'my-test-bucket ' ,
655+ 'name ' => 'test-user-hash-file.txt ' ,
656+ 'data ' => $ testStream ,
657+ 'crc32c ' => $ userCrc32c ,
658+ 'validate ' => true
659+ ];
660+
661+ $ uploader = $ rest ->insertObject ($ options );
662+ $ this ->assertInstanceOf (MultipartUploader::class, $ uploader );
663+ $ uploader ->upload ();
664+
665+ $ this ->assertNotNull ($ actualRequest );
666+ $ this ->assertTrue ($ actualRequest ->hasHeader ('X-Goog-Hash ' ));
667+ $ this ->assertEquals ([$ expectedHashHeader ], $ actualRequest ->getHeader ('X-Goog-Hash ' ));
668+
669+ list ($ contentType , $ metadata ) = $ this ->getContentTypeAndMetadata ($ actualRequest );
670+ $ this ->assertEquals ($ userCrc32c , $ metadata ['crc32c ' ]);
671+ $ this ->assertArrayNotHasKey ('md5Hash ' , $ metadata );
672+ }
673+
674+ public function testInsertObjectWithUserProvidedMd5Only ()
675+ {
676+ $ rest = new Rest ();
677+ $ testData = 'some test data ' ;
678+ $ testStream = Utils::streamFor ($ testData );
679+ $ userMd5 = 'user-md5 ' ;
680+ $ expectedHashHeader = 'md5= ' . $ userMd5 ;
681+
682+ $ actualRequest = null ;
683+ $ response = new Response (200 , ['Location ' => 'http://www.mordor.com ' ], $ this ->successBody );
684+
685+ $ this ->requestWrapper ->send (
686+ Argument::type (RequestInterface::class),
687+ Argument::type ('array ' )
688+ )->will (
689+ function ($ args ) use (&$ actualRequest , $ response ) {
690+ $ actualRequest = $ args [0 ];
691+ return $ response ;
692+ }
693+ );
694+
695+ $ rest ->setRequestWrapper ($ this ->requestWrapper ->reveal ());
696+
697+ $ options = [
698+ 'bucket ' => 'my-test-bucket ' ,
699+ 'name ' => 'test-user-hash-file.txt ' ,
700+ 'data ' => $ testStream ,
701+ 'md5 ' => $ userMd5 ,
702+ 'validate ' => true
703+ ];
704+
705+ $ uploader = $ rest ->insertObject ($ options );
706+ $ this ->assertInstanceOf (MultipartUploader::class, $ uploader );
707+ $ uploader ->upload ();
708+
709+ $ this ->assertNotNull ($ actualRequest );
710+ $ this ->assertTrue ($ actualRequest ->hasHeader ('X-Goog-Hash ' ));
711+ $ this ->assertEquals ([$ expectedHashHeader ], $ actualRequest ->getHeader ('X-Goog-Hash ' ));
712+
713+ list ($ contentType , $ metadata ) = $ this ->getContentTypeAndMetadata ($ actualRequest );
714+ $ this ->assertEquals ($ userMd5 , $ metadata ['md5Hash ' ]);
715+ $ this ->assertArrayNotHasKey ('crc32c ' , $ metadata );
716+ }
717+
584718 /**
585719 * @dataProvider validationMethod
586720 */
0 commit comments