1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "base/files/file.h"
8 #include "base/files/file_path.h"
9 #include "base/files/file_util.h"
10 #include "base/files/scoped_temp_dir.h"
11 #include "base/win/scoped_handle.h"
12 #include "chrome/installer/util/logging_installer.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 TEST(LoggingInstallerTest
, TestTruncate
) {
16 const std::string
test_data(installer::kMaxInstallerLogFileSize
+ 1, 'a');
18 base::ScopedTempDir temp_dir
;
19 ASSERT_TRUE(temp_dir
.CreateUniqueTempDir());
21 base::FilePath temp_file
= temp_dir
.path().Append(L
"temp");
22 EXPECT_EQ(test_data
.size(),
23 base::WriteFile(temp_file
, &test_data
[0], test_data
.size()));
24 ASSERT_TRUE(base::PathExists(temp_file
));
27 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
28 EXPECT_EQ(test_data
.size(), file_size
);
30 EXPECT_EQ(installer::LOGFILE_TRUNCATED
,
31 installer::TruncateLogFileIfNeeded(temp_file
));
33 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
34 EXPECT_EQ(installer::kTruncatedInstallerLogFileSize
, file_size
);
36 // Check that the temporary file was deleted.
37 EXPECT_FALSE(base::PathExists(temp_file
.Append(L
".tmp")));
40 TEST(LoggingInstallerTest
, TestTruncationNotNeeded
) {
41 const std::string
test_data(installer::kMaxInstallerLogFileSize
, 'a');
43 base::ScopedTempDir temp_dir
;
44 ASSERT_TRUE(temp_dir
.CreateUniqueTempDir());
46 base::FilePath temp_file
= temp_dir
.path().Append(L
"temp");
47 EXPECT_EQ(test_data
.size(),
48 base::WriteFile(temp_file
, &test_data
[0], test_data
.size()));
49 ASSERT_TRUE(base::PathExists(temp_file
));
52 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
53 EXPECT_EQ(test_data
.size(), file_size
);
55 EXPECT_EQ(installer::LOGFILE_UNTOUCHED
,
56 installer::TruncateLogFileIfNeeded(temp_file
));
57 EXPECT_TRUE(base::PathExists(temp_file
));
58 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
59 EXPECT_EQ(test_data
.size(), file_size
);
62 TEST(LoggingInstallerTest
, TestInUseNeedsTruncation
) {
63 const std::string
test_data(installer::kMaxInstallerLogFileSize
+ 1, 'a');
65 base::ScopedTempDir temp_dir
;
66 ASSERT_TRUE(temp_dir
.CreateUniqueTempDir());
68 base::FilePath temp_file
= temp_dir
.path().Append(L
"temp");
69 EXPECT_EQ(test_data
.size(),
70 base::WriteFile(temp_file
, &test_data
[0], test_data
.size()));
71 ASSERT_TRUE(base::PathExists(temp_file
));
73 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
74 EXPECT_EQ(test_data
.size(), file_size
);
76 // Prevent the log file from being moved or deleted.
77 uint32 file_flags
= base::File::FLAG_OPEN
|
78 base::File::FLAG_READ
|
79 base::File::FLAG_EXCLUSIVE_READ
;
80 base::File
temp_platform_file(temp_file
, file_flags
);
81 ASSERT_TRUE(temp_platform_file
.IsValid());
83 EXPECT_EQ(installer::LOGFILE_UNTOUCHED
,
84 installer::TruncateLogFileIfNeeded(temp_file
));
85 EXPECT_TRUE(base::PathExists(temp_file
));
86 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
87 EXPECT_EQ(test_data
.size(), file_size
);
90 TEST(LoggingInstallerTest
, TestMoveFailsNeedsTruncation
) {
91 const std::string
test_data(installer::kMaxInstallerLogFileSize
+ 1, 'a');
93 base::ScopedTempDir temp_dir
;
94 ASSERT_TRUE(temp_dir
.CreateUniqueTempDir());
96 base::FilePath temp_file
= temp_dir
.path().Append(L
"temp");
97 EXPECT_EQ(test_data
.size(),
98 base::WriteFile(temp_file
, &test_data
[0], test_data
.size()));
99 ASSERT_TRUE(base::PathExists(temp_file
));
101 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
102 EXPECT_EQ(test_data
.size(), file_size
);
104 // Create an inconvenient, non-deletable file in the location that
105 // TruncateLogFileIfNeeded would like to move the log file to.
106 uint32 file_flags
= base::File::FLAG_CREATE
|
107 base::File::FLAG_READ
|
108 base::File::FLAG_EXCLUSIVE_READ
;
109 base::FilePath
temp_file_move_dest(
110 temp_file
.value() + FILE_PATH_LITERAL(".tmp"));
111 base::File
temp_move_destination_file(temp_file_move_dest
, file_flags
);
112 ASSERT_TRUE(temp_move_destination_file
.IsValid());
114 EXPECT_EQ(installer::LOGFILE_DELETED
,
115 installer::TruncateLogFileIfNeeded(temp_file
));
116 EXPECT_FALSE(base::PathExists(temp_file
));