blob: 2104312403e22e2186b9b5b5b5aa2fa955235e1d [file] [log] [blame]
Paul Stewart21f2aae2013-01-17 17:10:08 -08001// Copyright (c) 2013 The Chromium OS 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
5#include "shill/wifi_provider.h"
6
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07007#include <map>
8#include <set>
9#include <string>
10#include <vector>
11
12#include <base/format_macros.h>
Ben Chana0ddf462014-02-06 11:32:42 -080013#include <base/strings/string_number_conversions.h>
14#include <base/strings/string_util.h>
15#include <base/strings/stringprintf.h>
Paul Stewart3c504012013-01-17 17:49:58 -080016#include <chromeos/dbus/service_constants.h>
Paul Stewart21f2aae2013-01-17 17:10:08 -080017#include <gtest/gtest.h>
18
Paul Stewart3c504012013-01-17 17:49:58 -080019#include "shill/ieee80211.h"
20#include "shill/mock_event_dispatcher.h"
Paul Stewart21f2aae2013-01-17 17:10:08 -080021#include "shill/mock_manager.h"
22#include "shill/mock_metrics.h"
Paul Stewart3c504012013-01-17 17:49:58 -080023#include "shill/mock_profile.h"
24#include "shill/mock_store.h"
Wade Guthrie7c2d34e2013-05-09 14:02:20 -070025#include "shill/mock_time.h"
Paul Stewart3c504012013-01-17 17:49:58 -080026#include "shill/mock_wifi_service.h"
Paul Stewart21f2aae2013-01-17 17:10:08 -080027#include "shill/nice_mock_control.h"
Paul Stewart3c504012013-01-17 17:49:58 -080028#include "shill/technology.h"
29#include "shill/wifi_endpoint.h"
30#include "shill/wpa_supplicant.h"
31
Ben Chana0ddf462014-02-06 11:32:42 -080032using base::StringPrintf;
Wade Guthrie7c2d34e2013-05-09 14:02:20 -070033using std::map;
Paul Stewart3c504012013-01-17 17:49:58 -080034using std::set;
35using std::string;
36using std::vector;
37using ::testing::_;
Wade Guthrie60a37062013-04-02 11:39:09 -070038using ::testing::ContainerEq;
Wade Guthrie7c2d34e2013-05-09 14:02:20 -070039using ::testing::Eq;
40using ::testing::Invoke;
Paul Stewart3c504012013-01-17 17:49:58 -080041using ::testing::Mock;
42using ::testing::NiceMock;
43using ::testing::Return;
44using ::testing::SetArgumentPointee;
45using ::testing::StrictMock;
Paul Stewart21f2aae2013-01-17 17:10:08 -080046
47namespace shill {
48
Wade Guthrie7c2d34e2013-05-09 14:02:20 -070049namespace {
50
51const time_t kFirstWeek = 50;
52const char kIllegalDayProfile[] = "IllegalDay";
53const time_t kSecondsPerWeek = 60 * 60 * 24 * 7;
54const time_t kTestDays = 20;
55
56} // namespace
57
Paul Stewart21f2aae2013-01-17 17:10:08 -080058class WiFiProviderTest : public testing::Test {
59 public:
60 WiFiProviderTest()
Thieu Le6c1e3bb2013-02-06 15:20:35 -080061 : metrics_(NULL),
Paul Stewart3c504012013-01-17 17:49:58 -080062 manager_(&control_, &dispatcher_, &metrics_,
63 reinterpret_cast<GLib *>(NULL)),
64 provider_(&control_, &dispatcher_, &metrics_, &manager_),
Thieu Le5133b712013-02-19 14:47:21 -080065 profile_(
66 new NiceMock<MockProfile>(&control_, &metrics_, &manager_, "")),
Wade Guthrie7c2d34e2013-05-09 14:02:20 -070067 storage_entry_index_(0) {
68 provider_.time_ = &time_;
69
70 string freq_string = StringPrintf("%s%d", WiFiProvider::kStorageFrequencies,
71 0);
72 profile_frequency_data_[freq_string].push_back(
73 base::StringPrintf("@%" PRIu64, static_cast<uint64_t>(kFirstWeek)));
74 profile_frequency_data_[freq_string].push_back("5001:1");
75 profile_frequency_data_[freq_string].push_back("5002:2");
76
77 freq_string = StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1);
78 profile_frequency_data_[freq_string].push_back(
79 base::StringPrintf("@%" PRIu64, static_cast<uint64_t>(kFirstWeek) + 1));
80 // Overlap one entry with previous block.
81 profile_frequency_data_[freq_string].push_back("5001:1");
82 profile_frequency_data_[freq_string].push_back("6001:1");
83 profile_frequency_data_[freq_string].push_back("6002:2");
84
85 freq_string = StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2);
86 profile_frequency_data_[freq_string].push_back(
87 base::StringPrintf("@%" PRIu64, static_cast<uint64_t>(kFirstWeek) + 2));
88 profile_frequency_data_[freq_string].push_back("7001:1");
89 profile_frequency_data_[freq_string].push_back("7002:2");
90
91 profile_frequency_data_[kIllegalDayProfile].push_back("7001:1");
92 profile_frequency_data_[kIllegalDayProfile].push_back("7002:2");
93 }
Paul Stewart21f2aae2013-01-17 17:10:08 -080094
95 virtual ~WiFiProviderTest() {}
96
Paul Stewart3c504012013-01-17 17:49:58 -080097 virtual void SetUp() {
98 EXPECT_CALL(*profile_, GetConstStorage()).WillRepeatedly(Return(&storage_));
99 }
100
Wade Guthrie7c2d34e2013-05-09 14:02:20 -0700101 bool GetStringList(const std::string &/*group*/,
102 const std::string &key,
103 std::vector<std::string> *value) {
104 if (!value) {
105 return false;
106 }
107 if (ContainsKey(profile_frequency_data_, key)) {
108 *value = profile_frequency_data_[key];
109 return true;
110 }
111 return false;
112 }
113
114 bool GetIllegalDayStringList(const std::string &/*group*/,
115 const std::string &key,
116 std::vector<std::string> *value) {
117 if (!value) {
118 return false;
119 }
120 if (ContainsKey(profile_frequency_data_, key)) {
121 *value = profile_frequency_data_[kIllegalDayProfile];
122 return true;
123 }
124 return false;
125 }
126
Paul Stewart4ef524d2014-07-23 13:11:29 -0700127 // Used by mock invocations of RegisterService() to maintain the side-effect
128 // of assigning a profile to |service|.
129 void SetProfileForService(const ServiceRefPtr &service) {
130 service->set_profile(profile_);
131 }
132
Paul Stewart21f2aae2013-01-17 17:10:08 -0800133 protected:
Paul Stewart3c504012013-01-17 17:49:58 -0800134 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
135
136 void CreateServicesFromProfile() {
137 provider_.CreateServicesFromProfile(profile_);
138 }
139
Wade Guthrie60a37062013-04-02 11:39:09 -0700140 void LoadAndFixupServiceEntries(bool is_default_profile) {
141 provider_.LoadAndFixupServiceEntries(&storage_, is_default_profile);
Paul Stewart3c504012013-01-17 17:49:58 -0800142 }
143
Wade Guthrie7c2d34e2013-05-09 14:02:20 -0700144 void Save() {
145 provider_.Save(&storage_);
146 }
147
Paul Stewart3c504012013-01-17 17:49:58 -0800148 const vector<WiFiServiceRefPtr> GetServices() {
149 return provider_.services_;
150 }
151
Paul Stewart0427cc12013-03-25 13:50:39 -0700152 const WiFiProvider::EndpointServiceMap &GetServiceByEndpoint() {
153 return provider_.service_by_endpoint_;
154 }
155
Paul Stewart6c351ff2013-02-25 15:13:03 -0800156 bool GetRunning() {
157 return provider_.running_;
158 }
159
Paul Stewart3c504012013-01-17 17:49:58 -0800160 void AddStringParameterToStorage(const string &id,
161 const string &key,
162 const string &value) {
163 EXPECT_CALL(storage_, GetString(id, key, _))
164 .WillRepeatedly(DoAll(SetArgumentPointee<2>(value),
165 Return(true)));
166 }
167
168 string AddServiceToStorage(const char *ssid,
169 const char *mode,
170 const char *security,
171 bool is_hidden,
172 bool provide_hidden) {
173 string id = StringToLowerASCII(base::StringPrintf("entry_%d",
174 storage_entry_index_));
175 EXPECT_CALL(storage_, GetString(id, _, _)).WillRepeatedly(Return(false));
176 if (ssid) {
177 const string ssid_string(ssid);
178 const string hex_ssid(
179 base::HexEncode(ssid_string.data(), ssid_string.size()));
180 AddStringParameterToStorage(id, WiFiService::kStorageSSID, hex_ssid);
181 }
182 if (mode) {
183 AddStringParameterToStorage(id, WiFiService::kStorageMode, mode);
184 }
185 if (security) {
186 AddStringParameterToStorage(id, WiFiService::kStorageSecurity, security);
187 }
188 if (provide_hidden) {
Ben Chanf024ef42013-09-20 14:21:38 -0700189 EXPECT_CALL(storage_, GetBool(id, kWifiHiddenSsid, _))
Paul Stewart3c504012013-01-17 17:49:58 -0800190 .WillRepeatedly(
191 DoAll(SetArgumentPointee<2>(is_hidden), Return(true)));
192 } else {
Ben Chanf024ef42013-09-20 14:21:38 -0700193 EXPECT_CALL(storage_, GetBool(id, kWifiHiddenSsid, _))
Paul Stewart3c504012013-01-17 17:49:58 -0800194 .WillRepeatedly(Return(false));
195 }
196 storage_entry_index_++;
197 return id;
198 }
199
Paul Stewartd2e1c362013-03-03 19:06:07 -0800200 void SetServiceParameters(const char *ssid,
201 const char *mode,
202 const char *security,
203 bool is_hidden,
204 bool provide_hidden,
205 KeyValueStore *args) {
Ben Chanf024ef42013-09-20 14:21:38 -0700206 args->SetString(kTypeProperty, kTypeWifi);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800207 if (ssid) {
Paul Stewart4539d262013-10-10 12:56:31 -0700208 // TODO(pstew): When Chrome switches to using kWifiHexSsid primarily for
209 // GetService and friends, we should switch to doing so here ourselves.
Ben Chanf024ef42013-09-20 14:21:38 -0700210 args->SetString(kSSIDProperty, ssid);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800211 }
212 if (mode) {
Ben Chanf024ef42013-09-20 14:21:38 -0700213 args->SetString(kModeProperty, mode);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800214 }
215 if (security) {
Ben Chanf024ef42013-09-20 14:21:38 -0700216 args->SetString(kSecurityProperty, security);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800217 }
218 if (provide_hidden) {
Ben Chanf024ef42013-09-20 14:21:38 -0700219 args->SetBool(kWifiHiddenSsid, is_hidden);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800220 }
221 }
222
Paul Stewart0e51ad92013-07-26 14:42:55 -0700223 ServiceRefPtr CreateTemporaryService(const char *ssid,
224 const char *mode,
225 const char *security,
226 bool is_hidden,
227 bool provide_hidden,
228 Error *error) {
Paul Stewartd2e1c362013-03-03 19:06:07 -0800229 KeyValueStore args;
230 SetServiceParameters(
231 ssid, mode, security, is_hidden, provide_hidden, &args);
232 return provider_.CreateTemporaryService(args, error);
233 }
234
Paul Stewart3c504012013-01-17 17:49:58 -0800235 WiFiServiceRefPtr GetService(const char *ssid,
236 const char *mode,
237 const char *security,
238 bool is_hidden,
239 bool provide_hidden,
240 Error *error) {
241 KeyValueStore args;
Paul Stewartd2e1c362013-03-03 19:06:07 -0800242 SetServiceParameters(
243 ssid, mode, security, is_hidden, provide_hidden, &args);
Paul Stewart0e51ad92013-07-26 14:42:55 -0700244 return provider_.GetWiFiService(args, error);
245 }
246
247 WiFiServiceRefPtr GetWiFiService(const KeyValueStore &args, Error *error) {
248 return provider_.GetWiFiService(args, error);
Paul Stewart3c504012013-01-17 17:49:58 -0800249 }
250
251 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
252 const string &mode,
253 const string &security) {
254 return provider_.FindService(ssid, mode, security);
255 }
256 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid,
Ben Chan7fab8972014-08-10 17:14:46 -0700257 uint16_t frequency, int16_t signal_dbm) {
Paul Stewart3c504012013-01-17 17:49:58 -0800258 return WiFiEndpoint::MakeOpenEndpoint(
Paul Stewart0654ece2013-03-26 15:21:26 -0700259 NULL, NULL, ssid, bssid, WPASupplicant::kNetworkModeInfrastructure,
Paul Stewart3c504012013-01-17 17:49:58 -0800260 frequency, signal_dbm);
261 }
262 MockWiFiServiceRefPtr AddMockService(const vector<uint8_t> &ssid,
263 const string &mode,
264 const string &security,
265 bool hidden_ssid) {
266 MockWiFiServiceRefPtr service = new MockWiFiService(
267 &control_,
268 &dispatcher_,
269 &metrics_,
270 &manager_,
271 &provider_,
272 ssid,
273 mode,
274 security,
275 hidden_ssid);
276 provider_.services_.push_back(service);
277 return service;
278 }
Paul Stewart0427cc12013-03-25 13:50:39 -0700279 void AddEndpointToService(WiFiServiceRefPtr service,
280 const WiFiEndpointConstRefPtr &endpoint) {
281 provider_.service_by_endpoint_[endpoint] = service;
282 }
Wade Guthrie60a37062013-04-02 11:39:09 -0700283
284 void BuildFreqCountStrings(vector<string> *strings) {
285 // NOTE: These strings match the frequencies in |BuildFreqCountMap|. They
286 // are also provided, here, in sorted order to match the frequency map
287 // (iterators for which will provide them in frequency-sorted order).
288 static const char *kStrings[] = {
Wade Guthrie7c2d34e2013-05-09 14:02:20 -0700289 "@20", "5180:14", "5240:16", "5745:7", "5765:4", "5785:14", "5805:5"
Wade Guthrie60a37062013-04-02 11:39:09 -0700290 };
291 if (!strings) {
292 LOG(ERROR) << "NULL |strings|.";
293 return;
294 }
295 for (size_t i = 0; i < arraysize(kStrings); ++i) {
296 (*strings).push_back(kStrings[i]);
297 }
298 }
299
300 void BuildFreqCountMap(WiFiProvider::ConnectFrequencyMap *frequencies) {
301 // NOTE: These structures match the strings in |BuildFreqCountStrings|.
302 static const struct FreqCount {
Ben Chan7fab8972014-08-10 17:14:46 -0700303 uint16_t freq;
304 int64_t count;
Wade Guthrie60a37062013-04-02 11:39:09 -0700305 } kConnectFreq[] = {
306 {5180, 14},
307 {5240, 16},
308 {5745, 7},
309 {5765, 4},
310 {5785, 14},
311 {5805, 5}
312 };
313 if (!frequencies) {
314 LOG(ERROR) << "NULL |frequencies|.";
315 return;
316 }
317 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kConnectFreq); ++i) {
318 (*frequencies)[kConnectFreq[i].freq] = kConnectFreq[i].count;
319 }
320 }
321
Wade Guthrie7c2d34e2013-05-09 14:02:20 -0700322 void LoadConnectCountByFrequency(time_t today_seconds) {
323 provider_.time_ = &time_;
324 EXPECT_CALL(time_, GetSecondsSinceEpoch()).WillOnce(Return(today_seconds));
325 const string kGroupId =
Ben Chanf024ef42013-09-20 14:21:38 -0700326 StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
Wade Guthrie7c2d34e2013-05-09 14:02:20 -0700327 EXPECT_CALL(storage_,
328 GetString(kGroupId, _, _)).WillRepeatedly(Return(true));
329 set<string> groups;
330 groups.insert(kGroupId);
331 EXPECT_CALL(storage_, GetGroups()).WillOnce(Return(groups));
332 // Provide data for block[0] through block[2] (block[3] is empty).
333 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
334 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0), _)).
335 WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
336 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
337 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1), _)).
338 WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
339 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
340 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2), _)).
341 WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
342 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
343 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 3), _)).
344 WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
345
346 LoadAndFixupServiceEntries(true);
347 }
348
349 map<string, vector<string>> profile_frequency_data_;
Paul Stewart21f2aae2013-01-17 17:10:08 -0800350 NiceMockControl control_;
Paul Stewart3c504012013-01-17 17:49:58 -0800351 MockEventDispatcher dispatcher_;
Paul Stewart21f2aae2013-01-17 17:10:08 -0800352 MockMetrics metrics_;
Wade Guthrie7c2d34e2013-05-09 14:02:20 -0700353 MockTime time_;
Paul Stewart3c504012013-01-17 17:49:58 -0800354 StrictMock<MockManager> manager_;
Paul Stewart21f2aae2013-01-17 17:10:08 -0800355 WiFiProvider provider_;
Paul Stewart3c504012013-01-17 17:49:58 -0800356 scoped_refptr<MockProfile> profile_;
357 StrictMock<MockStore> storage_;
358 int storage_entry_index_;
Paul Stewart21f2aae2013-01-17 17:10:08 -0800359};
360
Paul Stewart3c504012013-01-17 17:49:58 -0800361MATCHER(TypeWiFiPropertyMatch, "") {
362 return
363 arg.bool_properties().empty() &&
364 arg.int_properties().empty() &&
365 arg.uint_properties().empty() &&
366 arg.string_properties().size() == 1 &&
Ben Chanf024ef42013-09-20 14:21:38 -0700367 arg.LookupString(kTypeProperty, "") == kTypeWifi;
Paul Stewart3c504012013-01-17 17:49:58 -0800368}
369
370MATCHER_P(RefPtrMatch, ref, "") {
371 return ref.get() == arg.get();
372}
373
374TEST_F(WiFiProviderTest, Start) {
375 // Doesn't do anything really. Just testing for no crash.
376 EXPECT_TRUE(GetServices().empty());
Paul Stewart6c351ff2013-02-25 15:13:03 -0800377 EXPECT_FALSE(GetRunning());
Paul Stewart3c504012013-01-17 17:49:58 -0800378 provider_.Start();
379 EXPECT_TRUE(GetServices().empty());
Paul Stewart6c351ff2013-02-25 15:13:03 -0800380 EXPECT_TRUE(GetRunning());
Paul Stewart0427cc12013-03-25 13:50:39 -0700381 EXPECT_TRUE(GetServiceByEndpoint().empty());
Paul Stewart9d97b7d2014-03-13 21:47:03 -0700382 EXPECT_FALSE(provider_.disable_vht());
Paul Stewart3c504012013-01-17 17:49:58 -0800383}
384
385TEST_F(WiFiProviderTest, Stop) {
386 MockWiFiServiceRefPtr service0 = AddMockService(vector<uint8_t>(1, '0'),
Ben Chanf024ef42013-09-20 14:21:38 -0700387 kModeManaged,
388 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -0800389 false);
390 MockWiFiServiceRefPtr service1 = AddMockService(vector<uint8_t>(1, '1'),
Ben Chanf024ef42013-09-20 14:21:38 -0700391 kModeManaged,
392 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -0800393 false);
Paul Stewart0427cc12013-03-25 13:50:39 -0700394 WiFiEndpointRefPtr endpoint = MakeEndpoint("", "00:00:00:00:00:00", 0, 0);
395 AddEndpointToService(service0, endpoint);
396
Paul Stewart3c504012013-01-17 17:49:58 -0800397 EXPECT_EQ(2, GetServices().size());
Paul Stewart0427cc12013-03-25 13:50:39 -0700398 EXPECT_FALSE(GetServiceByEndpoint().empty());
Paul Stewart3c504012013-01-17 17:49:58 -0800399 EXPECT_CALL(*service0, ResetWiFi()).Times(1);
400 EXPECT_CALL(*service1, ResetWiFi()).Times(1);
401 EXPECT_CALL(manager_, DeregisterService(RefPtrMatch(service0))).Times(1);
402 EXPECT_CALL(manager_, DeregisterService(RefPtrMatch(service1))).Times(1);
403 provider_.Stop();
404 // Verify now, so it's clear that this happened as a result of the call
405 // above, and not anything in the destructor(s).
406 Mock::VerifyAndClearExpectations(service0);
407 Mock::VerifyAndClearExpectations(service1);
408 Mock::VerifyAndClearExpectations(&manager_);
409 EXPECT_TRUE(GetServices().empty());
Paul Stewart0427cc12013-03-25 13:50:39 -0700410 EXPECT_TRUE(GetServiceByEndpoint().empty());
Paul Stewart3c504012013-01-17 17:49:58 -0800411}
412
413TEST_F(WiFiProviderTest, CreateServicesFromProfileWithNoGroups) {
414 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
415 .WillOnce(Return(set<string>()));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700416 EXPECT_CALL(metrics_, SendToUMA(
417 Metrics::kMetricRememberedWiFiNetworkCount,
418 0,
419 Metrics::kMetricRememberedWiFiNetworkCountMin,
420 Metrics::kMetricRememberedWiFiNetworkCountMax,
421 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800422 CreateServicesFromProfile();
423 EXPECT_TRUE(GetServices().empty());
424}
425
426TEST_F(WiFiProviderTest, CreateServicesFromProfileMissingSSID) {
427 string id;
428 StrictMock<MockStore> storage;
429 set<string> groups;
Ben Chanf024ef42013-09-20 14:21:38 -0700430 groups.insert(
431 AddServiceToStorage(NULL, kModeManaged, kSecurityNone, false, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800432 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
433 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700434 EXPECT_CALL(metrics_, SendToUMA(
435 Metrics::kMetricRememberedWiFiNetworkCount,
436 0,
437 Metrics::kMetricRememberedWiFiNetworkCountMin,
438 Metrics::kMetricRememberedWiFiNetworkCountMax,
439 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800440 CreateServicesFromProfile();
441 EXPECT_TRUE(GetServices().empty());
442}
443
444TEST_F(WiFiProviderTest, CreateServicesFromProfileEmptySSID) {
445 string id;
446 StrictMock<MockStore> storage;
447 set<string> groups;
Ben Chanf024ef42013-09-20 14:21:38 -0700448 groups.insert(
449 AddServiceToStorage("", kModeManaged, kSecurityNone, false, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800450 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
451 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700452 EXPECT_CALL(metrics_, SendToUMA(
453 Metrics::kMetricRememberedWiFiNetworkCount,
454 0,
455 Metrics::kMetricRememberedWiFiNetworkCountMin,
456 Metrics::kMetricRememberedWiFiNetworkCountMax,
457 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800458 CreateServicesFromProfile();
459 EXPECT_TRUE(GetServices().empty());
460}
461
462TEST_F(WiFiProviderTest, CreateServicesFromProfileMissingMode) {
463 string id;
464 StrictMock<MockStore> storage;
465 set<string> groups;
Ben Chanf024ef42013-09-20 14:21:38 -0700466 groups.insert(AddServiceToStorage("foo", NULL, kSecurityNone, false, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800467 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
468 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700469 EXPECT_CALL(metrics_, SendToUMA(
470 Metrics::kMetricRememberedWiFiNetworkCount,
471 0,
472 Metrics::kMetricRememberedWiFiNetworkCountMin,
473 Metrics::kMetricRememberedWiFiNetworkCountMax,
474 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800475 CreateServicesFromProfile();
476 EXPECT_TRUE(GetServices().empty());
477}
478
479TEST_F(WiFiProviderTest, CreateServicesFromProfileEmptyMode) {
480 string id;
481 StrictMock<MockStore> storage;
482 set<string> groups;
Ben Chanf024ef42013-09-20 14:21:38 -0700483 groups.insert(AddServiceToStorage("foo", "", kSecurityNone, false, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800484 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
485 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700486 EXPECT_CALL(metrics_, SendToUMA(
487 Metrics::kMetricRememberedWiFiNetworkCount,
488 0,
489 Metrics::kMetricRememberedWiFiNetworkCountMin,
490 Metrics::kMetricRememberedWiFiNetworkCountMax,
491 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800492 CreateServicesFromProfile();
493 EXPECT_TRUE(GetServices().empty());
494}
495
496TEST_F(WiFiProviderTest, CreateServicesFromProfileMissingSecurity) {
497 string id;
498 StrictMock<MockStore> storage;
499 set<string> groups;
Ben Chanf024ef42013-09-20 14:21:38 -0700500 groups.insert(AddServiceToStorage("foo", kModeManaged, NULL, false, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800501 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
502 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700503 EXPECT_CALL(metrics_, SendToUMA(
504 Metrics::kMetricRememberedWiFiNetworkCount,
505 0,
506 Metrics::kMetricRememberedWiFiNetworkCountMin,
507 Metrics::kMetricRememberedWiFiNetworkCountMax,
508 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800509 CreateServicesFromProfile();
510 EXPECT_TRUE(GetServices().empty());
511}
512
513TEST_F(WiFiProviderTest, CreateServicesFromProfileEmptySecurity) {
514 string id;
515 StrictMock<MockStore> storage;
516 set<string> groups;
Ben Chanf024ef42013-09-20 14:21:38 -0700517 groups.insert(AddServiceToStorage("foo", kModeManaged, "", false, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800518 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
519 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700520 EXPECT_CALL(metrics_, SendToUMA(
521 Metrics::kMetricRememberedWiFiNetworkCount,
522 0,
523 Metrics::kMetricRememberedWiFiNetworkCountMin,
524 Metrics::kMetricRememberedWiFiNetworkCountMax,
525 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800526 CreateServicesFromProfile();
527 EXPECT_TRUE(GetServices().empty());
528}
529
530TEST_F(WiFiProviderTest, CreateServicesFromProfileMissingHidden) {
531 string id;
532 StrictMock<MockStore> storage;
533 set<string> groups;
Ben Chanf024ef42013-09-20 14:21:38 -0700534 groups.insert(
535 AddServiceToStorage("foo", kModeManaged, kSecurityNone, false, false));
Paul Stewart3c504012013-01-17 17:49:58 -0800536 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
537 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700538 EXPECT_CALL(metrics_, SendToUMA(
539 Metrics::kMetricRememberedWiFiNetworkCount,
540 0,
541 Metrics::kMetricRememberedWiFiNetworkCountMin,
542 Metrics::kMetricRememberedWiFiNetworkCountMax,
543 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800544 CreateServicesFromProfile();
545 EXPECT_TRUE(GetServices().empty());
546}
547
548TEST_F(WiFiProviderTest, CreateServicesFromProfileSingle) {
549 string id;
550 StrictMock<MockStore> storage;
551 set<string> groups;
552 string kSSID("foo");
553 groups.insert(AddServiceToStorage(
Ben Chanf024ef42013-09-20 14:21:38 -0700554 kSSID.c_str(), kModeManaged, kSecurityNone, false, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800555 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
556 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700557 EXPECT_CALL(manager_, RegisterService(_))
558 .WillOnce(Invoke(this, &WiFiProviderTest::SetProfileForService));
559 EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillOnce(Return(false));
560 EXPECT_CALL(metrics_, SendToUMA(
561 Metrics::kMetricRememberedWiFiNetworkCount,
562 1,
563 Metrics::kMetricRememberedWiFiNetworkCountMin,
564 Metrics::kMetricRememberedWiFiNetworkCountMax,
565 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets)).Times(2);
Paul Stewart3c504012013-01-17 17:49:58 -0800566 CreateServicesFromProfile();
567 Mock::VerifyAndClearExpectations(&manager_);
568 EXPECT_EQ(1, GetServices().size());
569
570 const WiFiServiceRefPtr service = GetServices().front();
571 const string service_ssid(service->ssid().begin(), service->ssid().end());
572 EXPECT_EQ(kSSID, service_ssid);
Ben Chanf024ef42013-09-20 14:21:38 -0700573 EXPECT_EQ(kModeManaged, service->mode());
574 EXPECT_TRUE(service->IsSecurityMatch(kSecurityNone));
Paul Stewart3c504012013-01-17 17:49:58 -0800575
576 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
Paul Stewart4ef524d2014-07-23 13:11:29 -0700577 EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillOnce(Return(false));
Paul Stewart3c504012013-01-17 17:49:58 -0800578 CreateServicesFromProfile();
579 EXPECT_EQ(1, GetServices().size());
580}
581
582TEST_F(WiFiProviderTest, CreateServicesFromProfileHiddenButConnected) {
583 string id;
584 StrictMock<MockStore> storage;
585 set<string> groups;
586 string kSSID("foo");
587 groups.insert(AddServiceToStorage(
Ben Chanf024ef42013-09-20 14:21:38 -0700588 kSSID.c_str(), kModeManaged, kSecurityNone, true, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800589 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
590 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700591 EXPECT_CALL(manager_, RegisterService(_))
592 .WillOnce(Invoke(this, &WiFiProviderTest::SetProfileForService));
593 EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillOnce(Return(false));
Paul Stewart3c504012013-01-17 17:49:58 -0800594 EXPECT_CALL(manager_, IsTechnologyConnected(Technology::kWifi))
595 .WillOnce(Return(true));
Wade Guthrie68d41092013-04-02 12:56:02 -0700596 EXPECT_CALL(manager_, RequestScan(_, _, _)).Times(0);
Paul Stewart4ef524d2014-07-23 13:11:29 -0700597 EXPECT_CALL(metrics_, SendToUMA(
598 Metrics::kMetricRememberedWiFiNetworkCount,
599 1,
600 Metrics::kMetricRememberedWiFiNetworkCountMin,
601 Metrics::kMetricRememberedWiFiNetworkCountMax,
602 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets)).Times(2);
Paul Stewart3c504012013-01-17 17:49:58 -0800603 CreateServicesFromProfile();
604 Mock::VerifyAndClearExpectations(&manager_);
605
606 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
607 EXPECT_CALL(manager_, IsTechnologyConnected(_)).Times(0);
Paul Stewart4ef524d2014-07-23 13:11:29 -0700608 EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillOnce(Return(false));
Paul Stewart3c504012013-01-17 17:49:58 -0800609 CreateServicesFromProfile();
610}
611
612TEST_F(WiFiProviderTest, CreateServicesFromProfileHiddenNotConnected) {
613 string id;
614 StrictMock<MockStore> storage;
615 set<string> groups;
616 string kSSID("foo");
617 groups.insert(AddServiceToStorage(
Ben Chanf024ef42013-09-20 14:21:38 -0700618 kSSID.c_str(), kModeManaged, kSecurityNone, true, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800619 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
620 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700621 EXPECT_CALL(manager_, RegisterService(_))
622 .WillOnce(Invoke(this, &WiFiProviderTest::SetProfileForService));
623 EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillOnce(Return(false));
Paul Stewart3c504012013-01-17 17:49:58 -0800624 EXPECT_CALL(manager_, IsTechnologyConnected(Technology::kWifi))
625 .WillOnce(Return(false));
Wade Guthrie68d41092013-04-02 12:56:02 -0700626 EXPECT_CALL(manager_, RequestScan(Device::kProgressiveScan,
Ben Chanf024ef42013-09-20 14:21:38 -0700627 kTypeWifi, _)).Times(1);
Paul Stewart4ef524d2014-07-23 13:11:29 -0700628 EXPECT_CALL(metrics_, SendToUMA(
629 Metrics::kMetricRememberedWiFiNetworkCount,
630 1,
631 Metrics::kMetricRememberedWiFiNetworkCountMin,
632 Metrics::kMetricRememberedWiFiNetworkCountMax,
633 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets)).Times(2);
Paul Stewart3c504012013-01-17 17:49:58 -0800634 CreateServicesFromProfile();
635 Mock::VerifyAndClearExpectations(&manager_);
636
637 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
638 EXPECT_CALL(manager_, IsTechnologyConnected(_)).Times(0);
Wade Guthrie68d41092013-04-02 12:56:02 -0700639 EXPECT_CALL(manager_, RequestScan(_, _, _)).Times(0);
Paul Stewart4ef524d2014-07-23 13:11:29 -0700640 EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillOnce(Return(false));
Paul Stewart3c504012013-01-17 17:49:58 -0800641 CreateServicesFromProfile();
642}
643
644TEST_F(WiFiProviderTest, CreateTwoServices) {
645 string id;
646 StrictMock<MockStore> storage;
647 set<string> groups;
Ben Chanf024ef42013-09-20 14:21:38 -0700648 groups.insert(
649 AddServiceToStorage("foo", kModeManaged, kSecurityNone, false, true));
650 groups.insert(
651 AddServiceToStorage("bar", kModeManaged, kSecurityNone, true, true));
Paul Stewart3c504012013-01-17 17:49:58 -0800652 EXPECT_CALL(storage_, GetGroupsWithProperties(TypeWiFiPropertyMatch()))
653 .WillRepeatedly(Return(groups));
Paul Stewart4ef524d2014-07-23 13:11:29 -0700654 EXPECT_CALL(manager_, RegisterService(_))
655 .Times(2)
656 .WillRepeatedly(Invoke(this, &WiFiProviderTest::SetProfileForService));
657 EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
Paul Stewart3c504012013-01-17 17:49:58 -0800658 EXPECT_CALL(manager_, IsTechnologyConnected(Technology::kWifi))
659 .WillOnce(Return(true));
Ben Chanf024ef42013-09-20 14:21:38 -0700660 EXPECT_CALL(manager_, RequestScan(_, kTypeWifi, _)).Times(0);
Paul Stewart4ef524d2014-07-23 13:11:29 -0700661 EXPECT_CALL(metrics_, SendToUMA(
662 Metrics::kMetricRememberedWiFiNetworkCount,
663 2,
664 Metrics::kMetricRememberedWiFiNetworkCountMin,
665 Metrics::kMetricRememberedWiFiNetworkCountMax,
666 Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
Paul Stewart3c504012013-01-17 17:49:58 -0800667 CreateServicesFromProfile();
668 Mock::VerifyAndClearExpectations(&manager_);
669
670 EXPECT_EQ(2, GetServices().size());
671}
672
Paul Stewart4fe4ec22013-02-22 07:47:29 -0800673TEST_F(WiFiProviderTest, GetServiceEmptyMode) {
Paul Stewart3c504012013-01-17 17:49:58 -0800674 Error error;
Ben Chanf024ef42013-09-20 14:21:38 -0700675 EXPECT_FALSE(GetService("foo", "", kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -0800676 false, false, &error).get());
677 EXPECT_EQ(Error::kNotSupported, error.type());
678}
679
Paul Stewart4fe4ec22013-02-22 07:47:29 -0800680TEST_F(WiFiProviderTest, GetServiceNoMode) {
681 Error error;
682 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
Ben Chanf024ef42013-09-20 14:21:38 -0700683 EXPECT_TRUE(GetService("foo", NULL, kSecurityNone,
Paul Stewart4fe4ec22013-02-22 07:47:29 -0800684 false, false, &error).get());
685 EXPECT_TRUE(error.IsSuccess());
686}
687
Paul Stewart3c504012013-01-17 17:49:58 -0800688TEST_F(WiFiProviderTest, GetServiceBadMode) {
689 Error error;
Paul Stewartd2e1c362013-03-03 19:06:07 -0800690 EXPECT_FALSE(GetService("foo", "BogoMesh",
Ben Chanf024ef42013-09-20 14:21:38 -0700691 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -0800692 false, false, &error).get());
693 EXPECT_EQ(Error::kNotSupported, error.type());
694 EXPECT_EQ("service mode is unsupported", error.message());
695}
696
697TEST_F(WiFiProviderTest, GetServiceNoSSID) {
698 Error error;
Ben Chanf024ef42013-09-20 14:21:38 -0700699 EXPECT_FALSE(GetService(NULL, kModeManaged,
700 kSecurityNone, false, false,
Paul Stewart3c504012013-01-17 17:49:58 -0800701 &error).get());
702 EXPECT_EQ(Error::kInvalidArguments, error.type());
703 EXPECT_EQ("must specify SSID", error.message());
704}
705
706TEST_F(WiFiProviderTest, GetServiceEmptySSID) {
707 Error error;
Ben Chanf024ef42013-09-20 14:21:38 -0700708 EXPECT_FALSE(GetService("", kModeManaged,
709 kSecurityNone, false, false,
Paul Stewart3c504012013-01-17 17:49:58 -0800710 &error).get());
711 EXPECT_EQ(Error::kInvalidNetworkName, error.type());
712 EXPECT_EQ("SSID is too short", error.message());
713}
714
715TEST_F(WiFiProviderTest, GetServiceLongSSID) {
716 Error error;
717 string ssid(IEEE_80211::kMaxSSIDLen + 1, '0');
Ben Chanf024ef42013-09-20 14:21:38 -0700718 EXPECT_FALSE(GetService(ssid.c_str(), kModeManaged,
719 kSecurityNone, false, false,
Paul Stewart3c504012013-01-17 17:49:58 -0800720 &error).get());
721 EXPECT_EQ(Error::kInvalidNetworkName, error.type());
722 EXPECT_EQ("SSID is too long", error.message());
723}
724
725TEST_F(WiFiProviderTest, GetServiceJustLongEnoughSSID) {
726 Error error;
727 string ssid(IEEE_80211::kMaxSSIDLen, '0');
728 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
Ben Chanf024ef42013-09-20 14:21:38 -0700729 EXPECT_TRUE(GetService(ssid.c_str(), kModeManaged,
730 kSecurityNone, false, false,
Paul Stewart3c504012013-01-17 17:49:58 -0800731 &error));
732 EXPECT_TRUE(error.IsSuccess());
733}
734
735TEST_F(WiFiProviderTest, GetServiceBadSecurty) {
736 Error error;
Ben Chanf024ef42013-09-20 14:21:38 -0700737 EXPECT_FALSE(GetService("foo", kModeManaged,
Paul Stewart3c504012013-01-17 17:49:58 -0800738 "pig-80211", false, false,
739 &error));
740 EXPECT_EQ(Error::kNotSupported, error.type());
741 EXPECT_EQ("security mode is unsupported", error.message());
742}
743
744TEST_F(WiFiProviderTest, GetServiceMinimal) {
745 Error error;
746 const string kSSID("foo");
747 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
Ben Chanf024ef42013-09-20 14:21:38 -0700748 WiFiServiceRefPtr service = GetService(kSSID.c_str(), kModeManaged,
Paul Stewart3c504012013-01-17 17:49:58 -0800749 NULL, false, false, &error);
750 EXPECT_TRUE(service.get());
751 EXPECT_TRUE(error.IsSuccess());
752 const string service_ssid(service->ssid().begin(), service->ssid().end());
753 EXPECT_EQ(kSSID, service_ssid);
Ben Chanf024ef42013-09-20 14:21:38 -0700754 EXPECT_EQ(kModeManaged, service->mode());
Paul Stewart3c504012013-01-17 17:49:58 -0800755
756 // These two should be set to their default values if not specified.
Ben Chanf024ef42013-09-20 14:21:38 -0700757 EXPECT_TRUE(service->IsSecurityMatch(kSecurityNone));
Paul Stewart3c504012013-01-17 17:49:58 -0800758 EXPECT_TRUE(service->hidden_ssid());
759}
760
761TEST_F(WiFiProviderTest, GetServiceFullySpecified) {
762 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
763 const string kSSID("bar");
764 Error error;
Ben Chanf024ef42013-09-20 14:21:38 -0700765 WiFiServiceRefPtr service0 = GetService(
766 kSSID.c_str(), kModeManaged, kSecurityPsk, false, true, &error);
Paul Stewart3c504012013-01-17 17:49:58 -0800767 Mock::VerifyAndClearExpectations(&manager_);
768 EXPECT_TRUE(error.IsSuccess());
769 const string service_ssid(service0->ssid().begin(), service0->ssid().end());
770 EXPECT_EQ(kSSID, service_ssid);
Ben Chanf024ef42013-09-20 14:21:38 -0700771 EXPECT_EQ(kModeManaged, service0->mode());
772 EXPECT_TRUE(service0->IsSecurityMatch(kSecurityPsk));
Paul Stewart3c504012013-01-17 17:49:58 -0800773 EXPECT_FALSE(service0->hidden_ssid());
774
775 // Getting the same service parameters (even with a different hidden
776 // parameter) should return the same service.
777 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
778 WiFiServiceRefPtr service1 =
Ben Chanf024ef42013-09-20 14:21:38 -0700779 GetService(kSSID.c_str(), kModeManaged, kSecurityPsk, true, true, &error);
Paul Stewart3c504012013-01-17 17:49:58 -0800780 Mock::VerifyAndClearExpectations(&manager_);
781 EXPECT_EQ(service0.get(), service1.get());
782 EXPECT_EQ(1, GetServices().size());
783
784 // Getting the same ssid with different other parameters should return
785 // a different service.
786 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
Ben Chanf024ef42013-09-20 14:21:38 -0700787 WiFiServiceRefPtr service2 = GetService(
788 kSSID.c_str(), kModeManaged, kSecurityNone, true, true, &error);
Paul Stewart3c504012013-01-17 17:49:58 -0800789 Mock::VerifyAndClearExpectations(&manager_);
790 EXPECT_NE(service0.get(), service2.get());
791 EXPECT_EQ(2, GetServices().size());
792}
793
Paul Stewart4539d262013-10-10 12:56:31 -0700794TEST_F(WiFiProviderTest, GetServiceByHexSsid) {
795 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
796 const string kSSID("bar");
797 const string kHexSsid(base::HexEncode(kSSID.c_str(), kSSID.length()));
798
799 KeyValueStore args;
800 args.SetString(kTypeProperty, kTypeWifi);
801 args.SetString(kWifiHexSsid, kHexSsid);
802 args.SetString(kSecurityProperty, kSecurityPsk);
803 args.SetBool(kWifiHiddenSsid, false);
804
805 Error error;
806 WiFiServiceRefPtr service = GetWiFiService(args, &error);
807 Mock::VerifyAndClearExpectations(&manager_);
808 EXPECT_TRUE(error.IsSuccess());
809 const string service_ssid(service->ssid().begin(), service->ssid().end());
810 EXPECT_EQ(kSSID, service_ssid);
811 EXPECT_EQ(kModeManaged, service->mode());
812 EXPECT_TRUE(service->IsSecurityMatch(kSecurityPsk));
813 EXPECT_FALSE(service->hidden_ssid());
814
815
816 // While here, make sure FindSimilarService also supports kWifiHexSsid.
817 Error find_error;
818 ServiceRefPtr find_service = provider_.FindSimilarService(args, &find_error);
819 EXPECT_TRUE(find_error.IsSuccess());
820 EXPECT_EQ(service.get(), find_service.get());
821}
822
Paul Stewartd2e1c362013-03-03 19:06:07 -0800823TEST_F(WiFiProviderTest, FindSimilarService) {
824 // Since CreateTemporyService uses exactly the same validation as
825 // GetService, don't bother with testing invalid parameters.
826 const string kSSID("foo");
827 KeyValueStore args;
828 SetServiceParameters(
Ben Chanf024ef42013-09-20 14:21:38 -0700829 kSSID.c_str(), kModeManaged, kSecurityNone,
Paul Stewartd2e1c362013-03-03 19:06:07 -0800830 true, true, &args);
831 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
832 Error get_service_error;
Paul Stewart0e51ad92013-07-26 14:42:55 -0700833 WiFiServiceRefPtr service = GetWiFiService(args, &get_service_error);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800834 EXPECT_EQ(1, GetServices().size());
835
836 {
837 Error error;
Paul Stewart0e51ad92013-07-26 14:42:55 -0700838 ServiceRefPtr find_service = provider_.FindSimilarService(args, &error);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800839 EXPECT_EQ(service.get(), find_service.get());
840 EXPECT_TRUE(error.IsSuccess());
841 }
842
Ben Chanf024ef42013-09-20 14:21:38 -0700843 args.SetBool(kWifiHiddenSsid, false);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800844
845 {
846 Error error;
Paul Stewart0e51ad92013-07-26 14:42:55 -0700847 ServiceRefPtr find_service = provider_.FindSimilarService(args, &error);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800848 EXPECT_EQ(service.get(), find_service.get());
849 EXPECT_TRUE(error.IsSuccess());
850 }
851
Ben Chanf024ef42013-09-20 14:21:38 -0700852 args.SetString(kSecurityProperty, kSecurityWpa);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800853
854 {
855 Error error;
Paul Stewart0e51ad92013-07-26 14:42:55 -0700856 ServiceRefPtr find_service = provider_.FindSimilarService(args, &error);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800857 EXPECT_EQ(NULL, find_service.get());
858 EXPECT_EQ(Error::kNotFound, error.type());
859 }
860}
861
862TEST_F(WiFiProviderTest, CreateTemporaryService) {
863 // Since CreateTemporyService uses exactly the same validation as
864 // GetService, don't bother with testing invalid parameters.
865 const string kSSID("foo");
866 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
867 Error error;
Ben Chanf024ef42013-09-20 14:21:38 -0700868 WiFiServiceRefPtr service0 = GetService(
869 kSSID.c_str(), kModeManaged, kSecurityNone, true, true, &error);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800870 EXPECT_EQ(1, GetServices().size());
871 Mock::VerifyAndClearExpectations(&manager_);
872
873 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
Paul Stewart0e51ad92013-07-26 14:42:55 -0700874 ServiceRefPtr service1 =
Ben Chanf024ef42013-09-20 14:21:38 -0700875 CreateTemporaryService(kSSID.c_str(), kModeManaged,
876 kSecurityNone, true, true, &error);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800877
878 // Test that a new service was created, but not registered with the
879 // manager or added to the provider's service list.
880 EXPECT_EQ(1, GetServices().size());
881 EXPECT_TRUE(service0 != service1);
882 EXPECT_TRUE(service1->HasOneRef());
883}
884
Paul Stewart3c504012013-01-17 17:49:58 -0800885TEST_F(WiFiProviderTest, FindServiceWPA) {
886 const string kSSID("an_ssid");
887 Error error;
888 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
889 WiFiServiceRefPtr service = GetService(
Ben Chanf024ef42013-09-20 14:21:38 -0700890 kSSID.c_str(), kModeManaged, kSecurityRsn, false, true, &error);
Paul Stewart3c504012013-01-17 17:49:58 -0800891 ASSERT_TRUE(service);
892 const vector<uint8_t> ssid_bytes(kSSID.begin(), kSSID.end());
Ben Chanf024ef42013-09-20 14:21:38 -0700893 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, kModeManaged,
894 kSecurityWpa));
Paul Stewart3c504012013-01-17 17:49:58 -0800895 EXPECT_TRUE(wpa_service);
896 EXPECT_EQ(service.get(), wpa_service.get());
Ben Chanf024ef42013-09-20 14:21:38 -0700897 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, kModeManaged,
898 kSecurityRsn));
Paul Stewart3c504012013-01-17 17:49:58 -0800899 EXPECT_TRUE(rsn_service.get());
900 EXPECT_EQ(service.get(), rsn_service.get());
Ben Chanf024ef42013-09-20 14:21:38 -0700901 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, kModeManaged,
902 kSecurityPsk));
Paul Stewart3c504012013-01-17 17:49:58 -0800903 EXPECT_EQ(service.get(), psk_service.get());
Ben Chanf024ef42013-09-20 14:21:38 -0700904 WiFiServiceRefPtr wep_service(FindService(ssid_bytes, kModeManaged,
905 kSecurityWep));
Paul Stewart3c504012013-01-17 17:49:58 -0800906 EXPECT_TRUE(service.get() != wep_service.get());
907 EXPECT_EQ(NULL, wep_service.get());
908}
909
910TEST_F(WiFiProviderTest, FindServiceForEndpoint) {
911 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
912 Error error;
913 const string kSSID("an_ssid");
914 WiFiServiceRefPtr service = GetService(
Ben Chanf024ef42013-09-20 14:21:38 -0700915 kSSID.c_str(), kModeManaged, kSecurityNone, false, true, &error);
Paul Stewart3c504012013-01-17 17:49:58 -0800916 ASSERT_TRUE(service);
917 WiFiEndpointRefPtr endpoint = MakeEndpoint(kSSID, "00:00:00:00:00:00", 0, 0);
918 WiFiServiceRefPtr endpoint_service =
919 provider_.FindServiceForEndpoint(endpoint);
Paul Stewart0427cc12013-03-25 13:50:39 -0700920 // Just because a matching service exists, we shouldn't necessarily have
921 // it returned. We will test that this function returns the correct
922 // service if the endpoint is added below.
923 EXPECT_EQ(NULL, endpoint_service.get());
Paul Stewart3c504012013-01-17 17:49:58 -0800924}
925
926TEST_F(WiFiProviderTest, OnEndpointAdded) {
Paul Stewart6c351ff2013-02-25 15:13:03 -0800927 provider_.Start();
Paul Stewart3c504012013-01-17 17:49:58 -0800928 const string ssid0("an_ssid");
929 const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
Ben Chanf024ef42013-09-20 14:21:38 -0700930 EXPECT_FALSE(FindService(ssid0_bytes, kModeManaged,
931 kSecurityNone));
Paul Stewart3c504012013-01-17 17:49:58 -0800932 WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
933 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
934 EXPECT_CALL(manager_, UpdateService(_)).Times(1);
935 provider_.OnEndpointAdded(endpoint0);
936 Mock::VerifyAndClearExpectations(&manager_);
937 EXPECT_EQ(1, GetServices().size());
Ben Chanf024ef42013-09-20 14:21:38 -0700938 WiFiServiceRefPtr service0(FindService(ssid0_bytes, kModeManaged,
939 kSecurityNone));
Paul Stewart3c504012013-01-17 17:49:58 -0800940 EXPECT_TRUE(service0);
941 EXPECT_TRUE(service0->HasEndpoints());
Paul Stewart0427cc12013-03-25 13:50:39 -0700942 EXPECT_EQ(1, GetServiceByEndpoint().size());
943 WiFiServiceRefPtr endpoint_service =
944 provider_.FindServiceForEndpoint(endpoint0);
945 EXPECT_EQ(service0.get(), endpoint_service.get());
Paul Stewart3c504012013-01-17 17:49:58 -0800946
947 WiFiEndpointRefPtr endpoint1 = MakeEndpoint(ssid0, "00:00:00:00:00:01", 0, 0);
948 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
949 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
950 provider_.OnEndpointAdded(endpoint1);
951 Mock::VerifyAndClearExpectations(&manager_);
952 EXPECT_EQ(1, GetServices().size());
953
954 const string ssid1("another_ssid");
955 const vector<uint8_t> ssid1_bytes(ssid1.begin(), ssid1.end());
Ben Chanf024ef42013-09-20 14:21:38 -0700956 EXPECT_FALSE(FindService(ssid1_bytes, kModeManaged,
957 kSecurityNone));
Paul Stewart3c504012013-01-17 17:49:58 -0800958 WiFiEndpointRefPtr endpoint2 = MakeEndpoint(ssid1, "00:00:00:00:00:02",
959 0, 0);
960 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
961 EXPECT_CALL(manager_, UpdateService(_)).Times(1);
962 provider_.OnEndpointAdded(endpoint2);
963 Mock::VerifyAndClearExpectations(&manager_);
964 EXPECT_EQ(2, GetServices().size());
965
Ben Chanf024ef42013-09-20 14:21:38 -0700966 WiFiServiceRefPtr service1(FindService(ssid1_bytes, kModeManaged,
967 kSecurityNone));
Paul Stewart3c504012013-01-17 17:49:58 -0800968 EXPECT_TRUE(service1);
969 EXPECT_TRUE(service1->HasEndpoints());
970 EXPECT_TRUE(service1 != service0);
971}
972
Paul Stewart08a54eb2013-03-11 12:07:36 -0700973TEST_F(WiFiProviderTest, OnEndpointAddedWithSecurity) {
974 provider_.Start();
975 const string ssid0("an_ssid");
976 const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
Ben Chanf024ef42013-09-20 14:21:38 -0700977 EXPECT_FALSE(FindService(ssid0_bytes, kModeManaged,
978 kSecurityNone));
Paul Stewart08a54eb2013-03-11 12:07:36 -0700979 WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
Ben Chanf024ef42013-09-20 14:21:38 -0700980 endpoint0->set_security_mode(kSecurityRsn);
Paul Stewart08a54eb2013-03-11 12:07:36 -0700981 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
982 EXPECT_CALL(manager_, UpdateService(_)).Times(1);
983 provider_.OnEndpointAdded(endpoint0);
984 Mock::VerifyAndClearExpectations(&manager_);
985 EXPECT_EQ(1, GetServices().size());
Ben Chanf024ef42013-09-20 14:21:38 -0700986 WiFiServiceRefPtr service0(FindService(ssid0_bytes, kModeManaged,
987 kSecurityWpa));
Paul Stewart08a54eb2013-03-11 12:07:36 -0700988 EXPECT_TRUE(service0);
989 EXPECT_TRUE(service0->HasEndpoints());
Ben Chanf024ef42013-09-20 14:21:38 -0700990 EXPECT_EQ(kSecurityPsk, service0->security_);
Paul Stewart08a54eb2013-03-11 12:07:36 -0700991
992 WiFiEndpointRefPtr endpoint1 = MakeEndpoint(ssid0, "00:00:00:00:00:01", 0, 0);
Ben Chanf024ef42013-09-20 14:21:38 -0700993 endpoint1->set_security_mode(kSecurityWpa);
Paul Stewart08a54eb2013-03-11 12:07:36 -0700994 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
995 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
996 provider_.OnEndpointAdded(endpoint1);
997 Mock::VerifyAndClearExpectations(&manager_);
998 EXPECT_EQ(1, GetServices().size());
999
1000 const string ssid1("another_ssid");
1001 const vector<uint8_t> ssid1_bytes(ssid1.begin(), ssid1.end());
Ben Chanf024ef42013-09-20 14:21:38 -07001002 EXPECT_FALSE(FindService(ssid1_bytes, kModeManaged,
1003 kSecurityNone));
Paul Stewart08a54eb2013-03-11 12:07:36 -07001004 WiFiEndpointRefPtr endpoint2 = MakeEndpoint(ssid1, "00:00:00:00:00:02", 0, 0);
Ben Chanf024ef42013-09-20 14:21:38 -07001005 endpoint2->set_security_mode(kSecurityWpa);
Paul Stewart08a54eb2013-03-11 12:07:36 -07001006 EXPECT_CALL(manager_, RegisterService(_)).Times(1);
1007 EXPECT_CALL(manager_, UpdateService(_)).Times(1);
1008 provider_.OnEndpointAdded(endpoint2);
1009 Mock::VerifyAndClearExpectations(&manager_);
1010 EXPECT_EQ(2, GetServices().size());
1011
Ben Chanf024ef42013-09-20 14:21:38 -07001012 WiFiServiceRefPtr service1(FindService(ssid1_bytes, kModeManaged,
1013 kSecurityRsn));
Paul Stewart08a54eb2013-03-11 12:07:36 -07001014 EXPECT_TRUE(service1);
1015 EXPECT_TRUE(service1->HasEndpoints());
Ben Chanf024ef42013-09-20 14:21:38 -07001016 EXPECT_EQ(kSecurityPsk, service1->security_);
Paul Stewart08a54eb2013-03-11 12:07:36 -07001017 EXPECT_TRUE(service1 != service0);
1018}
1019
Paul Stewart6c351ff2013-02-25 15:13:03 -08001020TEST_F(WiFiProviderTest, OnEndpointAddedWhileStopped) {
1021 // If we don't call provider_.Start(), OnEndpointAdded should have no effect.
1022 const string ssid("an_ssid");
1023 WiFiEndpointRefPtr endpoint = MakeEndpoint(ssid, "00:00:00:00:00:00", 0, 0);
1024 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
1025 EXPECT_CALL(manager_, UpdateService(_)).Times(0);
1026 provider_.OnEndpointAdded(endpoint);
1027 EXPECT_TRUE(GetServices().empty());
1028}
1029
Paul Stewart3c504012013-01-17 17:49:58 -08001030TEST_F(WiFiProviderTest, OnEndpointAddedToMockService) {
1031 // The previous test allowed the provider to create its own "real"
1032 // WiFiServices, which hides some of what we can test with mock
1033 // services. Re-do an add-endpoint operation by seeding the provider
1034 // with a mock service.
Paul Stewart6c351ff2013-02-25 15:13:03 -08001035 provider_.Start();
Paul Stewart3c504012013-01-17 17:49:58 -08001036 const string ssid0("an_ssid");
1037 const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
1038 MockWiFiServiceRefPtr service0 = AddMockService(ssid0_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001039 kModeManaged,
1040 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001041 false);
1042 const string ssid1("another_ssid");
1043 const vector<uint8_t> ssid1_bytes(ssid1.begin(), ssid1.end());
1044 MockWiFiServiceRefPtr service1 = AddMockService(ssid1_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001045 kModeManaged,
1046 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001047 false);
1048 EXPECT_EQ(service0.get(), FindService(ssid0_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001049 kModeManaged,
1050 kSecurityNone).get());
Paul Stewart3c504012013-01-17 17:49:58 -08001051 WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
1052 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
1053 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
1054 EXPECT_CALL(*service0, AddEndpoint(RefPtrMatch(endpoint0))).Times(1);
1055 EXPECT_CALL(*service1, AddEndpoint(_)).Times(0);
1056 provider_.OnEndpointAdded(endpoint0);
1057 Mock::VerifyAndClearExpectations(&manager_);
1058 Mock::VerifyAndClearExpectations(service0);
1059 Mock::VerifyAndClearExpectations(service1);
1060
1061 WiFiEndpointRefPtr endpoint1 = MakeEndpoint(ssid0, "00:00:00:00:00:01", 0, 0);
1062 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
1063 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
1064 EXPECT_CALL(*service0, AddEndpoint(RefPtrMatch(endpoint1))).Times(1);
1065 EXPECT_CALL(*service1, AddEndpoint(_)).Times(0);
1066 provider_.OnEndpointAdded(endpoint1);
1067 Mock::VerifyAndClearExpectations(&manager_);
1068 Mock::VerifyAndClearExpectations(service0);
1069 Mock::VerifyAndClearExpectations(service1);
1070
1071 WiFiEndpointRefPtr endpoint2 = MakeEndpoint(ssid1, "00:00:00:00:00:02", 0, 0);
1072 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
1073 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service1))).Times(1);
1074 EXPECT_CALL(*service0, AddEndpoint(_)).Times(0);
1075 EXPECT_CALL(*service1, AddEndpoint(RefPtrMatch(endpoint2))).Times(1);
1076 provider_.OnEndpointAdded(endpoint2);
1077}
1078
1079TEST_F(WiFiProviderTest, OnEndpointRemoved) {
Paul Stewart6c351ff2013-02-25 15:13:03 -08001080 provider_.Start();
Paul Stewart3c504012013-01-17 17:49:58 -08001081 const string ssid0("an_ssid");
1082 const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
1083 MockWiFiServiceRefPtr service0 = AddMockService(ssid0_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001084 kModeManaged,
1085 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001086 false);
1087 const string ssid1("another_ssid");
1088 const vector<uint8_t> ssid1_bytes(ssid1.begin(), ssid1.end());
1089 MockWiFiServiceRefPtr service1 = AddMockService(ssid1_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001090 kModeManaged,
1091 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001092 false);
1093 EXPECT_EQ(2, GetServices().size());
1094
1095 // Remove the last endpoint of a non-remembered service.
1096 WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
Paul Stewart0427cc12013-03-25 13:50:39 -07001097 AddEndpointToService(service0, endpoint0);
1098 EXPECT_EQ(1, GetServiceByEndpoint().size());
1099
Paul Stewart3c504012013-01-17 17:49:58 -08001100 EXPECT_CALL(*service0, RemoveEndpoint(RefPtrMatch(endpoint0))).Times(1);
1101 EXPECT_CALL(*service1, RemoveEndpoint(_)).Times(0);
1102 EXPECT_CALL(*service0, HasEndpoints()).WillOnce(Return(false));
1103 EXPECT_CALL(*service0, IsRemembered()).WillOnce(Return(false));
1104 EXPECT_CALL(*service0, ResetWiFi()).Times(1);
1105 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(0);
1106 EXPECT_CALL(manager_, DeregisterService(RefPtrMatch(service0))).Times(1);
1107 provider_.OnEndpointRemoved(endpoint0);
1108 // Verify now, so it's clear that this happened as a result of the call
1109 // above, and not anything in the destructor(s).
1110 Mock::VerifyAndClearExpectations(&manager_);
1111 Mock::VerifyAndClearExpectations(service0);
1112 Mock::VerifyAndClearExpectations(service1);
1113 EXPECT_EQ(1, GetServices().size());
1114 EXPECT_EQ(service1.get(), GetServices().front().get());
Paul Stewart0427cc12013-03-25 13:50:39 -07001115 EXPECT_TRUE(GetServiceByEndpoint().empty());
Paul Stewart3c504012013-01-17 17:49:58 -08001116}
1117
1118TEST_F(WiFiProviderTest, OnEndpointRemovedButHasEndpoints) {
Paul Stewart6c351ff2013-02-25 15:13:03 -08001119 provider_.Start();
Paul Stewart3c504012013-01-17 17:49:58 -08001120 const string ssid0("an_ssid");
1121 const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
1122 MockWiFiServiceRefPtr service0 = AddMockService(ssid0_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001123 kModeManaged,
1124 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001125 false);
1126 EXPECT_EQ(1, GetServices().size());
1127
1128 // Remove an endpoint of a non-remembered service.
1129 WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
Paul Stewart0427cc12013-03-25 13:50:39 -07001130 AddEndpointToService(service0, endpoint0);
1131 EXPECT_EQ(1, GetServiceByEndpoint().size());
1132
Paul Stewart3c504012013-01-17 17:49:58 -08001133 EXPECT_CALL(*service0, RemoveEndpoint(RefPtrMatch(endpoint0))).Times(1);
1134 EXPECT_CALL(*service0, HasEndpoints()).WillOnce(Return(true));
1135 EXPECT_CALL(*service0, IsRemembered()).WillRepeatedly(Return(false));
1136 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
1137 EXPECT_CALL(*service0, ResetWiFi()).Times(0);
1138 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
1139 provider_.OnEndpointRemoved(endpoint0);
1140 // Verify now, so it's clear that this happened as a result of the call
1141 // above, and not anything in the destructor(s).
1142 Mock::VerifyAndClearExpectations(&manager_);
1143 Mock::VerifyAndClearExpectations(service0);
1144 EXPECT_EQ(1, GetServices().size());
Paul Stewart0427cc12013-03-25 13:50:39 -07001145 EXPECT_TRUE(GetServiceByEndpoint().empty());
Paul Stewart3c504012013-01-17 17:49:58 -08001146}
1147
1148TEST_F(WiFiProviderTest, OnEndpointRemovedButIsRemembered) {
Paul Stewart6c351ff2013-02-25 15:13:03 -08001149 provider_.Start();
Paul Stewart3c504012013-01-17 17:49:58 -08001150 const string ssid0("an_ssid");
1151 const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
1152 MockWiFiServiceRefPtr service0 = AddMockService(ssid0_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001153 kModeManaged,
1154 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001155 false);
1156 EXPECT_EQ(1, GetServices().size());
1157
1158 // Remove the last endpoint of a remembered service.
1159 WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
Paul Stewart0427cc12013-03-25 13:50:39 -07001160 AddEndpointToService(service0, endpoint0);
1161 EXPECT_EQ(1, GetServiceByEndpoint().size());
1162
Paul Stewart3c504012013-01-17 17:49:58 -08001163 EXPECT_CALL(*service0, RemoveEndpoint(RefPtrMatch(endpoint0))).Times(1);
1164 EXPECT_CALL(*service0, HasEndpoints()).WillRepeatedly(Return(false));
1165 EXPECT_CALL(*service0, IsRemembered()).WillOnce(Return(true));
1166 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
1167 EXPECT_CALL(*service0, ResetWiFi()).Times(0);
1168 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
1169 provider_.OnEndpointRemoved(endpoint0);
1170 // Verify now, so it's clear that this happened as a result of the call
1171 // above, and not anything in the destructor(s).
1172 Mock::VerifyAndClearExpectations(&manager_);
1173 Mock::VerifyAndClearExpectations(service0);
1174 EXPECT_EQ(1, GetServices().size());
Paul Stewart0427cc12013-03-25 13:50:39 -07001175 EXPECT_TRUE(GetServiceByEndpoint().empty());
Paul Stewart3c504012013-01-17 17:49:58 -08001176}
1177
Paul Stewart6c351ff2013-02-25 15:13:03 -08001178TEST_F(WiFiProviderTest, OnEndpointRemovedWhileStopped) {
1179 // If we don't call provider_.Start(), OnEndpointRemoved should not
1180 // cause a crash even if a service matching the endpoint does not exist.
1181 const string ssid("an_ssid");
1182 WiFiEndpointRefPtr endpoint = MakeEndpoint(ssid, "00:00:00:00:00:00", 0, 0);
1183 provider_.OnEndpointRemoved(endpoint);
1184}
1185
Paul Stewart58baeec2013-08-22 10:08:15 -07001186TEST_F(WiFiProviderTest, OnEndpointUpdated) {
1187 provider_.Start();
1188
1189 // Create an endpoint and associate it with a mock service.
1190 const string ssid("an_ssid");
1191 WiFiEndpointRefPtr endpoint = MakeEndpoint(ssid, "00:00:00:00:00:00", 0, 0);
1192
1193 const vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1194 MockWiFiServiceRefPtr open_service = AddMockService(ssid_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001195 kModeManaged,
1196 kSecurityNone,
Paul Stewart58baeec2013-08-22 10:08:15 -07001197 false);
1198 EXPECT_CALL(*open_service, AddEndpoint(RefPtrMatch(endpoint)));
1199 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(open_service)));
1200 provider_.OnEndpointAdded(endpoint);
1201 Mock::VerifyAndClearExpectations(open_service);
1202
1203 // WiFiProvider is running and endpoint matches this service.
1204 EXPECT_CALL(*open_service, NotifyEndpointUpdated(RefPtrMatch(endpoint)));
1205 EXPECT_CALL(*open_service, AddEndpoint(_)).Times(0);
1206 provider_.OnEndpointUpdated(endpoint);
1207 Mock::VerifyAndClearExpectations(open_service);
1208
1209 // If the endpoint is changed in a way that causes it to match a different
1210 // service, the provider should transfer the endpoint from one service to
1211 // the other.
1212 MockWiFiServiceRefPtr rsn_service = AddMockService(ssid_bytes,
Ben Chanf024ef42013-09-20 14:21:38 -07001213 kModeManaged,
1214 kSecurityRsn,
Paul Stewart58baeec2013-08-22 10:08:15 -07001215 false);
1216 EXPECT_CALL(*open_service, RemoveEndpoint(RefPtrMatch(endpoint)));
1217 // We are playing out a scenario where the open service is not removed
1218 // since it still claims to have more endpoints remaining.
1219 EXPECT_CALL(*open_service, HasEndpoints()).WillOnce(Return(true));
1220 EXPECT_CALL(*rsn_service, AddEndpoint(RefPtrMatch(endpoint)));
1221 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(open_service)));
1222 EXPECT_CALL(manager_, UpdateService(RefPtrMatch(rsn_service)));
Ben Chanf024ef42013-09-20 14:21:38 -07001223 endpoint->set_security_mode(kSecurityRsn);
Paul Stewart58baeec2013-08-22 10:08:15 -07001224 provider_.OnEndpointUpdated(endpoint);
1225}
1226
1227TEST_F(WiFiProviderTest, OnEndpointUpdatedWhileStopped) {
1228 // If we don't call provider_.Start(), OnEndpointUpdated should not
1229 // cause a crash even if a service matching the endpoint does not exist.
1230 const string ssid("an_ssid");
1231 WiFiEndpointRefPtr endpoint = MakeEndpoint(ssid, "00:00:00:00:00:00", 0, 0);
1232 provider_.OnEndpointUpdated(endpoint);
1233}
1234
Paul Stewart3c504012013-01-17 17:49:58 -08001235TEST_F(WiFiProviderTest, OnServiceUnloaded) {
1236 // This function should never unregister services itself -- the Manager
1237 // will automatically deregister the service if OnServiceUnloaded()
1238 // returns true (via WiFiService::Unload()).
1239 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
1240
1241 MockWiFiServiceRefPtr service = AddMockService(vector<uint8_t>(1, '0'),
Ben Chanf024ef42013-09-20 14:21:38 -07001242 kModeManaged,
1243 kSecurityNone,
Paul Stewart6c351ff2013-02-25 15:13:03 -08001244 false);
Paul Stewart3c504012013-01-17 17:49:58 -08001245 EXPECT_EQ(1, GetServices().size());
1246 EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(true));
1247 EXPECT_CALL(*service, ResetWiFi()).Times(0);
1248 EXPECT_FALSE(provider_.OnServiceUnloaded(service));
1249 EXPECT_EQ(1, GetServices().size());
1250 Mock::VerifyAndClearExpectations(service);
1251
1252 EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
1253 EXPECT_CALL(*service, ResetWiFi()).Times(1);
1254 EXPECT_TRUE(provider_.OnServiceUnloaded(service));
1255 // Verify now, so it's clear that this happened as a result of the call
1256 // above, and not anything in the destructor(s).
1257 Mock::VerifyAndClearExpectations(service);
1258 EXPECT_TRUE(GetServices().empty());
1259
1260 Mock::VerifyAndClearExpectations(&manager_);
1261}
1262
Wade Guthrie60a37062013-04-02 11:39:09 -07001263TEST_F(WiFiProviderTest, LoadAndFixupServiceEntries) {
1264 // We test LoadAndFixupServiceEntries indirectly since it calls a static
1265 // method in WiFiService.
Paul Stewart3c504012013-01-17 17:49:58 -08001266 EXPECT_CALL(metrics_, SendEnumToUMA(
1267 "Network.Shill.Wifi.ServiceFixupEntries",
1268 Metrics::kMetricServiceFixupDefaultProfile,
1269 Metrics::kMetricServiceFixupMax)).Times(1);
1270 EXPECT_CALL(storage_, Flush()).Times(1);
1271 const string kGroupId =
Ben Chanf024ef42013-09-20 14:21:38 -07001272 StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
Paul Stewart3c504012013-01-17 17:49:58 -08001273 EXPECT_CALL(storage_,
1274 GetString(kGroupId, _, _)).WillRepeatedly(Return(false));
1275 EXPECT_CALL(storage_,
1276 SetString(kGroupId, _, _)).WillRepeatedly(Return(true));
1277 set<string> groups;
1278 groups.insert(kGroupId);
1279 EXPECT_CALL(storage_, GetGroups()).WillRepeatedly(Return(groups));
Wade Guthrie60a37062013-04-02 11:39:09 -07001280 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001281 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0), _)).
1282 WillOnce(Return(true));
1283 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1284 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1), _)).
1285 WillOnce(Return(true));
1286 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1287 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2), _)).
1288 WillOnce(Return(true));
1289 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1290 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 3), _)).
1291 WillOnce(Return(false));
Wade Guthrie60a37062013-04-02 11:39:09 -07001292 LoadAndFixupServiceEntries(true);
Paul Stewart3c504012013-01-17 17:49:58 -08001293 Mock::VerifyAndClearExpectations(&metrics_);
1294
1295 EXPECT_CALL(metrics_, SendEnumToUMA(
1296 "Network.Shill.Wifi.ServiceFixupEntries",
1297 Metrics::kMetricServiceFixupUserProfile,
1298 Metrics::kMetricServiceFixupMax)).Times(1);
1299 EXPECT_CALL(storage_, Flush()).Times(1);
Wade Guthrie60a37062013-04-02 11:39:09 -07001300 EXPECT_CALL(storage_, GetStringList(_, _, _)).Times(0);
1301 LoadAndFixupServiceEntries(false);
Paul Stewart3c504012013-01-17 17:49:58 -08001302}
1303
Wade Guthrie60a37062013-04-02 11:39:09 -07001304TEST_F(WiFiProviderTest, LoadAndFixupServiceEntriesNothingToDo) {
Paul Stewart3c504012013-01-17 17:49:58 -08001305 EXPECT_CALL(metrics_, SendEnumToUMA(_, _, _)).Times(0);
1306 EXPECT_CALL(storage_, Flush()).Times(0);
1307 const string kGroupId =
Ben Chanf024ef42013-09-20 14:21:38 -07001308 StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
Paul Stewart3c504012013-01-17 17:49:58 -08001309 EXPECT_CALL(storage_,
1310 GetString(kGroupId, _, _)).WillRepeatedly(Return(true));
1311 set<string> groups;
1312 groups.insert(kGroupId);
1313 EXPECT_CALL(storage_, GetGroups()).WillOnce(Return(groups));
Wade Guthrie60a37062013-04-02 11:39:09 -07001314 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001315 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0), _)).
1316 WillOnce(Return(true));
1317 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1318 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1), _)).
1319 WillOnce(Return(true));
1320 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1321 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2), _)).
1322 WillOnce(Return(true));
1323 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1324 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 3), _)).
1325 WillOnce(Return(false));
Wade Guthrie60a37062013-04-02 11:39:09 -07001326 LoadAndFixupServiceEntries(true);
Paul Stewart3c504012013-01-17 17:49:58 -08001327}
1328
1329TEST_F(WiFiProviderTest, GetHiddenSSIDList) {
1330 EXPECT_TRUE(provider_.GetHiddenSSIDList().empty());
1331 const vector<uint8_t> ssid0(1, '0');
Ben Chanf024ef42013-09-20 14:21:38 -07001332 AddMockService(ssid0, kModeManaged, kSecurityNone, false);
Paul Stewart3c504012013-01-17 17:49:58 -08001333 EXPECT_TRUE(provider_.GetHiddenSSIDList().empty());
1334
1335 const vector<uint8_t> ssid1(1, '1');
1336 MockWiFiServiceRefPtr service1 = AddMockService(ssid1,
Ben Chanf024ef42013-09-20 14:21:38 -07001337 kModeManaged,
1338 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001339 true);
1340 EXPECT_CALL(*service1, IsRemembered()).WillRepeatedly(Return(false));
1341 EXPECT_TRUE(provider_.GetHiddenSSIDList().empty());
1342
1343 const vector<uint8_t> ssid2(1, '2');
1344 MockWiFiServiceRefPtr service2 = AddMockService(ssid2,
Ben Chanf024ef42013-09-20 14:21:38 -07001345 kModeManaged,
1346 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001347 true);
1348 EXPECT_CALL(*service2, IsRemembered()).WillRepeatedly(Return(true));
1349 ByteArrays ssid_list = provider_.GetHiddenSSIDList();
1350
1351 EXPECT_EQ(1, ssid_list.size());
1352 EXPECT_TRUE(ssid_list[0] == ssid2);
1353
1354 const vector<uint8_t> ssid3(1, '3');
1355 MockWiFiServiceRefPtr service3 = AddMockService(ssid3,
Ben Chanf024ef42013-09-20 14:21:38 -07001356 kModeManaged,
1357 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001358 false);
1359 EXPECT_CALL(*service2, IsRemembered()).WillRepeatedly(Return(true));
1360
1361 ssid_list = provider_.GetHiddenSSIDList();
1362 EXPECT_EQ(1, ssid_list.size());
1363 EXPECT_TRUE(ssid_list[0] == ssid2);
1364
1365 const vector<uint8_t> ssid4(1, '4');
1366 MockWiFiServiceRefPtr service4 = AddMockService(ssid4,
Ben Chanf024ef42013-09-20 14:21:38 -07001367 kModeManaged,
1368 kSecurityNone,
Paul Stewart3c504012013-01-17 17:49:58 -08001369 true);
1370 EXPECT_CALL(*service4, IsRemembered()).WillRepeatedly(Return(true));
1371
1372 ssid_list = provider_.GetHiddenSSIDList();
1373 EXPECT_EQ(2, ssid_list.size());
1374 EXPECT_TRUE(ssid_list[0] == ssid2);
1375 EXPECT_TRUE(ssid_list[1] == ssid4);
Paul Stewart21f2aae2013-01-17 17:10:08 -08001376}
1377
Wade Guthrie60a37062013-04-02 11:39:09 -07001378TEST_F(WiFiProviderTest, StringListToFrequencyMap) {
1379 vector<string> strings;
1380 BuildFreqCountStrings(&strings);
1381 WiFiProvider::ConnectFrequencyMap frequencies_result;
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001382 time_t days = WiFiProvider::StringListToFrequencyMap(strings,
1383 &frequencies_result);
Wade Guthrie60a37062013-04-02 11:39:09 -07001384
1385 WiFiProvider::ConnectFrequencyMap frequencies_expect;
1386 BuildFreqCountMap(&frequencies_expect);
1387 EXPECT_THAT(frequencies_result, ContainerEq(frequencies_expect));
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001388 EXPECT_EQ(days, kTestDays);
1389}
1390
1391TEST_F(WiFiProviderTest, StringListToFrequencyMapEmpty) {
1392 vector<string> strings;
1393 strings.push_back("@50");
1394 WiFiProvider::ConnectFrequencyMap frequencies_result;
1395 time_t days = WiFiProvider::StringListToFrequencyMap(strings,
1396 &frequencies_result);
1397 EXPECT_TRUE(frequencies_result.empty());
1398 EXPECT_EQ(days, 50);
Wade Guthrie60a37062013-04-02 11:39:09 -07001399}
1400
1401TEST_F(WiFiProviderTest, FrequencyMapToStringList) {
1402 WiFiProvider::ConnectFrequencyMap frequencies;
1403 BuildFreqCountMap(&frequencies);
1404 vector<string> strings_result;
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001405 WiFiProvider::FrequencyMapToStringList(kTestDays, frequencies,
1406 &strings_result);
Wade Guthrie60a37062013-04-02 11:39:09 -07001407
1408 vector<string> strings_expect;
1409 BuildFreqCountStrings(&strings_expect);
1410 EXPECT_THAT(strings_result, ContainerEq(strings_expect));
1411}
1412
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001413TEST_F(WiFiProviderTest, FrequencyMapToStringListEmpty) {
1414 WiFiProvider::ConnectFrequencyMap frequencies;
1415 vector<string> strings_result;
1416 WiFiProvider::FrequencyMapToStringList(kTestDays, frequencies,
1417 &strings_result);
1418 EXPECT_EQ(1, strings_result.size());
1419 EXPECT_EQ(*strings_result.begin(), "@20");
1420}
1421
1422TEST_F(WiFiProviderTest, FrequencyMapBasicAging) {
1423 const time_t kThisWeek = kFirstWeek +
1424 WiFiProvider::kWeeksToKeepFrequencyCounts - 1;
1425 LoadConnectCountByFrequency(kThisWeek * kSecondsPerWeek);
1426
1427 // Make sure we have data for all 3 blocks.
1428 WiFiProvider::ConnectFrequencyMap expected;
1429 expected[5001] = 2;
1430 expected[5002] = 2;
1431 expected[6001] = 1;
1432 expected[6002] = 2;
1433 expected[7001] = 1;
1434 expected[7002] = 2;
1435 EXPECT_THAT(provider_.connect_count_by_frequency_, ContainerEq(expected));
1436
1437 // And, then, make sure we output the expected blocks of data.
1438 EXPECT_CALL(storage_, SetStringList(WiFiProvider::kStorageId, _,
1439 Eq(profile_frequency_data_[
1440 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0)])));
1441 EXPECT_CALL(storage_, SetStringList(WiFiProvider::kStorageId, _,
1442 Eq(profile_frequency_data_[
1443 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1)])));
1444 EXPECT_CALL(storage_, SetStringList(WiFiProvider::kStorageId, _,
1445 Eq(profile_frequency_data_[
1446 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2)])));
1447 vector<string> frequencies;
1448 frequencies.push_back(base::StringPrintf("@%" PRIu64,
1449 static_cast<uint64_t>(kThisWeek)));
1450 EXPECT_CALL(storage_, SetStringList(WiFiProvider::kStorageId, _,
1451 Eq(frequencies))).Times(0);
1452 Save();
1453}
1454
1455TEST_F(WiFiProviderTest, FrequencyMapAgingIllegalDay) {
1456 provider_.time_ = &time_;
1457 const time_t kThisWeek = kFirstWeek +
1458 WiFiProvider::kWeeksToKeepFrequencyCounts - 1;
1459 const time_t kThisWeekSeconds = kThisWeek * kSecondsPerWeek;
1460 EXPECT_CALL(time_, GetSecondsSinceEpoch()).WillOnce(Return(kThisWeekSeconds));
1461 const string kGroupId =
Ben Chanf024ef42013-09-20 14:21:38 -07001462 StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001463 EXPECT_CALL(storage_,
1464 GetString(kGroupId, _, _)).WillRepeatedly(Return(true));
1465 set<string> groups;
1466 groups.insert(kGroupId);
1467 // Instead of block[1], return a block without the date.
1468 EXPECT_CALL(storage_, GetGroups()).WillOnce(Return(groups));
1469 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1470 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0), _)).
1471 WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
1472 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1473 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1), _)).
1474 WillOnce(Invoke(this, &WiFiProviderTest::GetIllegalDayStringList));
1475 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1476 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2), _)).
1477 WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
1478 EXPECT_CALL(storage_, GetStringList(WiFiProvider::kStorageId,
1479 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 3), _)).
1480 WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
1481
1482 LoadAndFixupServiceEntries(true);
1483
1484 // Verify that the received information only includes block[0] and block[2].
1485 WiFiProvider::ConnectFrequencyMap expected;
1486 expected[5001] = 1;
1487 expected[5002] = 2;
1488 expected[7001] = 1;
1489 expected[7002] = 2;
1490 EXPECT_THAT(provider_.connect_count_by_frequency_, ContainerEq(expected));
1491
1492 // And, then, make sure we output the expected blocks of data.
1493 EXPECT_CALL(storage_, SetStringList(WiFiProvider::kStorageId, _,
1494 Eq(profile_frequency_data_[
1495 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0)])));
1496 EXPECT_CALL(storage_, SetStringList(WiFiProvider::kStorageId, _,
1497 Eq(profile_frequency_data_[
1498 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1)]))).
1499 Times(0);
1500 EXPECT_CALL(storage_, SetStringList(WiFiProvider::kStorageId, _,
1501 Eq(profile_frequency_data_[
1502 StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2)])));
1503 vector<string> frequencies;
1504 frequencies.push_back(base::StringPrintf("@%" PRIu64,
1505 static_cast<uint64_t>(kThisWeek)));
1506 EXPECT_CALL(storage_, SetStringList(WiFiProvider::kStorageId, _,
1507 Eq(frequencies))).Times(0);
1508 Save();
1509}
1510
1511TEST_F(WiFiProviderTest, IncrementConnectCount) {
1512 const time_t kThisWeek = kFirstWeek +
1513 WiFiProvider::kWeeksToKeepFrequencyCounts - 1;
1514 const time_t kThisWeekSeconds = kThisWeek * kSecondsPerWeek;
1515 LoadConnectCountByFrequency(kThisWeekSeconds);
1516
1517 EXPECT_CALL(time_, GetSecondsSinceEpoch()).WillOnce(Return(kThisWeekSeconds));
1518 EXPECT_CALL(manager_, UpdateWiFiProvider());
mukesh agrawala5dda0e2013-08-16 11:53:10 -07001519 EXPECT_CALL(metrics_, SendToUMA(Metrics::kMetricFrequenciesConnectedEver,
1520 _, _, _, _));
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001521 time_t newest_week_at_start =
1522 provider_.connect_count_by_frequency_dated_.crbegin()->first;
1523 provider_.IncrementConnectCount(6002);
1524
1525 // Make sure we have data for all 3 blocks.
1526 WiFiProvider::ConnectFrequencyMap expected;
1527 expected[5001] = 2;
1528 expected[5002] = 2;
1529 expected[6001] = 1;
1530 expected[6002] = 3;
1531 expected[7001] = 1;
1532 expected[7002] = 2;
1533 EXPECT_THAT(provider_.connect_count_by_frequency_, ContainerEq(expected));
1534 // Make sure we didn't delete the oldest block.
1535 EXPECT_TRUE(ContainsKey(provider_.connect_count_by_frequency_dated_,
1536 kFirstWeek));
1537 // Make sure we didn't create a new block.
1538 time_t newest_week_at_end =
1539 provider_.connect_count_by_frequency_dated_.crbegin()->first;
1540 EXPECT_EQ(newest_week_at_start, newest_week_at_end);
1541}
1542
1543TEST_F(WiFiProviderTest, IncrementConnectCountCreateNew) {
1544 time_t this_week = kFirstWeek + WiFiProvider::kWeeksToKeepFrequencyCounts - 1;
1545 LoadConnectCountByFrequency(this_week * kSecondsPerWeek);
1546
1547 this_week += 2;
1548 EXPECT_CALL(time_, GetSecondsSinceEpoch()).
1549 WillOnce(Return(this_week * kSecondsPerWeek));
1550 EXPECT_CALL(manager_, UpdateWiFiProvider());
mukesh agrawala5dda0e2013-08-16 11:53:10 -07001551 EXPECT_CALL(metrics_, SendToUMA(Metrics::kMetricFrequenciesConnectedEver,
1552 _, _, _, _));
Wade Guthrie7c2d34e2013-05-09 14:02:20 -07001553 time_t newest_week_at_start =
1554 provider_.connect_count_by_frequency_dated_.crbegin()->first;
1555 provider_.IncrementConnectCount(6001);
1556
1557 // Make sure we have data for newest 2 blocks (only).
1558 WiFiProvider::ConnectFrequencyMap expected;
1559 expected[5001] = 1;
1560 expected[6001] = 2;
1561 expected[6002] = 2;
1562 expected[7001] = 1;
1563 expected[7002] = 2;
1564 EXPECT_THAT(provider_.connect_count_by_frequency_, ContainerEq(expected));
1565 // Verify that the oldest block is gone.
1566 EXPECT_FALSE(ContainsKey(provider_.connect_count_by_frequency_dated_,
1567 kFirstWeek));
1568 // Make sure we created a new block and that it is for the current week.
1569 time_t newest_week_at_end =
1570 provider_.connect_count_by_frequency_dated_.crbegin()->first;
1571 EXPECT_NE(newest_week_at_start, newest_week_at_end);
1572 EXPECT_TRUE(ContainsKey(provider_.connect_count_by_frequency_dated_,
1573 this_week));
1574}
1575
Peter Qiu574996a2014-04-04 10:55:47 -07001576TEST_F(WiFiProviderTest, ReportAutoConnectableServices) {
1577 MockWiFiServiceRefPtr service0 = AddMockService(vector<uint8_t>(1, '0'),
1578 kModeManaged,
1579 kSecurityNone,
1580 false);
1581 MockWiFiServiceRefPtr service1 = AddMockService(vector<uint8_t>(1, '1'),
1582 kModeManaged,
1583 kSecurityNone,
1584 false);
1585 service0->EnableAndRetainAutoConnect();
1586 service0->SetConnectable(true);
1587 service1->EnableAndRetainAutoConnect();
1588 service1->SetConnectable(true);
1589
1590 EXPECT_CALL(*service0, IsAutoConnectable(_))
1591 .WillOnce(Return(true))
1592 .WillOnce(Return(false));
1593 EXPECT_CALL(*service1, IsAutoConnectable(_))
1594 .WillRepeatedly(Return(false));
1595
1596 // With 1 auto connectable service.
1597 EXPECT_CALL(metrics_, NotifyWifiAutoConnectableServices(1));
1598 provider_.ReportAutoConnectableServices();
1599
1600 // With no auto connectable service.
1601 EXPECT_CALL(metrics_, NotifyWifiAutoConnectableServices(_)).Times(0);
1602 provider_.ReportAutoConnectableServices();
1603}
1604
Paul Stewart21f2aae2013-01-17 17:10:08 -08001605} // namespace shill