1 // Copyright 2020 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.
4
5 #include "components/feedback/feedback_util.h"
6
7 #include <string>
8
9 #include "base/files/file_util.h"
10 #include "base/files/scoped_file.h"
11 #include "base/files/scoped_temp_dir.h"
12 #include "base/rand_util.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace feedback_util {
16
17 // Note: This file is excluded from win build.
18 // See https://crbug.com/1119560.
19 class FeedbackUtilTest : public ::testing::Test {
20 public:
SetUp()21 void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
22
23 base::ScopedTempDir temp_dir_;
24 };
25
TEST_F(FeedbackUtilTest,ReadEndOfFileEmpty)26 TEST_F(FeedbackUtilTest, ReadEndOfFileEmpty) {
27 std::string read_data("should be erased");
28
29 base::FilePath file_path = temp_dir_.GetPath().Append("test_empty.txt");
30
31 WriteFile(file_path, "", 0);
32
33 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 10, &read_data));
34 EXPECT_EQ(0u, read_data.length());
35 }
36
TEST_F(FeedbackUtilTest,ReadEndOfFileSmall)37 TEST_F(FeedbackUtilTest, ReadEndOfFileSmall) {
38 const char kTestData[] = "0123456789"; // Length of 10
39 std::string read_data;
40
41 base::FilePath file_path = temp_dir_.GetPath().Append("test_small.txt");
42
43 WriteFile(file_path, kTestData, strlen(kTestData));
44
45 read_data.clear();
46 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 15, &read_data));
47 EXPECT_EQ(kTestData, read_data);
48
49 read_data.clear();
50 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 10, &read_data));
51 EXPECT_EQ(kTestData, read_data);
52
53 read_data.clear();
54 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 2, &read_data));
55 EXPECT_EQ("89", read_data);
56
57 read_data.clear();
58 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 3, &read_data));
59 EXPECT_EQ("789", read_data);
60
61 read_data.clear();
62 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 5, &read_data));
63 EXPECT_EQ("56789", read_data);
64 }
65
TEST_F(FeedbackUtilTest,ReadEndOfFileWithZeros)66 TEST_F(FeedbackUtilTest, ReadEndOfFileWithZeros) {
67 const size_t test_size = 10;
68 std::string test_data("abcd\0\0\0\0hi", test_size);
69 std::string read_data;
70
71 base::FilePath file_path = temp_dir_.GetPath().Append("test_zero.txt");
72
73 WriteFile(file_path, test_data.data(), test_size);
74
75 read_data.clear();
76 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 15, &read_data));
77 EXPECT_EQ(test_data, read_data);
78
79 read_data.clear();
80 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 10, &read_data));
81 EXPECT_EQ(test_data, read_data);
82
83 read_data.clear();
84 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 2, &read_data));
85 EXPECT_EQ(test_data.substr(test_size - 2, 2), read_data);
86
87 read_data.clear();
88 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 3, &read_data));
89 EXPECT_EQ(test_data.substr(test_size - 3, 3), read_data);
90
91 read_data.clear();
92 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 5, &read_data));
93 EXPECT_EQ(test_data.substr(test_size - 5, 5), read_data);
94 }
95
TEST_F(FeedbackUtilTest,ReadEndOfFileMedium)96 TEST_F(FeedbackUtilTest, ReadEndOfFileMedium) {
97 std::string test_data = base::RandBytesAsString(10000); // 10KB data
98 std::string read_data;
99
100 const size_t test_size = test_data.length();
101
102 base::FilePath file_path = temp_dir_.GetPath().Append("test_med.txt");
103
104 WriteFile(file_path, test_data.data(), test_size);
105
106 read_data.clear();
107 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 15000, &read_data));
108 EXPECT_EQ(test_data, read_data);
109
110 read_data.clear();
111 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 10000, &read_data));
112 EXPECT_EQ(test_data, read_data);
113
114 read_data.clear();
115 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 1000, &read_data));
116 EXPECT_EQ(test_data.substr(test_size - 1000, 1000), read_data);
117
118 read_data.clear();
119 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 300, &read_data));
120 EXPECT_EQ(test_data.substr(test_size - 300, 300), read_data);
121
122 read_data.clear();
123 EXPECT_TRUE(feedback_util::ReadEndOfFile(file_path, 175, &read_data));
124 EXPECT_EQ(test_data.substr(test_size - 175, 175), read_data);
125 }
126
127 } // namespace feedback_util
128