blob: bac4b8cb314ce7c7e79b056e1d5be8df6760d4b5 [file] [log] [blame]
Chris Masone9be4a9d2011-05-16 15:44:09 -07001// Copyright (c) 2011 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.
Darin Petkov633ac6f2011-07-08 13:56:13 -07004
Chris Masone2aa97072011-08-09 17:35:08 -07005#include "shill/device_info.h"
6
Chris Masone9be4a9d2011-05-16 15:44:09 -07007#include <glib.h>
Darin Petkov633ac6f2011-07-08 13:56:13 -07008#include <sys/socket.h>
Darin Petkove6193c02011-08-11 12:42:40 -07009#include <linux/if.h>
Darin Petkov633ac6f2011-07-08 13:56:13 -070010#include <linux/netlink.h> // Needs typedefs from sys/socket.h.
11#include <linux/rtnetlink.h>
Chris Masone9be4a9d2011-05-16 15:44:09 -070012
13#include <base/callback_old.h>
14#include <base/logging.h>
15#include <base/memory/ref_counted.h>
16#include <base/message_loop.h>
Darin Petkov633ac6f2011-07-08 13:56:13 -070017#include <base/stl_util-inl.h>
Chris Masone9be4a9d2011-05-16 15:44:09 -070018#include <gtest/gtest.h>
19#include <gmock/gmock.h>
20
Paul Stewartb50f0b92011-05-16 16:31:42 -070021#include "shill/manager.h"
Chris Masone46eaaf52011-05-24 13:08:30 -070022#include "shill/mock_control.h"
Darin Petkovafa6fc42011-06-21 16:21:08 -070023#include "shill/mock_glib.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070024#include "shill/mock_manager.h"
Darin Petkov633ac6f2011-07-08 13:56:13 -070025#include "shill/mock_sockets.h"
Paul Stewarta3c56f92011-05-26 07:08:52 -070026#include "shill/rtnl_handler.h"
Chris Masone2aa97072011-08-09 17:35:08 -070027#include "shill/rtnl_message.h"
Chris Masone9be4a9d2011-05-16 15:44:09 -070028
Darin Petkove6193c02011-08-11 12:42:40 -070029using std::map;
Darin Petkov633ac6f2011-07-08 13:56:13 -070030using std::string;
31using testing::_;
32using testing::Return;
33using testing::Test;
34
Chris Masone9be4a9d2011-05-16 15:44:09 -070035namespace shill {
Darin Petkov633ac6f2011-07-08 13:56:13 -070036
37class TestEventDispatcher : public EventDispatcher {
38 public:
39 virtual IOInputHandler *CreateInputHandler(
40 int fd,
41 Callback1<InputData*>::Type *callback) {
42 return NULL;
43 }
44};
Chris Masone9be4a9d2011-05-16 15:44:09 -070045
46class DeviceInfoTest : public Test {
47 public:
48 DeviceInfoTest()
Darin Petkov887f2982011-07-14 16:10:17 -070049 : manager_(&control_interface_, &dispatcher_, &glib_),
Chris Masone2aa97072011-08-09 17:35:08 -070050 device_info_(&control_interface_, &dispatcher_, &manager_) {
Chris Masone9be4a9d2011-05-16 15:44:09 -070051 }
Darin Petkov633ac6f2011-07-08 13:56:13 -070052
Paul Stewarta3c56f92011-05-26 07:08:52 -070053 protected:
Chris Masoneb2e326b2011-07-12 13:28:51 -070054 static const int kTestDeviceIndex;
Darin Petkov633ac6f2011-07-08 13:56:13 -070055 static const char kTestDeviceName[];
Darin Petkove3e1cfa2011-08-11 13:41:17 -070056 static const char kTestAddress[];
Darin Petkov633ac6f2011-07-08 13:56:13 -070057
Chris Masone2aa97072011-08-09 17:35:08 -070058 RTNLMessage *BuildMessage(RTNLMessage::MessageType type,
59 RTNLMessage::MessageMode mode);
60 void SendMessageToDeviceInfo(const RTNLMessage &message);
Darin Petkov633ac6f2011-07-08 13:56:13 -070061
Darin Petkovafa6fc42011-06-21 16:21:08 -070062 MockGLib glib_;
Chris Masone46eaaf52011-05-24 13:08:30 -070063 MockControl control_interface_;
Chris Masone2ae797d2011-08-23 20:41:00 -070064 MockManager manager_;
Chris Masone9be4a9d2011-05-16 15:44:09 -070065 DeviceInfo device_info_;
Darin Petkov633ac6f2011-07-08 13:56:13 -070066 TestEventDispatcher dispatcher_;
Chris Masone9be4a9d2011-05-16 15:44:09 -070067};
68
Chris Masoneb2e326b2011-07-12 13:28:51 -070069const int DeviceInfoTest::kTestDeviceIndex = 123456;
Darin Petkov633ac6f2011-07-08 13:56:13 -070070const char DeviceInfoTest::kTestDeviceName[] = "test-device";
Darin Petkove3e1cfa2011-08-11 13:41:17 -070071const char DeviceInfoTest::kTestAddress[] = {
72 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
Chris Masone9be4a9d2011-05-16 15:44:09 -070073
Chris Masone2aa97072011-08-09 17:35:08 -070074RTNLMessage *DeviceInfoTest::BuildMessage(RTNLMessage::MessageType type,
75 RTNLMessage::MessageMode mode) {
76 RTNLMessage *message = new RTNLMessage(type, mode, 0, 0, 0, kTestDeviceIndex,
77 IPAddress::kAddressFamilyIPv4);
78 message->SetAttribute(static_cast<uint16>(IFLA_IFNAME),
79 ByteString(kTestDeviceName, true));
Chris Masone626719f2011-08-18 16:58:48 -070080 ByteString test_address(kTestAddress, sizeof(kTestAddress));
81 message->SetAttribute(IFLA_ADDRESS, test_address);
Chris Masone2aa97072011-08-09 17:35:08 -070082 return message;
Darin Petkov633ac6f2011-07-08 13:56:13 -070083}
84
Chris Masone2aa97072011-08-09 17:35:08 -070085void DeviceInfoTest::SendMessageToDeviceInfo(const RTNLMessage &message) {
86 device_info_.LinkMsgHandler(message);
Darin Petkov633ac6f2011-07-08 13:56:13 -070087}
88
89TEST_F(DeviceInfoTest, DeviceEnumeration) {
Paul Stewarta3c56f92011-05-26 07:08:52 -070090 // Start our own private device_info
Chris Masone9be4a9d2011-05-16 15:44:09 -070091 device_info_.Start();
Chris Masone2aa97072011-08-09 17:35:08 -070092 scoped_ptr<RTNLMessage> message(BuildMessage(RTNLMessage::kMessageTypeLink,
93 RTNLMessage::kMessageModeAdd));
Darin Petkove6193c02011-08-11 12:42:40 -070094 message->set_link_status(RTNLMessage::LinkStatus(0, IFF_LOWER_UP, 0));
95 EXPECT_FALSE(device_info_.GetDevice(kTestDeviceIndex).get());
96 SendMessageToDeviceInfo(*message);
97 EXPECT_TRUE(device_info_.GetDevice(kTestDeviceIndex).get());
98 unsigned int flags = 0;
99 EXPECT_TRUE(device_info_.GetFlags(kTestDeviceIndex, &flags));
100 EXPECT_EQ(IFF_LOWER_UP, flags);
Darin Petkove3e1cfa2011-08-11 13:41:17 -0700101 ByteString address;
102 EXPECT_TRUE(device_info_.GetAddress(kTestDeviceIndex, &address));
103 EXPECT_FALSE(address.IsEmpty());
Chris Masone626719f2011-08-18 16:58:48 -0700104 EXPECT_TRUE(address.Equals(ByteString(kTestAddress, sizeof(kTestAddress))));
Paul Stewarta3c56f92011-05-26 07:08:52 -0700105
Darin Petkove6193c02011-08-11 12:42:40 -0700106 message.reset(BuildMessage(RTNLMessage::kMessageTypeLink,
107 RTNLMessage::kMessageModeAdd));
108 message->set_link_status(RTNLMessage::LinkStatus(0, IFF_UP | IFF_RUNNING, 0));
109 SendMessageToDeviceInfo(*message);
110 EXPECT_TRUE(device_info_.GetFlags(kTestDeviceIndex, &flags));
111 EXPECT_EQ(IFF_UP | IFF_RUNNING, flags);
Paul Stewartb50f0b92011-05-16 16:31:42 -0700112
Chris Masone2aa97072011-08-09 17:35:08 -0700113 message.reset(BuildMessage(RTNLMessage::kMessageTypeLink,
114 RTNLMessage::kMessageModeDelete));
Darin Petkove6193c02011-08-11 12:42:40 -0700115 SendMessageToDeviceInfo(*message);
116 EXPECT_FALSE(device_info_.GetDevice(kTestDeviceIndex).get());
117 EXPECT_FALSE(device_info_.GetFlags(kTestDeviceIndex, NULL));
Paul Stewarta3c56f92011-05-26 07:08:52 -0700118
Paul Stewarta3c56f92011-05-26 07:08:52 -0700119 device_info_.Stop();
Chris Masone9be4a9d2011-05-16 15:44:09 -0700120}
121
mukesh agrawal8f317b62011-07-15 11:53:23 -0700122TEST_F(DeviceInfoTest, DeviceBlackList) {
123 device_info_.AddDeviceToBlackList(kTestDeviceName);
124 device_info_.Start();
Chris Masone2aa97072011-08-09 17:35:08 -0700125 scoped_ptr<RTNLMessage> message(BuildMessage(RTNLMessage::kMessageTypeLink,
126 RTNLMessage::kMessageModeAdd));
Darin Petkove6193c02011-08-11 12:42:40 -0700127 SendMessageToDeviceInfo(*message);
mukesh agrawal8f317b62011-07-15 11:53:23 -0700128
Darin Petkove6193c02011-08-11 12:42:40 -0700129 DeviceRefPtr device = device_info_.GetDevice(kTestDeviceIndex);
130 ASSERT_TRUE(device.get());
131 EXPECT_TRUE(device->TechnologyIs(Device::kBlacklisted));
mukesh agrawal8f317b62011-07-15 11:53:23 -0700132
mukesh agrawal8f317b62011-07-15 11:53:23 -0700133 device_info_.Stop();
134}
135
Chris Masone9be4a9d2011-05-16 15:44:09 -0700136} // namespace shill