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