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