1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2013 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
1621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
17d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_provider.h"
1821f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
197c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie#include <map>
207c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie#include <set>
217c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie#include <string>
227c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie#include <vector>
237c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
247c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie#include <base/format_macros.h>
25a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h>
26a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
27a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
28289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__)
29289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h>
30289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else
313c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include <chromeos/dbus/service_constants.h>
32289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif  // __ANDROID__
3321f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart#include <gtest/gtest.h>
3421f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
353c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_event_dispatcher.h"
3621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart#include "shill/mock_manager.h"
3721f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart#include "shill/mock_metrics.h"
383c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_profile.h"
393c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_store.h"
4002e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/ieee80211.h"
418d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_time.h"
4221f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart#include "shill/nice_mock_control.h"
43da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/wpa_supplicant.h"
443c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/technology.h"
45d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_service.h"
46d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_endpoint.h"
473c5040174273386868cc8dea8044d22c465885d8Paul Stewart
48a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf;
497c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrieusing std::map;
503c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing std::set;
513c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing std::string;
523c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing std::vector;
533c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::_;
54facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawalusing ::testing::AnyNumber;
5560a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrieusing ::testing::ContainerEq;
567c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrieusing ::testing::Eq;
577c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrieusing ::testing::Invoke;
583c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::Mock;
593c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::NiceMock;
603c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::Return;
613c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::SetArgumentPointee;
62facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawalusing ::testing::StartsWith;
633c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::StrictMock;
6421f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
6521f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartnamespace shill {
6621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
677c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrienamespace {
687c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
697c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrieconst time_t kFirstWeek = 50;
707c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrieconst char kIllegalDayProfile[] = "IllegalDay";
717c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrieconst time_t kSecondsPerWeek = 60 * 60 * 24 * 7;
727c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrieconst time_t kTestDays = 20;
737c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
747c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie}  // namespace
757c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
7621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass WiFiProviderTest : public testing::Test {
7721f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart public:
7821f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart  WiFiProviderTest()
790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      : metrics_(nullptr),
80bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal        manager_(&control_, &dispatcher_, &metrics_),
813c5040174273386868cc8dea8044d22c465885d8Paul Stewart        provider_(&control_, &dispatcher_, &metrics_, &manager_),
829842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        default_profile_(
839842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            new NiceMock<MockProfile>(
849842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                &control_, &metrics_, &manager_, "default")),
859842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        user_profile_(
869842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            new NiceMock<MockProfile>(&control_, &metrics_, &manager_, "user")),
877c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie        storage_entry_index_(0) {
887c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    provider_.time_ = &time_;
897c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
907c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    string freq_string = StringPrintf("%s%d", WiFiProvider::kStorageFrequencies,
917c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                                      0);
927c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back(
937c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie        base::StringPrintf("@%" PRIu64, static_cast<uint64_t>(kFirstWeek)));
947c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back("5001:1");
957c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back("5002:2");
967c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
977c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    freq_string = StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1);
987c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back(
997c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie        base::StringPrintf("@%" PRIu64, static_cast<uint64_t>(kFirstWeek) + 1));
1007c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    // Overlap one entry with previous block.
1017c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back("5001:1");
1027c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back("6001:1");
1037c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back("6002:2");
1047c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
1057c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    freq_string = StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2);
1067c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back(
1077c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie        base::StringPrintf("@%" PRIu64, static_cast<uint64_t>(kFirstWeek) + 2));
1087c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back("7001:1");
1097c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[freq_string].push_back("7002:2");
1107c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
1117c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[kIllegalDayProfile].push_back("7001:1");
1127c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    profile_frequency_data_[kIllegalDayProfile].push_back("7002:2");
1137c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  }
11421f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
11521f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart  virtual ~WiFiProviderTest() {}
11621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
1173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  virtual void SetUp() {
1189842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(*default_profile_, IsDefault()).WillRepeatedly(Return(true));
1199842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(*default_profile_, GetStorage())
1209842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        .WillRepeatedly(Return(&default_profile_storage_));
1219842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(*default_profile_, GetConstStorage())
1229842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        .WillRepeatedly(Return(&default_profile_storage_));
1239842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal
1249842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(*user_profile_, IsDefault()).WillRepeatedly(Return(false));
1259842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(*user_profile_, GetStorage())
1269842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        .WillRepeatedly(Return(&user_profile_storage_));
1279842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(*user_profile_, GetConstStorage())
1289842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        .WillRepeatedly(Return(&user_profile_storage_));
129facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal
130facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal    // Default expectations for UMA metrics. Individual test cases
131facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal    // will override these, by adding later expectations.
132facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal    EXPECT_CALL(metrics_, SendToUMA(
133facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCount,
134facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        _,
135facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountMin,
136facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountMax,
137facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountNumBuckets))
138facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        .Times(AnyNumber());
139facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal    EXPECT_CALL(metrics_, SendToUMA(
140facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        StartsWith("Network.Shill.WiFi.RememberedPrivateNetworkCount."),
141facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        _,
142facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountMin,
143facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountMax,
144facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountNumBuckets))
145facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        .Times(AnyNumber());
146facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal    EXPECT_CALL(metrics_, SendToUMA(
147facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        StartsWith("Network.Shill.WiFi.RememberedSharedNetworkCount."),
148facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        _,
149facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountMin,
150facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountMax,
151facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        Metrics::kMetricRememberedWiFiNetworkCountNumBuckets))
152facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal        .Times(AnyNumber());
1533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
1543c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1552b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool GetStringList(const std::string& /*group*/,
1562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                     const std::string& key,
1572b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                     std::vector<std::string>* value) {
1587c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    if (!value) {
1597c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      return false;
1607c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    }
1617c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    if (ContainsKey(profile_frequency_data_, key)) {
1627c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      *value = profile_frequency_data_[key];
1637c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      return true;
1647c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    }
1657c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    return false;
1667c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  }
1677c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
1682b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool GetIllegalDayStringList(const std::string& /*group*/,
1692b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                               const std::string& key,
1702b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                               std::vector<std::string>* value) {
1717c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    if (!value) {
1727c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      return false;
1737c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    }
1747c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    if (ContainsKey(profile_frequency_data_, key)) {
1757c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      *value = profile_frequency_data_[kIllegalDayProfile];
1767c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      return true;
1777c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    }
1787c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    return false;
1797c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  }
1807c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
1814ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  // Used by mock invocations of RegisterService() to maintain the side-effect
1824ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  // of assigning a profile to |service|.
1832b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void BindServiceToDefaultProfile(const ServiceRefPtr& service) {
1849842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    service->set_profile(default_profile_);
1859842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  }
1862b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void BindServiceToUserProfile(const ServiceRefPtr& service) {
1879842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    service->set_profile(user_profile_);
1884ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  }
1894ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart
19021f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart protected:
1913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
1923c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1932b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void CreateServicesFromProfile(Profile* profile) {
1949842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    provider_.CreateServicesFromProfile(profile);
1953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
1963c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1972b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void LoadAndFixupServiceEntries(Profile* profile) {
1989842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    provider_.LoadAndFixupServiceEntries(profile);
1993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
2003c5040174273386868cc8dea8044d22c465885d8Paul Stewart
2017c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  void Save() {
2029842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    provider_.Save(&default_profile_storage_);
2037c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  }
2047c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
2053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<WiFiServiceRefPtr> GetServices() {
2063c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return provider_.services_;
2073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
2083c5040174273386868cc8dea8044d22c465885d8Paul Stewart
2092b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFiProvider::EndpointServiceMap& GetServiceByEndpoint() {
2100427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    return provider_.service_by_endpoint_;
2110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
2120427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
2136c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  bool GetRunning() {
2146c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart    return provider_.running_;
2156c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  }
2166c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart
2172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void AddStringParameterToStorage(MockStore* storage,
2182b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                   const string& id,
2192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                   const string& key,
2202b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                   const string& value) {
2219842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(*storage, GetString(id, key, _))
2223c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(value),
2233c5040174273386868cc8dea8044d22c465885d8Paul Stewart                              Return(true)));
2243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
2253c5040174273386868cc8dea8044d22c465885d8Paul Stewart
2269842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  // Adds service to profile's storage. But does not set profile on the Service.
2272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  string AddServiceToProfileStorage(Profile* profile,
2282b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                    const char* ssid,
2292b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                    const char* mode,
2302b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                    const char* security,
2319842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                                    bool is_hidden,
2329842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                                    bool provide_hidden) {
2333a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko    string id = base::StringPrintf("entry_%d", storage_entry_index_);
234fa1eb722d0742d89c26b9c5c81d02ef2a138cbf2Alex Vakulenko    auto profile_storage = static_cast<MockStore*>(profile->GetStorage());
2359842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(*profile_storage, GetString(id, _, _))
2369842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        .WillRepeatedly(Return(false));
23718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    AddStringParameterToStorage(
23818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu        profile_storage, id, WiFiService::kStorageType, kTypeWifi);
2393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (ssid) {
2403c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string ssid_string(ssid);
2413c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string hex_ssid(
2423c5040174273386868cc8dea8044d22c465885d8Paul Stewart          base::HexEncode(ssid_string.data(), ssid_string.size()));
2439842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddStringParameterToStorage(
2449842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal          profile_storage, id, WiFiService::kStorageSSID, hex_ssid);
2453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
2463c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (mode) {
2479842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddStringParameterToStorage(
2489842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal          profile_storage, id, WiFiService::kStorageMode, mode);
2493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
2503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (security) {
2519842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddStringParameterToStorage(
2529842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal          profile_storage, id, WiFiService::kStorageSecurity, security);
2533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
2543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (provide_hidden) {
2559842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      EXPECT_CALL(*profile_storage, GetBool(id, kWifiHiddenSsid, _))
2563c5040174273386868cc8dea8044d22c465885d8Paul Stewart          .WillRepeatedly(
2573c5040174273386868cc8dea8044d22c465885d8Paul Stewart              DoAll(SetArgumentPointee<2>(is_hidden), Return(true)));
2583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    } else {
2599842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      EXPECT_CALL(*profile_storage, GetBool(id, kWifiHiddenSsid, _))
2603c5040174273386868cc8dea8044d22c465885d8Paul Stewart          .WillRepeatedly(Return(false));
2613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
2623c5040174273386868cc8dea8044d22c465885d8Paul Stewart    storage_entry_index_++;
2633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return id;
2643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
2653c5040174273386868cc8dea8044d22c465885d8Paul Stewart
2662b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetServiceParameters(const char* ssid,
2672b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                            const char* mode,
2682b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                            const char* security_class,
269d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart                            bool is_hidden,
270d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart                            bool provide_hidden,
2712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                            KeyValueStore* args) {
272f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    args->SetString(kTypeProperty, kTypeWifi);
2733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (ssid) {
2744539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart      // TODO(pstew): When Chrome switches to using kWifiHexSsid primarily for
2754539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart      // GetService and friends, we should switch to doing so here ourselves.
276f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      args->SetString(kSSIDProperty, ssid);
2773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
2783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (mode) {
279f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      args->SetString(kModeProperty, mode);
2803c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
2817116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal    if (security_class) {
2827116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal      args->SetString(kSecurityClassProperty, security_class);
2833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
2843c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (provide_hidden) {
285f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      args->SetBool(kWifiHiddenSsid, is_hidden);
2863c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
287d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  }
288d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
2892b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  ServiceRefPtr CreateTemporaryService(const char* ssid,
2902b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                       const char* mode,
2912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                       const char* security,
2920e51ad959ff2d81472e053b2809991082f976362Paul Stewart                                       bool is_hidden,
2930e51ad959ff2d81472e053b2809991082f976362Paul Stewart                                       bool provide_hidden,
2942b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                       Error* error) {
295d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    KeyValueStore args;
296d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    SetServiceParameters(
297d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart        ssid, mode, security, is_hidden, provide_hidden, &args);
298d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    return provider_.CreateTemporaryService(args, error);
299d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  }
300d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
3012b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiServiceRefPtr GetService(const char* ssid,
3022b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                               const char* mode,
3032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                               const char* security_class,
304d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart                               bool is_hidden,
305d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart                               bool provide_hidden,
3062b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                               Error* error) {
307d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    KeyValueStore args;
308d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    SetServiceParameters(
3097116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal        ssid, mode, security_class, is_hidden, provide_hidden, &args);
3100e51ad959ff2d81472e053b2809991082f976362Paul Stewart    return provider_.GetWiFiService(args, error);
3110e51ad959ff2d81472e053b2809991082f976362Paul Stewart  }
3120e51ad959ff2d81472e053b2809991082f976362Paul Stewart
3132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiServiceRefPtr GetWiFiService(const KeyValueStore& args, Error* error) {
3140e51ad959ff2d81472e053b2809991082f976362Paul Stewart    return provider_.GetWiFiService(args, error);
3153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3163c5040174273386868cc8dea8044d22c465885d8Paul Stewart
3172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiServiceRefPtr FindService(const vector<uint8_t>& ssid,
3182b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                const string& mode,
3192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                const string& security) {
3203c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return provider_.FindService(ssid, mode, security);
3213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3222b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string& ssid, const string& bssid,
3237fab89734d88724a288e96a9996b15548c5294c7Ben Chan                                  uint16_t frequency, int16_t signal_dbm) {
3243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
3250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        nullptr, nullptr, ssid, bssid,
3260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        WPASupplicant::kNetworkModeInfrastructure, frequency, signal_dbm);
3273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3282b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockWiFiServiceRefPtr AddMockService(const vector<uint8_t>& ssid,
3292b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                       const string& mode,
3302b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                       const string& security,
3313c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                       bool hidden_ssid) {
3323c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service = new MockWiFiService(
3333c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_,
3343c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &dispatcher_,
3353c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
3363c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
3373c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &provider_,
3383c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
3393c5040174273386868cc8dea8044d22c465885d8Paul Stewart        mode,
3403c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
3413c5040174273386868cc8dea8044d22c465885d8Paul Stewart        hidden_ssid);
3423c5040174273386868cc8dea8044d22c465885d8Paul Stewart    provider_.services_.push_back(service);
3433c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
3443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3450427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  void AddEndpointToService(WiFiServiceRefPtr service,
3462b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                            const WiFiEndpointConstRefPtr& endpoint) {
3470951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    provider_.service_by_endpoint_[endpoint.get()] = service;
3480427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
34960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
3502b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void BuildFreqCountStrings(vector<string>* strings) {
35160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    // NOTE: These strings match the frequencies in |BuildFreqCountMap|.  They
35260a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    // are also provided, here, in sorted order to match the frequency map
35360a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    // (iterators for which will provide them in frequency-sorted order).
3542b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    static const char* kStrings[] = {
3557c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      "@20", "5180:14", "5240:16", "5745:7", "5765:4", "5785:14", "5805:5"
35660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    };
35760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    if (!strings) {
35860a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      LOG(ERROR) << "NULL |strings|.";
35960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      return;
36060a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    }
36160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    for (size_t i = 0; i < arraysize(kStrings); ++i) {
36260a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      (*strings).push_back(kStrings[i]);
36360a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    }
36460a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  }
36560a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
3662b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void BuildFreqCountMap(WiFiProvider::ConnectFrequencyMap* frequencies) {
36760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    // NOTE: These structures match the strings in |BuildFreqCountStrings|.
36860a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    static const struct FreqCount {
3697fab89734d88724a288e96a9996b15548c5294c7Ben Chan      uint16_t freq;
3707fab89734d88724a288e96a9996b15548c5294c7Ben Chan      int64_t count;
37160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    } kConnectFreq[] = {
37260a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      {5180, 14},
37360a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      {5240, 16},
37460a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      {5745, 7},
37560a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      {5765, 4},
37660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      {5785, 14},
37760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      {5805, 5}
37860a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    };
37960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    if (!frequencies) {
38060a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      LOG(ERROR) << "NULL |frequencies|.";
38160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      return;
38260a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    }
3830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    for (size_t i = 0; i < arraysize(kConnectFreq); ++i) {
38460a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie      (*frequencies)[kConnectFreq[i].freq] = kConnectFreq[i].count;
38560a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie    }
38660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  }
38760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
3887c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  void LoadConnectCountByFrequency(time_t today_seconds) {
3897c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    provider_.time_ = &time_;
3907c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    EXPECT_CALL(time_, GetSecondsSinceEpoch()).WillOnce(Return(today_seconds));
3917c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    const string kGroupId =
392f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
3939842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(default_profile_storage_,
3947c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                GetString(kGroupId, _, _)).WillRepeatedly(Return(true));
3957c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    set<string> groups;
3967c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    groups.insert(kGroupId);
3979842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(default_profile_storage_, GetGroups()).WillOnce(Return(groups));
3987c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie    // Provide data for block[0] through block[2] (block[3] is empty).
3999842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(
4009842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        default_profile_storage_,
4019842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        GetStringList(
4029842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            WiFiProvider::kStorageId,
4039842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0), _)).
4047c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie        WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
4059842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(
4069842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        default_profile_storage_,
4079842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        GetStringList(
4089842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            WiFiProvider::kStorageId,
4099842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1), _)).
4107c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie        WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
4119842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(
4129842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        default_profile_storage_,
4139842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        GetStringList(
4149842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            WiFiProvider::kStorageId,
4159842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2), _)).
4167c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie        WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
4179842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal    EXPECT_CALL(
4189842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        default_profile_storage_,
4199842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal        GetStringList(
4209842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            WiFiProvider::kStorageId,
4219842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal            StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 3), _)).
4227c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie        WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
4237c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
4240951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    LoadAndFixupServiceEntries(default_profile_.get());
4257c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  }
4267c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
4277c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  map<string, vector<string>> profile_frequency_data_;
42821f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart  NiceMockControl control_;
4293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockEventDispatcher dispatcher_;
43021f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart  MockMetrics metrics_;
4317c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  MockTime time_;
4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StrictMock<MockManager> manager_;
43321f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart  WiFiProvider provider_;
4349842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  scoped_refptr<MockProfile> default_profile_;
4359842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  scoped_refptr<MockProfile> user_profile_;
4369842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  StrictMock<MockStore> default_profile_storage_;
4379842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  StrictMock<MockStore> user_profile_storage_;
4389842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  int storage_entry_index_;  // shared across profiles
43921f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart};
44021f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
4413c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER(TypeWiFiPropertyMatch, "") {
442d31fb5812df751f0bfac41e2c0489e1a8a18cfd7Peter Qiu  return arg.properties().size() == 1 &&
443f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      arg.LookupString(kTypeProperty, "") == kTypeWifi;
4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4463c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(RefPtrMatch, ref, "") {
4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ref.get() == arg.get();
4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4503c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, Start) {
4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Doesn't do anything really.  Just testing for no crash.
4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
4536c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  EXPECT_FALSE(GetRunning());
4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.Start();
4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
4566c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  EXPECT_TRUE(GetRunning());
4570427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_TRUE(GetServiceByEndpoint().empty());
4589d97b7deda3ae604d718873207a951f62d418b34Paul Stewart  EXPECT_FALSE(provider_.disable_vht());
4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4613c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, Stop) {
4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 = AddMockService(vector<uint8_t>(1, '0'),
463f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
464f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1 = AddMockService(vector<uint8_t>(1, '1'),
467f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
468f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
4700427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint = MakeEndpoint("", "00:00:00:00:00:00", 0, 0);
4710427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  AddEndpointToService(service0, endpoint);
4720427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(2, GetServices().size());
4740427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_FALSE(GetServiceByEndpoint().empty());
4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, ResetWiFi()).Times(1);
4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, ResetWiFi()).Times(1);
4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, DeregisterService(RefPtrMatch(service0))).Times(1);
4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, DeregisterService(RefPtrMatch(service1))).Times(1);
4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.Stop();
4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Verify now, so it's clear that this happened as a result of the call
4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // above, and not anything in the destructor(s).
4820951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
4830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service1.get());
4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
4860427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_TRUE(GetServiceByEndpoint().empty());
4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4893c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileWithNoGroups) {
4909842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
4919842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(set<string>()));
4934ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
4944ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
4954ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      0,
4964ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
4974ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
4984ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
4990951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5033c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileMissingSSID) {
5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
505f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  groups.insert(
5069842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
5070951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), nullptr, kModeManaged, kSecurityNone, false,
5080951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          true));
5099842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
5109842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
5124ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
5134ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
5144ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      0,
5154ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
5164ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
5174ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
5180951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
5203c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5223c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileEmptySSID) {
5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
524f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  groups.insert(
5259842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
5260951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "", kModeManaged, kSecurityNone, false,
5270951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          true));
5289842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
5299842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
5314ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
5324ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
5334ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      0,
5344ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
5354ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
5364ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
5370951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
5383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
5393c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5403c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5413c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileMissingMode) {
5423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
5439842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  groups.insert(
5449842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
5450951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "foo", nullptr, kSecurityNone, false, true));
5469842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
5479842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
5483c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
5494ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
5504ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
5514ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      0,
5524ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
5534ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
5544ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
5550951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
5563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5593c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileEmptyMode) {
5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
5619842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  groups.insert(
5629842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
5630951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "foo", "", kSecurityNone, false, true));
5649842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
5659842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
5674ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
5684ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
5694ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      0,
5704ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
5714ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
5724ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
5730951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5773c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileMissingSecurity) {
5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
5799842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  groups.insert(
5809842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
5810951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "foo", kModeManaged, nullptr, false, true));
5829842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
5839842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
5843c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
5854ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
5864ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
5874ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      0,
5884ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
5894ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
5904ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
5910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
5923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
5933c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5943c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5953c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileEmptySecurity) {
5963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
5979842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  groups.insert(
5989842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
5990951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "foo", kModeManaged, "", false, true));
6009842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
6019842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
6023c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
6034ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
6044ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
6054ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      0,
6064ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
6074ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
6084ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
6090951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
6103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
6113c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
6123c5040174273386868cc8dea8044d22c465885d8Paul Stewart
6133c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileMissingHidden) {
6143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
615f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  groups.insert(
6169842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
6170951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "foo", kModeManaged, kSecurityNone, false,
6180951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          false));
6199842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
6209842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
6213c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
6224ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
6234ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
6244ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      0,
6254ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
6264ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
6274ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
6280951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
6293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
6303c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
6313c5040174273386868cc8dea8044d22c465885d8Paul Stewart
6323c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileSingle) {
6333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
6343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  string kSSID("foo");
6359842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  groups.insert(
6369842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
6370951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(),
6389842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal          kSSID.c_str(), kModeManaged, kSecurityNone, false, true));
6399842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
6409842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
6413c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
6424ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(manager_, RegisterService(_))
6439842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      .WillOnce(Invoke(this, &WiFiProviderTest::BindServiceToDefaultProfile));
6449842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
6454ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
6464ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
6474ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      1,
6484ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
6494ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
6504ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets)).Times(2);
6510951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
6523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
6533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
6543c5040174273386868cc8dea8044d22c465885d8Paul Stewart
6553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const WiFiServiceRefPtr service = GetServices().front();
6563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string service_ssid(service->ssid().begin(), service->ssid().end());
6573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(kSSID, service_ssid);
658f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_EQ(kModeManaged, service->mode());
659f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_TRUE(service->IsSecurityMatch(kSecurityNone));
6603c5040174273386868cc8dea8044d22c465885d8Paul Stewart
6613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
6629842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
6630951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
6643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
6653c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
6663c5040174273386868cc8dea8044d22c465885d8Paul Stewart
6673c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileHiddenButConnected) {
6683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
6693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  string kSSID("foo");
6709842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  groups.insert(
6719842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
6720951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(),
6739842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal          kSSID.c_str(), kModeManaged, kSecurityNone, true, true));
6749842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
6759842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
6763c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
6774ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(manager_, RegisterService(_))
6789842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      .WillOnce(Invoke(this, &WiFiProviderTest::BindServiceToDefaultProfile));
6799842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
6803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, IsTechnologyConnected(Technology::kWifi))
6813c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(true));
68268d4109ff0176f7e5a9b67b916478d638aac577aWade Guthrie  EXPECT_CALL(manager_, RequestScan(_, _, _)).Times(0);
6834ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
6844ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
6854ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      1,
6864ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
6874ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
6884ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets)).Times(2);
6890951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
6903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
6913c5040174273386868cc8dea8044d22c465885d8Paul Stewart
6923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
6933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, IsTechnologyConnected(_)).Times(0);
6949842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
6950951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
6963c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
6973c5040174273386868cc8dea8044d22c465885d8Paul Stewart
6983c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateServicesFromProfileHiddenNotConnected) {
6993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
7003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  string kSSID("foo");
7010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  groups.insert(AddServiceToProfileStorage(default_profile_.get(),
702f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kSSID.c_str(), kModeManaged, kSecurityNone, true, true));
7039842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
7049842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
7053c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
7064ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(manager_, RegisterService(_))
7079842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      .WillOnce(Invoke(this, &WiFiProviderTest::BindServiceToDefaultProfile));
7089842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
7093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, IsTechnologyConnected(Technology::kWifi))
7103c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(false));
71168d4109ff0176f7e5a9b67b916478d638aac577aWade Guthrie  EXPECT_CALL(manager_, RequestScan(Device::kProgressiveScan,
712f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                    kTypeWifi, _)).Times(1);
7134ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
7144ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
7154ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      1,
7164ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
7174ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
7184ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets)).Times(2);
7190951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
7203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
7213c5040174273386868cc8dea8044d22c465885d8Paul Stewart
7223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
7233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, IsTechnologyConnected(_)).Times(0);
72468d4109ff0176f7e5a9b67b916478d638aac577aWade Guthrie  EXPECT_CALL(manager_, RequestScan(_, _, _)).Times(0);
7259842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
7260951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
7273c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
7283c5040174273386868cc8dea8044d22c465885d8Paul Stewart
72918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter QiuTEST_F(WiFiProviderTest, CreateTemporaryServiceFromProfileNonWiFi) {
73018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  const string kEntryName("name");
73118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  auto profile_storage =
732fa1eb722d0742d89c26b9c5c81d02ef2a138cbf2Alex Vakulenko      static_cast<MockStore*>(default_profile_->GetStorage());
73318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_CALL(*profile_storage,
73418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              GetString(kEntryName, WiFiService::kStorageType, _))
73518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      .WillOnce(Return(false));
73618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Error error;
73718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_EQ(nullptr,
73818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu            provider_.CreateTemporaryServiceFromProfile(
73918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu                default_profile_, kEntryName, &error));
74018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_FALSE(error.IsSuccess());
74118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_THAT(error.message(),
74218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              StartsWith("Unspecified or invalid network type"));
74318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu}
74418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
74518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter QiuTEST_F(WiFiProviderTest, CreateTemporaryServiceFromProfileMissingSSID) {
74618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  string entry_name = AddServiceToProfileStorage(
74718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu          default_profile_.get(), nullptr, kModeManaged, kSecurityNone, false,
74818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu          true);
74918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Error error;
75018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_EQ(nullptr,
75118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu            provider_.CreateTemporaryServiceFromProfile(
75218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu                default_profile_, entry_name, &error));
75318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_FALSE(error.IsSuccess());
75418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_THAT(error.message(), StartsWith("Unspecified or invalid SSID"));
75518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu}
75618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
75718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter QiuTEST_F(WiFiProviderTest, CreateTemporaryServiceFromProfileMissingMode) {
75818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  string entry_name = AddServiceToProfileStorage(
75918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      default_profile_.get(), "foo", "", kSecurityNone, false, true);
76018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
76118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Error error;
76218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_EQ(nullptr,
76318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu            provider_.CreateTemporaryServiceFromProfile(
76418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu                default_profile_, entry_name, &error));
76518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_FALSE(error.IsSuccess());
76618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_THAT(error.message(), StartsWith("Network mode not specified"));
76718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu}
76818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
76918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter QiuTEST_F(WiFiProviderTest, CreateTemporaryServiceFromProfileMissingSecurity) {
77018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  string entry_name = AddServiceToProfileStorage(
77118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      default_profile_.get(), "foo", kModeManaged, "", false, true);
77218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
77318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Error error;
77418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_EQ(nullptr,
77518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu            provider_.CreateTemporaryServiceFromProfile(
77618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu                default_profile_, entry_name, &error));
77718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_FALSE(error.IsSuccess());
77818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_THAT(error.message(),
77918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              StartsWith("Unspecified or invalid security mode"));
78018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu}
78118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
78218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter QiuTEST_F(WiFiProviderTest, CreateTemporaryServiceFromProfileMissingHidden) {
78318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  string entry_name = AddServiceToProfileStorage(
78418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      default_profile_.get(), "foo", kModeManaged, kSecurityNone, false, false);
78518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
78618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Error error;
78718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_EQ(nullptr,
78818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu            provider_.CreateTemporaryServiceFromProfile(
78918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu                default_profile_, entry_name, &error));
79018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_FALSE(error.IsSuccess());
79118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_THAT(error.message(),
79218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              StartsWith("Hidden SSID not specified"));
79318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu}
79418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
79518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter QiuTEST_F(WiFiProviderTest, CreateTemporaryServiceFromProfile) {
79618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  string entry_name = AddServiceToProfileStorage(
79718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      default_profile_.get(), "foo", kModeManaged, kSecurityNone, false, true);
79818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
79918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Error error;
80018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_NE(nullptr,
80118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu            provider_.CreateTemporaryServiceFromProfile(
80218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu                default_profile_, entry_name, &error));
80318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_TRUE(error.IsSuccess());
80418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu}
80518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
8063c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, CreateTwoServices) {
8073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
808f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  groups.insert(
8099842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
8100951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "foo", kModeManaged, kSecurityNone, false,
8110951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          true));
812f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  groups.insert(
8139842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      AddServiceToProfileStorage(
8140951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "bar", kModeManaged, kSecurityNone, true,
8150951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          true));
8169842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
8179842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
8183c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(groups));
8194ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(manager_, RegisterService(_))
8204ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      .Times(2)
8219842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      .WillRepeatedly(
8229842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal          Invoke(this, &WiFiProviderTest::BindServiceToDefaultProfile));
8234ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
8243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, IsTechnologyConnected(Technology::kWifi))
8253c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(true));
826f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(manager_, RequestScan(_, kTypeWifi, _)).Times(0);
8274ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart  EXPECT_CALL(metrics_, SendToUMA(
8284ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCount,
8294ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      2,
8304ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMin,
8314ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountMax,
8324ef524d362dd96f987cf34ed412486a7ed0d9863Paul Stewart      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
8330951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
8343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
8353c5040174273386868cc8dea8044d22c465885d8Paul Stewart
8363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(2, GetServices().size());
8373c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
8383c5040174273386868cc8dea8044d22c465885d8Paul Stewart
839facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawalTEST_F(WiFiProviderTest, ServiceSourceStats) {
840facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  set<string> default_profile_groups;
841facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  default_profile_groups.insert(
842facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      AddServiceToProfileStorage(
8430951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          default_profile_.get(), "foo", kModeManaged, kSecurityWpa, false,
8440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          true));
845facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(default_profile_storage_,
846facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
847facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      .WillRepeatedly(Return(default_profile_groups));
848facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(manager_, RegisterService(_))
849facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      .WillOnce(Invoke(this, &WiFiProviderTest::BindServiceToDefaultProfile));
850facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
851facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  // Processing default profile does not generate UMA metrics.
852facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(metrics_, SendToUMA(
853facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      StartsWith("Network.Shill.WiFi.RememberedSystemNetworkCount."),
854facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      _, _, _, _))
855facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      .Times(0);
856facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(metrics_, SendToUMA(
857facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      StartsWith("Network.Shill.WiFi.RememberedUserNetworkCount."),
858facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      _, _, _, _))
859facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      .Times(0);
8600951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(default_profile_.get());
861facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  Mock::VerifyAndClearExpectations(&manager_);
862facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal
863facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  set<string> user_profile_groups;
864facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  user_profile_groups.insert(
865facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      AddServiceToProfileStorage(
8660951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko          user_profile_.get(), "bar", kModeManaged, kSecurityRsn, false, true));
867facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(user_profile_storage_,
868facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal              GetGroupsWithProperties(TypeWiFiPropertyMatch()))
869facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      .WillRepeatedly(Return(user_profile_groups));
870facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(manager_, RegisterService(_))
871facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      .WillOnce(Invoke(this, &WiFiProviderTest::BindServiceToUserProfile));
872facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(manager_, IsServiceEphemeral(_)).WillRepeatedly(Return(false));
873facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  // Processing user profile generates metrics for both, default profile,
874facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  // and user profile.
875facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(metrics_, SendToUMA(
876facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      StartsWith("Network.Shill.WiFi.RememberedSystemNetworkCount."),
877facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      0,
878facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountMin,
879facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountMax,
880facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets))
881facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      .Times(3);  // none, wep, 802.1x
882facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(metrics_, SendToUMA(
883facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      StartsWith("Network.Shill.WiFi.RememberedUserNetworkCount."),
884facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      0,
885facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountMin,
886facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountMax,
887facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets))
888facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      .Times(3);  // none, wep, 802.1x
889facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(metrics_, SendToUMA(
890facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      StartsWith("Network.Shill.WiFi.RememberedSystemNetworkCount.psk"),
891facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      1,
892facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountMin,
893facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountMax,
894facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
895facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  EXPECT_CALL(metrics_, SendToUMA(
896facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      StartsWith("Network.Shill.WiFi.RememberedUserNetworkCount.psk"),
897facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      1,
898facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountMin,
899facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountMax,
900facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal      Metrics::kMetricRememberedWiFiNetworkCountNumBuckets));
9010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  CreateServicesFromProfile(user_profile_.get());
902facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal}
903facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal
9044fe4ec22a0c7d3d08c81b436d44e8c97d59bd3afPaul StewartTEST_F(WiFiProviderTest, GetServiceEmptyMode) {
9053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
906f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_FALSE(GetService("foo", "", kSecurityNone,
9073c5040174273386868cc8dea8044d22c465885d8Paul Stewart                          false, false, &error).get());
9083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(Error::kNotSupported, error.type());
9094fe4ec22a0c7d3d08c81b436d44e8c97d59bd3afPaul Stewart}
9104fe4ec22a0c7d3d08c81b436d44e8c97d59bd3afPaul Stewart
9114fe4ec22a0c7d3d08c81b436d44e8c97d59bd3afPaul StewartTEST_F(WiFiProviderTest, GetServiceNoMode) {
9124fe4ec22a0c7d3d08c81b436d44e8c97d59bd3afPaul Stewart  Error error;
9134fe4ec22a0c7d3d08c81b436d44e8c97d59bd3afPaul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
9140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_TRUE(GetService("foo", nullptr, kSecurityNone,
9154fe4ec22a0c7d3d08c81b436d44e8c97d59bd3afPaul Stewart                          false, false, &error).get());
9164fe4ec22a0c7d3d08c81b436d44e8c97d59bd3afPaul Stewart  EXPECT_TRUE(error.IsSuccess());
9173c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
9183c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9193c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, GetServiceBadMode) {
9203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
921d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_FALSE(GetService("foo", "BogoMesh",
922f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                          kSecurityNone,
9233c5040174273386868cc8dea8044d22c465885d8Paul Stewart                          false, false, &error).get());
9243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(Error::kNotSupported, error.type());
9253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ("service mode is unsupported", error.message());
9263c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
9273c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9283c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, GetServiceNoSSID) {
9293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
9300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(GetService(nullptr, kModeManaged,
931f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                          kSecurityNone, false, false,
9323c5040174273386868cc8dea8044d22c465885d8Paul Stewart                          &error).get());
9333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(Error::kInvalidArguments, error.type());
9343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ("must specify SSID", error.message());
9353c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
9363c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9373c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, GetServiceEmptySSID) {
9383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
939f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_FALSE(GetService("", kModeManaged,
940f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                          kSecurityNone, false, false,
9413c5040174273386868cc8dea8044d22c465885d8Paul Stewart                          &error).get());
9423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(Error::kInvalidNetworkName, error.type());
9433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ("SSID is too short", error.message());
9443c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
9453c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9463c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, GetServiceLongSSID) {
9473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
9483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  string ssid(IEEE_80211::kMaxSSIDLen + 1, '0');
949f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_FALSE(GetService(ssid.c_str(), kModeManaged,
950f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                          kSecurityNone, false, false,
9513c5040174273386868cc8dea8044d22c465885d8Paul Stewart                          &error).get());
9523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(Error::kInvalidNetworkName, error.type());
9533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ("SSID is too long", error.message());
9543c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
9553c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9563c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, GetServiceJustLongEnoughSSID) {
9573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
9583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  string ssid(IEEE_80211::kMaxSSIDLen, '0');
9593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
960f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_TRUE(GetService(ssid.c_str(), kModeManaged,
961f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                         kSecurityNone, false, false,
9623c5040174273386868cc8dea8044d22c465885d8Paul Stewart                         &error));
9633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(error.IsSuccess());
9643c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
9653c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9667116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawalTEST_F(WiFiProviderTest, GetServiceBadSecurityClass) {
9673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
968f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_FALSE(GetService("foo", kModeManaged,
9697116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal                          kSecurityRsn, false, false,
9703c5040174273386868cc8dea8044d22c465885d8Paul Stewart                          &error));
9713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(Error::kNotSupported, error.type());
9727116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_EQ("security class is unsupported", error.message());
9733c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
9743c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9753c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, GetServiceMinimal) {
9763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
9773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string kSSID("foo");
9783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
979f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr service = GetService(kSSID.c_str(), kModeManaged,
9800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                         nullptr, false, false, &error);
9813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(service.get());
9823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(error.IsSuccess());
9833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string service_ssid(service->ssid().begin(), service->ssid().end());
9843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(kSSID, service_ssid);
985f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_EQ(kModeManaged, service->mode());
9863c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // These two should be set to their default values if not specified.
988f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_TRUE(service->IsSecurityMatch(kSecurityNone));
9893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(service->hidden_ssid());
9903c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
9913c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9923c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, GetServiceFullySpecified) {
9933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
9943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string kSSID("bar");
9953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
996f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr service0 = GetService(
997f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kSSID.c_str(), kModeManaged, kSecurityPsk, false, true, &error);
9983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
9993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(error.IsSuccess());
10003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string service_ssid(service0->ssid().begin(), service0->ssid().end());
10013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(kSSID, service_ssid);
1002f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_EQ(kModeManaged, service0->mode());
1003f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_TRUE(service0->IsSecurityMatch(kSecurityPsk));
10043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(service0->hidden_ssid());
10053c5040174273386868cc8dea8044d22c465885d8Paul Stewart
10063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Getting the same service parameters (even with a different hidden
10073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // parameter) should return the same service.
10083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
10093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service1 =
1010f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      GetService(kSSID.c_str(), kModeManaged, kSecurityPsk, true, true, &error);
10113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
10123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), service1.get());
10133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
10143c5040174273386868cc8dea8044d22c465885d8Paul Stewart
10153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Getting the same ssid with different other parameters should return
10163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // a different service.
10173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
1018f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr service2 = GetService(
1019f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kSSID.c_str(), kModeManaged, kSecurityNone, true, true, &error);
10203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
10213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_NE(service0.get(), service2.get());
10223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(2, GetServices().size());
10233c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
10243c5040174273386868cc8dea8044d22c465885d8Paul Stewart
10254539d26229b9f37f7047ad32a4f02becf4cd32b2Paul StewartTEST_F(WiFiProviderTest, GetServiceByHexSsid) {
10264539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
10274539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  const string kSSID("bar");
10284539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  const string kHexSsid(base::HexEncode(kSSID.c_str(), kSSID.length()));
10294539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart
10304539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  KeyValueStore args;
10314539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  args.SetString(kTypeProperty, kTypeWifi);
10324539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  args.SetString(kWifiHexSsid, kHexSsid);
10334539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  args.SetString(kSecurityProperty, kSecurityPsk);
10344539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  args.SetBool(kWifiHiddenSsid, false);
10354539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart
10364539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  Error error;
10374539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  WiFiServiceRefPtr service = GetWiFiService(args, &error);
10384539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
10394539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  EXPECT_TRUE(error.IsSuccess());
10404539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  const string service_ssid(service->ssid().begin(), service->ssid().end());
10414539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  EXPECT_EQ(kSSID, service_ssid);
10424539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  EXPECT_EQ(kModeManaged, service->mode());
10434539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  EXPECT_TRUE(service->IsSecurityMatch(kSecurityPsk));
10444539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  EXPECT_FALSE(service->hidden_ssid());
10454539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart
10464539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart
10474539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  // While here, make sure FindSimilarService also supports kWifiHexSsid.
10484539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  Error find_error;
10494539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  ServiceRefPtr find_service = provider_.FindSimilarService(args, &find_error);
10504539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  EXPECT_TRUE(find_error.IsSuccess());
10514539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart  EXPECT_EQ(service.get(), find_service.get());
10524539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart}
10534539d26229b9f37f7047ad32a4f02becf4cd32b2Paul Stewart
10547116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawalTEST_F(WiFiProviderTest, GetServiceWithSecurityAndSecurityClassMismatched) {
10557116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  const string kSSID("bar");
10567116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  KeyValueStore args;
10577116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kTypeProperty, kTypeWifi);
10587116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSSIDProperty, kSSID);
10597116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityProperty, kSecurityRsn);
10607116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityClassProperty, kSecurityPsk);
10617116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetBool(kWifiHiddenSsid, false);
10627116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal
10637116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  Error error;
10647116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  WiFiServiceRefPtr service;
10657116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
10667116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  service = GetWiFiService(args, &error);
10677116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_FALSE(error.IsSuccess());
10687116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal}
10697116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal
10707116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawalTEST_F(WiFiProviderTest, GetServiceWithSecurityAndSecurityClassMatching) {
10717116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  const string kSSID("bar");
10727116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  KeyValueStore args;
10737116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kTypeProperty, kTypeWifi);
10747116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSSIDProperty, kSSID);
10757116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityProperty, kSecurityPsk);
10767116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityClassProperty, kSecurityPsk);
10777116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetBool(kWifiHiddenSsid, false);
10787116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal
10797116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  Error error;
10807116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  WiFiServiceRefPtr service;
10817116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_CALL(manager_, RegisterService(_));
10827116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  service = GetWiFiService(args, &error);
10837116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_TRUE(error.IsSuccess());
10847116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal}
10857116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal
10867116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawalTEST_F(WiFiProviderTest,
10877116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal       GetServiceWithSecurityAndSecurityClassMatchingButInvalidClass) {
10887116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  const string kSSID("bar");
10897116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  KeyValueStore args;
10907116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kTypeProperty, kTypeWifi);
10917116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSSIDProperty, kSSID);
10927116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityProperty, kSecurityRsn);
10937116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityClassProperty, kSecurityRsn);
10947116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetBool(kWifiHiddenSsid, false);
10957116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
10967116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal
10977116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  Error error;
10987116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  WiFiServiceRefPtr service = GetWiFiService(args, &error);
10997116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  Mock::VerifyAndClearExpectations(&manager_);
11007116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_FALSE(error.IsSuccess());
11017116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal}
11027116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal
11037116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawalTEST_F(WiFiProviderTest, GetServiceBadSecurity) {
11047116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  const string kSSID("bar");
11057116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  KeyValueStore args;
11067116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kTypeProperty, kTypeWifi);
11077116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSSIDProperty, kSSID);
11087116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityProperty, "pig-80211");
11097116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetBool(kWifiHiddenSsid, false);
11107116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal
11117116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  Error error;
11127116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  WiFiServiceRefPtr service;
11137116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
11147116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  service = GetWiFiService(args, &error);
11157116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_FALSE(error.IsSuccess());
11167116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_EQ(Error::kNotSupported, error.type());
11177116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  EXPECT_EQ("security mode is unsupported", error.message());
11187116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal}
11197116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal
1120d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul StewartTEST_F(WiFiProviderTest, FindSimilarService) {
1121d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // Since CreateTemporyService uses exactly the same validation as
1122d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // GetService, don't bother with testing invalid parameters.
1123d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  const string kSSID("foo");
1124d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  KeyValueStore args;
1125d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  SetServiceParameters(
1126f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kSSID.c_str(), kModeManaged, kSecurityNone,
1127d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart      true, true, &args);
1128d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
1129d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  Error get_service_error;
11300e51ad959ff2d81472e053b2809991082f976362Paul Stewart  WiFiServiceRefPtr service = GetWiFiService(args, &get_service_error);
1131d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_EQ(1, GetServices().size());
1132d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
1133d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  {
1134d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    Error error;
11350e51ad959ff2d81472e053b2809991082f976362Paul Stewart    ServiceRefPtr find_service = provider_.FindSimilarService(args, &error);
1136d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    EXPECT_EQ(service.get(), find_service.get());
1137d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    EXPECT_TRUE(error.IsSuccess());
1138d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  }
1139d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
1140f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  args.SetBool(kWifiHiddenSsid, false);
1141d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
1142d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  {
1143d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    Error error;
11440e51ad959ff2d81472e053b2809991082f976362Paul Stewart    ServiceRefPtr find_service = provider_.FindSimilarService(args, &error);
1145d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    EXPECT_EQ(service.get(), find_service.get());
1146d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    EXPECT_TRUE(error.IsSuccess());
1147d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  }
1148d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
11497116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityClassProperty, kSecurityPsk);
1150d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
1151d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  {
1152d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    Error error;
11530e51ad959ff2d81472e053b2809991082f976362Paul Stewart    ServiceRefPtr find_service = provider_.FindSimilarService(args, &error);
11540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    EXPECT_EQ(nullptr, find_service.get());
1155d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart    EXPECT_EQ(Error::kNotFound, error.type());
1156d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  }
1157d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart}
1158d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
1159d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul StewartTEST_F(WiFiProviderTest, CreateTemporaryService) {
1160d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // Since CreateTemporyService uses exactly the same validation as
1161d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // GetService, don't bother with testing invalid parameters.
1162d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  const string kSSID("foo");
1163d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
1164d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  Error error;
1165f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr service0 = GetService(
1166f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kSSID.c_str(), kModeManaged, kSecurityNone, true, true, &error);
1167d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_EQ(1, GetServices().size());
1168d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
1169d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
1170d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
11710e51ad959ff2d81472e053b2809991082f976362Paul Stewart  ServiceRefPtr service1 =
1172f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      CreateTemporaryService(kSSID.c_str(), kModeManaged,
1173f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                             kSecurityNone, true, true, &error);
1174d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
1175d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // Test that a new service was created, but not registered with the
1176d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // manager or added to the provider's service list.
1177d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_EQ(1, GetServices().size());
1178d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_TRUE(service0 != service1);
1179d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  EXPECT_TRUE(service1->HasOneRef());
1180d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart}
1181d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
11823c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, FindServiceWPA) {
11833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string kSSID("an_ssid");
11843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
11853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
11867116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  KeyValueStore args;
11877116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  SetServiceParameters(
11887116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal      kSSID.c_str(), kModeManaged, nullptr, false, false, &args);
11897116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  args.SetString(kSecurityProperty, kSecurityRsn);
11907116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  WiFiServiceRefPtr service = GetWiFiService(args, &error);
11913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ASSERT_TRUE(service);
11923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid_bytes(kSSID.begin(), kSSID.end());
1193f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, kModeManaged,
1194f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                            kSecurityWpa));
11953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(wpa_service);
11963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service.get(), wpa_service.get());
1197f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, kModeManaged,
1198f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                            kSecurityRsn));
11993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(rsn_service.get());
12003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service.get(), rsn_service.get());
1201f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr psk_service(FindService(ssid_bytes, kModeManaged,
1202f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                            kSecurityPsk));
12033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service.get(), psk_service.get());
1204f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr wep_service(FindService(ssid_bytes, kModeManaged,
1205f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                            kSecurityWep));
12063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(service.get() != wep_service.get());
12070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, wep_service.get());
12083c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
12093c5040174273386868cc8dea8044d22c465885d8Paul Stewart
12103c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, FindServiceForEndpoint) {
12113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
12123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Error error;
12133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string kSSID("an_ssid");
12143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service = GetService(
1215f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kSSID.c_str(), kModeManaged, kSecurityNone, false, true, &error);
12163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ASSERT_TRUE(service);
12173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint = MakeEndpoint(kSSID, "00:00:00:00:00:00", 0, 0);
12183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr endpoint_service =
12193c5040174273386868cc8dea8044d22c465885d8Paul Stewart      provider_.FindServiceForEndpoint(endpoint);
12200427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  // Just because a matching service exists, we shouldn't necessarily have
12210427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  // it returned.  We will test that this function returns the correct
12220427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  // service if the endpoint is added below.
12230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, endpoint_service.get());
12243c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
12253c5040174273386868cc8dea8044d22c465885d8Paul Stewart
12263c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, OnEndpointAdded) {
12276c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  provider_.Start();
12283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string ssid0("an_ssid");
12293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
1230f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_FALSE(FindService(ssid0_bytes, kModeManaged,
1231f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                           kSecurityNone));
12323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
12333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
12343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(_)).Times(1);
12353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointAdded(endpoint0);
12363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
12373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
1238f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr service0(FindService(ssid0_bytes, kModeManaged,
1239f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                         kSecurityNone));
12403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(service0);
12413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(service0->HasEndpoints());
12420427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_EQ(1, GetServiceByEndpoint().size());
12430427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiServiceRefPtr endpoint_service =
12440427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      provider_.FindServiceForEndpoint(endpoint0);
12450427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_EQ(service0.get(), endpoint_service.get());
12463c5040174273386868cc8dea8044d22c465885d8Paul Stewart
12473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1 = MakeEndpoint(ssid0, "00:00:00:00:00:01", 0, 0);
12483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
12493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
12503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointAdded(endpoint1);
12513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
12523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
12533c5040174273386868cc8dea8044d22c465885d8Paul Stewart
12543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string ssid1("another_ssid");
12553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid1_bytes(ssid1.begin(), ssid1.end());
1256f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_FALSE(FindService(ssid1_bytes, kModeManaged,
1257f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                           kSecurityNone));
12583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint2 = MakeEndpoint(ssid1, "00:00:00:00:00:02",
12593c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                              0, 0);
12603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
12613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(_)).Times(1);
12623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointAdded(endpoint2);
12633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
12643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(2, GetServices().size());
12653c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1266f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr service1(FindService(ssid1_bytes, kModeManaged,
1267f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                         kSecurityNone));
12683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(service1);
12693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(service1->HasEndpoints());
12703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(service1 != service0);
12713c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
12723c5040174273386868cc8dea8044d22c465885d8Paul Stewart
127308a54ebb51c670e2a46a84d715c6231323a8742fPaul StewartTEST_F(WiFiProviderTest, OnEndpointAddedWithSecurity) {
127408a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  provider_.Start();
127508a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  const string ssid0("an_ssid");
127608a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
1277f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_FALSE(FindService(ssid0_bytes, kModeManaged,
1278f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                           kSecurityNone));
127908a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
1280f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  endpoint0->set_security_mode(kSecurityRsn);
128108a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
128208a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_CALL(manager_, UpdateService(_)).Times(1);
128308a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  provider_.OnEndpointAdded(endpoint0);
128408a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  Mock::VerifyAndClearExpectations(&manager_);
128508a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_EQ(1, GetServices().size());
1286f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr service0(FindService(ssid0_bytes, kModeManaged,
1287f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                         kSecurityWpa));
128808a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_TRUE(service0);
128908a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_TRUE(service0->HasEndpoints());
1290f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_EQ(kSecurityPsk, service0->security_);
129108a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart
129208a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  WiFiEndpointRefPtr endpoint1 = MakeEndpoint(ssid0, "00:00:00:00:00:01", 0, 0);
1293f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  endpoint1->set_security_mode(kSecurityWpa);
129408a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
129508a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
129608a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  provider_.OnEndpointAdded(endpoint1);
129708a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  Mock::VerifyAndClearExpectations(&manager_);
129808a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_EQ(1, GetServices().size());
129908a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart
130008a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  const string ssid1("another_ssid");
130108a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  const vector<uint8_t> ssid1_bytes(ssid1.begin(), ssid1.end());
1302f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_FALSE(FindService(ssid1_bytes, kModeManaged,
1303f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                           kSecurityNone));
130408a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  WiFiEndpointRefPtr endpoint2 = MakeEndpoint(ssid1, "00:00:00:00:00:02", 0, 0);
1305f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  endpoint2->set_security_mode(kSecurityWpa);
130608a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
130708a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_CALL(manager_, UpdateService(_)).Times(1);
130808a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  provider_.OnEndpointAdded(endpoint2);
130908a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  Mock::VerifyAndClearExpectations(&manager_);
131008a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_EQ(2, GetServices().size());
131108a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart
1312f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  WiFiServiceRefPtr service1(FindService(ssid1_bytes, kModeManaged,
1313f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                         kSecurityRsn));
131408a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_TRUE(service1);
131508a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_TRUE(service1->HasEndpoints());
1316f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_EQ(kSecurityPsk, service1->security_);
131708a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart  EXPECT_TRUE(service1 != service0);
131808a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart}
131908a54ebb51c670e2a46a84d715c6231323a8742fPaul Stewart
13206c351ff7fea8c93c99b2a9d20bf4d66731603885Paul StewartTEST_F(WiFiProviderTest, OnEndpointAddedWhileStopped) {
13216c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  // If we don't call provider_.Start(), OnEndpointAdded should have no effect.
13226c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  const string ssid("an_ssid");
13236c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  WiFiEndpointRefPtr endpoint = MakeEndpoint(ssid, "00:00:00:00:00:00", 0, 0);
13246c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
13256c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  EXPECT_CALL(manager_, UpdateService(_)).Times(0);
13266c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  provider_.OnEndpointAdded(endpoint);
13276c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  EXPECT_TRUE(GetServices().empty());
13286c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart}
13296c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart
13303c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, OnEndpointAddedToMockService) {
13313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // The previous test allowed the provider to create its own "real"
13323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // WiFiServices, which hides some of what we can test with mock
13333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // services.  Re-do an add-endpoint operation by seeding the provider
13343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // with a mock service.
13356c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  provider_.Start();
13363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string ssid0("an_ssid");
13373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
13383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 = AddMockService(ssid0_bytes,
1339f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1340f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
13413c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
13423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string ssid1("another_ssid");
13433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid1_bytes(ssid1.begin(), ssid1.end());
13443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1 = AddMockService(ssid1_bytes,
1345f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1346f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
13473c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
13483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), FindService(ssid0_bytes,
1349f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                        kModeManaged,
1350f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                        kSecurityNone).get());
13513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
13523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
13533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
13543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, AddEndpoint(RefPtrMatch(endpoint0))).Times(1);
13553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, AddEndpoint(_)).Times(0);
13563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointAdded(endpoint0);
13573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
13580951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
13590951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service1.get());
13603c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1 = MakeEndpoint(ssid0, "00:00:00:00:00:01", 0, 0);
13623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
13633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
13643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, AddEndpoint(RefPtrMatch(endpoint1))).Times(1);
13653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, AddEndpoint(_)).Times(0);
13663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointAdded(endpoint1);
13673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
13680951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
13690951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service1.get());
13703c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint2 = MakeEndpoint(ssid1, "00:00:00:00:00:02", 0, 0);
13723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, RegisterService(_)).Times(0);
13733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service1))).Times(1);
13743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, AddEndpoint(_)).Times(0);
13753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, AddEndpoint(RefPtrMatch(endpoint2))).Times(1);
13763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointAdded(endpoint2);
13773c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
13783c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13793c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, OnEndpointRemoved) {
13806c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  provider_.Start();
13813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string ssid0("an_ssid");
13823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
13833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 = AddMockService(ssid0_bytes,
1384f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1385f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
13863c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
13873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string ssid1("another_ssid");
13883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid1_bytes(ssid1.begin(), ssid1.end());
13893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1 = AddMockService(ssid1_bytes,
1390f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1391f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
13923c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
13933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(2, GetServices().size());
13943c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Remove the last endpoint of a non-remembered service.
13963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
13970427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  AddEndpointToService(service0, endpoint0);
13980427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_EQ(1, GetServiceByEndpoint().size());
13990427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
14003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, RemoveEndpoint(RefPtrMatch(endpoint0))).Times(1);
14013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, RemoveEndpoint(_)).Times(0);
14023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, HasEndpoints()).WillOnce(Return(false));
14033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, IsRemembered()).WillOnce(Return(false));
14043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, ResetWiFi()).Times(1);
14053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(0);
14063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, DeregisterService(RefPtrMatch(service0))).Times(1);
14073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointRemoved(endpoint0);
14083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Verify now, so it's clear that this happened as a result of the call
14093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // above, and not anything in the destructor(s).
14103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
14110951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
14120951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service1.get());
14133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
14143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetServices().front().get());
14150427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_TRUE(GetServiceByEndpoint().empty());
14163c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
14173c5040174273386868cc8dea8044d22c465885d8Paul Stewart
14183c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, OnEndpointRemovedButHasEndpoints) {
14196c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  provider_.Start();
14203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string ssid0("an_ssid");
14213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
14223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 = AddMockService(ssid0_bytes,
1423f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1424f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
14253c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
14263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
14273c5040174273386868cc8dea8044d22c465885d8Paul Stewart
14283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Remove an endpoint of a non-remembered service.
14293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
14300427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  AddEndpointToService(service0, endpoint0);
14310427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_EQ(1, GetServiceByEndpoint().size());
14320427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
14333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, RemoveEndpoint(RefPtrMatch(endpoint0))).Times(1);
14343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, HasEndpoints()).WillOnce(Return(true));
14353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, IsRemembered()).WillRepeatedly(Return(false));
14363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
14373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, ResetWiFi()).Times(0);
14383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
14393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointRemoved(endpoint0);
14403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Verify now, so it's clear that this happened as a result of the call
14413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // above, and not anything in the destructor(s).
14423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
14430951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
14443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
14450427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_TRUE(GetServiceByEndpoint().empty());
14463c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
14473c5040174273386868cc8dea8044d22c465885d8Paul Stewart
14483c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, OnEndpointRemovedButIsRemembered) {
14496c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  provider_.Start();
14503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string ssid0("an_ssid");
14513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid0_bytes(ssid0.begin(), ssid0.end());
14523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 = AddMockService(ssid0_bytes,
1453f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1454f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
14553c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
14563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
14573c5040174273386868cc8dea8044d22c465885d8Paul Stewart
14583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Remove the last endpoint of a remembered service.
14593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0 = MakeEndpoint(ssid0, "00:00:00:00:00:00", 0, 0);
14600427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  AddEndpointToService(service0, endpoint0);
14610427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_EQ(1, GetServiceByEndpoint().size());
14620427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
14633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, RemoveEndpoint(RefPtrMatch(endpoint0))).Times(1);
14643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, HasEndpoints()).WillRepeatedly(Return(false));
14653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, IsRemembered()).WillOnce(Return(true));
14663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(service0))).Times(1);
14673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, ResetWiFi()).Times(0);
14683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
14693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  provider_.OnEndpointRemoved(endpoint0);
14703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Verify now, so it's clear that this happened as a result of the call
14713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // above, and not anything in the destructor(s).
14723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
14730951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
14743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
14750427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_TRUE(GetServiceByEndpoint().empty());
14763c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
14773c5040174273386868cc8dea8044d22c465885d8Paul Stewart
14786c351ff7fea8c93c99b2a9d20bf4d66731603885Paul StewartTEST_F(WiFiProviderTest, OnEndpointRemovedWhileStopped) {
14796c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  // If we don't call provider_.Start(), OnEndpointRemoved should not
14806c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  // cause a crash even if a service matching the endpoint does not exist.
14816c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  const string ssid("an_ssid");
14826c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  WiFiEndpointRefPtr endpoint = MakeEndpoint(ssid, "00:00:00:00:00:00", 0, 0);
14836c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  provider_.OnEndpointRemoved(endpoint);
14846c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart}
14856c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart
148658baeecaf4725031d94de9c1a149c9848b6c5b1dPaul StewartTEST_F(WiFiProviderTest, OnEndpointUpdated) {
148758baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  provider_.Start();
148858baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart
148958baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // Create an endpoint and associate it with a mock service.
149058baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  const string ssid("an_ssid");
149158baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  WiFiEndpointRefPtr endpoint = MakeEndpoint(ssid, "00:00:00:00:00:00", 0, 0);
149258baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart
149358baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  const vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
149458baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  MockWiFiServiceRefPtr open_service = AddMockService(ssid_bytes,
1495f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                      kModeManaged,
1496f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                      kSecurityNone,
149758baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart                                                      false);
149858baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(*open_service, AddEndpoint(RefPtrMatch(endpoint)));
149958baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(open_service)));
150058baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  provider_.OnEndpointAdded(endpoint);
15010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(open_service.get());
150258baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart
150358baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // WiFiProvider is running and endpoint matches this service.
150458baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(*open_service, NotifyEndpointUpdated(RefPtrMatch(endpoint)));
150558baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(*open_service, AddEndpoint(_)).Times(0);
150658baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  provider_.OnEndpointUpdated(endpoint);
15070951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(open_service.get());
150858baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart
150958baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // If the endpoint is changed in a way that causes it to match a different
151058baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // service, the provider should transfer the endpoint from one service to
151158baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // the other.
151258baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  MockWiFiServiceRefPtr rsn_service = AddMockService(ssid_bytes,
1513f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                     kModeManaged,
1514f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                     kSecurityRsn,
151558baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart                                                     false);
151658baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(*open_service, RemoveEndpoint(RefPtrMatch(endpoint)));
151758baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // We are playing out a scenario where the open service is not removed
151858baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // since it still claims to have more endpoints remaining.
151958baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(*open_service, HasEndpoints()).WillOnce(Return(true));
152058baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(*rsn_service, AddEndpoint(RefPtrMatch(endpoint)));
152158baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(open_service)));
152258baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  EXPECT_CALL(manager_, UpdateService(RefPtrMatch(rsn_service)));
1523f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  endpoint->set_security_mode(kSecurityRsn);
152458baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  provider_.OnEndpointUpdated(endpoint);
152558baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart}
152658baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart
152758baeecaf4725031d94de9c1a149c9848b6c5b1dPaul StewartTEST_F(WiFiProviderTest, OnEndpointUpdatedWhileStopped) {
152858baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // If we don't call provider_.Start(), OnEndpointUpdated should not
152958baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  // cause a crash even if a service matching the endpoint does not exist.
153058baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  const string ssid("an_ssid");
153158baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  WiFiEndpointRefPtr endpoint = MakeEndpoint(ssid, "00:00:00:00:00:00", 0, 0);
153258baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart  provider_.OnEndpointUpdated(endpoint);
153358baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart}
153458baeecaf4725031d94de9c1a149c9848b6c5b1dPaul Stewart
15353c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, OnServiceUnloaded) {
15363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function should never unregister services itself -- the Manager
15373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // will automatically deregister the service if OnServiceUnloaded()
15383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // returns true (via WiFiService::Unload()).
15393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
15403c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = AddMockService(vector<uint8_t>(1, '0'),
1542f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                 kModeManaged,
1543f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                 kSecurityNone,
15446c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart                                                 false);
15453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
15463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(true));
15473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, ResetWiFi()).Times(0);
15483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(provider_.OnServiceUnloaded(service));
15493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, GetServices().size());
15500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
15513c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
15533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, ResetWiFi()).Times(1);
15543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(provider_.OnServiceUnloaded(service));
15553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Verify now, so it's clear that this happened as a result of the call
15563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // above, and not anything in the destructor(s).
15570951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
15583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetServices().empty());
15593c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(&manager_);
15613c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
15623c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15639842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawalTEST_F(WiFiProviderTest, LoadAndFixupServiceEntriesDefaultProfile) {
156460a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // We test LoadAndFixupServiceEntries indirectly since it calls a static
156560a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // method in WiFiService.
15663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(metrics_, SendEnumToUMA(
15673c5040174273386868cc8dea8044d22c465885d8Paul Stewart      "Network.Shill.Wifi.ServiceFixupEntries",
15683c5040174273386868cc8dea8044d22c465885d8Paul Stewart      Metrics::kMetricServiceFixupDefaultProfile,
15693c5040174273386868cc8dea8044d22c465885d8Paul Stewart      Metrics::kMetricServiceFixupMax)).Times(1);
15709842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, Flush()).Times(1);
15713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string kGroupId =
1572f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
15739842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
15743c5040174273386868cc8dea8044d22c465885d8Paul Stewart              GetString(kGroupId, _, _)).WillRepeatedly(Return(false));
15759842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
15763c5040174273386868cc8dea8044d22c465885d8Paul Stewart              SetString(kGroupId, _, _)).WillRepeatedly(Return(true));
15773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
15783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  groups.insert(kGroupId);
15799842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetGroups())
15809842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      .WillRepeatedly(Return(groups));
15819842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
15827c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0), _)).
15837c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(true));
15849842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
15857c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1), _)).
15867c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(true));
15879842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
15887c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2), _)).
15897c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(true));
15909842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
15917c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 3), _)).
15927c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(false));
15930951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  LoadAndFixupServiceEntries(default_profile_.get());
15949842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal}
15953c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15969842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawalTEST_F(WiFiProviderTest, LoadAndFixupServiceEntriesUserProfile) {
15973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(metrics_, SendEnumToUMA(
15983c5040174273386868cc8dea8044d22c465885d8Paul Stewart      "Network.Shill.Wifi.ServiceFixupEntries",
15993c5040174273386868cc8dea8044d22c465885d8Paul Stewart      Metrics::kMetricServiceFixupUserProfile,
16003c5040174273386868cc8dea8044d22c465885d8Paul Stewart      Metrics::kMetricServiceFixupMax)).Times(1);
16019842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(user_profile_storage_, Flush()).Times(1);
16029842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  const string kGroupId =
16039842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
16049842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(user_profile_storage_,
16059842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              GetString(kGroupId, _, _)).WillRepeatedly(Return(false));
16069842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(user_profile_storage_,
16079842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              SetString(kGroupId, _, _)).WillRepeatedly(Return(true));
16089842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  set<string> groups;
16099842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  groups.insert(kGroupId);
16109842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(user_profile_storage_, GetGroups())
16119842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      .WillRepeatedly(Return(groups));
16129842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(user_profile_storage_, GetStringList(_, _, _)).Times(0);
16130951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  LoadAndFixupServiceEntries(user_profile_.get());
16143c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
16153c5040174273386868cc8dea8044d22c465885d8Paul Stewart
161660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade GuthrieTEST_F(WiFiProviderTest, LoadAndFixupServiceEntriesNothingToDo) {
16173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(metrics_, SendEnumToUMA(_, _, _)).Times(0);
16189842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, Flush()).Times(0);
16193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const string kGroupId =
1620f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
16219842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
16223c5040174273386868cc8dea8044d22c465885d8Paul Stewart              GetString(kGroupId, _, _)).WillRepeatedly(Return(true));
16233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  set<string> groups;
16243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  groups.insert(kGroupId);
16259842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetGroups()).WillOnce(Return(groups));
16269842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
16277c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0), _)).
16287c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(true));
16299842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
16307c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1), _)).
16317c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(true));
16329842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
16337c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2), _)).
16347c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(true));
16359842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
16367c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 3), _)).
16377c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(false));
16380951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  LoadAndFixupServiceEntries(default_profile_.get());
16393c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16413c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiProviderTest, GetHiddenSSIDList) {
16423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(provider_.GetHiddenSSIDList().empty());
16433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid0(1, '0');
1644f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  AddMockService(ssid0, kModeManaged, kSecurityNone, false);
16453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(provider_.GetHiddenSSIDList().empty());
16463c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid1(1, '1');
16483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1 = AddMockService(ssid1,
1649f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1650f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
16513c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  true);
16523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, IsRemembered()).WillRepeatedly(Return(false));
16533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(provider_.GetHiddenSSIDList().empty());
16543c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid2(1, '2');
16563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service2 = AddMockService(ssid2,
1657f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1658f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  true);
16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service2, IsRemembered()).WillRepeatedly(Return(true));
16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssid_list = provider_.GetHiddenSSIDList();
16623c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, ssid_list.size());
16643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(ssid_list[0] == ssid2);
16653c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid3(1, '3');
16673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service3 = AddMockService(ssid3,
1668f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1669f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
16703c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  false);
16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service2, IsRemembered()).WillRepeatedly(Return(true));
16723c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssid_list = provider_.GetHiddenSSIDList();
16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(1, ssid_list.size());
16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(ssid_list[0] == ssid2);
16763c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  const vector<uint8_t> ssid4(1, '4');
16783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service4 = AddMockService(ssid4,
1679f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kModeManaged,
1680f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                                  kSecurityNone,
16813c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                  true);
16823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service4, IsRemembered()).WillRepeatedly(Return(true));
16833c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssid_list = provider_.GetHiddenSSIDList();
16853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(2, ssid_list.size());
16863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(ssid_list[0] == ssid2);
16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(ssid_list[1] == ssid4);
168821f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart}
168921f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
169060a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade GuthrieTEST_F(WiFiProviderTest, StringListToFrequencyMap) {
169160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  vector<string> strings;
169260a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  BuildFreqCountStrings(&strings);
169360a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  WiFiProvider::ConnectFrequencyMap frequencies_result;
16947c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  time_t days = WiFiProvider::StringListToFrequencyMap(strings,
16957c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                                                       &frequencies_result);
169660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
169760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  WiFiProvider::ConnectFrequencyMap frequencies_expect;
169860a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  BuildFreqCountMap(&frequencies_expect);
169960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  EXPECT_THAT(frequencies_result, ContainerEq(frequencies_expect));
17007c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_EQ(days, kTestDays);
17017c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie}
17027c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
17037c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade GuthrieTEST_F(WiFiProviderTest, StringListToFrequencyMapEmpty) {
17047c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  vector<string> strings;
17057c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  strings.push_back("@50");
17067c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  WiFiProvider::ConnectFrequencyMap frequencies_result;
17077c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  time_t days = WiFiProvider::StringListToFrequencyMap(strings,
17087c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                                                       &frequencies_result);
17097c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_TRUE(frequencies_result.empty());
17107c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_EQ(days, 50);
171160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie}
171260a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
171360a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade GuthrieTEST_F(WiFiProviderTest, FrequencyMapToStringList) {
171460a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  WiFiProvider::ConnectFrequencyMap frequencies;
171560a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  BuildFreqCountMap(&frequencies);
171660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  vector<string> strings_result;
17177c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  WiFiProvider::FrequencyMapToStringList(kTestDays, frequencies,
17187c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                                         &strings_result);
171960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
172060a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  vector<string> strings_expect;
172160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  BuildFreqCountStrings(&strings_expect);
172260a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  EXPECT_THAT(strings_result, ContainerEq(strings_expect));
172360a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie}
172460a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
17257c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade GuthrieTEST_F(WiFiProviderTest, FrequencyMapToStringListEmpty) {
17267c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  WiFiProvider::ConnectFrequencyMap frequencies;
17277c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  vector<string> strings_result;
17287c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  WiFiProvider::FrequencyMapToStringList(kTestDays, frequencies,
17297c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                                         &strings_result);
17307c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_EQ(1, strings_result.size());
17317c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_EQ(*strings_result.begin(), "@20");
17327c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie}
17337c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
17347c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade GuthrieTEST_F(WiFiProviderTest, FrequencyMapBasicAging) {
17357c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  const time_t kThisWeek = kFirstWeek +
17367c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WiFiProvider::kWeeksToKeepFrequencyCounts - 1;
17377c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  LoadConnectCountByFrequency(kThisWeek * kSecondsPerWeek);
17387c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
17397c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Make sure we have data for all 3 blocks.
17407c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  WiFiProvider::ConnectFrequencyMap expected;
17417c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[5001] = 2;
17427c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[5002] = 2;
17437c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[6001] = 1;
17447c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[6002] = 2;
17457c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[7001] = 1;
17467c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[7002] = 2;
17477c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_THAT(provider_.connect_count_by_frequency_, ContainerEq(expected));
17487c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
17497c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // And, then, make sure we output the expected blocks of data.
17509842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(
17519842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      default_profile_storage_,
17529842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      SetStringList(WiFiProvider::kStorageId, _,
17539842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                    Eq(profile_frequency_data_[
17549842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                        StringPrintf(
17559842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                            "%s%d", WiFiProvider::kStorageFrequencies, 0)])));
17569842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(
17579842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      default_profile_storage_,
17589842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      SetStringList(WiFiProvider::kStorageId, _,
17599842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                    Eq(profile_frequency_data_[
17609842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                        StringPrintf(
17619842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                            "%s%d", WiFiProvider::kStorageFrequencies, 1)])));
17629842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(
17639842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      default_profile_storage_,
17649842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      SetStringList(WiFiProvider::kStorageId, _,
17659842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                    Eq(profile_frequency_data_[
17669842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                        StringPrintf(
17679842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                            "%s%d", WiFiProvider::kStorageFrequencies, 2)])));
17687c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  vector<string> frequencies;
17697c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  frequencies.push_back(base::StringPrintf("@%" PRIu64,
17707c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                                           static_cast<uint64_t>(kThisWeek)));
17719842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(
17729842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      default_profile_storage_,
17739842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      SetStringList(WiFiProvider::kStorageId, _, Eq(frequencies))).Times(0);
17747c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  Save();
17757c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie}
17767c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
17777c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade GuthrieTEST_F(WiFiProviderTest, FrequencyMapAgingIllegalDay) {
17787c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  provider_.time_ = &time_;
17797c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  const time_t kThisWeek = kFirstWeek +
17807c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WiFiProvider::kWeeksToKeepFrequencyCounts - 1;
17817c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  const time_t kThisWeekSeconds = kThisWeek * kSecondsPerWeek;
17827c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_CALL(time_, GetSecondsSinceEpoch()).WillOnce(Return(kThisWeekSeconds));
17837c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  const string kGroupId =
1784f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      StringPrintf("%s_0_0_%s_%s", kTypeWifi, kModeManaged, kSecurityNone);
17859842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
17867c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie              GetString(kGroupId, _, _)).WillRepeatedly(Return(true));
17877c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  set<string> groups;
17887c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  groups.insert(kGroupId);
17897c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Instead of block[1], return a block without the date.
17909842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetGroups()).WillOnce(Return(groups));
17919842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
17927c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 0), _)).
17937c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
17949842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
17957c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 1), _)).
17967c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Invoke(this, &WiFiProviderTest::GetIllegalDayStringList));
17979842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
17987c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 2), _)).
17997c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
18009842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_, GetStringList(WiFiProvider::kStorageId,
18017c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      StringPrintf("%s%d", WiFiProvider::kStorageFrequencies, 3), _)).
18027c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Invoke(this, &WiFiProviderTest::GetStringList));
18037c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18040951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  LoadAndFixupServiceEntries(default_profile_.get());
18057c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18067c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Verify that the received information only includes block[0] and block[2].
18077c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  WiFiProvider::ConnectFrequencyMap expected;
18087c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[5001] = 1;
18097c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[5002] = 2;
18107c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[7001] = 1;
18117c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[7002] = 2;
18127c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_THAT(provider_.connect_count_by_frequency_, ContainerEq(expected));
18137c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18147c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // And, then, make sure we output the expected blocks of data.
18159842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(
18169842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      default_profile_storage_,
18179842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      SetStringList(WiFiProvider::kStorageId, _,
18189842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                    Eq(profile_frequency_data_[
18199842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                        StringPrintf(
18209842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                            "%s%d", WiFiProvider::kStorageFrequencies, 0)])));
18219842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(
18229842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      default_profile_storage_,
18239842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      SetStringList(WiFiProvider::kStorageId, _,
18249842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                    Eq(profile_frequency_data_[
18259842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                        StringPrintf(
18269842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                            "%s%d", WiFiProvider::kStorageFrequencies, 1)]))).
18277c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      Times(0);
18289842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(
18299842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      default_profile_storage_,
18309842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      SetStringList(WiFiProvider::kStorageId, _,
18319842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                    Eq(profile_frequency_data_[
18329842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                        StringPrintf(
18339842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal                            "%s%d", WiFiProvider::kStorageFrequencies, 2)])));
18347c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  vector<string> frequencies;
18357c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  frequencies.push_back(base::StringPrintf("@%" PRIu64,
18367c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                                           static_cast<uint64_t>(kThisWeek)));
18379842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  EXPECT_CALL(default_profile_storage_,
18389842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal              SetStringList(WiFiProvider::kStorageId, _, Eq(frequencies)))
18399842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal      .Times(0);
18407c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  Save();
18417c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie}
18427c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18437c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade GuthrieTEST_F(WiFiProviderTest, IncrementConnectCount) {
18447c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  const time_t kThisWeek = kFirstWeek +
18457c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WiFiProvider::kWeeksToKeepFrequencyCounts - 1;
18467c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  const time_t kThisWeekSeconds = kThisWeek * kSecondsPerWeek;
18477c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  LoadConnectCountByFrequency(kThisWeekSeconds);
18487c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18497c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_CALL(time_, GetSecondsSinceEpoch()).WillOnce(Return(kThisWeekSeconds));
18507c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_CALL(manager_, UpdateWiFiProvider());
1851a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(metrics_, SendToUMA(Metrics::kMetricFrequenciesConnectedEver,
1852a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal                                  _, _, _, _));
18537c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  time_t newest_week_at_start =
18547c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      provider_.connect_count_by_frequency_dated_.crbegin()->first;
18557c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  provider_.IncrementConnectCount(6002);
18567c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18577c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Make sure we have data for all 3 blocks.
18587c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  WiFiProvider::ConnectFrequencyMap expected;
18597c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[5001] = 2;
18607c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[5002] = 2;
18617c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[6001] = 1;
18627c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[6002] = 3;
18637c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[7001] = 1;
18647c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[7002] = 2;
18657c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_THAT(provider_.connect_count_by_frequency_, ContainerEq(expected));
18667c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Make sure we didn't delete the oldest block.
18677c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_TRUE(ContainsKey(provider_.connect_count_by_frequency_dated_,
18687c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                          kFirstWeek));
18697c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Make sure we didn't create a new block.
18707c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  time_t newest_week_at_end =
18717c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      provider_.connect_count_by_frequency_dated_.crbegin()->first;
18727c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_EQ(newest_week_at_start, newest_week_at_end);
18737c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie}
18747c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18757c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade GuthrieTEST_F(WiFiProviderTest, IncrementConnectCountCreateNew) {
18767c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  time_t this_week = kFirstWeek + WiFiProvider::kWeeksToKeepFrequencyCounts - 1;
18777c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  LoadConnectCountByFrequency(this_week * kSecondsPerWeek);
18787c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18797c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  this_week += 2;
18807c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_CALL(time_, GetSecondsSinceEpoch()).
18817c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      WillOnce(Return(this_week * kSecondsPerWeek));
18827c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_CALL(manager_, UpdateWiFiProvider());
1883a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(metrics_, SendToUMA(Metrics::kMetricFrequenciesConnectedEver,
1884a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal                                  _, _, _, _));
18857c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  time_t newest_week_at_start =
18867c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      provider_.connect_count_by_frequency_dated_.crbegin()->first;
18877c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  provider_.IncrementConnectCount(6001);
18887c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
18897c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Make sure we have data for newest 2 blocks (only).
18907c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  WiFiProvider::ConnectFrequencyMap expected;
18917c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[5001] = 1;
18927c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[6001] = 2;
18937c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[6002] = 2;
18947c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[7001] = 1;
18957c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  expected[7002] = 2;
18967c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_THAT(provider_.connect_count_by_frequency_, ContainerEq(expected));
18977c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Verify that the oldest block is gone.
18987c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_FALSE(ContainsKey(provider_.connect_count_by_frequency_dated_,
18997c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                           kFirstWeek));
19007c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Make sure we created a new block and that it is for the current week.
19017c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  time_t newest_week_at_end =
19027c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie      provider_.connect_count_by_frequency_dated_.crbegin()->first;
19037c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_NE(newest_week_at_start, newest_week_at_end);
19047c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  EXPECT_TRUE(ContainsKey(provider_.connect_count_by_frequency_dated_,
19057c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie                          this_week));
19067c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie}
19077c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
1908574996af8ed3e3c2fe2bc16970f73c665296cfccPeter QiuTEST_F(WiFiProviderTest, ReportAutoConnectableServices) {
1909574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  MockWiFiServiceRefPtr service0 = AddMockService(vector<uint8_t>(1, '0'),
1910574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu                                                  kModeManaged,
1911574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu                                                  kSecurityNone,
1912574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu                                                  false);
1913574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  MockWiFiServiceRefPtr service1 = AddMockService(vector<uint8_t>(1, '1'),
1914574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu                                                  kModeManaged,
1915574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu                                                  kSecurityNone,
1916574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu                                                  false);
1917574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  service0->EnableAndRetainAutoConnect();
1918574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  service0->SetConnectable(true);
1919574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  service1->EnableAndRetainAutoConnect();
1920574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  service1->SetConnectable(true);
1921574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu
1922574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  EXPECT_CALL(*service0, IsAutoConnectable(_))
1923574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu      .WillOnce(Return(true))
1924574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu      .WillOnce(Return(false));
1925574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  EXPECT_CALL(*service1, IsAutoConnectable(_))
1926574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu      .WillRepeatedly(Return(false));
1927574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu
1928574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  // With 1 auto connectable service.
1929574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  EXPECT_CALL(metrics_, NotifyWifiAutoConnectableServices(1));
1930574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  provider_.ReportAutoConnectableServices();
1931574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu
1932574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  // With no auto connectable service.
1933574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  EXPECT_CALL(metrics_, NotifyWifiAutoConnectableServices(_)).Times(0);
1934574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  provider_.ReportAutoConnectableServices();
1935574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu}
1936574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu
1937402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiProviderTest, NumAutoConnectableServices) {
19386d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan  MockWiFiServiceRefPtr service0 = AddMockService(
19396d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan      vector<uint8_t>(1, '0'), kModeManaged, kSecurityNone, false);
19406d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan  MockWiFiServiceRefPtr service1 = AddMockService(
19416d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan      vector<uint8_t>(1, '1'), kModeManaged, kSecurityNone, false);
1942402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  service0->EnableAndRetainAutoConnect();
1943402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  service0->SetConnectable(true);
1944402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  service1->EnableAndRetainAutoConnect();
1945402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  service1->SetConnectable(true);
1946402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
1947402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*service0, IsAutoConnectable(_))
1948402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(true))
1949402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(false));
19506d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan  EXPECT_CALL(*service1, IsAutoConnectable(_)).WillRepeatedly(Return(true));
1951402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
1952d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  // 2 auto-connectable services.
1953d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  EXPECT_EQ(2, provider_.NumAutoConnectableServices());
1954402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
1955d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  // 1 auto-connectable service.
1956d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  EXPECT_EQ(1, provider_.NumAutoConnectableServices());
1957402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan}
1958402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
1959d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel TanTEST_F(WiFiProviderTest, GetSsidsConfiguredForAutoConnect) {
1960d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  vector<uint8_t> ssid0(3, '0');
1961d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  vector<uint8_t> ssid1(5, '1');
1962d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  ByteString ssid0_bytes(ssid0);
1963d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  ByteString ssid1_bytes(ssid1);
19646d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan  MockWiFiServiceRefPtr service0 =
19656d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan      AddMockService(ssid0, kModeManaged, kSecurityNone, false);
19666d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan  MockWiFiServiceRefPtr service1 =
19676d61faf84ef5eb2545bc6eee8a4d74109dfdd6d1Samuel Tan      AddMockService(ssid1, kModeManaged, kSecurityNone, false);
1968d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  // 2 services configured for auto-connect.
1969d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  service0->SetAutoConnect(true);
1970d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  service1->SetAutoConnect(true);
1971d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  vector<ByteString> service_list_0 =
1972d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan      provider_.GetSsidsConfiguredForAutoConnect();
1973d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  EXPECT_EQ(2, service_list_0.size());
1974d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  EXPECT_TRUE(ssid0_bytes.Equals(service_list_0[0]));
1975d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  EXPECT_TRUE(ssid1_bytes.Equals(service_list_0[1]));
1976d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan
1977d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  // 1 service configured for auto-connect.
1978d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  service0->SetAutoConnect(false);
1979d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  service1->SetAutoConnect(true);
1980d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  vector<ByteString> service_list_1 =
1981d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan      provider_.GetSsidsConfiguredForAutoConnect();
1982d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  EXPECT_EQ(1, service_list_1.size());
1983d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  EXPECT_TRUE(ssid1_bytes.Equals(service_list_1[0]));
1984d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan}
1985d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan
198621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart}  // namespace shill
1987