blob: 1091fb74a580ab8973567c33b5075e9be207a889 [file] [log] [blame]
Paul Stewartced3ad72013-04-03 13:39:25 -07001// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/ethernet.h"
6
7#include <netinet/ether.h>
8#include <linux/if.h> // Needs definitions from netinet/ether.h
mukesh agrawal8bda7962014-04-01 17:09:35 -07009#include <linux/sockios.h>
Paul Stewartced3ad72013-04-03 13:39:25 -070010
11#include <base/memory/ref_counted.h>
12#include <base/memory/scoped_ptr.h>
Paul Stewartced3ad72013-04-03 13:39:25 -070013
14#include "shill/mock_device_info.h"
15#include "shill/mock_dhcp_config.h"
16#include "shill/mock_dhcp_provider.h"
Paul Stewart35eff132013-04-12 12:08:40 -070017#include "shill/mock_eap_credentials.h"
Paul Stewartced3ad72013-04-03 13:39:25 -070018#include "shill/mock_eap_listener.h"
19#include "shill/mock_event_dispatcher.h"
Paul Stewart35eff132013-04-12 12:08:40 -070020#include "shill/mock_ethernet_eap_provider.h"
Paul Stewart9413bcc2013-04-04 16:12:43 -070021#include "shill/mock_ethernet_service.h"
Paul Stewartced3ad72013-04-03 13:39:25 -070022#include "shill/mock_glib.h"
Paul Stewart9413bcc2013-04-04 16:12:43 -070023#include "shill/mock_log.h"
Paul Stewartced3ad72013-04-03 13:39:25 -070024#include "shill/mock_manager.h"
25#include "shill/mock_metrics.h"
Ben Chana55469d2014-01-27 16:35:29 -080026#include "shill/mock_proxy_factory.h"
Paul Stewartced3ad72013-04-03 13:39:25 -070027#include "shill/mock_rtnl_handler.h"
Paul Stewart35eff132013-04-12 12:08:40 -070028#include "shill/mock_service.h"
mukesh agrawal8bda7962014-04-01 17:09:35 -070029#include "shill/mock_sockets.h"
Paul Stewart9413bcc2013-04-04 16:12:43 -070030#include "shill/mock_supplicant_interface_proxy.h"
31#include "shill/mock_supplicant_process_proxy.h"
Paul Stewartced3ad72013-04-03 13:39:25 -070032#include "shill/nice_mock_control.h"
Ben Chana55469d2014-01-27 16:35:29 -080033#include "shill/testing.h"
34#include "shill/wpa_supplicant.h"
Paul Stewartced3ad72013-04-03 13:39:25 -070035
Paul Stewart9413bcc2013-04-04 16:12:43 -070036using std::string;
Paul Stewartced3ad72013-04-03 13:39:25 -070037using testing::_;
38using testing::AnyNumber;
Paul Stewart9413bcc2013-04-04 16:12:43 -070039using testing::EndsWith;
Gaurav Shah25ee2502013-04-08 17:55:01 -070040using testing::Eq;
Paul Stewartced3ad72013-04-03 13:39:25 -070041using testing::Mock;
Paul Stewart9413bcc2013-04-04 16:12:43 -070042using testing::NiceMock;
Paul Stewartced3ad72013-04-03 13:39:25 -070043using testing::Return;
Paul Stewart35eff132013-04-12 12:08:40 -070044using testing::ReturnRef;
Paul Stewart9413bcc2013-04-04 16:12:43 -070045using testing::StrEq;
Paul Stewartced3ad72013-04-03 13:39:25 -070046using testing::StrictMock;
Paul Stewart9413bcc2013-04-04 16:12:43 -070047using testing::Throw;
Paul Stewartced3ad72013-04-03 13:39:25 -070048
49namespace shill {
50
51class EthernetTest : public testing::Test {
52 public:
53 EthernetTest()
mukesh agrawal8bda7962014-04-01 17:09:35 -070054 : metrics_(nullptr),
Paul Stewartced3ad72013-04-03 13:39:25 -070055 manager_(&control_interface_, NULL, &metrics_, &glib_),
56 device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
57 ethernet_(new Ethernet(&control_interface_,
58 &dispatcher_,
59 &metrics_,
60 &manager_,
61 kDeviceName,
62 kDeviceAddress,
63 kInterfaceIndex)),
64 dhcp_config_(new MockDHCPConfig(&control_interface_,
65 kDeviceName)),
Paul Stewart9413bcc2013-04-04 16:12:43 -070066 eap_listener_(new MockEapListener()),
mukesh agrawal8bda7962014-04-01 17:09:35 -070067 mock_sockets_(new StrictMock<MockSockets>()),
Paul Stewart9413bcc2013-04-04 16:12:43 -070068 mock_service_(new MockEthernetService(&control_interface_, &metrics_)),
Paul Stewart35eff132013-04-12 12:08:40 -070069 mock_eap_service_(new MockService(&control_interface_,
70 &dispatcher_,
71 &metrics_,
72 &manager_)),
Paul Stewart9413bcc2013-04-04 16:12:43 -070073 supplicant_interface_proxy_(
74 new NiceMock<MockSupplicantInterfaceProxy>()),
75 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()) {}
Paul Stewartced3ad72013-04-03 13:39:25 -070076
77 virtual void SetUp() {
78 ethernet_->rtnl_handler_ = &rtnl_handler_;
Paul Stewart9413bcc2013-04-04 16:12:43 -070079 ethernet_->proxy_factory_ = &proxy_factory_;
mukesh agrawal8bda7962014-04-01 17:09:35 -070080 ethernet_->eap_listener_.reset(eap_listener_); // Transfers ownership.
81 ethernet_->sockets_.reset(mock_sockets_); // Transfers ownership.
Paul Stewartced3ad72013-04-03 13:39:25 -070082
83 ethernet_->set_dhcp_provider(&dhcp_provider_);
84 ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
85 EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
Paul Stewart35eff132013-04-12 12:08:40 -070086 EXPECT_CALL(manager_, ethernet_eap_provider())
87 .WillRepeatedly(Return(&ethernet_eap_provider_));
88 ethernet_eap_provider_.set_service(mock_eap_service_);
Paul Stewartced3ad72013-04-03 13:39:25 -070089 }
90
91 virtual void TearDown() {
Paul Stewart35eff132013-04-12 12:08:40 -070092 ethernet_eap_provider_.set_service(NULL);
Paul Stewartced3ad72013-04-03 13:39:25 -070093 ethernet_->set_dhcp_provider(NULL);
94 ethernet_->eap_listener_.reset();
mukesh agrawal8bda7962014-04-01 17:09:35 -070095 ethernet_->sockets_.reset();
Paul Stewartced3ad72013-04-03 13:39:25 -070096 }
97
98 protected:
99 static const char kDeviceName[];
100 static const char kDeviceAddress[];
Paul Stewart9413bcc2013-04-04 16:12:43 -0700101 static const char kInterfacePath[];
Paul Stewartced3ad72013-04-03 13:39:25 -0700102 static const int kInterfaceIndex;
103
Paul Stewart9413bcc2013-04-04 16:12:43 -0700104 bool GetIsEapAuthenticated() { return ethernet_->is_eap_authenticated_; }
105 void SetIsEapAuthenticated(bool is_eap_authenticated) {
106 ethernet_->is_eap_authenticated_ = is_eap_authenticated;
107 }
108 bool GetIsEapDetected() { return ethernet_->is_eap_detected_; }
109 void SetIsEapDetected(bool is_eap_detected) {
110 ethernet_->is_eap_detected_ = is_eap_detected;
111 }
112 bool GetLinkUp() { return ethernet_->link_up_; }
113 const ServiceRefPtr &GetSelectedService() {
114 return ethernet_->selected_service();
115 }
116 ServiceRefPtr GetService() { return ethernet_->service_; }
117 void SetService(const EthernetServiceRefPtr &service) {
118 ethernet_->service_ = service;
119 }
120 const PropertyStore &GetStore() { return ethernet_->store(); }
Paul Stewartced3ad72013-04-03 13:39:25 -0700121 void StartEthernet() {
122 EXPECT_CALL(rtnl_handler_,
123 SetInterfaceFlags(kInterfaceIndex, IFF_UP, IFF_UP));
124 ethernet_->Start(NULL, EnabledStateChangedCallback());
125 }
Paul Stewart9413bcc2013-04-04 16:12:43 -0700126 const SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
127 return ethernet_->supplicant_interface_proxy_.get();
Paul Stewartced3ad72013-04-03 13:39:25 -0700128 }
Paul Stewart9413bcc2013-04-04 16:12:43 -0700129 const SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
130 return ethernet_->supplicant_process_proxy_.get();
131 }
132 const string &GetSupplicantInterfacePath() {
133 return ethernet_->supplicant_interface_path_;
134 }
135 const string &GetSupplicantNetworkPath() {
136 return ethernet_->supplicant_network_path_;
137 }
138 void SetSupplicantNetworkPath(const string &network_path) {
139 ethernet_->supplicant_network_path_ = network_path;
140 }
141 bool InvokeStartSupplicant() {
142 return ethernet_->StartSupplicant();
143 }
144 void InvokeStopSupplicant() {
145 return ethernet_->StopSupplicant();
146 }
147 bool InvokeStartEapAuthentication() {
148 return ethernet_->StartEapAuthentication();
149 }
150 void StartSupplicant() {
Ben Chana55469d2014-01-27 16:35:29 -0800151 MockSupplicantInterfaceProxy *interface_proxy =
152 ExpectCreateSupplicantInterfaceProxy();
153 MockSupplicantProcessProxy *process_proxy =
154 ExpectCreateSupplicantProcessProxy();
155 EXPECT_CALL(*process_proxy, CreateInterface(_))
Paul Stewart9413bcc2013-04-04 16:12:43 -0700156 .WillOnce(Return(kInterfacePath));
157 EXPECT_TRUE(InvokeStartSupplicant());
Ben Chana55469d2014-01-27 16:35:29 -0800158 EXPECT_EQ(interface_proxy, GetSupplicantInterfaceProxy());
159 EXPECT_EQ(process_proxy, GetSupplicantProcessProxy());
Paul Stewart9413bcc2013-04-04 16:12:43 -0700160 EXPECT_EQ(kInterfacePath, GetSupplicantInterfacePath());
161 }
Paul Stewartced3ad72013-04-03 13:39:25 -0700162 void TriggerOnEapDetected() { ethernet_->OnEapDetected(); }
Paul Stewart9413bcc2013-04-04 16:12:43 -0700163 void TriggerCertification(const string &subject, uint32 depth) {
164 ethernet_->CertificationTask(subject, depth);
165 }
Paul Stewart35eff132013-04-12 12:08:40 -0700166 void TriggerTryEapAuthentication() {
167 ethernet_->TryEapAuthenticationTask();
168 }
Paul Stewartced3ad72013-04-03 13:39:25 -0700169
Ben Chana55469d2014-01-27 16:35:29 -0800170 MockSupplicantInterfaceProxy *ExpectCreateSupplicantInterfaceProxy() {
171 EXPECT_CALL(proxy_factory_,
172 CreateSupplicantInterfaceProxy(_, DBus::Path(kInterfacePath),
173 StrEq(WPASupplicant::kDBusAddr)))
174 .WillOnce(ReturnAndReleasePointee(&supplicant_interface_proxy_));
175 return supplicant_interface_proxy_.get();
176 }
177 MockSupplicantProcessProxy *ExpectCreateSupplicantProcessProxy() {
178 EXPECT_CALL(proxy_factory_,
179 CreateSupplicantProcessProxy(StrEq(WPASupplicant::kDBusPath),
180 StrEq(WPASupplicant::kDBusAddr)))
181 .WillOnce(ReturnAndReleasePointee(&supplicant_process_proxy_));
182 return supplicant_process_proxy_.get();
183 }
184
Paul Stewartced3ad72013-04-03 13:39:25 -0700185 StrictMock<MockEventDispatcher> dispatcher_;
186 MockGLib glib_;
187 NiceMockControl control_interface_;
mukesh agrawal8bda7962014-04-01 17:09:35 -0700188 NiceMock<MockMetrics> metrics_;
Paul Stewartced3ad72013-04-03 13:39:25 -0700189 MockManager manager_;
190 MockDeviceInfo device_info_;
191 EthernetRefPtr ethernet_;
Paul Stewart35eff132013-04-12 12:08:40 -0700192 MockEthernetEapProvider ethernet_eap_provider_;
Paul Stewartced3ad72013-04-03 13:39:25 -0700193 MockDHCPProvider dhcp_provider_;
194 scoped_refptr<MockDHCPConfig> dhcp_config_;
Paul Stewart9413bcc2013-04-04 16:12:43 -0700195
Paul Stewartced3ad72013-04-03 13:39:25 -0700196 // Owned by Ethernet instance, but tracked here for expectations.
197 MockEapListener *eap_listener_;
mukesh agrawal8bda7962014-04-01 17:09:35 -0700198 MockSockets *mock_sockets_;
Paul Stewart9413bcc2013-04-04 16:12:43 -0700199
200 MockRTNLHandler rtnl_handler_;
201 scoped_refptr<MockEthernetService> mock_service_;
Paul Stewart35eff132013-04-12 12:08:40 -0700202 scoped_refptr<MockService> mock_eap_service_;
Ben Chana55469d2014-01-27 16:35:29 -0800203 NiceMock<MockProxyFactory> proxy_factory_;
Paul Stewart9413bcc2013-04-04 16:12:43 -0700204 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
205 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
Paul Stewartced3ad72013-04-03 13:39:25 -0700206};
207
208// static
209const char EthernetTest::kDeviceName[] = "eth0";
210const char EthernetTest::kDeviceAddress[] = "000102030405";
Paul Stewart9413bcc2013-04-04 16:12:43 -0700211const char EthernetTest::kInterfacePath[] = "/interface/path";
Paul Stewartced3ad72013-04-03 13:39:25 -0700212const int EthernetTest::kInterfaceIndex = 123;
213
214TEST_F(EthernetTest, Construct) {
215 EXPECT_FALSE(GetLinkUp());
Paul Stewart9413bcc2013-04-04 16:12:43 -0700216 EXPECT_FALSE(GetIsEapAuthenticated());
Paul Stewartced3ad72013-04-03 13:39:25 -0700217 EXPECT_FALSE(GetIsEapDetected());
Paul Stewart9413bcc2013-04-04 16:12:43 -0700218 EXPECT_TRUE(GetStore().Contains(kEapAuthenticationCompletedProperty));
Paul Stewartced3ad72013-04-03 13:39:25 -0700219 EXPECT_TRUE(GetStore().Contains(kEapAuthenticatorDetectedProperty));
220 EXPECT_EQ(NULL, GetService().get());
221}
222
223TEST_F(EthernetTest, StartStop) {
Gaurav Shah25ee2502013-04-08 17:55:01 -0700224 StartEthernet();
225
Paul Stewartced3ad72013-04-03 13:39:25 -0700226 EXPECT_FALSE(GetService().get() == NULL);
227
Gaurav Shah25ee2502013-04-08 17:55:01 -0700228 Service* service = GetService().get();
229 EXPECT_CALL(manager_, DeregisterService(Eq(service)));
Paul Stewartced3ad72013-04-03 13:39:25 -0700230 ethernet_->Stop(NULL, EnabledStateChangedCallback());
231 EXPECT_EQ(NULL, GetService().get());
232}
233
234TEST_F(EthernetTest, LinkEvent) {
235 StartEthernet();
236
237 // Link-down event while already down.
238 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
239 EXPECT_CALL(*eap_listener_, Start()).Times(0);
240 ethernet_->LinkEvent(0, IFF_LOWER_UP);
241 EXPECT_FALSE(GetLinkUp());
242 EXPECT_FALSE(GetIsEapDetected());
243 Mock::VerifyAndClearExpectations(&manager_);
244
245 // Link-up event while down.
mukesh agrawal8bda7962014-04-01 17:09:35 -0700246 int kFakeFd = 789;
Paul Stewartced3ad72013-04-03 13:39:25 -0700247 EXPECT_CALL(manager_, RegisterService(GetService()));
248 EXPECT_CALL(*eap_listener_, Start());
mukesh agrawal8bda7962014-04-01 17:09:35 -0700249 EXPECT_CALL(*mock_sockets_, Socket(_, _, _)).WillOnce(Return(kFakeFd));
250 EXPECT_CALL(*mock_sockets_, Ioctl(kFakeFd, SIOCETHTOOL, _));
251 EXPECT_CALL(*mock_sockets_, Close(kFakeFd));
Paul Stewartced3ad72013-04-03 13:39:25 -0700252 ethernet_->LinkEvent(IFF_LOWER_UP, 0);
253 EXPECT_TRUE(GetLinkUp());
254 EXPECT_FALSE(GetIsEapDetected());
255 Mock::VerifyAndClearExpectations(&manager_);
256
257 // Link-up event while already up.
258 EXPECT_CALL(manager_, RegisterService(GetService())).Times(0);
259 EXPECT_CALL(*eap_listener_, Start()).Times(0);
260 ethernet_->LinkEvent(IFF_LOWER_UP, 0);
261 EXPECT_TRUE(GetLinkUp());
262 EXPECT_FALSE(GetIsEapDetected());
263 Mock::VerifyAndClearExpectations(&manager_);
264
265 // Link-down event while up.
266 SetIsEapDetected(true);
Paul Stewart35eff132013-04-12 12:08:40 -0700267 // This is done in SetUp, but we have to reestablish this after calling
268 // VerifyAndClearExpectations() above.
269 EXPECT_CALL(manager_, ethernet_eap_provider())
270 .WillRepeatedly(Return(&ethernet_eap_provider_));
271 EXPECT_CALL(ethernet_eap_provider_,
272 ClearCredentialChangeCallback(ethernet_.get()));
Paul Stewartced3ad72013-04-03 13:39:25 -0700273 EXPECT_CALL(manager_, DeregisterService(GetService()));
274 EXPECT_CALL(*eap_listener_, Stop());
275 ethernet_->LinkEvent(0, IFF_LOWER_UP);
276 EXPECT_FALSE(GetLinkUp());
277 EXPECT_FALSE(GetIsEapDetected());
278
279 // Restore this expectation during shutdown.
280 EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
281}
282
Paul Stewart9413bcc2013-04-04 16:12:43 -0700283TEST_F(EthernetTest, ConnectToFailure) {
284 StartEthernet();
285 SetService(mock_service_);
286 EXPECT_EQ(NULL, GetSelectedService().get());
Paul Stewart75a68b92013-10-24 10:50:27 -0700287 EXPECT_CALL(dhcp_provider_, CreateConfig(_, _, _, _, _)).
Paul Stewart9413bcc2013-04-04 16:12:43 -0700288 WillOnce(Return(dhcp_config_));
289 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).WillOnce(Return(false));
290 EXPECT_CALL(dispatcher_, PostTask(_)); // Posts ConfigureStaticIPTask.
Paul Stewartdded0072013-10-24 12:38:54 -0700291 EXPECT_CALL(*mock_service_, SetState(Service::kStateFailure));
Paul Stewart9413bcc2013-04-04 16:12:43 -0700292 ethernet_->ConnectTo(mock_service_);
Paul Stewartdded0072013-10-24 12:38:54 -0700293 EXPECT_EQ(mock_service_, GetSelectedService().get());
Paul Stewart9413bcc2013-04-04 16:12:43 -0700294}
295
296TEST_F(EthernetTest, ConnectToSuccess) {
297 StartEthernet();
298 SetService(mock_service_);
299 EXPECT_EQ(NULL, GetSelectedService().get());
Paul Stewart75a68b92013-10-24 10:50:27 -0700300 EXPECT_CALL(dhcp_provider_, CreateConfig(_, _, _, _, _)).
Paul Stewart9413bcc2013-04-04 16:12:43 -0700301 WillOnce(Return(dhcp_config_));
302 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).WillOnce(Return(true));
303 EXPECT_CALL(dispatcher_, PostTask(_)); // Posts ConfigureStaticIPTask.
304 EXPECT_CALL(*mock_service_, SetState(Service::kStateConfiguring));
305 ethernet_->ConnectTo(mock_service_.get());
306 EXPECT_EQ(GetService().get(), GetSelectedService().get());
307 Mock::VerifyAndClearExpectations(mock_service_);
308
309 EXPECT_CALL(*mock_service_, SetState(Service::kStateIdle));
310 ethernet_->DisconnectFrom(mock_service_);
311 EXPECT_EQ(NULL, GetSelectedService().get());
312}
313
Paul Stewartced3ad72013-04-03 13:39:25 -0700314TEST_F(EthernetTest, OnEapDetected) {
315 EXPECT_FALSE(GetIsEapDetected());
316 EXPECT_CALL(*eap_listener_, Stop());
Paul Stewart35eff132013-04-12 12:08:40 -0700317 EXPECT_CALL(ethernet_eap_provider_,
318 SetCredentialChangeCallback(ethernet_.get(), _));
319 EXPECT_CALL(dispatcher_, PostTask(_)); // Posts TryEapAuthenticationTask.
Paul Stewartced3ad72013-04-03 13:39:25 -0700320 TriggerOnEapDetected();
321 EXPECT_TRUE(GetIsEapDetected());
322}
323
Paul Stewart9413bcc2013-04-04 16:12:43 -0700324TEST_F(EthernetTest, TryEapAuthenticationNoService) {
Paul Stewart35eff132013-04-12 12:08:40 -0700325 EXPECT_CALL(*mock_eap_service_, Is8021xConnectable()).Times(0);
Paul Stewart9413bcc2013-04-04 16:12:43 -0700326 NiceScopedMockLog log;
327 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
328 EndsWith("Service is missing; "
329 "not doing EAP authentication.")));
Paul Stewart35eff132013-04-12 12:08:40 -0700330 TriggerTryEapAuthentication();
Paul Stewart9413bcc2013-04-04 16:12:43 -0700331}
332
333TEST_F(EthernetTest, TryEapAuthenticationNotConnectableNotAuthenticated) {
334 SetService(mock_service_);
Paul Stewart35eff132013-04-12 12:08:40 -0700335 EXPECT_CALL(*mock_eap_service_, Is8021xConnectable()).WillOnce(Return(false));
Paul Stewart9413bcc2013-04-04 16:12:43 -0700336 NiceScopedMockLog log;
337 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
Paul Stewart35eff132013-04-12 12:08:40 -0700338 EndsWith("EAP Service lacks 802.1X credentials; "
Paul Stewart9413bcc2013-04-04 16:12:43 -0700339 "not doing EAP authentication.")));
Paul Stewart35eff132013-04-12 12:08:40 -0700340 TriggerTryEapAuthentication();
341 SetService(NULL);
Paul Stewart9413bcc2013-04-04 16:12:43 -0700342}
343
344TEST_F(EthernetTest, TryEapAuthenticationNotConnectableAuthenticated) {
345 SetService(mock_service_);
346 SetIsEapAuthenticated(true);
Paul Stewart35eff132013-04-12 12:08:40 -0700347 EXPECT_CALL(*mock_eap_service_, Is8021xConnectable()).WillOnce(Return(false));
Paul Stewart9413bcc2013-04-04 16:12:43 -0700348 NiceScopedMockLog log;
Paul Stewart35eff132013-04-12 12:08:40 -0700349 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
Paul Stewart9413bcc2013-04-04 16:12:43 -0700350 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
Paul Stewart35eff132013-04-12 12:08:40 -0700351 EndsWith("EAP Service lost 802.1X credentials; "
Paul Stewart9413bcc2013-04-04 16:12:43 -0700352 "terminating EAP authentication.")));
Paul Stewart35eff132013-04-12 12:08:40 -0700353 TriggerTryEapAuthentication();
Paul Stewart9413bcc2013-04-04 16:12:43 -0700354 EXPECT_FALSE(GetIsEapAuthenticated());
355}
356
357TEST_F(EthernetTest, TryEapAuthenticationEapNotDetected) {
358 SetService(mock_service_);
Paul Stewart35eff132013-04-12 12:08:40 -0700359 EXPECT_CALL(*mock_eap_service_, Is8021xConnectable()).WillOnce(Return(true));
Paul Stewart9413bcc2013-04-04 16:12:43 -0700360 NiceScopedMockLog log;
Paul Stewart35eff132013-04-12 12:08:40 -0700361 EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
Paul Stewart9413bcc2013-04-04 16:12:43 -0700362 EndsWith("EAP authenticator not detected; "
363 "not doing EAP authentication.")));
Paul Stewart35eff132013-04-12 12:08:40 -0700364 TriggerTryEapAuthentication();
Paul Stewart9413bcc2013-04-04 16:12:43 -0700365}
366
367TEST_F(EthernetTest, StartSupplicant) {
368 // Save the mock proxy pointers before the Ethernet instance accepts it.
369 MockSupplicantInterfaceProxy *interface_proxy =
370 supplicant_interface_proxy_.get();
371 MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
372
373 StartSupplicant();
374
375 // Starting it again should not invoke another call to create an interface.
376 Mock::VerifyAndClearExpectations(process_proxy);
377 EXPECT_CALL(*process_proxy, CreateInterface(_)).Times(0);
378 EXPECT_TRUE(InvokeStartSupplicant());
379
Ben Chana55469d2014-01-27 16:35:29 -0800380 // Also, the mock pointers should remain; if the MockProxyFactory was
Paul Stewart9413bcc2013-04-04 16:12:43 -0700381 // invoked again, they would be NULL.
382 EXPECT_EQ(interface_proxy, GetSupplicantInterfaceProxy());
383 EXPECT_EQ(process_proxy, GetSupplicantProcessProxy());
384 EXPECT_EQ(kInterfacePath, GetSupplicantInterfacePath());
385}
386
387TEST_F(EthernetTest, StartSupplicantWithInterfaceExistsException) {
Ben Chana55469d2014-01-27 16:35:29 -0800388 MockSupplicantProcessProxy *process_proxy =
389 ExpectCreateSupplicantProcessProxy();
Paul Stewart9413bcc2013-04-04 16:12:43 -0700390 MockSupplicantInterfaceProxy *interface_proxy =
Ben Chana55469d2014-01-27 16:35:29 -0800391 ExpectCreateSupplicantInterfaceProxy();
Paul Stewart9413bcc2013-04-04 16:12:43 -0700392 EXPECT_CALL(*process_proxy, CreateInterface(_))
393 .WillOnce(Throw(DBus::Error(
394 "fi.w1.wpa_supplicant1.InterfaceExists",
395 "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
396 EXPECT_CALL(*process_proxy, GetInterface(kDeviceName))
397 .WillOnce(Return(kInterfacePath));
398 EXPECT_TRUE(InvokeStartSupplicant());
399 EXPECT_EQ(interface_proxy, GetSupplicantInterfaceProxy());
400 EXPECT_EQ(process_proxy, GetSupplicantProcessProxy());
401 EXPECT_EQ(kInterfacePath, GetSupplicantInterfacePath());
402}
403
404TEST_F(EthernetTest, StartSupplicantWithUnknownException) {
Ben Chana55469d2014-01-27 16:35:29 -0800405 MockSupplicantProcessProxy *process_proxy =
406 ExpectCreateSupplicantProcessProxy();
Paul Stewart9413bcc2013-04-04 16:12:43 -0700407 EXPECT_CALL(*process_proxy, CreateInterface(_))
408 .WillOnce(Throw(DBus::Error(
409 "fi.w1.wpa_supplicant1.UnknownError",
410 "test threw fi.w1.wpa_supplicant1.UnknownError")));
411 EXPECT_CALL(*process_proxy, GetInterface(kDeviceName)).Times(0);
412 EXPECT_FALSE(InvokeStartSupplicant());
413 EXPECT_EQ(NULL, GetSupplicantInterfaceProxy());
414 EXPECT_EQ(NULL, GetSupplicantProcessProxy());
415 EXPECT_EQ("", GetSupplicantInterfacePath());
416}
417
418TEST_F(EthernetTest, StartEapAuthentication) {
419 MockSupplicantInterfaceProxy *interface_proxy =
420 supplicant_interface_proxy_.get();
421
422 StartSupplicant();
423 SetService(mock_service_);
424
425 EXPECT_CALL(*mock_service_, ClearEAPCertification());
Paul Stewart35eff132013-04-12 12:08:40 -0700426 MockEapCredentials mock_eap_credentials;
427 EXPECT_CALL(*mock_eap_service_, eap())
428 .WillOnce(Return(&mock_eap_credentials));
429 EXPECT_CALL(mock_eap_credentials, PopulateSupplicantProperties(_, _, _, _));
Paul Stewart9413bcc2013-04-04 16:12:43 -0700430 EXPECT_CALL(*interface_proxy, RemoveNetwork(_)).Times(0);
431 EXPECT_CALL(*interface_proxy, AddNetwork(_))
432 .WillOnce(Throw(DBus::Error(
433 "fi.w1.wpa_supplicant1.UnknownError",
434 "test threw fi.w1.wpa_supplicant1.UnknownError")));
435 EXPECT_CALL(*interface_proxy, SelectNetwork(_)).Times(0);
Paul Stewartbe9abfd2013-04-22 12:18:48 -0700436 EXPECT_CALL(*interface_proxy, EAPLogon()).Times(0);
Paul Stewart9413bcc2013-04-04 16:12:43 -0700437 EXPECT_FALSE(InvokeStartEapAuthentication());
438 Mock::VerifyAndClearExpectations(mock_service_);
Paul Stewart35eff132013-04-12 12:08:40 -0700439 Mock::VerifyAndClearExpectations(mock_eap_service_);
Paul Stewart9413bcc2013-04-04 16:12:43 -0700440 Mock::VerifyAndClearExpectations(interface_proxy);
441 EXPECT_EQ("", GetSupplicantNetworkPath());
442
443 EXPECT_CALL(*mock_service_, ClearEAPCertification());
444 EXPECT_CALL(*interface_proxy, RemoveNetwork(_)).Times(0);
Paul Stewart35eff132013-04-12 12:08:40 -0700445 EXPECT_CALL(*mock_eap_service_, eap())
446 .WillOnce(Return(&mock_eap_credentials));
447 EXPECT_CALL(mock_eap_credentials, PopulateSupplicantProperties(_, _, _, _));
Paul Stewart9413bcc2013-04-04 16:12:43 -0700448 const char kFirstNetworkPath[] = "/network/first-path";
449 EXPECT_CALL(*interface_proxy, AddNetwork(_))
450 .WillOnce(Return(kFirstNetworkPath));
451 EXPECT_CALL(*interface_proxy, SelectNetwork(StrEq(kFirstNetworkPath)));
Paul Stewartbe9abfd2013-04-22 12:18:48 -0700452 EXPECT_CALL(*interface_proxy, EAPLogon());
Paul Stewart9413bcc2013-04-04 16:12:43 -0700453 EXPECT_TRUE(InvokeStartEapAuthentication());
454 Mock::VerifyAndClearExpectations(mock_service_);
Paul Stewart35eff132013-04-12 12:08:40 -0700455 Mock::VerifyAndClearExpectations(mock_eap_service_);
456 Mock::VerifyAndClearExpectations(&mock_eap_credentials);
Paul Stewart9413bcc2013-04-04 16:12:43 -0700457 Mock::VerifyAndClearExpectations(interface_proxy);
458 EXPECT_EQ(kFirstNetworkPath, GetSupplicantNetworkPath());
459
460 EXPECT_CALL(*mock_service_, ClearEAPCertification());
461 EXPECT_CALL(*interface_proxy, RemoveNetwork(StrEq(kFirstNetworkPath)));
Paul Stewart35eff132013-04-12 12:08:40 -0700462 EXPECT_CALL(*mock_eap_service_, eap())
463 .WillOnce(Return(&mock_eap_credentials));
464 EXPECT_CALL(mock_eap_credentials, PopulateSupplicantProperties(_, _, _, _));
Paul Stewart9413bcc2013-04-04 16:12:43 -0700465 const char kSecondNetworkPath[] = "/network/second-path";
466 EXPECT_CALL(*interface_proxy, AddNetwork(_))
467 .WillOnce(Return(kSecondNetworkPath));
468 EXPECT_CALL(*interface_proxy, SelectNetwork(StrEq(kSecondNetworkPath)));
Paul Stewartbe9abfd2013-04-22 12:18:48 -0700469 EXPECT_CALL(*interface_proxy, EAPLogon());
Paul Stewart9413bcc2013-04-04 16:12:43 -0700470 EXPECT_TRUE(InvokeStartEapAuthentication());
471 EXPECT_EQ(kSecondNetworkPath, GetSupplicantNetworkPath());
472}
473
474TEST_F(EthernetTest, StopSupplicant) {
475 MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
Paul Stewartbe9abfd2013-04-22 12:18:48 -0700476 MockSupplicantInterfaceProxy *interface_proxy =
477 supplicant_interface_proxy_.get();
Paul Stewart9413bcc2013-04-04 16:12:43 -0700478 StartSupplicant();
479 SetIsEapAuthenticated(true);
480 SetSupplicantNetworkPath("/network/1");
Paul Stewartbe9abfd2013-04-22 12:18:48 -0700481 EXPECT_CALL(*interface_proxy, EAPLogoff());
Paul Stewart9413bcc2013-04-04 16:12:43 -0700482 EXPECT_CALL(*process_proxy, RemoveInterface(StrEq(kInterfacePath)));
483 InvokeStopSupplicant();
484 EXPECT_EQ(NULL, GetSupplicantInterfaceProxy());
485 EXPECT_EQ(NULL, GetSupplicantProcessProxy());
486 EXPECT_EQ("", GetSupplicantInterfacePath());
487 EXPECT_EQ("", GetSupplicantNetworkPath());
488 EXPECT_FALSE(GetIsEapAuthenticated());
489}
490
491TEST_F(EthernetTest, Certification) {
492 const string kSubjectName("subject-name");
493 const uint32 kDepth = 123;
494 // Should not crash due to no service_.
495 TriggerCertification(kSubjectName, kDepth);
496 EXPECT_CALL(*mock_service_, AddEAPCertification(kSubjectName, kDepth));
497 SetService(mock_service_);
498 TriggerCertification(kSubjectName, kDepth);
499}
500
Paul Stewartced3ad72013-04-03 13:39:25 -0700501} // namespace shill