Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Unified Diff: third_party/zlib/google/zip_unittest.cc

Issue 99333019: Preserve modification timestamp when zipping files. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: better comments, cleanup Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/zlib/google/zip_reader.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/zlib/google/zip_unittest.cc
diff --git a/third_party/zlib/google/zip_unittest.cc b/third_party/zlib/google/zip_unittest.cc
index 1023705f1b8b33e466b5625759be42eabbf36935..1d4963e894060d8316556195969432cb9e16e0bf 100644
--- a/third_party/zlib/google/zip_unittest.cc
+++ b/third_party/zlib/google/zip_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include <set>
+#include <string>
#include <vector>
#include "base/file_util.h"
@@ -21,6 +22,11 @@ namespace {
// Make the test a PlatformTest to setup autorelease pools properly on Mac.
class ZipTest : public PlatformTest {
protected:
+ enum ValidYearType {
+ VALID_YEAR,
+ INVALID_YEAR
+ };
+
virtual void SetUp() {
PlatformTest::SetUp();
@@ -98,6 +104,58 @@ class ZipTest : public PlatformTest {
EXPECT_EQ(expected_count, count);
}
+ // This function does the following:
+ // 1) Creates a test.txt file with the given last modification timestamp
+ // 2) Zips test.txt and extracts it back into a different location.
+ // 3) Confirms that test.txt in the output directory has the specified
+ // last modification timestamp if it is valid (|valid_year| is true).
+ // If the timestamp is not supported by the zip format, the last
+ // modification defaults to the current time.
+ void TestTimeStamp(const char* date_time, ValidYearType valid_year) {
+ SCOPED_TRACE(std::string("TestTimeStamp(") + date_time + ")");
+ base::ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ base::FilePath zip_file = temp_dir.path().AppendASCII("out.zip");
+ base::FilePath src_dir = temp_dir.path().AppendASCII("input");
+ base::FilePath out_dir = temp_dir.path().AppendASCII("output");
+
+ base::FilePath src_file = src_dir.AppendASCII("test.txt");
+ base::FilePath out_file = out_dir.AppendASCII("test.txt");
+
+ EXPECT_TRUE(base::CreateDirectory(src_dir));
+ EXPECT_TRUE(base::CreateDirectory(out_dir));
+
+ base::Time test_mtime;
+ ASSERT_TRUE(base::Time::FromString(date_time, &test_mtime));
+
+ // Adjusting the current timestamp to the resolution that the zip file
+ // supports, which is 2 seconds. Note that between this call to Time::Now()
+ // and zip::Zip() the clock can advance a bit, hence the use of EXPECT_GE.
+ base::Time::Exploded now_parts;
+ base::Time::Now().LocalExplode(&now_parts);
+ now_parts.second = now_parts.second & ~1;
+ now_parts.millisecond = 0;
+ base::Time now_time = base::Time::FromLocalExploded(now_parts);
+
+ EXPECT_EQ(1, file_util::WriteFile(src_file, "1", 1));
+ EXPECT_TRUE(base::TouchFile(src_file, base::Time::Now(), test_mtime));
+
+ EXPECT_TRUE(zip::Zip(src_dir, zip_file, true));
+ ASSERT_TRUE(zip::Unzip(zip_file, out_dir));
+
+ base::PlatformFileInfo file_info;
+ EXPECT_TRUE(base::GetFileInfo(out_file, &file_info));
+ EXPECT_EQ(file_info.size, 1);
+
+ if (valid_year == VALID_YEAR) {
+ EXPECT_EQ(file_info.last_modified, test_mtime);
+ } else {
+ // Invalid date means the modification time will default to 'now'.
+ EXPECT_GE(file_info.last_modified, now_time);
+ }
+ }
+
// The path to temporary directory used to contain the test operations.
base::FilePath test_dir_;
@@ -192,6 +250,28 @@ TEST_F(ZipTest, ZipNonASCIIDir) {
TestUnzipFile(zip_file, true);
}
+TEST_F(ZipTest, ZipTimeStamp) {
+ // The dates tested are arbitrary, with some constraints. The zip format can
+ // only store years from 1980 to 2107 and an even number of seconds, due to it
+ // using the ms dos date format.
+
+ // Valid arbitrary date.
+ TestTimeStamp("23 Oct 1997 23:22:20", VALID_YEAR);
+
+ // Date before 1980, zip format limitation, must default to unix epoch.
+ TestTimeStamp("29 Dec 1979 21:00:10", INVALID_YEAR);
+
+ // Despite the minizip headers telling the maximum year should be 2044, it
+ // can actually go up to 2107. Beyond that, the dos date format cannot store
+ // the year (2107-1980=127). To test that limit, the input file needs to be
+ // touched, but the code that modifies the file access and modification times
+ // relies on time_t which is defined as long, therefore being in many
+ // platforms just a 4-byte integer, like 32-bit Mac OSX or linux. As such, it
+ // suffers from the year-2038 bug. Therefore 2038 is the highest we can test
+ // in all platforms reliably.
+ TestTimeStamp("02 Jan 2038 23:59:58", VALID_YEAR);
+}
+
#if defined(OS_POSIX)
TEST_F(ZipTest, ZipFiles) {
base::FilePath src_dir;
« no previous file with comments | « third_party/zlib/google/zip_reader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698