wifi_data_provider_lacros_unittest.cc 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // Copyright 2021 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 "services/device/geolocation/wifi_data_provider_lacros.h"
  5. #include "base/memory/raw_ptr.h"
  6. #include "base/run_loop.h"
  7. #include "base/strings/string_number_conversions.h"
  8. #include "base/test/bind.h"
  9. #include "base/test/task_environment.h"
  10. #include "services/device/geolocation/wifi_polling_policy.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace {
  13. constexpr int kDefaultIntervalMillis = 200;
  14. constexpr int kNoChangeIntervalMillis = 300;
  15. constexpr int kTwoNoChangeIntervalMillis = 400;
  16. constexpr int kNoWifiIntervalMillis = 100;
  17. } // namespace
  18. namespace device {
  19. class WifiDataProviderLacrosTest : public testing::Test {
  20. public:
  21. void SetUp() override {
  22. WifiPollingPolicy::Initialize(
  23. std::make_unique<GenericWifiPollingPolicy<
  24. kDefaultIntervalMillis, kNoChangeIntervalMillis,
  25. kTwoNoChangeIntervalMillis, kNoWifiIntervalMillis>>());
  26. polling_policy_ = WifiPollingPolicy::Get();
  27. provider_ = new WifiDataProviderLacros();
  28. Test::SetUp();
  29. }
  30. void TearDown() override {
  31. polling_policy_ = nullptr;
  32. WifiPollingPolicy::Shutdown();
  33. Test::TearDown();
  34. }
  35. void CallDidWifiScanTask(bool service_initialized,
  36. bool data_available,
  37. int num_aps) {
  38. std::vector<crosapi::mojom::AccessPointDataPtr> ap_data_vector;
  39. for (int i = 0; i < num_aps; ++i) {
  40. auto ap_data = crosapi::mojom::AccessPointData::New();
  41. ap_data->mac_address = base::NumberToString16(i);
  42. ap_data->radio_signal_strength = i;
  43. ap_data->channel = i;
  44. ap_data->signal_to_noise = i;
  45. ap_data->ssid = base::NumberToString16(i);
  46. ap_data_vector.push_back(std::move(ap_data));
  47. }
  48. provider_->DidWifiScanTaskForTesting(service_initialized, data_available,
  49. base::TimeDelta(),
  50. std::move(ap_data_vector));
  51. base::RunLoop().RunUntilIdle();
  52. }
  53. WifiDataProviderLacros* provider() { return provider_.get(); }
  54. private:
  55. base::test::SingleThreadTaskEnvironment task_environment_;
  56. raw_ptr<WifiPollingPolicy> polling_policy_ = nullptr;
  57. scoped_refptr<WifiDataProviderLacros> provider_;
  58. };
  59. TEST_F(WifiDataProviderLacrosTest, NoDataWhenNoScanTaskHasCompleted) {
  60. WifiData wifi_data;
  61. // By default the provider should not have any wifi data.
  62. EXPECT_FALSE(provider()->GetData(&wifi_data));
  63. EXPECT_TRUE(wifi_data.access_point_data.empty());
  64. }
  65. TEST_F(WifiDataProviderLacrosTest, NoDataWhenServiceIsNotInitialized) {
  66. WifiData wifi_data;
  67. EXPECT_FALSE(provider()->GetData(&wifi_data));
  68. // The provider should indicate it does not have any wifi data if the service
  69. // is reported to be uninitialized.
  70. CallDidWifiScanTask(false, false, 0);
  71. EXPECT_FALSE(provider()->GetData(&wifi_data));
  72. EXPECT_TRUE(wifi_data.access_point_data.empty());
  73. }
  74. TEST_F(WifiDataProviderLacrosTest, RespondsCorrectlyWhenDataIsNotAvailable) {
  75. WifiData wifi_data;
  76. EXPECT_FALSE(provider()->GetData(&wifi_data));
  77. // Simulate a successful callback to DidWifiScanTask().
  78. CallDidWifiScanTask(true, true, 1);
  79. EXPECT_TRUE(provider()->GetData(&wifi_data));
  80. EXPECT_EQ(1u, wifi_data.access_point_data.size());
  81. // The provider should continue to report the most recent wifi data
  82. // successfully returned by the callback.
  83. CallDidWifiScanTask(true, false, 0);
  84. EXPECT_TRUE(provider()->GetData(&wifi_data));
  85. EXPECT_EQ(1u, wifi_data.access_point_data.size());
  86. }
  87. TEST_F(WifiDataProviderLacrosTest, DoesNotNotifyWhenIncommingDataIsIdentical) {
  88. WifiData wifi_data;
  89. EXPECT_FALSE(provider()->GetData(&wifi_data));
  90. int times_called = 0;
  91. auto wifi_data_callback =
  92. base::BindLambdaForTesting([&]() { times_called++; });
  93. provider()->AddCallback(&wifi_data_callback);
  94. // Simulate a successful callback to DidWifiScanTask().
  95. CallDidWifiScanTask(true, true, 2);
  96. EXPECT_TRUE(provider()->GetData(&wifi_data));
  97. EXPECT_EQ(2u, wifi_data.access_point_data.size());
  98. EXPECT_EQ(1, times_called);
  99. // Simulate a successful callback to DidWifiScanTask() with the same data as
  100. // before. This should not trigger any callbacks.
  101. CallDidWifiScanTask(true, false, 2);
  102. EXPECT_TRUE(provider()->GetData(&wifi_data));
  103. EXPECT_EQ(2u, wifi_data.access_point_data.size());
  104. EXPECT_EQ(1, times_called);
  105. provider()->RemoveCallback(&wifi_data_callback);
  106. }
  107. TEST_F(WifiDataProviderLacrosTest,
  108. NotifiesWhenIncommingDataIsSufficientlyDifferent) {
  109. WifiData wifi_data;
  110. EXPECT_FALSE(provider()->GetData(&wifi_data));
  111. int times_called = 0;
  112. WifiData original_wifi_data = wifi_data;
  113. auto wifi_data_callback =
  114. base::BindLambdaForTesting([&]() { times_called++; });
  115. provider()->AddCallback(&wifi_data_callback);
  116. // Simulate a successful callback to DidWifiScanTask().
  117. CallDidWifiScanTask(true, true, 2);
  118. EXPECT_TRUE(provider()->GetData(&wifi_data));
  119. EXPECT_EQ(2u, wifi_data.access_point_data.size());
  120. EXPECT_EQ(1, times_called);
  121. // Simulate a successful callback to DidWifiScanTask() with the significantly
  122. // different wifi data (>50% difference). This should trigger callbacks with
  123. // the new data.
  124. original_wifi_data = wifi_data;
  125. CallDidWifiScanTask(true, true, 5);
  126. EXPECT_TRUE(provider()->GetData(&wifi_data));
  127. EXPECT_EQ(5u, wifi_data.access_point_data.size());
  128. EXPECT_EQ(2, times_called);
  129. EXPECT_TRUE(original_wifi_data.DiffersSignificantly(wifi_data));
  130. // Simulate a successful callback to DidWifiScanTask() with very similar wifi
  131. // data (<50% difference). This should not trigger callbacks.
  132. original_wifi_data = wifi_data;
  133. CallDidWifiScanTask(true, true, 6);
  134. EXPECT_TRUE(provider()->GetData(&wifi_data));
  135. EXPECT_EQ(6u, wifi_data.access_point_data.size());
  136. EXPECT_EQ(2, times_called);
  137. EXPECT_FALSE(original_wifi_data.DiffersSignificantly(wifi_data));
  138. provider()->RemoveCallback(&wifi_data_callback);
  139. }
  140. } // namespace device