15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/shill_property_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_device_client.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/shill_ipconfig_client.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_manager_client.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chromeos/dbus/shill_profile_client.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_service_client.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DoNothingWithCallStatus(DBusMethodCallStatus call_status) {
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorCallbackFunction(const std::string& error_name,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& error_message) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestListener : public internal::ShillPropertyHandler::Listener {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestListener() : technology_list_updates_(0),
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   errors_(0) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateManagedList(ManagedState::ManagedType type,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const base::ListValue& entries) OVERRIDE {
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    VLOG(1) << "UpdateManagedList[" << ManagedState::TypeToString(type) << "]: "
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            << entries.GetSize();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateEntries(GetTypeString(type), entries);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateManagedStateProperties(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ManagedState::ManagedType type,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& path,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::DictionaryValue& properties) OVERRIDE {
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    VLOG(2) << "UpdateManagedStateProperties: " << GetTypeString(type);
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    initial_property_updates(GetTypeString(type))[path] += 1;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ProfileListChanged() OVERRIDE {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateNetworkServiceProperty(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& service_path,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& key,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Value& value) OVERRIDE {
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    AddPropertyUpdate(shill::kServiceCompleteListProperty, service_path);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateDeviceProperty(
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& device_path,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& key,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Value& value) OVERRIDE {
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddPropertyUpdate(shill::kDevicesProperty, device_path);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void UpdateIPConfigProperties(
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ManagedState::ManagedType type,
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& path,
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& ip_config_path,
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const base::DictionaryValue& properties) OVERRIDE {
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    AddPropertyUpdate(shill::kIPConfigsProperty, ip_config_path);
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void TechnologyListChanged() OVERRIDE {
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    VLOG(1) << "TechnologyListChanged.";
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ++technology_list_updates_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void CheckPortalListChanged(
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const std::string& check_portal_list) OVERRIDE {
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ManagedStateListChanged(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ManagedState::ManagedType type) OVERRIDE {
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    VLOG(1) << "ManagedStateListChanged: " << GetTypeString(type);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddStateListUpdate(GetTypeString(type));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DefaultNetworkServiceChanged(
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::string& service_path) OVERRIDE {
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string>& entries(const std::string& type) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return entries_[type];
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, int>& property_updates(const std::string& type) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return property_updates_[type];
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::map<std::string, int>& initial_property_updates(
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::string& type) {
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return initial_property_updates_[type];
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int list_updates(const std::string& type) { return list_updates_[type]; }
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int technology_list_updates() { return technology_list_updates_; }
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void reset_list_updates() {
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    VLOG(1) << "=== RESET LIST UPDATES ===";
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    list_updates_.clear();
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    technology_list_updates_ = 0;
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int errors() { return errors_; }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetTypeString(ManagedState::ManagedType type) {
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (type == ManagedState::MANAGED_TYPE_NETWORK)
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return shill::kServiceCompleteListProperty;
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (type == ManagedState::MANAGED_TYPE_DEVICE)
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return shill::kDevicesProperty;
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    NOTREACHED();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateEntries(const std::string& type, const base::ListValue& entries) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type.empty())
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries_[type].clear();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (base::ListValue::const_iterator iter = entries.begin();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != entries.end(); ++iter) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string path;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((*iter)->GetAsString(&path))
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entries_[type].push_back(path);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddPropertyUpdate(const std::string& type, const std::string& path) {
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DCHECK(!type.empty());
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    VLOG(2) << "AddPropertyUpdate: " << type;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    property_updates(type)[path] += 1;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddStateListUpdate(const std::string& type) {
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DCHECK(!type.empty());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list_updates_[type] += 1;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map of list-type -> paths
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::vector<std::string> > entries_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map of list-type -> map of paths -> update counts
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::map<std::string, int> > property_updates_;
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::map<std::string, std::map<std::string, int> > initial_property_updates_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map of list-type -> list update counts
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, int > list_updates_;
161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int technology_list_updates_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int errors_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShillPropertyHandlerTest : public testing::Test {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShillPropertyHandlerTest()
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : manager_test_(NULL),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_test_(NULL),
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        service_test_(NULL),
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        profile_test_(NULL) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ShillPropertyHandlerTest() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize DBusThreadManager with a stub implementation.
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DBusThreadManager::Initialize();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get the test interface for manager / device / service and clear the
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // default stub properties.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_test_ =
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(manager_test_);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_test_ =
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DBusThreadManager::Get()->GetShillDeviceClient()->GetTestInterface();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(device_test_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_test_ =
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(service_test_);
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    profile_test_ =
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        DBusThreadManager::Get()->GetShillProfileClient()->GetTestInterface();
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(profile_test_);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetupShillPropertyHandler();
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop_.RunUntilIdle();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shill_property_handler_.reset();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listener_.reset();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DBusThreadManager::Shutdown();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddDevice(const std::string& type, const std::string& id) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(IsValidType(type));
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    device_test_->AddDevice(id, type, id);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveDevice(const std::string& id) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_test_->RemoveDevice(id);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddService(const std::string& type,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const std::string& id,
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  const std::string& state) {
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    VLOG(2) << "AddService: " << type << ": " << id << ": " << state;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(IsValidType(type));
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_test_->AddService(id /* service_path */,
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              id /* guid */,
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              id /* name */,
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              type,
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              state,
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              true /* visible */);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AddServiceWithIPConfig(const std::string& type,
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const std::string& id,
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const std::string& state,
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                              const std::string& ipconfig_path) {
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(IsValidType(type));
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    service_test_->AddServiceWithIPConfig(id, /* service_path */
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          id /* guid */,
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                          id /* name */,
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                          type,
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                          state,
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          ipconfig_path,
23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                          true /* visible */);
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AddServiceToProfile(const std::string& type,
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           const std::string& id,
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           bool visible) {
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_test_->AddService(id /* service_path */,
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              id /* guid */,
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              id /* name */,
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              type,
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              shill::kStateIdle,
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              visible);
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<std::string> profiles;
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    profile_test_->GetProfilePaths(&profiles);
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(profiles.size() > 0);
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::DictionaryValue properties;  // Empty entry
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    profile_test_->AddService(profiles[0], id);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveService(const std::string& id) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_test_->RemoveService(id);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call this after any initial Shill client setup
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupShillPropertyHandler() {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetupDefaultShillState();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listener_.reset(new TestListener);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shill_property_handler_.reset(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new internal::ShillPropertyHandler(listener_.get()));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shill_property_handler_->Init();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsValidType(const std::string& type) {
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return (type == shill::kTypeEthernet ||
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            type == shill::kTypeEthernetEap ||
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            type == shill::kTypeWifi ||
27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            type == shill::kTypeWimax ||
27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            type == shill::kTypeBluetooth ||
27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            type == shill::kTypeCellular ||
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            type == shill::kTypeVPN);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetupDefaultShillState() {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();  // Process any pending updates
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    device_test_->ClearDevices();
28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddDevice(shill::kTypeWifi, "stub_wifi_device1");
28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddDevice(shill::kTypeCellular, "stub_cellular_device1");
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service_test_->ClearServices();
28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    AddService(shill::kTypeEthernet, "stub_ethernet", shill::kStateOnline);
28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    AddService(shill::kTypeWifi, "stub_wifi1", shill::kStateOnline);
28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    AddService(shill::kTypeWifi, "stub_wifi2", shill::kStateIdle);
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    AddService(shill::kTypeCellular, "stub_cellular1", shill::kStateIdle);
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoopForUI message_loop_;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestListener> listener_;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<internal::ShillPropertyHandler> shill_property_handler_;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShillManagerClient::TestInterface* manager_test_;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShillDeviceClient::TestInterface* device_test_;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShillServiceClient::TestInterface* service_test_;
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ShillProfileClient::TestInterface* profile_test_;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShillPropertyHandlerTest);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShillPropertyHandlerTest, ShillPropertyHandlerStub) {
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(shill_property_handler_->IsTechnologyAvailable(shill::kTypeWifi));
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(shill_property_handler_->IsTechnologyEnabled(shill::kTypeWifi));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kNumShillManagerClientStubImplDevices = 2;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumShillManagerClientStubImplDevices,
31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            listener_->entries(shill::kDevicesProperty).size());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kNumShillManagerClientStubImplServices = 4;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumShillManagerClientStubImplServices,
3136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            listener_->entries(shill::kServiceCompleteListProperty).size());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, listener_->errors());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShillPropertyHandlerTest, ShillPropertyHandlerTechnologyChanged) {
319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const int initial_technology_updates = 2;  // Available and Enabled lists
320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(initial_technology_updates, listener_->technology_list_updates());
3212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Remove an enabled technology. Updates both the Available and Enabled lists.
32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  listener_->reset_list_updates();
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager_test_->RemoveTechnology(shill::kTypeWifi);
3252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  message_loop_.RunUntilIdle();
32646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2, listener_->technology_list_updates());
3272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a disabled technology.
32946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  listener_->reset_list_updates();
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager_test_->AddTechnology(shill::kTypeWifi, false);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
33246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1, listener_->technology_list_updates());
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(shill_property_handler_->IsTechnologyAvailable(
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      shill::kTypeWifi));
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(shill_property_handler_->IsTechnologyEnabled(shill::kTypeWifi));
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable the technology.
33846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  listener_->reset_list_updates();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DBusThreadManager::Get()->GetShillManagerClient()->EnableTechnology(
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      shill::kTypeWifi,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1, listener_->technology_list_updates());
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(shill_property_handler_->IsTechnologyEnabled(shill::kTypeWifi));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, listener_->errors());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShillPropertyHandlerTest, ShillPropertyHandlerDevicePropertyChanged) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kNumShillManagerClientStubImplDevices = 2;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumShillManagerClientStubImplDevices,
35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            listener_->entries(shill::kDevicesProperty).size());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a device.
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  listener_->reset_list_updates();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kTestDevicePath("test_wifi_device1");
35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddDevice(shill::kTypeWifi, kTestDevicePath);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, listener_->list_updates(shill::kDevicesProperty));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumShillManagerClientStubImplDevices + 1,
36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            listener_->entries(shill::kDevicesProperty).size());
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove a device
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  listener_->reset_list_updates();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveDevice(kTestDevicePath);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, listener_->list_updates(shill::kDevicesProperty));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumShillManagerClientStubImplDevices,
36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            listener_->entries(shill::kDevicesProperty).size());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, listener_->errors());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShillPropertyHandlerTest, ShillPropertyHandlerServicePropertyChanged) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kNumShillManagerClientStubImplServices = 4;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumShillManagerClientStubImplServices,
3766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            listener_->entries(shill::kServiceCompleteListProperty).size());
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Add a service.
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  listener_->reset_list_updates();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kTestServicePath("test_wifi_service1");
38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AddService(shill::kTypeWifi, kTestServicePath, shill::kStateIdle);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Add should trigger a service list update and update entries.
384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1, listener_->list_updates(shill::kServiceCompleteListProperty));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumShillManagerClientStubImplServices + 1,
3866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            listener_->entries(shill::kServiceCompleteListProperty).size());
387a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Service receives an initial property update.
388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, listener_->initial_property_updates(
389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      shill::kServiceCompleteListProperty)[kTestServicePath]);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change a property.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue scan_interval(3);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DBusThreadManager::Get()->GetShillServiceClient()->SetProperty(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::ObjectPath(kTestServicePath),
39468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      shill::kScanIntervalProperty,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scan_interval,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Property change triggers an update (but not a service list update).
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, listener_->property_updates(
400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      shill::kServiceCompleteListProperty)[kTestServicePath]);
401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
4026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Change the visibility of a service. This will trigger a service list
4036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // updates.
404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  listener_->reset_list_updates();
405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DBusThreadManager::Get()->GetShillServiceClient()->SetProperty(
406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      dbus::ObjectPath(kTestServicePath),
407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      shill::kVisibleProperty,
408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FundamentalValue(false),
409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction));
410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  message_loop_.RunUntilIdle();
4116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(1, listener_->list_updates(shill::kServiceCompleteListProperty));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Remove a service. This will update the entries and signal a service list
414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // update.
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  listener_->reset_list_updates();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveService(kTestServicePath);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1, listener_->list_updates(shill::kServiceCompleteListProperty));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumShillManagerClientStubImplServices,
4206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            listener_->entries(shill::kServiceCompleteListProperty).size());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, listener_->errors());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ShillPropertyHandlerTest, ShillPropertyHandlerIPConfigPropertyChanged) {
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set the properties for an IP Config object.
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string kTestIPConfigPath("test_ip_config_path");
4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::StringValue ip_address("192.168.1.1");
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DBusThreadManager::Get()->GetShillIPConfigClient()->SetProperty(
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::ObjectPath(kTestIPConfigPath),
43268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      shill::kAddressProperty, ip_address,
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&DoNothingWithCallStatus));
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue dns_servers;
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  dns_servers.Append(new base::StringValue("192.168.1.100"));
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  dns_servers.Append(new base::StringValue("192.168.1.101"));
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DBusThreadManager::Get()->GetShillIPConfigClient()->SetProperty(
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::ObjectPath(kTestIPConfigPath),
43968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      shill::kNameServersProperty, dns_servers,
4407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&DoNothingWithCallStatus));
4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FundamentalValue prefixlen(8);
4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DBusThreadManager::Get()->GetShillIPConfigClient()->SetProperty(
4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      dbus::ObjectPath(kTestIPConfigPath),
44468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      shill::kPrefixlenProperty, prefixlen,
4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&DoNothingWithCallStatus));
4467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::StringValue gateway("192.0.0.1");
4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DBusThreadManager::Get()->GetShillIPConfigClient()->SetProperty(
4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      dbus::ObjectPath(kTestIPConfigPath),
44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      shill::kGatewayProperty, gateway,
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&DoNothingWithCallStatus));
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message_loop_.RunUntilIdle();
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add a service with an empty ipconfig and then update
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // its ipconfig property.
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string kTestServicePath1("test_wifi_service1");
45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AddService(shill::kTypeWifi, kTestServicePath1, shill::kStateIdle);
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message_loop_.RunUntilIdle();
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This is the initial property update.
459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, listener_->initial_property_updates(
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      shill::kServiceCompleteListProperty)[kTestServicePath1]);
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DBusThreadManager::Get()->GetShillServiceClient()->SetProperty(
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::ObjectPath(kTestServicePath1),
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      shill::kIPConfigProperty,
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::StringValue(kTestIPConfigPath),
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction));
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message_loop_.RunUntilIdle();
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // IPConfig property change on the service should trigger an IPConfigs update.
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, listener_->property_updates(
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      shill::kIPConfigsProperty)[kTestIPConfigPath]);
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Now, Add a new service with the IPConfig already set.
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string kTestServicePath2("test_wifi_service2");
47368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddServiceWithIPConfig(shill::kTypeWifi, kTestServicePath2,
47446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                         shill::kStateIdle, kTestIPConfigPath);
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message_loop_.RunUntilIdle();
47646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // A service with the IPConfig property already set should trigger an
477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // additional IPConfigs update.
478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(2, listener_->property_updates(
479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      shill::kIPConfigsProperty)[kTestIPConfigPath]);
480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(ShillPropertyHandlerTest, ShillPropertyHandlerServiceList) {
483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Add an entry to the profile only.
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::string kTestServicePath1("stub_wifi_profile_only1");
48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AddServiceToProfile(shill::kTypeWifi, kTestServicePath1, false /* visible */);
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  message_loop_.RunUntilIdle();
487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Update the Manager properties. This should trigger a single list update,
4896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // an initial property update, and a regular property update.
490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  listener_->reset_list_updates();
491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  shill_property_handler_->UpdateManagerProperties();
492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  message_loop_.RunUntilIdle();
493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, listener_->list_updates(shill::kServiceCompleteListProperty));
494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, listener_->initial_property_updates(
495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shill::kServiceCompleteListProperty)[kTestServicePath1]);
4966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(1, listener_->property_updates(
497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shill::kServiceCompleteListProperty)[kTestServicePath1]);
498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Add a new entry to the services and the profile; should also trigger a
500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // service list update, and a property update.
501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  listener_->reset_list_updates();
502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const std::string kTestServicePath2("stub_wifi_profile_only2");
50368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddServiceToProfile(shill::kTypeWifi, kTestServicePath2, true);
504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  shill_property_handler_->UpdateManagerProperties();
505eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  message_loop_.RunUntilIdle();
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, listener_->list_updates(shill::kServiceCompleteListProperty));
507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, listener_->initial_property_updates(
508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shill::kServiceCompleteListProperty)[kTestServicePath2]);
509eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, listener_->property_updates(
510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shill::kServiceCompleteListProperty)[kTestServicePath2]);
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
514