Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Side by Side Diff: net/base/backoff_entry_unittest.cc

Issue 1023473003: Allow BackoffEntry to be serialized and deserialized. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tweak comments Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "net/base/backoff_entry.h" 5 #include "net/base/backoff_entry.h"
6 6
7 #include "base/logging.h"
7 #include "base/macros.h" 8 #include "base/macros.h"
8 #include "base/time/tick_clock.h" 9 #include "base/time/tick_clock.h"
10 #include "base/values.h"
11 #include "net/base/backoff_entry_serializer.h"
9 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
10 13
11 namespace net { 14 namespace net {
12 15
13 namespace { 16 namespace {
14 17
18 using base::Time;
15 using base::TimeDelta; 19 using base::TimeDelta;
16 using base::TimeTicks; 20 using base::TimeTicks;
17 21
18 BackoffEntry::Policy base_policy = { 0, 1000, 2.0, 0.0, 20000, 2000, false }; 22 BackoffEntry::Policy base_policy = {
23 0 /* num_errors_to_ignore */,
24 1000 /* initial_delay_ms */,
25 2.0 /* multiply_factor */,
26 0.0 /* jitter_factor */,
27 20000 /* maximum_backoff_ms */,
28 2000 /* entry_lifetime_ms */,
29 false /* always_use_initial_delay */
30 };
19 31
20 class TestTickClock : public base::TickClock { 32 class TestTickClock : public base::TickClock {
21 public: 33 public:
22 TestTickClock() {} 34 TestTickClock() {}
23 ~TestTickClock() override {} 35 ~TestTickClock() override {}
24 36
25 TimeTicks NowTicks() override { return now_ticks_; } 37 TimeTicks NowTicks() override { return now_ticks_; }
26 void set_now(TimeTicks now) { now_ticks_ = now; } 38 void set_now(TimeTicks now) { now_ticks_ = now; }
27 39
28 private: 40 private:
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 for (int i = 0; i < 129; ++i) { 316 for (int i = 0; i < 129; ++i) {
305 now_ticks.set_now(now_ticks.NowTicks() + custom.GetTimeUntilRelease()); 317 now_ticks.set_now(now_ticks.NowTicks() + custom.GetTimeUntilRelease());
306 custom.InformOfRequest(false); 318 custom.InformOfRequest(false);
307 ASSERT_TRUE(custom.ShouldRejectRequest()); 319 ASSERT_TRUE(custom.ShouldRejectRequest());
308 } 320 }
309 321
310 // Max delay should still be respected. 322 // Max delay should still be respected.
311 EXPECT_EQ(20000, custom.GetTimeUntilRelease().InMilliseconds()); 323 EXPECT_EQ(20000, custom.GetTimeUntilRelease().InMilliseconds());
312 } 324 }
313 325
326 TEST(BackoffEntryTest, SerializeTimeOffsets) {
mmenke 2015/05/05 15:47:52 These should probably go in backoff_entry_serializ
johnme 2015/05/06 12:46:47 Done.
327 TestTickClock now_ticks;
328 BackoffEntry original(&base_policy, &now_ticks);
329 // 2 errors.
330 original.InformOfRequest(false);
331 original.InformOfRequest(false);
332 scoped_ptr<base::ListValue> serialized =
333 BackoffEntrySerializer::SerializeToValue(original, base::Time());
334
335 {
336 // Test that immediate deserializeation round-trips.
337 scoped_ptr<BackoffEntry> deserialized =
338 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
339 &now_ticks, base::Time());
340 ASSERT_TRUE(deserialized.get());
341 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
342 EXPECT_EQ(original.GetReleaseTime(), deserialized->GetReleaseTime());
343 }
344
345 {
346 // Test deserialization when wall clock has advanced but TimeTicks haven't
347 // (e.g. device was rebooted).
348 base::Time later = base::Time() + TimeDelta::FromDays(1);
349 scoped_ptr<BackoffEntry> deserialized =
350 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
351 &now_ticks, later);
352 ASSERT_TRUE(deserialized.get());
353 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
354 EXPECT_EQ(original.GetReleaseTime() - TimeDelta::FromDays(1),
355 deserialized->GetReleaseTime());
356 }
357
358 {
359 // Test deserialization when TimeTicks have advanced but wall clock hasn't
360 // (e.g. it's an hour later, but a DST change cancelled that out).
361 TestTickClock later_ticks;
362 later_ticks.set_now(base::TimeTicks() + TimeDelta::FromDays(1));
363 scoped_ptr<BackoffEntry> deserialized =
364 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
365 &later_ticks,
366 base::Time());
367 ASSERT_TRUE(deserialized.get());
368 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
369 EXPECT_EQ(original.GetReleaseTime() + TimeDelta::FromDays(1),
370 deserialized->GetReleaseTime());
371 }
372
373 {
374 // Test deserialization when both wall clock and TimeTicks have advanced
375 // (e.g. it's just later than it's used to be).
376 TestTickClock later_ticks;
377 later_ticks.set_now(base::TimeTicks() + TimeDelta::FromDays(1));
378 base::Time later = base::Time() + TimeDelta::FromDays(1);
379 scoped_ptr<BackoffEntry> deserialized =
380 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
381 &later_ticks, later);
382 ASSERT_TRUE(deserialized.get());
383 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
384 EXPECT_EQ(original.GetReleaseTime(), deserialized->GetReleaseTime());
385 }
386
387 {
388 // Test deserialization when wall clock has gone backwards but TimeTicks
389 // haven't (e.g. the system clock was fast but they fixed it).
390 EXPECT_LT(TimeDelta::FromSeconds(1), original.GetTimeUntilRelease());
391 base::Time earlier = base::Time() - TimeDelta::FromSeconds(1);
392 scoped_ptr<BackoffEntry> deserialized =
393 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
394 &now_ticks, earlier);
395 ASSERT_TRUE(deserialized.get());
396 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
397 // Deserialization should not exceed original time_until_release in such a
398 // situation.
399 EXPECT_EQ(original.GetTimeUntilRelease(),
400 deserialized->GetTimeUntilRelease());
401 // Since TimeTicks are equal, the release times will be too.
402 EXPECT_EQ(original.GetReleaseTime(), deserialized->GetReleaseTime());
403 }
404 }
405
406 TEST(BackoffEntryTest, SerializeNoFailures) {
407 TestTickClock now_ticks;
408 BackoffEntry original(&base_policy, &now_ticks);
409 scoped_ptr<base::ListValue> serialized =
410 BackoffEntrySerializer::SerializeToValue(original, base::Time());
411
412 scoped_ptr<BackoffEntry> deserialized =
413 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
414 &now_ticks, base::Time());
415 ASSERT_TRUE(deserialized.get());
416 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
417 EXPECT_EQ(original.GetReleaseTime(), deserialized->GetReleaseTime());
418 }
419
314 } // namespace 420 } // namespace
315 421
316 } // namespace net 422 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698