Index: net/nqe/network_qualities_manager_unittest.cc |
diff --git a/net/nqe/network_qualities_manager_unittest.cc b/net/nqe/network_qualities_manager_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a9c63f5117a8d169fa3beda8683cee4b9196555a |
--- /dev/null |
+++ b/net/nqe/network_qualities_manager_unittest.cc |
@@ -0,0 +1,211 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "net/nqe/network_qualities_manager.h" |
+ |
+#include "base/macros.h" |
RyanSturm
2016/07/12 18:45:38
Is this needed?
tbansal1
2016/07/12 19:40:19
Done.
|
+#include "base/strings/string_number_conversions.h" |
+#include "base/test/simple_test_tick_clock.h" |
+#include "base/time/time.h" |
+#include "net/base/network_change_notifier.h" |
+#include "net/nqe/cached_network_quality.h" |
+#include "net/nqe/network_id.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace net { |
+ |
+namespace { |
+ |
+TEST(NetworkQualitiesManagerTest, TestCaching) { |
+ nqe::internal::NetworkQualitiesManager network_qualities_manager; |
+ base::SimpleTestTickClock tick_clock; |
+ |
+ { |
+ // Entry will be added for (2G, "test1"). |
+ nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G, |
+ "test1"); |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ const nqe::internal::CachedNetworkQuality cached_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(1), |
+ base::TimeDelta::FromSeconds(1), 1)); |
+ network_qualities_manager.CacheNetworkQualityEstimate( |
+ network_id, cached_network_quality); |
+ EXPECT_TRUE(network_qualities_manager.GetCachedNetworkQualityEstimate( |
+ network_id, &read_network_quality)); |
+ EXPECT_EQ(cached_network_quality.network_quality(), |
+ read_network_quality.network_quality()); |
+ } |
+ |
+ { |
+ // Entry will be added for (2G, "test2"). |
+ nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G, |
+ "test2"); |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ nqe::internal::CachedNetworkQuality cached_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(2), |
+ base::TimeDelta::FromSeconds(2), 2)); |
+ network_qualities_manager.CacheNetworkQualityEstimate( |
+ network_id, cached_network_quality); |
+ EXPECT_TRUE(network_qualities_manager.GetCachedNetworkQualityEstimate( |
+ network_id, &read_network_quality)); |
+ EXPECT_EQ(read_network_quality.network_quality(), |
+ cached_network_quality.network_quality()); |
+ } |
+ |
+ { |
+ // Entry will be added for (3G, "test3"). |
+ nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_3G, |
+ "test3"); |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ nqe::internal::CachedNetworkQuality cached_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(3), |
+ base::TimeDelta::FromSeconds(3), 3)); |
+ network_qualities_manager.CacheNetworkQualityEstimate( |
+ network_id, cached_network_quality); |
+ EXPECT_TRUE(network_qualities_manager.GetCachedNetworkQualityEstimate( |
+ network_id, &read_network_quality)); |
+ EXPECT_EQ(read_network_quality.network_quality(), |
+ cached_network_quality.network_quality()); |
+ } |
+ |
+ { |
+ // Entry will not be added for (Unknown, ""). |
+ nqe::internal::NetworkID network_id( |
+ NetworkChangeNotifier::CONNECTION_UNKNOWN, ""); |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ nqe::internal::CachedNetworkQuality set_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(4), |
+ base::TimeDelta::FromSeconds(4), 4)); |
+ network_qualities_manager.CacheNetworkQualityEstimate(network_id, |
+ set_network_quality); |
+ EXPECT_FALSE(network_qualities_manager.GetCachedNetworkQualityEstimate( |
+ network_id, &read_network_quality)); |
+ } |
+ |
+ { |
+ // Existing entry will be read for (2G, "test1"). |
+ nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G, |
+ "test1"); |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ const nqe::internal::CachedNetworkQuality cached_network_quality( |
RyanSturm
2016/07/12 18:45:38
Add a comment that this cached_network_quality is
tbansal1
2016/07/12 19:40:19
Done.
|
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(1), |
+ base::TimeDelta::FromSeconds(1), 1)); |
+ EXPECT_TRUE(network_qualities_manager.GetCachedNetworkQualityEstimate( |
+ network_id, &read_network_quality)); |
+ EXPECT_EQ(cached_network_quality.network_quality(), |
+ read_network_quality.network_quality()); |
+ } |
+ |
+ { |
+ // Existing entry will be overwritten for (2G, "test1"). |
+ nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G, |
+ "test1"); |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ const nqe::internal::CachedNetworkQuality cached_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(5), |
+ base::TimeDelta::FromSeconds(5), 5)); |
+ network_qualities_manager.CacheNetworkQualityEstimate( |
+ network_id, cached_network_quality); |
+ EXPECT_TRUE(network_qualities_manager.GetCachedNetworkQualityEstimate( |
+ network_id, &read_network_quality)); |
+ EXPECT_EQ(cached_network_quality.network_quality(), |
+ read_network_quality.network_quality()); |
+ } |
+ |
+ { |
+ // No entry should exist for (2G, "test4"). |
+ nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G, |
+ "test4"); |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ EXPECT_FALSE(network_qualities_manager.GetCachedNetworkQualityEstimate( |
+ network_id, &read_network_quality)); |
+ } |
+} |
+ |
+// Tests if the cache size remains bounded. Also, ensure that the cache is |
+// LRU. |
+TEST(NetworkQualitiesManagerTest, TestLRUCacheMaximumSize) { |
+ nqe::internal::NetworkQualitiesManager network_qualities_manager; |
+ base::SimpleTestTickClock tick_clock; |
+ |
+ // Add more networks than the maximum size of the cache. |
+ const size_t network_count = 100; |
RyanSturm
2016/07/12 18:45:38
I'd prefer kMaximumNetworkQualityCacheSize+1, if y
tbansal1
2016/07/12 19:40:18
Changed to 11. There is a static assert in network
|
+ |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ |
+ for (size_t i = 0; i < network_count; ++i) { |
+ nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G, |
+ "test" + base::IntToString(i)); |
+ |
+ const nqe::internal::CachedNetworkQuality network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(1), |
+ base::TimeDelta::FromSeconds(1), 1)); |
+ network_qualities_manager.CacheNetworkQualityEstimate(network_id, |
+ network_quality); |
+ tick_clock.Advance(base::TimeDelta::FromSeconds(1)); |
+ } |
+ |
+ base::TimeTicks earliest_last_update_time = tick_clock.NowTicks(); |
+ size_t cache_match_count = 0; |
+ for (size_t i = 0; i < network_count; ++i) { |
+ nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G, |
+ "test" + base::IntToString(i)); |
+ |
+ nqe::internal::CachedNetworkQuality read_network_quality( |
+ tick_clock.NowTicks(), |
+ nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0), |
+ base::TimeDelta::FromSeconds(0), 0)); |
+ if (network_qualities_manager.GetCachedNetworkQualityEstimate( |
+ network_id, &read_network_quality)) { |
+ cache_match_count++; |
+ earliest_last_update_time = std::min( |
+ earliest_last_update_time, read_network_quality.last_update_time()); |
+ } |
+ } |
+ |
+ // Ensure that the number of entries in cache are fewer than |network_count|. |
+ EXPECT_LT(cache_match_count, network_count); |
+ EXPECT_GT(cache_match_count, 0u); |
+ |
+ // Ensure that only LRU entries are cached by comparing the |
+ // |earliest_last_update_time|. |
+ EXPECT_EQ( |
+ tick_clock.NowTicks() - base::TimeDelta::FromSeconds(cache_match_count), |
+ earliest_last_update_time); |
+} |
+ |
+} // namespace |
+ |
+} // namespace net |