network_quality_store_unittest.cc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  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
  3. // found in the LICENSE file.
  4. #include "net/nqe/network_quality_store.h"
  5. #include "base/strings/string_number_conversions.h"
  6. #include "base/test/simple_test_tick_clock.h"
  7. #include "base/time/time.h"
  8. #include "net/base/network_change_notifier.h"
  9. #include "net/nqe/cached_network_quality.h"
  10. #include "net/nqe/effective_connection_type.h"
  11. #include "net/nqe/network_id.h"
  12. #include "testing/gtest/include/gtest/gtest.h"
  13. namespace net {
  14. namespace {
  15. TEST(NetworkQualityStoreTest, TestCaching) {
  16. nqe::internal::NetworkQualityStore network_quality_store;
  17. base::SimpleTestTickClock tick_clock;
  18. // Cached network quality for network with NetworkID (2G, "test1").
  19. const nqe::internal::CachedNetworkQuality cached_network_quality_2g_test1(
  20. tick_clock.NowTicks(),
  21. nqe::internal::NetworkQuality(base::Seconds(1), base::Seconds(1), 1),
  22. EFFECTIVE_CONNECTION_TYPE_2G);
  23. {
  24. // When ECT is UNKNOWN, then the network quality is not cached.
  25. nqe::internal::CachedNetworkQuality cached_network_quality_unknown(
  26. tick_clock.NowTicks(),
  27. nqe::internal::NetworkQuality(base::Seconds(1), base::Seconds(1), 1),
  28. EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
  29. // Entry should not be added.
  30. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  31. "test1", 0);
  32. nqe::internal::CachedNetworkQuality read_network_quality;
  33. network_quality_store.Add(network_id, cached_network_quality_unknown);
  34. EXPECT_FALSE(
  35. network_quality_store.GetById(network_id, &read_network_quality));
  36. }
  37. {
  38. // Entry will be added for (2G, "test1").
  39. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  40. "test1", 0);
  41. nqe::internal::CachedNetworkQuality read_network_quality;
  42. network_quality_store.Add(network_id, cached_network_quality_2g_test1);
  43. EXPECT_TRUE(
  44. network_quality_store.GetById(network_id, &read_network_quality));
  45. EXPECT_EQ(cached_network_quality_2g_test1.network_quality(),
  46. read_network_quality.network_quality());
  47. }
  48. {
  49. // Entry will be added for (2G, "test2").
  50. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  51. "test2", 0);
  52. nqe::internal::CachedNetworkQuality read_network_quality;
  53. nqe::internal::CachedNetworkQuality cached_network_quality(
  54. tick_clock.NowTicks(),
  55. nqe::internal::NetworkQuality(base::Seconds(2), base::Seconds(2), 2),
  56. EFFECTIVE_CONNECTION_TYPE_2G);
  57. network_quality_store.Add(network_id, cached_network_quality);
  58. EXPECT_TRUE(
  59. network_quality_store.GetById(network_id, &read_network_quality));
  60. EXPECT_EQ(read_network_quality.network_quality(),
  61. cached_network_quality.network_quality());
  62. }
  63. {
  64. // Entry will be added for (3G, "test3").
  65. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_3G,
  66. "test3", 0);
  67. nqe::internal::CachedNetworkQuality read_network_quality;
  68. nqe::internal::CachedNetworkQuality cached_network_quality(
  69. tick_clock.NowTicks(),
  70. nqe::internal::NetworkQuality(base::Seconds(3), base::Seconds(3), 3),
  71. EFFECTIVE_CONNECTION_TYPE_3G);
  72. network_quality_store.Add(network_id, cached_network_quality);
  73. EXPECT_TRUE(
  74. network_quality_store.GetById(network_id, &read_network_quality));
  75. EXPECT_EQ(read_network_quality.network_quality(),
  76. cached_network_quality.network_quality());
  77. }
  78. {
  79. // Entry will be added for (Unknown, "").
  80. nqe::internal::NetworkID network_id(
  81. NetworkChangeNotifier::CONNECTION_UNKNOWN, "", 0);
  82. nqe::internal::CachedNetworkQuality read_network_quality;
  83. nqe::internal::CachedNetworkQuality set_network_quality(
  84. tick_clock.NowTicks(),
  85. nqe::internal::NetworkQuality(base::Seconds(4), base::Seconds(4), 4),
  86. EFFECTIVE_CONNECTION_TYPE_4G);
  87. network_quality_store.Add(network_id, set_network_quality);
  88. EXPECT_TRUE(
  89. network_quality_store.GetById(network_id, &read_network_quality));
  90. }
  91. {
  92. // Existing entry will be read for (2G, "test1").
  93. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  94. "test1", 0);
  95. nqe::internal::CachedNetworkQuality read_network_quality;
  96. EXPECT_TRUE(
  97. network_quality_store.GetById(network_id, &read_network_quality));
  98. EXPECT_EQ(cached_network_quality_2g_test1.network_quality(),
  99. read_network_quality.network_quality());
  100. }
  101. {
  102. // Existing entry will be overwritten for (2G, "test1").
  103. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  104. "test1", 0);
  105. nqe::internal::CachedNetworkQuality read_network_quality;
  106. const nqe::internal::CachedNetworkQuality cached_network_quality(
  107. tick_clock.NowTicks(),
  108. nqe::internal::NetworkQuality(base::Seconds(5), base::Seconds(5), 5),
  109. EFFECTIVE_CONNECTION_TYPE_4G);
  110. network_quality_store.Add(network_id, cached_network_quality);
  111. EXPECT_TRUE(
  112. network_quality_store.GetById(network_id, &read_network_quality));
  113. EXPECT_EQ(cached_network_quality.network_quality(),
  114. read_network_quality.network_quality());
  115. }
  116. {
  117. // No entry should exist for (2G, "test4").
  118. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  119. "test4", 0);
  120. nqe::internal::CachedNetworkQuality read_network_quality;
  121. EXPECT_FALSE(
  122. network_quality_store.GetById(network_id, &read_network_quality));
  123. }
  124. }
  125. TEST(NetworkQualityStoreTest, TestCachingClosestSignalStrength) {
  126. nqe::internal::NetworkQualityStore network_quality_store;
  127. base::SimpleTestTickClock tick_clock;
  128. // Cached network quality for network with NetworkID (2G, "test1").
  129. const nqe::internal::CachedNetworkQuality cached_network_quality_strength_1(
  130. tick_clock.NowTicks(),
  131. nqe::internal::NetworkQuality(base::Seconds(1), base::Seconds(1), 1),
  132. EFFECTIVE_CONNECTION_TYPE_2G);
  133. const nqe::internal::CachedNetworkQuality cached_network_quality_strength_3(
  134. tick_clock.NowTicks(),
  135. nqe::internal::NetworkQuality(base::Seconds(3), base::Seconds(3), 3),
  136. EFFECTIVE_CONNECTION_TYPE_2G);
  137. {
  138. // Entry will be added for (2G, "test1") with signal strength value of 1.
  139. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  140. "test1", 1);
  141. nqe::internal::CachedNetworkQuality read_network_quality;
  142. network_quality_store.Add(network_id, cached_network_quality_strength_1);
  143. EXPECT_TRUE(
  144. network_quality_store.GetById(network_id, &read_network_quality));
  145. EXPECT_EQ(cached_network_quality_strength_1.network_quality(),
  146. read_network_quality.network_quality());
  147. }
  148. {
  149. // Entry will be added for (2G, "test1") with signal strength value of 3.
  150. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  151. "test1", 3);
  152. nqe::internal::CachedNetworkQuality read_network_quality;
  153. network_quality_store.Add(network_id, cached_network_quality_strength_3);
  154. EXPECT_TRUE(
  155. network_quality_store.GetById(network_id, &read_network_quality));
  156. EXPECT_EQ(cached_network_quality_strength_3.network_quality(),
  157. read_network_quality.network_quality());
  158. }
  159. {
  160. // Now with cached entries for signal strengths 1 and 3, verify across the
  161. // range of strength values that the closest value match will be returned
  162. // when looking up (2G, "test1", signal_strength).
  163. for (int32_t signal_strength = 0; signal_strength <= 4; ++signal_strength) {
  164. nqe::internal::CachedNetworkQuality expected_cached_network_quality =
  165. signal_strength <= 2 ? cached_network_quality_strength_1
  166. : cached_network_quality_strength_3;
  167. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  168. "test1", signal_strength);
  169. nqe::internal::CachedNetworkQuality read_network_quality;
  170. EXPECT_TRUE(
  171. network_quality_store.GetById(network_id, &read_network_quality));
  172. EXPECT_EQ(expected_cached_network_quality.network_quality(),
  173. read_network_quality.network_quality());
  174. }
  175. }
  176. {
  177. // When the current network does not have signal strength available, then
  178. // the cached value that corresponds to maximum signal strength should be
  179. // returned.
  180. int32_t signal_strength = INT32_MIN;
  181. nqe::internal::CachedNetworkQuality expected_cached_network_quality =
  182. cached_network_quality_strength_3;
  183. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  184. "test1", signal_strength);
  185. nqe::internal::CachedNetworkQuality read_network_quality;
  186. EXPECT_TRUE(
  187. network_quality_store.GetById(network_id, &read_network_quality));
  188. EXPECT_EQ(expected_cached_network_quality.network_quality(),
  189. read_network_quality.network_quality());
  190. }
  191. {
  192. // No entry should exist for (2G, "test4").
  193. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  194. "test4", 0);
  195. nqe::internal::CachedNetworkQuality read_network_quality;
  196. EXPECT_FALSE(
  197. network_quality_store.GetById(network_id, &read_network_quality));
  198. }
  199. }
  200. TEST(NetworkQualityStoreTest, TestCachingUnknownSignalStrength) {
  201. nqe::internal::NetworkQualityStore network_quality_store;
  202. base::SimpleTestTickClock tick_clock;
  203. // Cached network quality for network with NetworkID (2G, "test1").
  204. const nqe::internal::CachedNetworkQuality
  205. cached_network_quality_strength_unknown(
  206. tick_clock.NowTicks(),
  207. nqe::internal::NetworkQuality(base::Seconds(1), base::Seconds(1), 1),
  208. EFFECTIVE_CONNECTION_TYPE_2G);
  209. const nqe::internal::CachedNetworkQuality cached_network_quality_strength_3(
  210. tick_clock.NowTicks(),
  211. nqe::internal::NetworkQuality(base::Seconds(3), base::Seconds(3), 3),
  212. EFFECTIVE_CONNECTION_TYPE_2G);
  213. {
  214. // Entry will be added for (2G, "test1") with signal strength value of
  215. // INT32_MIN.
  216. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  217. "test1", INT32_MIN);
  218. nqe::internal::CachedNetworkQuality read_network_quality;
  219. network_quality_store.Add(network_id,
  220. cached_network_quality_strength_unknown);
  221. EXPECT_TRUE(
  222. network_quality_store.GetById(network_id, &read_network_quality));
  223. EXPECT_EQ(cached_network_quality_strength_unknown.network_quality(),
  224. read_network_quality.network_quality());
  225. }
  226. {
  227. // Entry will be added for (2G, "test1") with signal strength value of 3.
  228. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  229. "test1", 3);
  230. nqe::internal::CachedNetworkQuality read_network_quality;
  231. network_quality_store.Add(network_id, cached_network_quality_strength_3);
  232. EXPECT_TRUE(
  233. network_quality_store.GetById(network_id, &read_network_quality));
  234. EXPECT_EQ(cached_network_quality_strength_3.network_quality(),
  235. read_network_quality.network_quality());
  236. }
  237. {
  238. // Now with cached entries for signal strengths INT32_MIN and 3, verify
  239. // across the range of strength values that the closest value match will be
  240. // returned when looking up (2G, "test1", signal_strength).
  241. for (int32_t signal_strength = 0; signal_strength <= 4; ++signal_strength) {
  242. nqe::internal::CachedNetworkQuality expected_cached_network_quality =
  243. cached_network_quality_strength_3;
  244. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  245. "test1", signal_strength);
  246. nqe::internal::CachedNetworkQuality read_network_quality;
  247. EXPECT_TRUE(
  248. network_quality_store.GetById(network_id, &read_network_quality));
  249. EXPECT_EQ(expected_cached_network_quality.network_quality(),
  250. read_network_quality.network_quality());
  251. }
  252. }
  253. {
  254. // When the current network does not have signal strength available, then
  255. // the cached value that corresponds to unknown signal strength should be
  256. // returned.
  257. int32_t signal_strength = INT32_MIN;
  258. nqe::internal::CachedNetworkQuality expected_cached_network_quality =
  259. cached_network_quality_strength_unknown;
  260. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  261. "test1", signal_strength);
  262. nqe::internal::CachedNetworkQuality read_network_quality;
  263. EXPECT_TRUE(
  264. network_quality_store.GetById(network_id, &read_network_quality));
  265. EXPECT_EQ(expected_cached_network_quality.network_quality(),
  266. read_network_quality.network_quality());
  267. }
  268. }
  269. // Tests if the cache size remains bounded. Also, ensure that the cache is
  270. // LRU.
  271. TEST(NetworkQualityStoreTest, TestLRUCacheMaximumSize) {
  272. nqe::internal::NetworkQualityStore network_quality_store;
  273. base::SimpleTestTickClock tick_clock;
  274. // Add more networks than the maximum size of the cache.
  275. const size_t network_count = 21;
  276. nqe::internal::CachedNetworkQuality read_network_quality(
  277. tick_clock.NowTicks(),
  278. nqe::internal::NetworkQuality(base::Seconds(0), base::Seconds(0), 0),
  279. EFFECTIVE_CONNECTION_TYPE_2G);
  280. for (size_t i = 0; i < network_count; ++i) {
  281. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  282. "test" + base::NumberToString(i), 0);
  283. const nqe::internal::CachedNetworkQuality network_quality(
  284. tick_clock.NowTicks(),
  285. nqe::internal::NetworkQuality(base::Seconds(1), base::Seconds(1), 1),
  286. EFFECTIVE_CONNECTION_TYPE_2G);
  287. network_quality_store.Add(network_id, network_quality);
  288. tick_clock.Advance(base::Seconds(1));
  289. }
  290. base::TimeTicks earliest_last_update_time = tick_clock.NowTicks();
  291. size_t cache_match_count = 0;
  292. for (size_t i = 0; i < network_count; ++i) {
  293. nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
  294. "test" + base::NumberToString(i), 0);
  295. nqe::internal::CachedNetworkQuality network_quality(
  296. tick_clock.NowTicks(),
  297. nqe::internal::NetworkQuality(base::Seconds(0), base::Seconds(0), 0),
  298. EFFECTIVE_CONNECTION_TYPE_2G);
  299. if (network_quality_store.GetById(network_id, &network_quality)) {
  300. cache_match_count++;
  301. earliest_last_update_time = std::min(earliest_last_update_time,
  302. network_quality.last_update_time());
  303. }
  304. }
  305. // Ensure that the number of entries in cache are fewer than |network_count|.
  306. EXPECT_LT(cache_match_count, network_count);
  307. EXPECT_GT(cache_match_count, 0u);
  308. // Ensure that only LRU entries are cached by comparing the
  309. // |earliest_last_update_time|.
  310. EXPECT_EQ(tick_clock.NowTicks() - base::Seconds(cache_match_count),
  311. earliest_last_update_time);
  312. }
  313. } // namespace
  314. } // namespace net