blob: 05c700faa33bb128c4be4e2f8e2b37d0b5667c99 [file] [log] [blame]
Jay Srinivasan43488792012-06-19 00:25:31 -07001// Copyright (c) 2012 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
Alex Deymo8427b4a2014-11-05 14:00:32 -08005#include "update_engine/connection_manager.h"
6
Alex Vakulenkod2779df2014-06-16 13:19:00 -07007#include <set>
8#include <string>
9
Jay Srinivasan43488792012-06-19 00:25:31 -070010#include <base/logging.h>
11#include <chromeos/dbus/service_constants.h>
Alex Deymo5665d0c2014-05-28 17:45:43 -070012#include <gmock/gmock.h>
Jay Srinivasan43488792012-06-19 00:25:31 -070013#include <gtest/gtest.h>
Jay Srinivasan43488792012-06-19 00:25:31 -070014
Gilad Arnold5bb4c902014-04-10 12:32:13 -070015#include "update_engine/fake_system_state.h"
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080016#include "update_engine/mock_dbus_wrapper.h"
Alex Deymo5665d0c2014-05-28 17:45:43 -070017#include "update_engine/test_utils.h"
Jay Srinivasan43488792012-06-19 00:25:31 -070018
19using std::set;
20using std::string;
Jay Srinivasan43488792012-06-19 00:25:31 -070021using testing::AnyNumber;
22using testing::Return;
23using testing::SetArgumentPointee;
24using testing::StrEq;
Alex Deymof329b932014-10-30 01:37:48 -070025using testing::_;
Jay Srinivasan43488792012-06-19 00:25:31 -070026
27namespace chromeos_update_engine {
28
29class ConnectionManagerTest : public ::testing::Test {
30 public:
31 ConnectionManagerTest()
Alex Vakulenko88b591f2014-08-28 16:48:57 -070032 : kMockFlimFlamManagerProxy_(nullptr),
33 kMockFlimFlamServiceProxy_(nullptr),
34 kServicePath_(nullptr),
Gilad Arnold5bb4c902014-04-10 12:32:13 -070035 cmut_(&fake_system_state_) {
36 fake_system_state_.set_connection_manager(&cmut_);
Jay Srinivasan43488792012-06-19 00:25:31 -070037 }
38
39 protected:
40 void SetupMocks(const char* service_path);
Alex Deymo5665d0c2014-05-28 17:45:43 -070041 void SetManagerReply(const char* reply_value, const GType& reply_type);
Alex Deymo1c4e6382013-07-15 12:09:51 -070042
43 // Sets the |service_type| Type and the |physical_technology|
Alex Vakulenko88b591f2014-08-28 16:48:57 -070044 // PhysicalTechnology properties in the mocked service. If a null
Alex Deymo1c4e6382013-07-15 12:09:51 -070045 // |physical_technology| is passed, the property is not set (not present).
46 void SetServiceReply(const char* service_type,
Alex Deymo6ae91202014-03-10 19:21:25 -070047 const char* physical_technology,
48 const char* service_tethering);
Jay Srinivasan43488792012-06-19 00:25:31 -070049 void TestWithServiceType(
Alex Deymo1c4e6382013-07-15 12:09:51 -070050 const char* service_type,
51 const char* physical_technology,
52 NetworkConnectionType expected_type);
Alex Deymo6ae91202014-03-10 19:21:25 -070053 void TestWithServiceTethering(
54 const char* service_tethering,
55 NetworkTethering expected_tethering);
Jay Srinivasan43488792012-06-19 00:25:31 -070056
57 static const char* kGetPropertiesMethod;
58 DBusGProxy* kMockFlimFlamManagerProxy_;
59 DBusGProxy* kMockFlimFlamServiceProxy_;
60 DBusGConnection* kMockSystemBus_;
61 const char* kServicePath_;
Alex Deymo5665d0c2014-05-28 17:45:43 -070062 testing::StrictMock<MockDBusWrapper> dbus_iface_;
Jay Srinivasan43488792012-06-19 00:25:31 -070063 ConnectionManager cmut_; // ConnectionManager under test.
Gilad Arnold5bb4c902014-04-10 12:32:13 -070064 FakeSystemState fake_system_state_;
Jay Srinivasan43488792012-06-19 00:25:31 -070065};
66
67// static
68const char* ConnectionManagerTest::kGetPropertiesMethod = "GetProperties";
69
70void ConnectionManagerTest::SetupMocks(const char* service_path) {
71 int number = 1;
72 kMockSystemBus_ = reinterpret_cast<DBusGConnection*>(number++);
73 kMockFlimFlamManagerProxy_ = reinterpret_cast<DBusGProxy*>(number++);
74 kMockFlimFlamServiceProxy_ = reinterpret_cast<DBusGProxy*>(number++);
Alex Vakulenko88b591f2014-08-28 16:48:57 -070075 ASSERT_NE(kMockSystemBus_, static_cast<DBusGConnection*>(nullptr));
Jay Srinivasan43488792012-06-19 00:25:31 -070076
77 kServicePath_ = service_path;
78
79 ON_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
80 .WillByDefault(Return(kMockSystemBus_));
81 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
82 .Times(AnyNumber());
83}
84
Alex Deymo5665d0c2014-05-28 17:45:43 -070085void ConnectionManagerTest::SetManagerReply(const char *reply_value,
Jay Srinivasan43488792012-06-19 00:25:31 -070086 const GType& reply_type) {
Alex Deymo5665d0c2014-05-28 17:45:43 -070087 ASSERT_TRUE(dbus_g_type_is_collection(reply_type));
Jay Srinivasan43488792012-06-19 00:25:31 -070088
Alex Deymo5665d0c2014-05-28 17:45:43 -070089 // Create the GPtrArray array holding the |reply_value| pointer. The
90 // |reply_value| string is duplicated because it should be mutable on the
91 // interface and is because dbus-glib collections will g_free() each element
92 // of the GPtrArray automatically when the |array_as_value| GValue is unset.
93 // The g_strdup() is not being leaked.
94 GPtrArray* array = g_ptr_array_new();
Alex Vakulenko88b591f2014-08-28 16:48:57 -070095 ASSERT_NE(nullptr, array);
Alex Deymo5665d0c2014-05-28 17:45:43 -070096 g_ptr_array_add(array, g_strdup(reply_value));
Jay Srinivasan43488792012-06-19 00:25:31 -070097
Jay Srinivasan43488792012-06-19 00:25:31 -070098 GValue* array_as_value = g_new0(GValue, 1);
99 EXPECT_EQ(array_as_value, g_value_init(array_as_value, reply_type));
100 g_value_take_boxed(array_as_value, array);
Alex Deymo5665d0c2014-05-28 17:45:43 -0700101
102 // Initialize return value for D-Bus call to Manager object, which is a
103 // hash table of static strings (char*) in GValue* containing a single array.
104 GHashTable* manager_hash_table = g_hash_table_new_full(
105 g_str_hash, g_str_equal,
106 nullptr, // no key_destroy_func because keys are static.
107 GValueFree); // value_destroy_func
Jay Srinivasan43488792012-06-19 00:25:31 -0700108 g_hash_table_insert(manager_hash_table,
109 const_cast<char*>("Services"),
110 array_as_value);
111
112 // Plumb return value into mock object.
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800113 EXPECT_CALL(dbus_iface_, ProxyCall_0_1(kMockFlimFlamManagerProxy_,
114 StrEq(kGetPropertiesMethod),
115 _, _))
116 .WillOnce(DoAll(SetArgumentPointee<3>(manager_hash_table), Return(TRUE)));
Jay Srinivasan43488792012-06-19 00:25:31 -0700117
118 // Set other expectations.
119 EXPECT_CALL(dbus_iface_,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800120 ProxyNewForName(kMockSystemBus_,
121 StrEq(shill::kFlimflamServiceName),
122 StrEq(shill::kFlimflamServicePath),
123 StrEq(shill::kFlimflamManagerInterface)))
Jay Srinivasan43488792012-06-19 00:25:31 -0700124 .WillOnce(Return(kMockFlimFlamManagerProxy_));
125 EXPECT_CALL(dbus_iface_, ProxyUnref(kMockFlimFlamManagerProxy_));
126 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
127 .RetiresOnSaturation();
128}
129
Alex Deymo1c4e6382013-07-15 12:09:51 -0700130void ConnectionManagerTest::SetServiceReply(const char* service_type,
Alex Deymo6ae91202014-03-10 19:21:25 -0700131 const char* physical_technology,
132 const char* service_tethering) {
Alex Deymo5665d0c2014-05-28 17:45:43 -0700133 // Initialize return value for D-Bus call to Service object, which is a
134 // hash table of static strings (char*) in GValue*.
135 GHashTable* service_hash_table = g_hash_table_new_full(
136 g_str_hash, g_str_equal,
137 nullptr, // no key_destroy_func because keys are static.
138 GValueFree); // value_destroy_func
139 GValue* service_type_value = GValueNewString(service_type);
Jay Srinivasan43488792012-06-19 00:25:31 -0700140 g_hash_table_insert(service_hash_table,
141 const_cast<char*>("Type"),
142 service_type_value);
143
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700144 if (physical_technology) {
Alex Deymo5665d0c2014-05-28 17:45:43 -0700145 GValue* physical_technology_value = GValueNewString(physical_technology);
Alex Deymo1c4e6382013-07-15 12:09:51 -0700146 g_hash_table_insert(service_hash_table,
147 const_cast<char*>("PhysicalTechnology"),
148 physical_technology_value);
149 }
150
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700151 if (service_tethering) {
Alex Deymo5665d0c2014-05-28 17:45:43 -0700152 GValue* service_tethering_value = GValueNewString(service_tethering);
Alex Deymo6ae91202014-03-10 19:21:25 -0700153 g_hash_table_insert(service_hash_table,
154 const_cast<char*>("Tethering"),
155 service_tethering_value);
156 }
157
Jay Srinivasan43488792012-06-19 00:25:31 -0700158 // Plumb return value into mock object.
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800159 EXPECT_CALL(dbus_iface_, ProxyCall_0_1(kMockFlimFlamServiceProxy_,
160 StrEq(kGetPropertiesMethod),
161 _, _))
162 .WillOnce(DoAll(SetArgumentPointee<3>(service_hash_table), Return(TRUE)));
Jay Srinivasan43488792012-06-19 00:25:31 -0700163
164 // Set other expectations.
165 EXPECT_CALL(dbus_iface_,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800166 ProxyNewForName(kMockSystemBus_,
167 StrEq(shill::kFlimflamServiceName),
168 StrEq(kServicePath_),
169 StrEq(shill::kFlimflamServiceInterface)))
Jay Srinivasan43488792012-06-19 00:25:31 -0700170 .WillOnce(Return(kMockFlimFlamServiceProxy_));
171 EXPECT_CALL(dbus_iface_, ProxyUnref(kMockFlimFlamServiceProxy_));
172 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
173 .RetiresOnSaturation();
174}
175
176void ConnectionManagerTest::TestWithServiceType(
177 const char* service_type,
Alex Deymo1c4e6382013-07-15 12:09:51 -0700178 const char* physical_technology,
Jay Srinivasan43488792012-06-19 00:25:31 -0700179 NetworkConnectionType expected_type) {
180
181 SetupMocks("/service/guest-network");
182 SetManagerReply(kServicePath_, DBUS_TYPE_G_OBJECT_PATH_ARRAY);
Alex Deymo6ae91202014-03-10 19:21:25 -0700183 SetServiceReply(service_type, physical_technology,
184 shill::kTetheringNotDetectedState);
Jay Srinivasan43488792012-06-19 00:25:31 -0700185
186 NetworkConnectionType type;
Alex Deymo6ae91202014-03-10 19:21:25 -0700187 NetworkTethering tethering;
188 EXPECT_TRUE(cmut_.GetConnectionProperties(&dbus_iface_, &type, &tethering));
Jay Srinivasan43488792012-06-19 00:25:31 -0700189 EXPECT_EQ(expected_type, type);
Alex Deymo5665d0c2014-05-28 17:45:43 -0700190 testing::Mock::VerifyAndClearExpectations(&dbus_iface_);
Jay Srinivasan43488792012-06-19 00:25:31 -0700191}
192
Alex Deymo6ae91202014-03-10 19:21:25 -0700193void ConnectionManagerTest::TestWithServiceTethering(
194 const char* service_tethering,
195 NetworkTethering expected_tethering) {
196
197 SetupMocks("/service/guest-network");
198 SetManagerReply(kServicePath_, DBUS_TYPE_G_OBJECT_PATH_ARRAY);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700199 SetServiceReply(shill::kTypeWifi, nullptr, service_tethering);
Alex Deymo6ae91202014-03-10 19:21:25 -0700200
201 NetworkConnectionType type;
202 NetworkTethering tethering;
203 EXPECT_TRUE(cmut_.GetConnectionProperties(&dbus_iface_, &type, &tethering));
204 EXPECT_EQ(expected_tethering, tethering);
205}
206
Jay Srinivasan43488792012-06-19 00:25:31 -0700207TEST_F(ConnectionManagerTest, SimpleTest) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700208 TestWithServiceType(shill::kTypeEthernet, nullptr, kNetEthernet);
209 TestWithServiceType(shill::kTypeWifi, nullptr, kNetWifi);
210 TestWithServiceType(shill::kTypeWimax, nullptr, kNetWimax);
211 TestWithServiceType(shill::kTypeBluetooth, nullptr, kNetBluetooth);
212 TestWithServiceType(shill::kTypeCellular, nullptr, kNetCellular);
Alex Deymo1c4e6382013-07-15 12:09:51 -0700213}
214
215TEST_F(ConnectionManagerTest, PhysicalTechnologyTest) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700216 TestWithServiceType(shill::kTypeVPN, nullptr, kNetUnknown);
Ben Chanc6007e42013-09-19 23:49:22 -0700217 TestWithServiceType(shill::kTypeVPN, shill::kTypeVPN, kNetUnknown);
218 TestWithServiceType(shill::kTypeVPN, shill::kTypeWifi, kNetWifi);
219 TestWithServiceType(shill::kTypeVPN, shill::kTypeWimax, kNetWimax);
Jay Srinivasan43488792012-06-19 00:25:31 -0700220}
221
Alex Deymo6ae91202014-03-10 19:21:25 -0700222TEST_F(ConnectionManagerTest, TetheringTest) {
223 TestWithServiceTethering(shill::kTetheringConfirmedState,
224 NetworkTethering::kConfirmed);
225 TestWithServiceTethering(shill::kTetheringNotDetectedState,
226 NetworkTethering::kNotDetected);
227 TestWithServiceTethering(shill::kTetheringSuspectedState,
228 NetworkTethering::kSuspected);
229 TestWithServiceTethering("I'm not a valid property value =)",
230 NetworkTethering::kUnknown);
231}
232
Jay Srinivasan43488792012-06-19 00:25:31 -0700233TEST_F(ConnectionManagerTest, UnknownTest) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700234 TestWithServiceType("foo", nullptr, kNetUnknown);
Jay Srinivasan43488792012-06-19 00:25:31 -0700235}
236
237TEST_F(ConnectionManagerTest, AllowUpdatesOverEthernetTest) {
Jay Srinivasan43488792012-06-19 00:25:31 -0700238 // Updates over Ethernet are allowed even if there's no policy.
Alex Deymo6ae91202014-03-10 19:21:25 -0700239 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet,
240 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700241}
242
243TEST_F(ConnectionManagerTest, AllowUpdatesOverWifiTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700244 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi, NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700245}
246
247TEST_F(ConnectionManagerTest, AllowUpdatesOverWimaxTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700248 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWimax,
249 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700250}
251
252TEST_F(ConnectionManagerTest, BlockUpdatesOverBluetoothTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700253 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetBluetooth,
254 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700255}
256
257TEST_F(ConnectionManagerTest, AllowUpdatesOnlyOver3GPerPolicyTest) {
258 policy::MockDevicePolicy allow_3g_policy;
259
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700260 fake_system_state_.set_device_policy(&allow_3g_policy);
Jay Srinivasan43488792012-06-19 00:25:31 -0700261
Alex Deymof4867c42013-06-28 14:41:39 -0700262 // This test tests cellular (3G) being the only connection type being allowed.
Jay Srinivasan43488792012-06-19 00:25:31 -0700263 set<string> allowed_set;
264 allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
265
266 EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
267 .Times(1)
268 .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
269
Alex Deymo6ae91202014-03-10 19:21:25 -0700270 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetCellular,
271 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700272}
273
274TEST_F(ConnectionManagerTest, AllowUpdatesOver3GAndOtherTypesPerPolicyTest) {
275 policy::MockDevicePolicy allow_3g_policy;
276
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700277 fake_system_state_.set_device_policy(&allow_3g_policy);
Jay Srinivasan43488792012-06-19 00:25:31 -0700278
279 // This test tests multiple connection types being allowed, with
Alex Deymof4867c42013-06-28 14:41:39 -0700280 // 3G one among them. Only Cellular is currently enforced by the policy
281 // setting, the others are ignored (see Bluetooth for example).
Jay Srinivasan43488792012-06-19 00:25:31 -0700282 set<string> allowed_set;
Jay Srinivasan43488792012-06-19 00:25:31 -0700283 allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
Alex Deymof4867c42013-06-28 14:41:39 -0700284 allowed_set.insert(cmut_.StringForConnectionType(kNetBluetooth));
Jay Srinivasan43488792012-06-19 00:25:31 -0700285
286 EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
Alex Deymo6ae91202014-03-10 19:21:25 -0700287 .Times(3)
288 .WillRepeatedly(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
Jay Srinivasan43488792012-06-19 00:25:31 -0700289
Alex Deymo6ae91202014-03-10 19:21:25 -0700290 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet,
291 NetworkTethering::kUnknown));
292 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet,
293 NetworkTethering::kNotDetected));
294 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetCellular,
295 NetworkTethering::kUnknown));
296 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi, NetworkTethering::kUnknown));
297 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWimax, NetworkTethering::kUnknown));
298 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetBluetooth,
299 NetworkTethering::kUnknown));
300
301 // Tethered networks are treated in the same way as Cellular networks and
302 // thus allowed.
303 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet,
304 NetworkTethering::kConfirmed));
305 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi,
306 NetworkTethering::kConfirmed));
Jay Srinivasan43488792012-06-19 00:25:31 -0700307}
308
Alex Deymof4867c42013-06-28 14:41:39 -0700309TEST_F(ConnectionManagerTest, BlockUpdatesOverCellularByDefaultTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700310 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
311 NetworkTethering::kUnknown));
312}
313
314TEST_F(ConnectionManagerTest, BlockUpdatesOverTetheredNetworkByDefaultTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700315 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetWifi,
316 NetworkTethering::kConfirmed));
317 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetEthernet,
318 NetworkTethering::kConfirmed));
319 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi,
320 NetworkTethering::kSuspected));
Jay Srinivasan43488792012-06-19 00:25:31 -0700321}
322
323TEST_F(ConnectionManagerTest, BlockUpdatesOver3GPerPolicyTest) {
324 policy::MockDevicePolicy block_3g_policy;
325
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700326 fake_system_state_.set_device_policy(&block_3g_policy);
Jay Srinivasan43488792012-06-19 00:25:31 -0700327
328 // Test that updates for 3G are blocked while updates are allowed
329 // over several other types.
330 set<string> allowed_set;
331 allowed_set.insert(cmut_.StringForConnectionType(kNetEthernet));
332 allowed_set.insert(cmut_.StringForConnectionType(kNetWifi));
333 allowed_set.insert(cmut_.StringForConnectionType(kNetWimax));
334
335 EXPECT_CALL(block_3g_policy, GetAllowedConnectionTypesForUpdate(_))
336 .Times(1)
337 .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
338
Alex Deymo6ae91202014-03-10 19:21:25 -0700339 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
340 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700341}
342
343TEST_F(ConnectionManagerTest, BlockUpdatesOver3GIfErrorInPolicyFetchTest) {
344 policy::MockDevicePolicy allow_3g_policy;
345
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700346 fake_system_state_.set_device_policy(&allow_3g_policy);
Jay Srinivasan43488792012-06-19 00:25:31 -0700347
348 set<string> allowed_set;
349 allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
350
351 // Return false for GetAllowedConnectionTypesForUpdate and see
352 // that updates are still blocked for 3G despite the value being in
353 // the string set above.
354 EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
355 .Times(1)
356 .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(false)));
357
Alex Deymo6ae91202014-03-10 19:21:25 -0700358 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
359 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700360}
361
Alex Deymof4867c42013-06-28 14:41:39 -0700362TEST_F(ConnectionManagerTest, UseUserPrefForUpdatesOverCellularIfNoPolicyTest) {
363 policy::MockDevicePolicy no_policy;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800364 testing::NiceMock<MockPrefs>* prefs = fake_system_state_.mock_prefs();
Alex Deymof4867c42013-06-28 14:41:39 -0700365
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700366 fake_system_state_.set_device_policy(&no_policy);
Alex Deymof4867c42013-06-28 14:41:39 -0700367
368 // No setting enforced by the device policy, user prefs should be used.
369 EXPECT_CALL(no_policy, GetAllowedConnectionTypesForUpdate(_))
370 .Times(3)
371 .WillRepeatedly(Return(false));
372
373 // No user pref: block.
374 EXPECT_CALL(*prefs, Exists(kPrefsUpdateOverCellularPermission))
375 .Times(1)
376 .WillOnce(Return(false));
Alex Deymo6ae91202014-03-10 19:21:25 -0700377 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
378 NetworkTethering::kUnknown));
Alex Deymof4867c42013-06-28 14:41:39 -0700379
380 // Allow per user pref.
381 EXPECT_CALL(*prefs, Exists(kPrefsUpdateOverCellularPermission))
382 .Times(1)
383 .WillOnce(Return(true));
Alex Deymoefb7c4c2013-07-09 14:34:00 -0700384 EXPECT_CALL(*prefs, GetBoolean(kPrefsUpdateOverCellularPermission, _))
Alex Deymof4867c42013-06-28 14:41:39 -0700385 .Times(1)
Alex Deymoefb7c4c2013-07-09 14:34:00 -0700386 .WillOnce(DoAll(SetArgumentPointee<1>(true), Return(true)));
Alex Deymo6ae91202014-03-10 19:21:25 -0700387 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetCellular,
388 NetworkTethering::kUnknown));
Alex Deymof4867c42013-06-28 14:41:39 -0700389
390 // Block per user pref.
391 EXPECT_CALL(*prefs, Exists(kPrefsUpdateOverCellularPermission))
392 .Times(1)
393 .WillOnce(Return(true));
Alex Deymoefb7c4c2013-07-09 14:34:00 -0700394 EXPECT_CALL(*prefs, GetBoolean(kPrefsUpdateOverCellularPermission, _))
Alex Deymof4867c42013-06-28 14:41:39 -0700395 .Times(1)
Alex Deymoefb7c4c2013-07-09 14:34:00 -0700396 .WillOnce(DoAll(SetArgumentPointee<1>(false), Return(true)));
Alex Deymo6ae91202014-03-10 19:21:25 -0700397 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
398 NetworkTethering::kUnknown));
Alex Deymof4867c42013-06-28 14:41:39 -0700399}
400
Jay Srinivasan43488792012-06-19 00:25:31 -0700401TEST_F(ConnectionManagerTest, StringForConnectionTypeTest) {
Ben Chanc6007e42013-09-19 23:49:22 -0700402 EXPECT_STREQ(shill::kTypeEthernet,
Jay Srinivasan43488792012-06-19 00:25:31 -0700403 cmut_.StringForConnectionType(kNetEthernet));
Ben Chanc6007e42013-09-19 23:49:22 -0700404 EXPECT_STREQ(shill::kTypeWifi,
Jay Srinivasan43488792012-06-19 00:25:31 -0700405 cmut_.StringForConnectionType(kNetWifi));
Ben Chanc6007e42013-09-19 23:49:22 -0700406 EXPECT_STREQ(shill::kTypeWimax,
Jay Srinivasan43488792012-06-19 00:25:31 -0700407 cmut_.StringForConnectionType(kNetWimax));
Ben Chanc6007e42013-09-19 23:49:22 -0700408 EXPECT_STREQ(shill::kTypeBluetooth,
Jay Srinivasan43488792012-06-19 00:25:31 -0700409 cmut_.StringForConnectionType(kNetBluetooth));
Ben Chanc6007e42013-09-19 23:49:22 -0700410 EXPECT_STREQ(shill::kTypeCellular,
Jay Srinivasan43488792012-06-19 00:25:31 -0700411 cmut_.StringForConnectionType(kNetCellular));
412 EXPECT_STREQ("Unknown",
413 cmut_.StringForConnectionType(kNetUnknown));
414 EXPECT_STREQ("Unknown",
415 cmut_.StringForConnectionType(
416 static_cast<NetworkConnectionType>(999999)));
417}
418
419TEST_F(ConnectionManagerTest, MalformedServiceList) {
420 SetupMocks("/service/guest-network");
Alex Deymo5665d0c2014-05-28 17:45:43 -0700421 SetManagerReply(kServicePath_, DBUS_TYPE_G_STRING_ARRAY);
Jay Srinivasan43488792012-06-19 00:25:31 -0700422
423 NetworkConnectionType type;
Alex Deymo6ae91202014-03-10 19:21:25 -0700424 NetworkTethering tethering;
425 EXPECT_FALSE(cmut_.GetConnectionProperties(&dbus_iface_, &type, &tethering));
Jay Srinivasan43488792012-06-19 00:25:31 -0700426}
427
428} // namespace chromeos_update_engine