blob: d98e64db156f4c4949f4d24f0ae5f3b6ef06da61 [file] [log] [blame]
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001// Copyright (c) 2010 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 <base/logging.h>
6#include <gtest/gtest.h>
mukesh agrawal88226ff2012-03-19 17:50:06 -07007#include <string>
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07008
9#include "update_engine/flimflam_proxy.h"
10#include "update_engine/mock_dbus_interface.h"
11
12using ::testing::_;
mukesh agrawal88226ff2012-03-19 17:50:06 -070013using ::testing::AnyNumber;
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070014using ::testing::Return;
15using ::testing::SetArgumentPointee;
16using ::testing::StrEq;
17
18namespace chromeos_update_engine {
19
20template<typename T, void F(T)>
21class ScopedRelease {
22 public:
23 ScopedRelease(T obj) : obj_(obj) {}
24 ~ScopedRelease() {
25 F(obj_);
26 }
27
28 private:
29 T obj_;
30};
31
32class FlimFlamProxyTest : public ::testing::Test {
mukesh agrawal88226ff2012-03-19 17:50:06 -070033 public:
34 FlimFlamProxyTest()
35 : kMockFlimFlamManagerProxy_(NULL),
36 kMockFlimFlamServiceProxy_(NULL),
37 kServicePath_(NULL) {}
38
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070039 protected:
mukesh agrawal88226ff2012-03-19 17:50:06 -070040 void SetupMocks(const char* service_path);
41 void SetManagerReply(gconstpointer value, const GType& type);
42 void SetServiceReply(const char* service_type);
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070043 void TestWithServiceType(
44 const char* service_type, NetworkConnectionType expected_type);
mukesh agrawal88226ff2012-03-19 17:50:06 -070045
46 static const char* kGetPropertiesMethod;
47 DBusGProxy* kMockFlimFlamManagerProxy_;
48 DBusGProxy* kMockFlimFlamServiceProxy_;
49 DBusGConnection* kMockSystemBus_;
50 const char* kServicePath_;
51 MockDbusGlib dbus_iface_;
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070052};
53
mukesh agrawal88226ff2012-03-19 17:50:06 -070054// static
55const char* FlimFlamProxyTest::kGetPropertiesMethod = "GetProperties";
56
57void FlimFlamProxyTest::SetupMocks(const char *service_path) {
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070058 int number = 1;
mukesh agrawal88226ff2012-03-19 17:50:06 -070059 kMockSystemBus_ = reinterpret_cast<DBusGConnection*>(number++);
60 kMockFlimFlamManagerProxy_ = reinterpret_cast<DBusGProxy*>(number++);
61 kMockFlimFlamServiceProxy_ = reinterpret_cast<DBusGProxy*>(number++);
62 ASSERT_NE(kMockSystemBus_, reinterpret_cast<DBusGConnection*>(NULL));
Andrew de los Reyes47851f42010-12-15 11:05:33 -080063
mukesh agrawal88226ff2012-03-19 17:50:06 -070064 kServicePath_ = service_path;
Andrew de los Reyes47851f42010-12-15 11:05:33 -080065
mukesh agrawal88226ff2012-03-19 17:50:06 -070066 ON_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
67 .WillByDefault(Return(kMockSystemBus_));
68 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
69 .Times(AnyNumber());
70}
Andrew de los Reyes47851f42010-12-15 11:05:33 -080071
mukesh agrawal88226ff2012-03-19 17:50:06 -070072void FlimFlamProxyTest::SetManagerReply(gconstpointer reply_value,
73 const GType &reply_type) {
74 // Initialize return value for D-Bus call to Manager object.
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070075 GHashTable* manager_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
Andrew de los Reyes47851f42010-12-15 11:05:33 -080076
mukesh agrawal88226ff2012-03-19 17:50:06 -070077 GArray* array = g_array_new(FALSE, FALSE, sizeof(const char *));
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070078 ASSERT_TRUE(array != NULL);
Andrew de los Reyes47851f42010-12-15 11:05:33 -080079
mukesh agrawal88226ff2012-03-19 17:50:06 -070080 EXPECT_EQ(array, g_array_append_val(array, reply_value));
81 GValue* array_as_value = g_new0(GValue, 1);
82 EXPECT_EQ(array_as_value,
83 g_value_init(array_as_value, reply_type));
84 g_value_take_boxed(array_as_value, array);
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070085 g_hash_table_insert(manager_hash_table,
86 const_cast<char*>("Services"),
mukesh agrawal88226ff2012-03-19 17:50:06 -070087 array_as_value);
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070088
mukesh agrawal88226ff2012-03-19 17:50:06 -070089 // Plumb return value into mock object.
90 EXPECT_CALL(dbus_iface_, ProxyCall(kMockFlimFlamManagerProxy_,
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070091 StrEq(kGetPropertiesMethod),
92 _,
93 G_TYPE_INVALID,
94 dbus_g_type_get_map("GHashTable",
95 G_TYPE_STRING,
96 G_TYPE_VALUE),
97 _,
98 G_TYPE_INVALID))
99 .WillOnce(DoAll(SetArgumentPointee<5>(manager_hash_table), Return(TRUE)));
100
mukesh agrawal88226ff2012-03-19 17:50:06 -0700101 // Set other expectations.
102 EXPECT_CALL(dbus_iface_,
103 ProxyNewForNameOwner(kMockSystemBus_,
104 StrEq(kFlimFlamDbusService),
105 StrEq(kFlimFlamDbusManagerPath),
106 StrEq(kFlimFlamDbusManagerInterface),
107 _))
108 .WillOnce(Return(kMockFlimFlamManagerProxy_));
109 EXPECT_CALL(dbus_iface_, ProxyUnref(kMockFlimFlamManagerProxy_));
110 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
111 .RetiresOnSaturation();
112}
113
114void FlimFlamProxyTest::SetServiceReply(const char *service_type) {
115 // Initialize return value for D-Bus call to Service object.
116 GHashTable* service_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
117
118 GValue* service_type_value = g_new0(GValue, 1);
119 EXPECT_EQ(service_type_value,
120 g_value_init(service_type_value, G_TYPE_STRING));
121 g_value_set_static_string(service_type_value, service_type);
122
123 g_hash_table_insert(service_hash_table,
124 const_cast<char*>("Type"),
125 service_type_value);
126
127 // Plumb return value into mock object.
128 EXPECT_CALL(dbus_iface_, ProxyCall(kMockFlimFlamServiceProxy_,
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700129 StrEq(kGetPropertiesMethod),
130 _,
131 G_TYPE_INVALID,
132 dbus_g_type_get_map("GHashTable",
133 G_TYPE_STRING,
134 G_TYPE_VALUE),
135 _,
136 G_TYPE_INVALID))
137 .WillOnce(DoAll(SetArgumentPointee<5>(service_hash_table), Return(TRUE)));
138
mukesh agrawal88226ff2012-03-19 17:50:06 -0700139 // Set other expectations.
140 EXPECT_CALL(dbus_iface_,
141 ProxyNewForNameOwner(kMockSystemBus_,
142 StrEq(kFlimFlamDbusService),
143 StrEq(kServicePath_),
144 StrEq(kFlimFlamDbusServiceInterface),
145 _))
146 .WillOnce(Return(kMockFlimFlamServiceProxy_));
147 EXPECT_CALL(dbus_iface_, ProxyUnref(kMockFlimFlamServiceProxy_));
148 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
149 .RetiresOnSaturation();
150}
Andrew de los Reyes47851f42010-12-15 11:05:33 -0800151
mukesh agrawal88226ff2012-03-19 17:50:06 -0700152void FlimFlamProxyTest::TestWithServiceType(
153 const char* service_type,
154 NetworkConnectionType expected_type) {
155
156 SetupMocks("/service/guest-network");
157 SetManagerReply(kServicePath_, DBUS_TYPE_G_OBJECT_PATH_ARRAY);
158 SetServiceReply(service_type);
159
160 NetworkConnectionType type;
161 EXPECT_TRUE(FlimFlamProxy::GetConnectionType(&dbus_iface_, &type));
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700162 EXPECT_EQ(expected_type, type);
163}
164
165TEST_F(FlimFlamProxyTest, SimpleTest) {
166 TestWithServiceType(kFlimFlamNetTypeEthernet, kNetEthernet);
167 TestWithServiceType(kFlimFlamNetTypeWifi, kNetWifi);
168 TestWithServiceType(kFlimFlamNetTypeWimax, kNetWimax);
169 TestWithServiceType(kFlimFlamNetTypeBluetooth, kNetBluetooth);
170 TestWithServiceType(kFlimFlamNetTypeCellular, kNetCellular);
171}
172
173TEST_F(FlimFlamProxyTest, UnknownTest) {
174 TestWithServiceType("foo", kNetUnknown);
175}
176
177TEST_F(FlimFlamProxyTest, ExpensiveConnectionsTest) {
178 EXPECT_FALSE(FlimFlamProxy::IsExpensiveConnectionType(kNetEthernet));
179 EXPECT_FALSE(FlimFlamProxy::IsExpensiveConnectionType(kNetWifi));
180 EXPECT_TRUE(FlimFlamProxy::IsExpensiveConnectionType(kNetWimax));
181 EXPECT_TRUE(FlimFlamProxy::IsExpensiveConnectionType(kNetBluetooth));
182 EXPECT_TRUE(FlimFlamProxy::IsExpensiveConnectionType(kNetCellular));
183}
184
185TEST_F(FlimFlamProxyTest, StringForConnectionTypeTest) {
Don Garrett2a4b4462011-12-15 17:52:01 -0800186 EXPECT_STREQ(kFlimFlamNetTypeEthernet,
187 FlimFlamProxy::StringForConnectionType(kNetEthernet));
188 EXPECT_STREQ(kFlimFlamNetTypeWifi,
189 FlimFlamProxy::StringForConnectionType(kNetWifi));
190 EXPECT_STREQ(kFlimFlamNetTypeWimax,
191 FlimFlamProxy::StringForConnectionType(kNetWimax));
192 EXPECT_STREQ(kFlimFlamNetTypeBluetooth,
193 FlimFlamProxy::StringForConnectionType(kNetBluetooth));
194 EXPECT_STREQ(kFlimFlamNetTypeCellular,
195 FlimFlamProxy::StringForConnectionType(kNetCellular));
196 EXPECT_STREQ("Unknown",
197 FlimFlamProxy::StringForConnectionType(kNetUnknown));
198 EXPECT_STREQ("Unknown",
199 FlimFlamProxy::StringForConnectionType(
200 static_cast<NetworkConnectionType>(999999)));
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700201}
202
mukesh agrawal88226ff2012-03-19 17:50:06 -0700203TEST_F(FlimFlamProxyTest, MalformedServiceList) {
204 SetupMocks("/service/guest-network");
205 std::string service_name(kServicePath_);
206 SetManagerReply(&service_name, DBUS_TYPE_G_STRING_ARRAY);
207
208 NetworkConnectionType type;
209 EXPECT_FALSE(FlimFlamProxy::GetConnectionType(&dbus_iface_, &type));
210}
211
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700212} // namespace chromeos_update_engine