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/file_util.h"
8 #include "base/files/file_path.h"
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/platform_file.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 file_util::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 file_util::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 file_util::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 const int file_flags
= base::PLATFORM_FILE_OPEN
|
78 base::PLATFORM_FILE_READ
|
79 base::PLATFORM_FILE_EXCLUSIVE_READ
;
80 base::win::ScopedHandle
temp_platform_file(
81 base::CreatePlatformFile(temp_file
, file_flags
, NULL
, NULL
));
82 ASSERT_TRUE(temp_platform_file
.IsValid());
84 EXPECT_EQ(installer::LOGFILE_UNTOUCHED
,
85 installer::TruncateLogFileIfNeeded(temp_file
));
86 EXPECT_TRUE(base::PathExists(temp_file
));
87 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
88 EXPECT_EQ(test_data
.size(), file_size
);
91 TEST(LoggingInstallerTest
, TestMoveFailsNeedsTruncation
) {
92 const std::string
test_data(installer::kMaxInstallerLogFileSize
+ 1, 'a');
94 base::ScopedTempDir temp_dir
;
95 ASSERT_TRUE(temp_dir
.CreateUniqueTempDir());
97 base::FilePath temp_file
= temp_dir
.path().Append(L
"temp");
98 EXPECT_EQ(test_data
.size(),
99 file_util::WriteFile(temp_file
, &test_data
[0], test_data
.size()));
100 ASSERT_TRUE(base::PathExists(temp_file
));
102 EXPECT_TRUE(base::GetFileSize(temp_file
, &file_size
));
103 EXPECT_EQ(test_data
.size(), file_size
);
105 // Create an inconvenient, non-deletable file in the location that
106 // TruncateLogFileIfNeeded would like to move the log file to.
107 const int file_flags
= base::PLATFORM_FILE_CREATE
|
108 base::PLATFORM_FILE_READ
|
109 base::PLATFORM_FILE_EXCLUSIVE_READ
;
110 base::FilePath
temp_file_move_dest(
111 temp_file
.value() + FILE_PATH_LITERAL(".tmp"));
112 base::win::ScopedHandle
temp_move_destination_file(
113 base::CreatePlatformFile(temp_file_move_dest
, file_flags
, NULL
, NULL
));
114 ASSERT_TRUE(temp_move_destination_file
.IsValid());
116 EXPECT_EQ(installer::LOGFILE_DELETED
,
117 installer::TruncateLogFileIfNeeded(temp_file
));
118 EXPECT_FALSE(base::PathExists(temp_file
));