OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "ios/chrome/browser/reading_list/reading_list_entry.h" | 5 #include "ios/chrome/browser/reading_list/reading_list_entry.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "base/test/simple_test_tick_clock.h" | 8 #include "base/test/simple_test_tick_clock.h" |
| 9 #include "components/sync/protocol/reading_list_specifics.pb.h" |
| 10 #include "ios/chrome/browser/reading_list/proto/reading_list.pb.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
10 | 12 |
11 namespace { | 13 namespace { |
12 const int kFirstBackoff = 10; | 14 const int kFirstBackoff = 10; |
13 const int kSecondBackoff = 10; | 15 const int kSecondBackoff = 10; |
14 const int kThirdBackoff = 60; | 16 const int kThirdBackoff = 60; |
15 const int kFourthBackoff = 120; | 17 const int kFourthBackoff = 120; |
16 const int kFifthBackoff = 120; | 18 const int kFifthBackoff = 120; |
17 } // namespace | 19 } // namespace |
18 | 20 |
(...skipping 19 matching lines...) Expand all Loading... |
38 | 40 |
39 ReadingListEntry e3(std::move(e1)); | 41 ReadingListEntry e3(std::move(e1)); |
40 | 42 |
41 EXPECT_EQ(e3, e2); | 43 EXPECT_EQ(e3, e2); |
42 EXPECT_EQ(e3.Title(), e2.Title()); | 44 EXPECT_EQ(e3.Title(), e2.Title()); |
43 } | 45 } |
44 | 46 |
45 TEST(ReadingListEntry, DistilledPathAndURL) { | 47 TEST(ReadingListEntry, DistilledPathAndURL) { |
46 ReadingListEntry e(GURL("http://example.com"), "bar"); | 48 ReadingListEntry e(GURL("http://example.com"), "bar"); |
47 | 49 |
48 EXPECT_FALSE(e.DistilledURL().is_valid()); | 50 EXPECT_TRUE(e.DistilledPath().empty()); |
49 | 51 |
50 const base::FilePath distilled_path("distilled/page.html"); | 52 const base::FilePath distilled_path("distilled/page.html"); |
51 e.SetDistilledPath(distilled_path); | 53 e.SetDistilledPath(distilled_path); |
52 EXPECT_EQ(distilled_path, e.DistilledPath()); | 54 EXPECT_EQ(distilled_path, e.DistilledPath()); |
53 EXPECT_EQ(GURL("chrome://offline/distilled/page.html"), e.DistilledURL()); | 55 EXPECT_EQ(GURL("chrome://offline/distilled/page.html"), e.DistilledURL()); |
54 } | 56 } |
55 | 57 |
56 TEST(ReadingListEntry, DistilledState) { | 58 TEST(ReadingListEntry, DistilledState) { |
57 ReadingListEntry e(GURL("http://example.com"), "bar"); | 59 ReadingListEntry e(GURL("http://example.com"), "bar"); |
58 | 60 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 EXPECT_EQ(1, e.FailedDownloadCounter()); | 178 EXPECT_EQ(1, e.FailedDownloadCounter()); |
177 | 179 |
178 e.SetDistilledState(ReadingListEntry::PROCESSING); | 180 e.SetDistilledState(ReadingListEntry::PROCESSING); |
179 EXPECT_EQ(1, e.FailedDownloadCounter()); | 181 EXPECT_EQ(1, e.FailedDownloadCounter()); |
180 | 182 |
181 e.SetDistilledState(ReadingListEntry::WILL_RETRY); | 183 e.SetDistilledState(ReadingListEntry::WILL_RETRY); |
182 EXPECT_EQ(2, e.FailedDownloadCounter()); | 184 EXPECT_EQ(2, e.FailedDownloadCounter()); |
183 e.SetDistilledState(ReadingListEntry::ERROR); | 185 e.SetDistilledState(ReadingListEntry::ERROR); |
184 EXPECT_EQ(2, e.FailedDownloadCounter()); | 186 EXPECT_EQ(2, e.FailedDownloadCounter()); |
185 } | 187 } |
| 188 |
| 189 // Tests that the reading list entry is correctly encoded to |
| 190 // sync_pb::ReadingListSpecifics. |
| 191 TEST(ReadingListEntry, AsReadingListSpecifics) { |
| 192 ReadingListEntry entry(GURL("http://example.com/"), "bar"); |
| 193 int64_t creation_time_us = entry.UpdateTime(); |
| 194 |
| 195 std::unique_ptr<sync_pb::ReadingListSpecifics> pb_entry( |
| 196 entry.AsReadingListSpecifics(false)); |
| 197 EXPECT_EQ(pb_entry->entry_id(), "http://example.com/"); |
| 198 EXPECT_EQ(pb_entry->url(), "http://example.com/"); |
| 199 EXPECT_EQ(pb_entry->title(), "bar"); |
| 200 EXPECT_EQ(pb_entry->creation_time_us(), creation_time_us); |
| 201 EXPECT_EQ(pb_entry->update_time_us(), entry.UpdateTime()); |
| 202 EXPECT_EQ(pb_entry->status(), sync_pb::ReadingListSpecifics::UNREAD); |
| 203 |
| 204 entry.MarkEntryUpdated(); |
| 205 EXPECT_NE(entry.UpdateTime(), creation_time_us); |
| 206 std::unique_ptr<sync_pb::ReadingListSpecifics> updated_pb_entry( |
| 207 entry.AsReadingListSpecifics(true)); |
| 208 EXPECT_EQ(updated_pb_entry->creation_time_us(), creation_time_us); |
| 209 EXPECT_EQ(updated_pb_entry->update_time_us(), entry.UpdateTime()); |
| 210 EXPECT_EQ(updated_pb_entry->status(), sync_pb::ReadingListSpecifics::READ); |
| 211 } |
| 212 |
| 213 // Tests that the reading list entry is correctly parsed from |
| 214 // sync_pb::ReadingListSpecifics. |
| 215 TEST(ReadingListEntry, FromReadingListSpecifics) { |
| 216 std::unique_ptr<sync_pb::ReadingListSpecifics> pb_entry = |
| 217 base::MakeUnique<sync_pb::ReadingListSpecifics>(); |
| 218 pb_entry->set_entry_id("http://example.com/"); |
| 219 pb_entry->set_url("http://example.com/"); |
| 220 pb_entry->set_title("title"); |
| 221 pb_entry->set_creation_time_us(1); |
| 222 pb_entry->set_update_time_us(2); |
| 223 pb_entry->set_status(sync_pb::ReadingListSpecifics::UNREAD); |
| 224 |
| 225 std::unique_ptr<ReadingListEntry> entry( |
| 226 ReadingListEntry::FromReadingListSpecifics(*pb_entry)); |
| 227 EXPECT_EQ(entry->URL().spec(), "http://example.com/"); |
| 228 EXPECT_EQ(entry->Title(), "title"); |
| 229 EXPECT_EQ(entry->UpdateTime(), 2); |
| 230 EXPECT_EQ(entry->FailedDownloadCounter(), 0); |
| 231 } |
| 232 |
| 233 // Tests that the reading list entry is correctly encoded to |
| 234 // reading_list::ReadingListLocal. |
| 235 TEST(ReadingListEntry, AsReadingListLocal) { |
| 236 ReadingListEntry entry(GURL("http://example.com/"), "bar"); |
| 237 int64_t creation_time_us = entry.UpdateTime(); |
| 238 |
| 239 std::unique_ptr<reading_list::ReadingListLocal> pb_entry( |
| 240 entry.AsReadingListLocal(false)); |
| 241 EXPECT_EQ(pb_entry->entry_id(), "http://example.com/"); |
| 242 EXPECT_EQ(pb_entry->url(), "http://example.com/"); |
| 243 EXPECT_EQ(pb_entry->title(), "bar"); |
| 244 EXPECT_EQ(pb_entry->creation_time_us(), creation_time_us); |
| 245 EXPECT_EQ(pb_entry->update_time_us(), entry.UpdateTime()); |
| 246 EXPECT_EQ(pb_entry->status(), reading_list::ReadingListLocal::UNREAD); |
| 247 EXPECT_EQ(pb_entry->distillation_state(), |
| 248 reading_list::ReadingListLocal::WAITING); |
| 249 EXPECT_EQ(pb_entry->distilled_path(), ""); |
| 250 EXPECT_EQ(pb_entry->failed_download_counter(), 0); |
| 251 EXPECT_NE(pb_entry->backoff(), ""); |
| 252 |
| 253 entry.SetDistilledState(ReadingListEntry::WILL_RETRY); |
| 254 std::unique_ptr<reading_list::ReadingListLocal> will_retry_pb_entry( |
| 255 entry.AsReadingListLocal(true)); |
| 256 EXPECT_EQ(will_retry_pb_entry->distillation_state(), |
| 257 reading_list::ReadingListLocal::WILL_RETRY); |
| 258 EXPECT_EQ(will_retry_pb_entry->failed_download_counter(), 1); |
| 259 |
| 260 entry.SetDistilledPath(base::FilePath("distilled/page.html")); |
| 261 entry.MarkEntryUpdated(); |
| 262 EXPECT_NE(entry.UpdateTime(), creation_time_us); |
| 263 std::unique_ptr<reading_list::ReadingListLocal> distilled_pb_entry( |
| 264 entry.AsReadingListLocal(true)); |
| 265 EXPECT_EQ(distilled_pb_entry->creation_time_us(), creation_time_us); |
| 266 EXPECT_EQ(distilled_pb_entry->update_time_us(), entry.UpdateTime()); |
| 267 EXPECT_NE(distilled_pb_entry->backoff(), ""); |
| 268 EXPECT_EQ(distilled_pb_entry->status(), reading_list::ReadingListLocal::READ); |
| 269 EXPECT_EQ(distilled_pb_entry->distillation_state(), |
| 270 reading_list::ReadingListLocal::PROCESSED); |
| 271 EXPECT_EQ(distilled_pb_entry->distilled_path(), "distilled/page.html"); |
| 272 EXPECT_EQ(distilled_pb_entry->failed_download_counter(), 0); |
| 273 } |
| 274 |
| 275 // Tests that the reading list entry is correctly parsed from |
| 276 // sync_pb::ReadingListLocal. |
| 277 TEST(ReadingListEntry, FromReadingListLocal) { |
| 278 ReadingListEntry entry(GURL("http://example.com/"), "title"); |
| 279 base::Time next_call = base::Time::Now() + entry.TimeUntilNextTry(); |
| 280 |
| 281 std::unique_ptr<reading_list::ReadingListLocal> pb_entry( |
| 282 entry.AsReadingListLocal(false)); |
| 283 |
| 284 pb_entry->set_entry_id("http://example.com/"); |
| 285 pb_entry->set_url("http://example.com/"); |
| 286 pb_entry->set_title("title"); |
| 287 pb_entry->set_creation_time_us(1); |
| 288 pb_entry->set_update_time_us(2); |
| 289 pb_entry->set_status(reading_list::ReadingListLocal::UNREAD); |
| 290 pb_entry->set_distillation_state(reading_list::ReadingListLocal::WAITING); |
| 291 pb_entry->set_failed_download_counter(2); |
| 292 |
| 293 std::unique_ptr<ReadingListEntry> waiting_entry( |
| 294 ReadingListEntry::FromReadingListLocal(*pb_entry)); |
| 295 EXPECT_EQ(waiting_entry->URL().spec(), "http://example.com/"); |
| 296 EXPECT_EQ(waiting_entry->Title(), "title"); |
| 297 EXPECT_EQ(waiting_entry->UpdateTime(), 2); |
| 298 EXPECT_EQ(waiting_entry->FailedDownloadCounter(), 2); |
| 299 EXPECT_EQ(waiting_entry->DistilledState(), ReadingListEntry::WAITING); |
| 300 EXPECT_EQ(waiting_entry->DistilledPath(), base::FilePath()); |
| 301 base::Time waiting_next_call = |
| 302 base::Time::Now() + waiting_entry->TimeUntilNextTry(); |
| 303 base::TimeDelta delta = next_call - waiting_next_call; |
| 304 EXPECT_NEAR(delta.InMillisecondsRoundedUp(), 0, 10); |
| 305 } |
| 306 |
| 307 // Tests that the merging of two ReadingListEntry. |
| 308 TEST(ReadingListEntry, MergeLocalStateFrom) { |
| 309 ReadingListEntry local_entry(GURL("http://example.com/"), "title"); |
| 310 base::Time next_call = base::Time::Now() + local_entry.TimeUntilNextTry(); |
| 311 int64_t local_update_time_us = local_entry.UpdateTime(); |
| 312 local_entry.SetDistilledPath(base::FilePath("distilled/page.html")); |
| 313 |
| 314 ReadingListEntry sync_entry(GURL("http://example2.com/"), "title2"); |
| 315 sync_entry.SetDistilledState(ReadingListEntry::ERROR); |
| 316 int64_t sync_update_time_us = sync_entry.UpdateTime(); |
| 317 EXPECT_NE(local_update_time_us, sync_update_time_us); |
| 318 sync_entry.MergeLocalStateFrom(local_entry); |
| 319 EXPECT_EQ(sync_entry.URL().spec(), "http://example2.com/"); |
| 320 EXPECT_EQ(sync_entry.Title(), "title2"); |
| 321 EXPECT_EQ(sync_entry.UpdateTime(), sync_update_time_us); |
| 322 EXPECT_EQ(sync_entry.FailedDownloadCounter(), 0); |
| 323 EXPECT_EQ(sync_entry.DistilledState(), ReadingListEntry::PROCESSED); |
| 324 EXPECT_EQ(sync_entry.DistilledPath().value(), "distilled/page.html"); |
| 325 base::Time sync_next_call = base::Time::Now() + sync_entry.TimeUntilNextTry(); |
| 326 base::TimeDelta delta = next_call - sync_next_call; |
| 327 EXPECT_NEAR(delta.InMillisecondsRoundedUp(), 0, 10); |
| 328 } |
OLD | NEW |