| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/upload_list/upload_list.h" | 5 #include "components/upload_list/upload_list.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/files/file_util.h" |
| 13 #include "base/files/scoped_temp_dir.h" |
| 12 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
| 15 #include "base/message_loop/message_loop.h" |
| 16 #include "base/run_loop.h" |
| 13 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
| 14 #include "base/threading/sequenced_worker_pool.h" | 18 #include "base/test/sequenced_worker_pool_owner.h" |
| 15 #include "base/time/time.h" | 19 #include "base/time/time.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 21 |
| 18 namespace { | 22 namespace { |
| 19 | 23 |
| 20 const char kTestUploadTime[] = "1234567890"; | 24 const char kTestUploadTime[] = "1234567890"; |
| 21 const char kTestUploadId[] = "0123456789abcdef"; | 25 const char kTestUploadId[] = "0123456789abcdef"; |
| 22 const char kTestLocalID[] = "fedcba9876543210"; | 26 const char kTestLocalID[] = "fedcba9876543210"; |
| 23 const char kTestCaptureTime[] = "2345678901"; | 27 const char kTestCaptureTime[] = "2345678901"; |
| 24 | 28 |
| 25 } // namespace | 29 class UploadListTest : public testing::Test, |
| 30 public UploadList::Delegate { |
| 31 public: |
| 32 UploadListTest() : worker_pool_owner_(1, "UploadListTest") {} |
| 33 |
| 34 void SetUp() override { |
| 35 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 36 } |
| 37 |
| 38 void WriteUploadLog(const std::string& log_data) { |
| 39 ASSERT_GT(base::WriteFile(log_path(), log_data.c_str(), log_data.size()), |
| 40 0); |
| 41 } |
| 42 |
| 43 void WaitForUploadList() { |
| 44 base::RunLoop run_loop; |
| 45 quit_closure_ = run_loop.QuitClosure(); |
| 46 run_loop.Run(); |
| 47 } |
| 48 |
| 49 // UploadList::Delegate: |
| 50 void OnUploadListAvailable() override { |
| 51 ASSERT_FALSE(quit_closure_.is_null()); |
| 52 quit_closure_.Run(); |
| 53 } |
| 54 |
| 55 const scoped_refptr<base::SequencedWorkerPool> worker_pool() { |
| 56 return worker_pool_owner_.pool(); |
| 57 } |
| 58 base::FilePath log_path() { |
| 59 return temp_dir_.path().Append(FILE_PATH_LITERAL("uploads.log")); |
| 60 } |
| 61 |
| 62 private: |
| 63 base::MessageLoop message_loop_; |
| 64 base::ScopedTempDir temp_dir_; |
| 65 base::SequencedWorkerPoolOwner worker_pool_owner_; |
| 66 base::Closure quit_closure_; |
| 67 }; |
| 26 | 68 |
| 27 // These tests test that UploadList can parse a vector of log entry strings of | 69 // These tests test that UploadList can parse a vector of log entry strings of |
| 28 // various formats to a vector of UploadInfo objects. See the UploadList | 70 // various formats to a vector of UploadInfo objects. See the UploadList |
| 29 // declaration for a description of the log entry string formats. | 71 // declaration for a description of the log entry string formats. |
| 30 | 72 |
| 31 // Test log entry string with upload time and upload ID. | 73 // Test log entry string with upload time and upload ID. |
| 32 // This is the format that crash reports are stored in. | 74 // This is the format that crash reports are stored in. |
| 33 TEST(UploadListTest, ParseUploadTimeUploadId) { | 75 TEST_F(UploadListTest, ParseUploadTimeUploadId) { |
| 34 std::string test_entry = kTestUploadTime; | 76 std::string test_entry = kTestUploadTime; |
| 35 test_entry += ","; | 77 test_entry += ","; |
| 36 test_entry.append(kTestUploadId); | 78 test_entry.append(kTestUploadId); |
| 79 WriteUploadLog(test_entry); |
| 37 | 80 |
| 38 scoped_refptr<UploadList> upload_list = | 81 scoped_refptr<UploadList> upload_list = |
| 39 new UploadList(nullptr, base::FilePath(), nullptr); | 82 new UploadList(this, log_path(), worker_pool()); |
| 40 | 83 |
| 41 std::vector<std::string> log_entries; | 84 upload_list->LoadUploadListAsynchronously(); |
| 42 log_entries.push_back(test_entry); | 85 WaitForUploadList(); |
| 43 upload_list->ParseLogEntries(log_entries); | |
| 44 | 86 |
| 45 EXPECT_EQ(1u, upload_list->uploads_.size()); | 87 std::vector<UploadList::UploadInfo> uploads; |
| 46 double time_double = upload_list->uploads_[0].upload_time.ToDoubleT(); | 88 upload_list->GetUploads(999, &uploads); |
| 89 |
| 90 EXPECT_EQ(1u, uploads.size()); |
| 91 double time_double = uploads[0].upload_time.ToDoubleT(); |
| 47 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); | 92 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); |
| 48 EXPECT_STREQ(kTestUploadId, upload_list->uploads_[0].upload_id.c_str()); | 93 EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str()); |
| 49 EXPECT_STREQ("", upload_list->uploads_[0].local_id.c_str()); | 94 EXPECT_STREQ("", uploads[0].local_id.c_str()); |
| 50 time_double = upload_list->uploads_[0].capture_time.ToDoubleT(); | 95 time_double = uploads[0].capture_time.ToDoubleT(); |
| 51 EXPECT_STREQ("0", base::DoubleToString(time_double).c_str()); | 96 EXPECT_STREQ("0", base::DoubleToString(time_double).c_str()); |
| 52 } | 97 } |
| 53 | 98 |
| 54 // Test log entry string with upload time, upload ID and local ID. | 99 // Test log entry string with upload time, upload ID and local ID. |
| 55 // This is the old format that WebRTC logs were stored in. | 100 // This is the old format that WebRTC logs were stored in. |
| 56 TEST(UploadListTest, ParseUploadTimeUploadIdLocalId) { | 101 TEST_F(UploadListTest, ParseUploadTimeUploadIdLocalId) { |
| 57 std::string test_entry = kTestUploadTime; | 102 std::string test_entry = kTestUploadTime; |
| 58 test_entry += ","; | 103 test_entry += ","; |
| 59 test_entry.append(kTestUploadId); | 104 test_entry.append(kTestUploadId); |
| 60 test_entry += ","; | 105 test_entry += ","; |
| 61 test_entry.append(kTestLocalID); | 106 test_entry.append(kTestLocalID); |
| 107 WriteUploadLog(test_entry); |
| 62 | 108 |
| 63 scoped_refptr<UploadList> upload_list = | 109 scoped_refptr<UploadList> upload_list = |
| 64 new UploadList(nullptr, base::FilePath(), nullptr); | 110 new UploadList(this, log_path(), worker_pool()); |
| 65 | 111 |
| 66 std::vector<std::string> log_entries; | 112 upload_list->LoadUploadListAsynchronously(); |
| 67 log_entries.push_back(test_entry); | 113 WaitForUploadList(); |
| 68 upload_list->ParseLogEntries(log_entries); | |
| 69 | 114 |
| 70 EXPECT_EQ(1u, upload_list->uploads_.size()); | 115 std::vector<UploadList::UploadInfo> uploads; |
| 71 double time_double = upload_list->uploads_[0].upload_time.ToDoubleT(); | 116 upload_list->GetUploads(999, &uploads); |
| 117 |
| 118 EXPECT_EQ(1u, uploads.size()); |
| 119 double time_double = uploads[0].upload_time.ToDoubleT(); |
| 72 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); | 120 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); |
| 73 EXPECT_STREQ(kTestUploadId, upload_list->uploads_[0].upload_id.c_str()); | 121 EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str()); |
| 74 EXPECT_STREQ(kTestLocalID, upload_list->uploads_[0].local_id.c_str()); | 122 EXPECT_STREQ(kTestLocalID, uploads[0].local_id.c_str()); |
| 75 time_double = upload_list->uploads_[0].capture_time.ToDoubleT(); | 123 time_double = uploads[0].capture_time.ToDoubleT(); |
| 76 EXPECT_STREQ("0", base::DoubleToString(time_double).c_str()); | 124 EXPECT_STREQ("0", base::DoubleToString(time_double).c_str()); |
| 77 } | 125 } |
| 78 | 126 |
| 79 // Test log entry string with upload time, upload ID and capture time. | 127 // Test log entry string with upload time, upload ID and capture time. |
| 80 // This is the format that WebRTC logs that only have been uploaded only are | 128 // This is the format that WebRTC logs that only have been uploaded only are |
| 81 // stored in. | 129 // stored in. |
| 82 TEST(UploadListTest, ParseUploadTimeUploadIdCaptureTime) { | 130 TEST_F(UploadListTest, ParseUploadTimeUploadIdCaptureTime) { |
| 83 std::string test_entry = kTestUploadTime; | 131 std::string test_entry = kTestUploadTime; |
| 84 test_entry += ","; | 132 test_entry += ","; |
| 85 test_entry.append(kTestUploadId); | 133 test_entry.append(kTestUploadId); |
| 86 test_entry += ",,"; | 134 test_entry += ",,"; |
| 87 test_entry.append(kTestCaptureTime); | 135 test_entry.append(kTestCaptureTime); |
| 136 WriteUploadLog(test_entry); |
| 88 | 137 |
| 89 scoped_refptr<UploadList> upload_list = | 138 scoped_refptr<UploadList> upload_list = |
| 90 new UploadList(nullptr, base::FilePath(), nullptr); | 139 new UploadList(this, log_path(), worker_pool()); |
| 91 | 140 |
| 92 std::vector<std::string> log_entries; | 141 upload_list->LoadUploadListAsynchronously(); |
| 93 log_entries.push_back(test_entry); | 142 WaitForUploadList(); |
| 94 upload_list->ParseLogEntries(log_entries); | |
| 95 | 143 |
| 96 EXPECT_EQ(1u, upload_list->uploads_.size()); | 144 std::vector<UploadList::UploadInfo> uploads; |
| 97 double time_double = upload_list->uploads_[0].upload_time.ToDoubleT(); | 145 upload_list->GetUploads(999, &uploads); |
| 146 |
| 147 EXPECT_EQ(1u, uploads.size()); |
| 148 double time_double = uploads[0].upload_time.ToDoubleT(); |
| 98 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); | 149 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); |
| 99 EXPECT_STREQ(kTestUploadId, upload_list->uploads_[0].upload_id.c_str()); | 150 EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str()); |
| 100 EXPECT_STREQ("", upload_list->uploads_[0].local_id.c_str()); | 151 EXPECT_STREQ("", uploads[0].local_id.c_str()); |
| 101 time_double = upload_list->uploads_[0].capture_time.ToDoubleT(); | 152 time_double = uploads[0].capture_time.ToDoubleT(); |
| 102 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); | 153 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); |
| 103 } | 154 } |
| 104 | 155 |
| 105 // Test log entry string with local ID and capture time. | 156 // Test log entry string with local ID and capture time. |
| 106 // This is the format that WebRTC logs that only are stored locally are stored | 157 // This is the format that WebRTC logs that only are stored locally are stored |
| 107 // in. | 158 // in. |
| 108 TEST(UploadListTest, ParseLocalIdCaptureTime) { | 159 TEST_F(UploadListTest, ParseLocalIdCaptureTime) { |
| 109 std::string test_entry = ",,"; | 160 std::string test_entry = ",,"; |
| 110 test_entry.append(kTestLocalID); | 161 test_entry.append(kTestLocalID); |
| 111 test_entry += ","; | 162 test_entry += ","; |
| 112 test_entry.append(kTestCaptureTime); | 163 test_entry.append(kTestCaptureTime); |
| 164 WriteUploadLog(test_entry); |
| 113 | 165 |
| 114 scoped_refptr<UploadList> upload_list = | 166 scoped_refptr<UploadList> upload_list = |
| 115 new UploadList(nullptr, base::FilePath(), nullptr); | 167 new UploadList(this, log_path(), worker_pool()); |
| 116 | 168 |
| 117 std::vector<std::string> log_entries; | 169 upload_list->LoadUploadListAsynchronously(); |
| 118 log_entries.push_back(test_entry); | 170 WaitForUploadList(); |
| 119 upload_list->ParseLogEntries(log_entries); | |
| 120 | 171 |
| 121 EXPECT_EQ(1u, upload_list->uploads_.size()); | 172 std::vector<UploadList::UploadInfo> uploads; |
| 122 double time_double = upload_list->uploads_[0].upload_time.ToDoubleT(); | 173 upload_list->GetUploads(999, &uploads); |
| 174 |
| 175 EXPECT_EQ(1u, uploads.size()); |
| 176 double time_double = uploads[0].upload_time.ToDoubleT(); |
| 123 EXPECT_STREQ("0", base::DoubleToString(time_double).c_str()); | 177 EXPECT_STREQ("0", base::DoubleToString(time_double).c_str()); |
| 124 EXPECT_STREQ("", upload_list->uploads_[0].upload_id.c_str()); | 178 EXPECT_STREQ("", uploads[0].upload_id.c_str()); |
| 125 EXPECT_STREQ(kTestLocalID, upload_list->uploads_[0].local_id.c_str()); | 179 EXPECT_STREQ(kTestLocalID, uploads[0].local_id.c_str()); |
| 126 time_double = upload_list->uploads_[0].capture_time.ToDoubleT(); | 180 time_double = uploads[0].capture_time.ToDoubleT(); |
| 127 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); | 181 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); |
| 128 } | 182 } |
| 129 | 183 |
| 130 // Test log entry string with upload time, upload ID, local ID and capture | 184 // Test log entry string with upload time, upload ID, local ID and capture |
| 131 // time. | 185 // time. |
| 132 // This is the format that WebRTC logs that are stored locally and have been | 186 // This is the format that WebRTC logs that are stored locally and have been |
| 133 // uploaded are stored in. | 187 // uploaded are stored in. |
| 134 TEST(UploadListTest, ParseUploadTimeUploadIdLocalIdCaptureTime) { | 188 TEST_F(UploadListTest, ParseUploadTimeUploadIdLocalIdCaptureTime) { |
| 135 std::string test_entry = kTestUploadTime; | 189 std::string test_entry = kTestUploadTime; |
| 136 test_entry += ","; | 190 test_entry += ","; |
| 137 test_entry.append(kTestUploadId); | 191 test_entry.append(kTestUploadId); |
| 138 test_entry += ","; | 192 test_entry += ","; |
| 139 test_entry.append(kTestLocalID); | 193 test_entry.append(kTestLocalID); |
| 140 test_entry += ","; | 194 test_entry += ","; |
| 141 test_entry.append(kTestCaptureTime); | 195 test_entry.append(kTestCaptureTime); |
| 196 WriteUploadLog(test_entry); |
| 142 | 197 |
| 143 scoped_refptr<UploadList> upload_list = | 198 scoped_refptr<UploadList> upload_list = |
| 144 new UploadList(nullptr, base::FilePath(), nullptr); | 199 new UploadList(this, log_path(), worker_pool()); |
| 145 | 200 |
| 146 std::vector<std::string> log_entries; | 201 upload_list->LoadUploadListAsynchronously(); |
| 147 log_entries.push_back(test_entry); | 202 WaitForUploadList(); |
| 148 upload_list->ParseLogEntries(log_entries); | |
| 149 | 203 |
| 150 EXPECT_EQ(1u, upload_list->uploads_.size()); | 204 std::vector<UploadList::UploadInfo> uploads; |
| 151 double time_double = upload_list->uploads_[0].upload_time.ToDoubleT(); | 205 upload_list->GetUploads(999, &uploads); |
| 206 |
| 207 EXPECT_EQ(1u, uploads.size()); |
| 208 double time_double = uploads[0].upload_time.ToDoubleT(); |
| 152 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); | 209 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); |
| 153 EXPECT_STREQ(kTestUploadId, upload_list->uploads_[0].upload_id.c_str()); | 210 EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str()); |
| 154 EXPECT_STREQ(kTestLocalID, upload_list->uploads_[0].local_id.c_str()); | 211 EXPECT_STREQ(kTestLocalID, uploads[0].local_id.c_str()); |
| 155 time_double = upload_list->uploads_[0].capture_time.ToDoubleT(); | 212 time_double = uploads[0].capture_time.ToDoubleT(); |
| 156 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); | 213 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); |
| 157 } | 214 } |
| 158 | 215 |
| 159 TEST(UploadListTest, ParseMultipleEntries) { | 216 TEST_F(UploadListTest, ParseMultipleEntries) { |
| 217 std::string test_entry; |
| 218 for (int i = 1; i <= 4; ++i) { |
| 219 test_entry.append(kTestUploadTime); |
| 220 test_entry += ","; |
| 221 test_entry.append(kTestUploadId); |
| 222 test_entry += ","; |
| 223 test_entry.append(kTestLocalID); |
| 224 test_entry += ","; |
| 225 test_entry.append(kTestCaptureTime); |
| 226 test_entry += "\n"; |
| 227 } |
| 228 WriteUploadLog(test_entry); |
| 229 |
| 230 scoped_refptr<UploadList> upload_list = |
| 231 new UploadList(this, log_path(), worker_pool()); |
| 232 |
| 233 upload_list->LoadUploadListAsynchronously(); |
| 234 WaitForUploadList(); |
| 235 |
| 236 std::vector<UploadList::UploadInfo> uploads; |
| 237 upload_list->GetUploads(999, &uploads); |
| 238 |
| 239 EXPECT_EQ(4u, uploads.size()); |
| 240 for (size_t i = 0; i < uploads.size(); ++i) { |
| 241 double time_double = uploads[i].upload_time.ToDoubleT(); |
| 242 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); |
| 243 EXPECT_STREQ(kTestUploadId, uploads[i].upload_id.c_str()); |
| 244 EXPECT_STREQ(kTestLocalID, uploads[i].local_id.c_str()); |
| 245 time_double = uploads[i].capture_time.ToDoubleT(); |
| 246 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); |
| 247 } |
| 248 } |
| 249 |
| 250 TEST_F(UploadListTest, SimultaneousAccess) { |
| 160 std::string test_entry = kTestUploadTime; | 251 std::string test_entry = kTestUploadTime; |
| 161 test_entry += ","; | 252 test_entry += ","; |
| 162 test_entry.append(kTestUploadId); | 253 test_entry.append(kTestUploadId); |
| 163 test_entry += ","; | 254 test_entry += ","; |
| 164 test_entry.append(kTestLocalID); | 255 test_entry.append(kTestLocalID); |
| 165 test_entry += ","; | 256 test_entry += ","; |
| 166 test_entry.append(kTestCaptureTime); | 257 test_entry.append(kTestCaptureTime); |
| 258 WriteUploadLog(test_entry); |
| 167 | 259 |
| 168 scoped_refptr<UploadList> upload_list = | 260 scoped_refptr<UploadList> upload_list = |
| 169 new UploadList(nullptr, base::FilePath(), nullptr); | 261 new UploadList(this, log_path(), worker_pool()); |
| 170 | 262 |
| 171 // 1 entry. | 263 for (int i = 1; i <= 20; ++i) { |
| 172 std::vector<std::string> log_entries; | 264 upload_list->LoadUploadListAsynchronously(); |
| 173 log_entries.push_back(test_entry); | 265 } |
| 174 upload_list->ParseLogEntries(log_entries); | 266 WaitForUploadList(); |
| 175 EXPECT_EQ(1u, upload_list->uploads_.size()); | 267 upload_list->ClearDelegate(); |
| 176 double time_double = upload_list->uploads_[0].upload_time.ToDoubleT(); | 268 |
| 269 std::vector<UploadList::UploadInfo> uploads; |
| 270 for (int i = 1; i <= 4; ++i) { |
| 271 uploads.clear(); |
| 272 upload_list->GetUploads(999, &uploads); |
| 273 } |
| 274 |
| 275 EXPECT_EQ(1u, uploads.size()); |
| 276 double time_double = uploads[0].upload_time.ToDoubleT(); |
| 177 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); | 277 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); |
| 178 EXPECT_STREQ(kTestUploadId, upload_list->uploads_[0].upload_id.c_str()); | 278 EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str()); |
| 179 EXPECT_STREQ(kTestLocalID, upload_list->uploads_[0].local_id.c_str()); | 279 EXPECT_STREQ(kTestLocalID, uploads[0].local_id.c_str()); |
| 180 time_double = upload_list->uploads_[0].capture_time.ToDoubleT(); | 280 time_double = uploads[0].capture_time.ToDoubleT(); |
| 181 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); | 281 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); |
| 282 } |
| 182 | 283 |
| 183 // Add 3 more entries. | 284 } // namespace |
| 184 log_entries.push_back(test_entry); | |
| 185 log_entries.push_back(test_entry); | |
| 186 upload_list->ParseLogEntries(log_entries); | |
| 187 EXPECT_EQ(4u, upload_list->uploads_.size()); | |
| 188 for (size_t i = 0; i < upload_list->uploads_.size(); ++i) { | |
| 189 time_double = upload_list->uploads_[i].upload_time.ToDoubleT(); | |
| 190 EXPECT_STREQ(kTestUploadTime, base::DoubleToString(time_double).c_str()); | |
| 191 EXPECT_STREQ(kTestUploadId, upload_list->uploads_[i].upload_id.c_str()); | |
| 192 EXPECT_STREQ(kTestLocalID, upload_list->uploads_[i].local_id.c_str()); | |
| 193 time_double = upload_list->uploads_[i].capture_time.ToDoubleT(); | |
| 194 EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str()); | |
| 195 } | |
| 196 } | |
| OLD | NEW |