@@ -20,7 +20,9 @@ limitations under the License.
20
20
#include < string>
21
21
#include < vector>
22
22
23
+ #include < gmock/gmock.h>
23
24
#include < gtest/gtest.h>
25
+ #include " absl/strings/str_cat.h"
24
26
#include " absl/strings/string_view.h"
25
27
26
28
namespace tensorflow {
@@ -602,6 +604,98 @@ TEST(ZLibTest, BytewiseRead) {
602
604
ASSERT_EQ (truncated_output, text);
603
605
}
604
606
607
+ TEST (ZLibTest, TruncatedData) {
608
+ const int kBufferLen = 64 ;
609
+ std::string uncompressed = " Hello, World!" ;
610
+ std::string compressed (
611
+ " \x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xf3\x48\xcd\xc9\xc9 "
612
+ " \xd7\x51\x08\xcf\x2f\xca\x49\x51\x04\x00\xd0\xc3\x4a\xec\x0d "
613
+ " \x00\x00\x00 " ,
614
+ 33 );
615
+
616
+ // Verify that "compressed" contains valid gzip data.
617
+ {
618
+ ZLib zlib;
619
+ // zlib.SetGzipHeaderMode();
620
+ char uncompbuf[kBufferLen ];
621
+ bzero (uncompbuf, kBufferLen );
622
+ uLongf uncomplen = kBufferLen ;
623
+ int err = zlib.Uncompress (
624
+ reinterpret_cast <Bytef*>(uncompbuf), &uncomplen,
625
+ reinterpret_cast <const Bytef*>(compressed.c_str ()), compressed.size ());
626
+ ASSERT_EQ (err, Z_OK);
627
+ ASSERT_EQ (uncompressed, absl::string_view (uncompbuf, uncomplen));
628
+ }
629
+
630
+ // Test truncated data with ZLib::Uncompress().
631
+ for (int len = compressed.size () - 1 ; len > 0 ; len--) {
632
+ SCOPED_TRACE (absl::StrCat (" Decompressing first " , len, " out of " ,
633
+ compressed.size (), " bytes" ));
634
+ ZLib zlib;
635
+ // zlib.SetGzipHeaderMode();
636
+ char uncompbuf[kBufferLen ];
637
+ bzero (uncompbuf, kBufferLen );
638
+ uLongf uncomplen = kBufferLen ;
639
+ int err = zlib.Uncompress (
640
+ reinterpret_cast <Bytef*>(uncompbuf), &uncomplen,
641
+ reinterpret_cast <const Bytef*>(compressed.c_str ()), len);
642
+ ASSERT_NE (err, Z_OK);
643
+ }
644
+
645
+ // Test truncated data with ZLib::UncompressAtMost() and
646
+ // ZLib::UncompressDone().
647
+ for (int len = compressed.size () - 1 ; len > 0 ; len--) {
648
+ SCOPED_TRACE (absl::StrCat (" Decompressing first " , len, " out of " ,
649
+ compressed.size (), " bytes" ));
650
+ ZLib zlib;
651
+ // zlib.SetGzipHeaderMode();
652
+ char uncompbuf[kBufferLen ];
653
+ bzero (uncompbuf, kBufferLen );
654
+ uLongf uncomplen = kBufferLen ;
655
+ uLongf complen = len;
656
+ int err = zlib.UncompressAtMost (
657
+ reinterpret_cast <Bytef*>(uncompbuf), &uncomplen,
658
+ reinterpret_cast <const Bytef*>(compressed.c_str ()), &complen);
659
+ ASSERT_EQ (err, Z_OK);
660
+ ASSERT_EQ (complen, 0 );
661
+ if (uncomplen > 0 ) {
662
+ EXPECT_THAT (
663
+ uncompressed,
664
+ testing::StartsWith (std::string (uncompbuf).substr (0 , uncomplen)));
665
+ }
666
+ ASSERT_FALSE (zlib.UncompressChunkDone ());
667
+ }
668
+ }
669
+
670
+ TEST (ZLibTest, GzipUncompressedLength) {
671
+ ZLib zlib;
672
+
673
+ // "Hello, World!", compressed.
674
+ std::string hello_world (
675
+ " \x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xf3\x48\xcd\xc9\xc9 "
676
+ " \xd7\x51\x08\xcf\x2f\xca\x49\x51\x04\x00\xd0\xc3\x4a\xec\x0d "
677
+ " \x00\x00\x00 " ,
678
+ 33 );
679
+ EXPECT_EQ (13 , zlib.GzipUncompressedLength (
680
+ reinterpret_cast <const Bytef*>(hello_world.c_str ()),
681
+ hello_world.size ()));
682
+
683
+ // Empty string, "", compressed.
684
+ std::string empty (
685
+ " \x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00 "
686
+ " \x00\x00\x00\x00\x00 " ,
687
+ 20 );
688
+ EXPECT_EQ (0 ,
689
+ zlib.GzipUncompressedLength (
690
+ reinterpret_cast <const Bytef*>(empty.c_str ()), empty.size ()));
691
+
692
+ std::string bad_data (" \x01\x01\x01\x01 " , 4 );
693
+ for (int len = 0 ; len <= bad_data.size (); len++) {
694
+ EXPECT_EQ (0 , zlib.GzipUncompressedLength (
695
+ reinterpret_cast <const Bytef*>(bad_data.c_str ()), len));
696
+ }
697
+ }
698
+
605
699
} // namespace
606
700
} // namespace net_http
607
701
} // namespace serving
0 commit comments