1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2015 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 162dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 172dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/pppoe/pppoe_service.h" 182dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 192dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include <map> 202dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include <string> 212dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 222dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include <gmock/gmock.h> 232dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include <gtest/gtest.h> 242dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 252dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include <base/memory/ref_counted.h> 262dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 272dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/ethernet/mock_ethernet.h" 282dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/mock_control.h" 292dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/mock_device_info.h" 302dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/mock_external_task.h" 312dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/mock_manager.h" 322dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/mock_metrics.h" 332dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/mock_ppp_device.h" 34d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu#include "shill/mock_ppp_device_factory.h" 35a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu#include "shill/mock_process_manager.h" 362dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/service.h" 37a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu#include "shill/test_event_dispatcher.h" 382dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/testing.h" 392dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 402dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyusing std::map; 412dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyusing std::string; 429b6f8b8cdeb0c9e925fad635cc52a467c82741d0Peter Qiuusing testing::Mock; 432dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyusing testing::NiceMock; 442dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyusing testing::Return; 452dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyusing testing::StrEq; 462dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyusing testing::_; 472dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 482dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellynamespace shill { 492dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 502dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass PPPoEServiceTest : public testing::Test { 512dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly public: 522dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly PPPoEServiceTest() 532dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly : metrics_(&dispatcher_), 54bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal manager_(&control_interface_, &dispatcher_, &metrics_), 552dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly ethernet_(new MockEthernet(&control_interface_, 562dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &dispatcher_, 572dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &metrics_, 582dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &manager_, 592dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly "ethernet", 602dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly "aabbccddeeff", 612dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 0)), 622dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly device_info_(&control_interface_, 632dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &dispatcher_, 642dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &metrics_, 652dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &manager_), 662dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_(new PPPoEService(&control_interface_, 672dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &dispatcher_, 682dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &metrics_, 692dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &manager_, 702dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly ethernet_->weak_ptr_factory_.GetWeakPtr())) { 712dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly manager_.set_mock_device_info(&device_info_); 72a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu service_->process_manager_ = &process_manager_; 732dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly } 742dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 75b2a5529593725d88197cf6621a4a5ba882707eceGarret Kelly ~PPPoEServiceTest() override { 76b2a5529593725d88197cf6621a4a5ba882707eceGarret Kelly Error error; 77b2a5529593725d88197cf6621a4a5ba882707eceGarret Kelly service_->Disconnect(&error, __func__); 78b2a5529593725d88197cf6621a4a5ba882707eceGarret Kelly dispatcher_.DispatchPendingEvents(); 79b2a5529593725d88197cf6621a4a5ba882707eceGarret Kelly } 802dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 812dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly protected: 822dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly void FakeConnectionSuccess() { 832dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(*ethernet_, link_up()) 842dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly .WillRepeatedly(Return(true)); 85a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu EXPECT_CALL(process_manager_, StartProcess(_, _, _, _, _, _)) 86a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu .WillOnce(Return(0)); 872dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly Error error; 882dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Connect(&error, "in test"); 892dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_TRUE(error.IsSuccess()); 902dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly } 912dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 92a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu EventDispatcherForTest dispatcher_; 932dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly MockMetrics metrics_; 942dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly MockControl control_interface_; 95a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu MockProcessManager process_manager_; 962dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly MockManager manager_; 972dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly scoped_refptr<MockEthernet> ethernet_; 982dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly MockDeviceInfo device_info_; 992dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1002dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly scoped_refptr<PPPoEService> service_; 1012dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1022dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly private: 1032dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly DISALLOW_COPY_AND_ASSIGN(PPPoEServiceTest); 1042dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly}; 1052dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1062dc218e49e210b64ecf7d83946ec257ef1529171Garret KellyMATCHER_P(LinkNamed, name, "") { 1072dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly return arg->link_name() == name; 1082dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly} 1092dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1102dc218e49e210b64ecf7d83946ec257ef1529171Garret KellyTEST_F(PPPoEServiceTest, AuthenticationFailure) { 1112dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(*ethernet_, link_up()).WillRepeatedly(Return(true)); 1122dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly FakeConnectionSuccess(); 1132dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly map<string, string> empty_dict; 1142dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Notify(kPPPReasonAuthenticating, empty_dict); 1152dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Notify(kPPPReasonDisconnect, empty_dict); 1162dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_EQ(service_->state(), Service::kStateFailure); 1172dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_EQ(service_->failure(), Service::kFailurePPPAuth); 1182dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly} 1192dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1202dc218e49e210b64ecf7d83946ec257ef1529171Garret KellyTEST_F(PPPoEServiceTest, DisconnectBeforeConnect) { 1212dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(*ethernet_, link_up()).WillRepeatedly(Return(true)); 1222dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly FakeConnectionSuccess(); 1232dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly map<string, string> empty_dict; 1242dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Notify(kPPPReasonAuthenticating, empty_dict); 1252dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Notify(kPPPReasonAuthenticated, empty_dict); 1262dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Notify(kPPPReasonDisconnect, empty_dict); 1272dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_EQ(service_->state(), Service::kStateFailure); 1282dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_EQ(service_->failure(), Service::kFailureUnknown); 1292dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly} 1302dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1312dc218e49e210b64ecf7d83946ec257ef1529171Garret KellyTEST_F(PPPoEServiceTest, ConnectFailsWhenEthernetLinkDown) { 1322dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(*ethernet_, link_up()).WillRepeatedly(Return(false)); 1332dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1342dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly Error error; 1352dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Connect(&error, "in test"); 1362dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_FALSE(error.IsSuccess()); 1372dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly} 1382dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 139d1d3278b365e866a7381de2a640219b51fe0e27aPeter QiuTEST_F(PPPoEServiceTest, OnPPPConnected) { 140d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu // Setup device factory. 141d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu MockPPPDeviceFactory* factory = MockPPPDeviceFactory::GetInstance(); 142d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu service_->ppp_device_factory_ = factory; 143d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu 144d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu static const char kLinkName[] = "ppp0"; 145d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu map<string, string> params = { {kPPPInterfaceName, kLinkName} }; 146d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu MockPPPDevice* device = new MockPPPDevice( 147d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu &control_interface_, &dispatcher_, &metrics_, &manager_, kLinkName, 0); 148d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu 149d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu EXPECT_CALL(device_info_, GetIndex(StrEq(kLinkName))).WillOnce(Return(0)); 150d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu EXPECT_CALL(*factory, CreatePPPDevice(_, _, _, _, _, _)) 151d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu .WillOnce(Return(device)); 152d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu EXPECT_CALL(device_info_, RegisterDevice(IsRefPtrTo(device))); 153d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu EXPECT_CALL(*device, SetEnabled(true)); 154d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu EXPECT_CALL(*device, SelectService(_)); 155d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu EXPECT_CALL(*device, UpdateIPConfigFromPPP(params, false)); 156d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu#ifndef DISABLE_DHCPV6 157d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu EXPECT_CALL(manager_, IsDHCPv6EnabledForDevice(StrEq(kLinkName))) 158d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu .WillOnce(Return(true)); 159d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu EXPECT_CALL(*device, AcquireIPv6Config()); 160d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu#endif // DISABLE_DHCPV6 1619b6f8b8cdeb0c9e925fad635cc52a467c82741d0Peter Qiu EXPECT_CALL(manager_, OnInnerDevicesChanged()); 162d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu service_->OnPPPConnected(params); 1639b6f8b8cdeb0c9e925fad635cc52a467c82741d0Peter Qiu Mock::VerifyAndClearExpectations(&manager_); 164d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu} 165d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu 1662dc218e49e210b64ecf7d83946ec257ef1529171Garret KellyTEST_F(PPPoEServiceTest, Connect) { 1672dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly static const char kLinkName[] = "ppp0"; 1682dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1692dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(*ethernet_, link_up()).WillRepeatedly(Return(true)); 1702dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(device_info_, GetIndex(StrEq(kLinkName))).WillOnce(Return(0)); 1712dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(device_info_, RegisterDevice(LinkNamed(kLinkName))); 1722dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1732dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly FakeConnectionSuccess(); 1742dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly map<string, string> empty_dict; 1752dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Notify(kPPPReasonAuthenticating, empty_dict); 1762dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Notify(kPPPReasonAuthenticated, empty_dict); 1772dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1782dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly map<string, string> connect_dict = { 1792dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly {kPPPInterfaceName, kLinkName}, 1802dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly }; 1812dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Notify(kPPPReasonConnect, connect_dict); 1822dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_EQ(service_->state(), Service::kStateOnline); 1832dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly} 1842dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1852dc218e49e210b64ecf7d83946ec257ef1529171Garret KellyTEST_F(PPPoEServiceTest, Disconnect) { 1862dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly FakeConnectionSuccess(); 1872dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1882dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly auto weak_ptr = service_->weak_ptr_factory_.GetWeakPtr(); 18996ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart MockExternalTask* pppd = new MockExternalTask( 190a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu &control_interface_, &process_manager_, weak_ptr, 1912dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly base::Bind(&PPPoEService::OnPPPDied, weak_ptr)); 1922dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->pppd_.reset(pppd); 1932dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 19496ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart MockPPPDevice* ppp_device = new MockPPPDevice( 1952dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly &control_interface_, &dispatcher_, &metrics_, &manager_, "ppp0", 0); 1962dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->ppp_device_ = ppp_device; 1972dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1982dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(*ppp_device, DropConnection()); 1992dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_CALL(*pppd, OnDelete()); 2002dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 2012dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly { 2022dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly Error error; 2032dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly service_->Disconnect(&error, "in test"); 2042dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly EXPECT_TRUE(error.IsSuccess()); 2052dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly } 2062dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly} 2072dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 208dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret KellyTEST_F(PPPoEServiceTest, DisconnectDuringAssociation) { 209dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly FakeConnectionSuccess(); 210dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly 211dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly Error error; 212dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly service_->Disconnect(&error, "in test"); 213dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly EXPECT_TRUE(error.IsSuccess()); 214dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly 215dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly EXPECT_EQ(service_->state(), Service::kStateIdle); 216dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly} 217dac90aadec34bb7e3b38651718aa15ba2f23aad6Garret Kelly 2182dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly} // namespace shill 219