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