Index: third_party/zlib/google/zip_reader_unittest.cc |
diff --git a/third_party/zlib/google/zip_reader_unittest.cc b/third_party/zlib/google/zip_reader_unittest.cc |
index 2033f9fa002c2db2de3510d39a81c5bd39ea27c5..8571d6d9026c5cac8ed21b5f0fe6d415fcd31102 100644 |
--- a/third_party/zlib/google/zip_reader_unittest.cc |
+++ b/third_party/zlib/google/zip_reader_unittest.cc |
@@ -15,6 +15,7 @@ |
#include "base/path_service.h" |
#include "base/platform_file.h" |
#include "base/run_loop.h" |
+#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/time/time.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -70,7 +71,7 @@ class PlatformFileWrapper { |
// Assumes that progress callbacks will be executed in-order. |
class MockUnzipListener : public base::SupportsWeakPtr<MockUnzipListener> { |
public: |
- MockUnzipListener() |
+ MockUnzipListener() |
: success_calls_(0), |
failure_calls_(0), |
progress_calls_(0), |
@@ -553,4 +554,46 @@ TEST_F(ZipReaderTest, ExtractToFileAsync_Directory) { |
ASSERT_TRUE(base::DirectoryExists(target_file)); |
} |
+TEST_F(ZipReaderTest, ExtractCurrentEntryToString) { |
+ // test_mismatch_size.zip contains files with names from 0.txt to 7.txt with |
+ // sizes from 0 to 7 bytes respectively, but the metadata in the zip file says |
+ // the uncompressed size is 3 bytes. The ZipReader code needs to be clever |
+ // enough to get all the data out. |
+ base::FilePath test_zip_file = |
+ test_data_dir_.AppendASCII("test_mismatch_size.zip"); |
+ |
+ ZipReader reader; |
+ std::string contents; |
+ ASSERT_TRUE(reader.Open(test_zip_file)); |
+ |
+ for (size_t k = 0; k < 8; k++) { |
+ SCOPED_TRACE(base::StringPrintf("<loop:%d>", static_cast<int>(k))); |
+ |
+ base::FilePath file_name = base::FilePath( |
+ base::StringPrintf(FILE_PATH_LITERAL("%d.txt"), static_cast<int>(k))); |
+ ASSERT_TRUE(reader.LocateAndOpenEntry(file_name)); |
+ EXPECT_EQ(3, reader.current_entry_info()->original_size()); |
+ |
+ if (k > 1) { |
+ // Off by one byte read limit: must fail. |
+ EXPECT_FALSE(reader.ExtractCurrentEntryToString(k - 1, &contents)); |
+ } |
+ |
+ if (k > 0) { |
+ // Exact byte read limit: must pass. |
+ EXPECT_TRUE(reader.ExtractCurrentEntryToString(k, &contents)); |
+ SCOPED_TRACE(contents); |
+ EXPECT_EQ(k, contents.size()); |
+ EXPECT_EQ(0, memcmp(contents.c_str(), "0123456", k)); |
+ } |
+ |
+ // More than necessary byte read limit: must pass. |
+ EXPECT_TRUE(reader.ExtractCurrentEntryToString(16, &contents)); |
+ SCOPED_TRACE(contents); |
+ EXPECT_EQ(k, contents.size()); |
+ EXPECT_EQ(0, memcmp(contents.c_str(), "0123456", k)); |
+ } |
+ reader.Close(); |
+} |
+ |
} // namespace zip |