blob: 5e18a320bba3dd20f14fa324a72e42d4b6de58f8 [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>
7
8#include "update_engine/flimflam_proxy.h"
9#include "update_engine/mock_dbus_interface.h"
10
11using ::testing::_;
12using ::testing::Return;
13using ::testing::SetArgumentPointee;
14using ::testing::StrEq;
15
16namespace chromeos_update_engine {
17
18template<typename T, void F(T)>
19class ScopedRelease {
20 public:
21 ScopedRelease(T obj) : obj_(obj) {}
22 ~ScopedRelease() {
23 F(obj_);
24 }
25
26 private:
27 T obj_;
28};
29
30class FlimFlamProxyTest : public ::testing::Test {
31 protected:
32 void TestWithServiceType(
33 const char* service_type, NetworkConnectionType expected_type);
34};
35
36void FlimFlamProxyTest::TestWithServiceType(
37 const char* service_type,
38 NetworkConnectionType expected_type) {
39 int number = 1;
40 DBusGConnection* kMockSystemBus =
41 reinterpret_cast<DBusGConnection*>(number++);
42 DBusGProxy* kMockFlimFlamManagerProxy =
43 reinterpret_cast<DBusGProxy*>(number++);
44 DBusGProxy* kMockFlimFlamServiceProxy =
45 reinterpret_cast<DBusGProxy*>(number++);
46 ASSERT_NE(kMockSystemBus, reinterpret_cast<DBusGConnection*>(NULL));
47 const char* kServicePath = "/foo/service";
48 const char kGetPropertiesMethod[] = "GetProperties";
Andrew de los Reyes47851f42010-12-15 11:05:33 -080049
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070050 MockDbusGlib dbus_iface;
Andrew de los Reyes47851f42010-12-15 11:05:33 -080051
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070052 EXPECT_CALL(dbus_iface,
53 ProxyNewForNameOwner(kMockSystemBus,
54 StrEq(kFlimFlamDbusService),
55 StrEq(kFlimFlamDbusManagerPath),
56 StrEq(kFlimFlamDbusManagerInterface),
57 _))
58 .WillOnce(Return(kMockFlimFlamManagerProxy));
59 EXPECT_CALL(dbus_iface,
60 ProxyNewForNameOwner(kMockSystemBus,
61 StrEq(kFlimFlamDbusService),
62 StrEq(kServicePath),
63 StrEq(kFlimFlamDbusServiceInterface),
64 _))
65 .WillOnce(Return(kMockFlimFlamServiceProxy));
Andrew de los Reyes47851f42010-12-15 11:05:33 -080066
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070067 EXPECT_CALL(dbus_iface, ProxyUnref(kMockFlimFlamManagerProxy));
68 EXPECT_CALL(dbus_iface, ProxyUnref(kMockFlimFlamServiceProxy));
69
70 EXPECT_CALL(dbus_iface, BusGet(DBUS_BUS_SYSTEM, _))
71 .Times(2)
72 .WillRepeatedly(Return(kMockSystemBus));
Andrew de los Reyes47851f42010-12-15 11:05:33 -080073
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070074 // Set up return value for first dbus call (to Manager object).
75 GHashTable* manager_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
Andrew de los Reyes47851f42010-12-15 11:05:33 -080076
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070077 GArray* array = g_array_new(FALSE, FALSE, sizeof(const char*));
78 ASSERT_TRUE(array != NULL);
Andrew de los Reyes47851f42010-12-15 11:05:33 -080079
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070080 EXPECT_EQ(array, g_array_append_val(array, kServicePath));
81 GValue array_value = {0, {{0}}};
82 EXPECT_EQ(&array_value, g_value_init(&array_value, G_TYPE_ARRAY));
83 g_value_take_boxed(&array_value, array);
84 g_hash_table_insert(manager_hash_table,
85 const_cast<char*>("Services"),
86 &array_value);
87
88 // Set up return value for second dbus call (to Service object).
89
90 GHashTable* service_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
Andrew de los Reyes47851f42010-12-15 11:05:33 -080091
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070092 GValue service_type_value = {0, {{0}}};
93 EXPECT_EQ(&service_type_value,
94 g_value_init(&service_type_value, G_TYPE_STRING));
95 g_value_set_static_string(&service_type_value, service_type);
Andrew de los Reyes47851f42010-12-15 11:05:33 -080096
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070097 g_hash_table_insert(service_hash_table,
98 const_cast<char*>("Type"),
99 &service_type_value);
100
101 EXPECT_CALL(dbus_iface, ProxyCall(kMockFlimFlamManagerProxy,
102 StrEq(kGetPropertiesMethod),
103 _,
104 G_TYPE_INVALID,
105 dbus_g_type_get_map("GHashTable",
106 G_TYPE_STRING,
107 G_TYPE_VALUE),
108 _,
109 G_TYPE_INVALID))
110 .WillOnce(DoAll(SetArgumentPointee<5>(manager_hash_table), Return(TRUE)));
111
112 EXPECT_CALL(dbus_iface, ProxyCall(kMockFlimFlamServiceProxy,
113 StrEq(kGetPropertiesMethod),
114 _,
115 G_TYPE_INVALID,
116 dbus_g_type_get_map("GHashTable",
117 G_TYPE_STRING,
118 G_TYPE_VALUE),
119 _,
120 G_TYPE_INVALID))
121 .WillOnce(DoAll(SetArgumentPointee<5>(service_hash_table), Return(TRUE)));
122
123 NetworkConnectionType type;
Andrew de los Reyes47851f42010-12-15 11:05:33 -0800124
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700125 EXPECT_TRUE(FlimFlamProxy::GetConnectionType(&dbus_iface, &type));
126 EXPECT_EQ(expected_type, type);
127}
128
129TEST_F(FlimFlamProxyTest, SimpleTest) {
130 TestWithServiceType(kFlimFlamNetTypeEthernet, kNetEthernet);
131 TestWithServiceType(kFlimFlamNetTypeWifi, kNetWifi);
132 TestWithServiceType(kFlimFlamNetTypeWimax, kNetWimax);
133 TestWithServiceType(kFlimFlamNetTypeBluetooth, kNetBluetooth);
134 TestWithServiceType(kFlimFlamNetTypeCellular, kNetCellular);
135}
136
137TEST_F(FlimFlamProxyTest, UnknownTest) {
138 TestWithServiceType("foo", kNetUnknown);
139}
140
141TEST_F(FlimFlamProxyTest, ExpensiveConnectionsTest) {
142 EXPECT_FALSE(FlimFlamProxy::IsExpensiveConnectionType(kNetEthernet));
143 EXPECT_FALSE(FlimFlamProxy::IsExpensiveConnectionType(kNetWifi));
144 EXPECT_TRUE(FlimFlamProxy::IsExpensiveConnectionType(kNetWimax));
145 EXPECT_TRUE(FlimFlamProxy::IsExpensiveConnectionType(kNetBluetooth));
146 EXPECT_TRUE(FlimFlamProxy::IsExpensiveConnectionType(kNetCellular));
147}
148
149TEST_F(FlimFlamProxyTest, StringForConnectionTypeTest) {
150 EXPECT_EQ(kFlimFlamNetTypeEthernet,
151 FlimFlamProxy::StringForConnectionType(kNetEthernet));
152 EXPECT_EQ(kFlimFlamNetTypeWifi,
153 FlimFlamProxy::StringForConnectionType(kNetWifi));
154 EXPECT_EQ(kFlimFlamNetTypeWimax,
155 FlimFlamProxy::StringForConnectionType(kNetWimax));
156 EXPECT_EQ(kFlimFlamNetTypeBluetooth,
157 FlimFlamProxy::StringForConnectionType(kNetBluetooth));
158 EXPECT_EQ(kFlimFlamNetTypeCellular,
159 FlimFlamProxy::StringForConnectionType(kNetCellular));
160 EXPECT_EQ("Unknown", FlimFlamProxy::StringForConnectionType(kNetUnknown));
161 EXPECT_EQ("Unknown", FlimFlamProxy::StringForConnectionType(
162 static_cast<NetworkConnectionType>(999999)));
163}
164
165} // namespace chromeos_update_engine