blob: 748c7252f5c28e8b6809e2ab8e6ba1843e760803 [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 Vakulenkod2779df2014-06-16 13:19:00 -07005#include <set>
6#include <string>
7
Jay Srinivasan43488792012-06-19 00:25:31 -07008#include <base/logging.h>
9#include <chromeos/dbus/service_constants.h>
Alex Deymo5665d0c2014-05-28 17:45:43 -070010#include <gmock/gmock.h>
Jay Srinivasan43488792012-06-19 00:25:31 -070011#include <gtest/gtest.h>
Jay Srinivasan43488792012-06-19 00:25:31 -070012
13#include "update_engine/connection_manager.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070014#include "update_engine/fake_system_state.h"
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080015#include "update_engine/mock_dbus_wrapper.h"
Alex Deymo5665d0c2014-05-28 17:45:43 -070016#include "update_engine/test_utils.h"
Jay Srinivasan43488792012-06-19 00:25:31 -070017
18using std::set;
19using std::string;
Jay Srinivasan43488792012-06-19 00:25:31 -070020using testing::AnyNumber;
21using testing::Return;
22using testing::SetArgumentPointee;
23using testing::StrEq;
Alex Deymof329b932014-10-30 01:37:48 -070024using testing::_;
Jay Srinivasan43488792012-06-19 00:25:31 -070025
26namespace chromeos_update_engine {
27
28class ConnectionManagerTest : public ::testing::Test {
29 public:
30 ConnectionManagerTest()
Alex Vakulenko88b591f2014-08-28 16:48:57 -070031 : kMockFlimFlamManagerProxy_(nullptr),
32 kMockFlimFlamServiceProxy_(nullptr),
33 kServicePath_(nullptr),
Gilad Arnold5bb4c902014-04-10 12:32:13 -070034 cmut_(&fake_system_state_) {
35 fake_system_state_.set_connection_manager(&cmut_);
Jay Srinivasan43488792012-06-19 00:25:31 -070036 }
37
38 protected:
39 void SetupMocks(const char* service_path);
Alex Deymo5665d0c2014-05-28 17:45:43 -070040 void SetManagerReply(const char* reply_value, const GType& reply_type);
Alex Deymo1c4e6382013-07-15 12:09:51 -070041
42 // Sets the |service_type| Type and the |physical_technology|
Alex Vakulenko88b591f2014-08-28 16:48:57 -070043 // PhysicalTechnology properties in the mocked service. If a null
Alex Deymo1c4e6382013-07-15 12:09:51 -070044 // |physical_technology| is passed, the property is not set (not present).
45 void SetServiceReply(const char* service_type,
Alex Deymo6ae91202014-03-10 19:21:25 -070046 const char* physical_technology,
47 const char* service_tethering);
Jay Srinivasan43488792012-06-19 00:25:31 -070048 void TestWithServiceType(
Alex Deymo1c4e6382013-07-15 12:09:51 -070049 const char* service_type,
50 const char* physical_technology,
51 NetworkConnectionType expected_type);
Alex Deymo6ae91202014-03-10 19:21:25 -070052 void TestWithServiceTethering(
53 const char* service_tethering,
54 NetworkTethering expected_tethering);
Jay Srinivasan43488792012-06-19 00:25:31 -070055
56 static const char* kGetPropertiesMethod;
57 DBusGProxy* kMockFlimFlamManagerProxy_;
58 DBusGProxy* kMockFlimFlamServiceProxy_;
59 DBusGConnection* kMockSystemBus_;
60 const char* kServicePath_;
Alex Deymo5665d0c2014-05-28 17:45:43 -070061 testing::StrictMock<MockDBusWrapper> dbus_iface_;
Jay Srinivasan43488792012-06-19 00:25:31 -070062 ConnectionManager cmut_; // ConnectionManager under test.
Gilad Arnold5bb4c902014-04-10 12:32:13 -070063 FakeSystemState fake_system_state_;
Jay Srinivasan43488792012-06-19 00:25:31 -070064};
65
66// static
67const char* ConnectionManagerTest::kGetPropertiesMethod = "GetProperties";
68
69void ConnectionManagerTest::SetupMocks(const char* service_path) {
70 int number = 1;
71 kMockSystemBus_ = reinterpret_cast<DBusGConnection*>(number++);
72 kMockFlimFlamManagerProxy_ = reinterpret_cast<DBusGProxy*>(number++);
73 kMockFlimFlamServiceProxy_ = reinterpret_cast<DBusGProxy*>(number++);
Alex Vakulenko88b591f2014-08-28 16:48:57 -070074 ASSERT_NE(kMockSystemBus_, static_cast<DBusGConnection*>(nullptr));
Jay Srinivasan43488792012-06-19 00:25:31 -070075
76 kServicePath_ = service_path;
77
78 ON_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
79 .WillByDefault(Return(kMockSystemBus_));
80 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
81 .Times(AnyNumber());
82}
83
Alex Deymo5665d0c2014-05-28 17:45:43 -070084void ConnectionManagerTest::SetManagerReply(const char *reply_value,
Jay Srinivasan43488792012-06-19 00:25:31 -070085 const GType& reply_type) {
Alex Deymo5665d0c2014-05-28 17:45:43 -070086 ASSERT_TRUE(dbus_g_type_is_collection(reply_type));
Jay Srinivasan43488792012-06-19 00:25:31 -070087
Alex Deymo5665d0c2014-05-28 17:45:43 -070088 // Create the GPtrArray array holding the |reply_value| pointer. The
89 // |reply_value| string is duplicated because it should be mutable on the
90 // interface and is because dbus-glib collections will g_free() each element
91 // of the GPtrArray automatically when the |array_as_value| GValue is unset.
92 // The g_strdup() is not being leaked.
93 GPtrArray* array = g_ptr_array_new();
Alex Vakulenko88b591f2014-08-28 16:48:57 -070094 ASSERT_NE(nullptr, array);
Alex Deymo5665d0c2014-05-28 17:45:43 -070095 g_ptr_array_add(array, g_strdup(reply_value));
Jay Srinivasan43488792012-06-19 00:25:31 -070096
Jay Srinivasan43488792012-06-19 00:25:31 -070097 GValue* array_as_value = g_new0(GValue, 1);
98 EXPECT_EQ(array_as_value, g_value_init(array_as_value, reply_type));
99 g_value_take_boxed(array_as_value, array);
Alex Deymo5665d0c2014-05-28 17:45:43 -0700100
101 // Initialize return value for D-Bus call to Manager object, which is a
102 // hash table of static strings (char*) in GValue* containing a single array.
103 GHashTable* manager_hash_table = g_hash_table_new_full(
104 g_str_hash, g_str_equal,
105 nullptr, // no key_destroy_func because keys are static.
106 GValueFree); // value_destroy_func
Jay Srinivasan43488792012-06-19 00:25:31 -0700107 g_hash_table_insert(manager_hash_table,
108 const_cast<char*>("Services"),
109 array_as_value);
110
111 // Plumb return value into mock object.
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800112 EXPECT_CALL(dbus_iface_, ProxyCall_0_1(kMockFlimFlamManagerProxy_,
113 StrEq(kGetPropertiesMethod),
114 _, _))
115 .WillOnce(DoAll(SetArgumentPointee<3>(manager_hash_table), Return(TRUE)));
Jay Srinivasan43488792012-06-19 00:25:31 -0700116
117 // Set other expectations.
118 EXPECT_CALL(dbus_iface_,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800119 ProxyNewForName(kMockSystemBus_,
120 StrEq(shill::kFlimflamServiceName),
121 StrEq(shill::kFlimflamServicePath),
122 StrEq(shill::kFlimflamManagerInterface)))
Jay Srinivasan43488792012-06-19 00:25:31 -0700123 .WillOnce(Return(kMockFlimFlamManagerProxy_));
124 EXPECT_CALL(dbus_iface_, ProxyUnref(kMockFlimFlamManagerProxy_));
125 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
126 .RetiresOnSaturation();
127}
128
Alex Deymo1c4e6382013-07-15 12:09:51 -0700129void ConnectionManagerTest::SetServiceReply(const char* service_type,
Alex Deymo6ae91202014-03-10 19:21:25 -0700130 const char* physical_technology,
131 const char* service_tethering) {
Alex Deymo5665d0c2014-05-28 17:45:43 -0700132 // Initialize return value for D-Bus call to Service object, which is a
133 // hash table of static strings (char*) in GValue*.
134 GHashTable* service_hash_table = g_hash_table_new_full(
135 g_str_hash, g_str_equal,
136 nullptr, // no key_destroy_func because keys are static.
137 GValueFree); // value_destroy_func
138 GValue* service_type_value = GValueNewString(service_type);
Jay Srinivasan43488792012-06-19 00:25:31 -0700139 g_hash_table_insert(service_hash_table,
140 const_cast<char*>("Type"),
141 service_type_value);
142
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700143 if (physical_technology) {
Alex Deymo5665d0c2014-05-28 17:45:43 -0700144 GValue* physical_technology_value = GValueNewString(physical_technology);
Alex Deymo1c4e6382013-07-15 12:09:51 -0700145 g_hash_table_insert(service_hash_table,
146 const_cast<char*>("PhysicalTechnology"),
147 physical_technology_value);
148 }
149
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700150 if (service_tethering) {
Alex Deymo5665d0c2014-05-28 17:45:43 -0700151 GValue* service_tethering_value = GValueNewString(service_tethering);
Alex Deymo6ae91202014-03-10 19:21:25 -0700152 g_hash_table_insert(service_hash_table,
153 const_cast<char*>("Tethering"),
154 service_tethering_value);
155 }
156
Jay Srinivasan43488792012-06-19 00:25:31 -0700157 // Plumb return value into mock object.
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800158 EXPECT_CALL(dbus_iface_, ProxyCall_0_1(kMockFlimFlamServiceProxy_,
159 StrEq(kGetPropertiesMethod),
160 _, _))
161 .WillOnce(DoAll(SetArgumentPointee<3>(service_hash_table), Return(TRUE)));
Jay Srinivasan43488792012-06-19 00:25:31 -0700162
163 // Set other expectations.
164 EXPECT_CALL(dbus_iface_,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800165 ProxyNewForName(kMockSystemBus_,
166 StrEq(shill::kFlimflamServiceName),
167 StrEq(kServicePath_),
168 StrEq(shill::kFlimflamServiceInterface)))
Jay Srinivasan43488792012-06-19 00:25:31 -0700169 .WillOnce(Return(kMockFlimFlamServiceProxy_));
170 EXPECT_CALL(dbus_iface_, ProxyUnref(kMockFlimFlamServiceProxy_));
171 EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
172 .RetiresOnSaturation();
173}
174
175void ConnectionManagerTest::TestWithServiceType(
176 const char* service_type,
Alex Deymo1c4e6382013-07-15 12:09:51 -0700177 const char* physical_technology,
Jay Srinivasan43488792012-06-19 00:25:31 -0700178 NetworkConnectionType expected_type) {
179
180 SetupMocks("/service/guest-network");
181 SetManagerReply(kServicePath_, DBUS_TYPE_G_OBJECT_PATH_ARRAY);
Alex Deymo6ae91202014-03-10 19:21:25 -0700182 SetServiceReply(service_type, physical_technology,
183 shill::kTetheringNotDetectedState);
Jay Srinivasan43488792012-06-19 00:25:31 -0700184
185 NetworkConnectionType type;
Alex Deymo6ae91202014-03-10 19:21:25 -0700186 NetworkTethering tethering;
187 EXPECT_TRUE(cmut_.GetConnectionProperties(&dbus_iface_, &type, &tethering));
Jay Srinivasan43488792012-06-19 00:25:31 -0700188 EXPECT_EQ(expected_type, type);
Alex Deymo5665d0c2014-05-28 17:45:43 -0700189 testing::Mock::VerifyAndClearExpectations(&dbus_iface_);
Jay Srinivasan43488792012-06-19 00:25:31 -0700190}
191
Alex Deymo6ae91202014-03-10 19:21:25 -0700192void ConnectionManagerTest::TestWithServiceTethering(
193 const char* service_tethering,
194 NetworkTethering expected_tethering) {
195
196 SetupMocks("/service/guest-network");
197 SetManagerReply(kServicePath_, DBUS_TYPE_G_OBJECT_PATH_ARRAY);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700198 SetServiceReply(shill::kTypeWifi, nullptr, service_tethering);
Alex Deymo6ae91202014-03-10 19:21:25 -0700199
200 NetworkConnectionType type;
201 NetworkTethering tethering;
202 EXPECT_TRUE(cmut_.GetConnectionProperties(&dbus_iface_, &type, &tethering));
203 EXPECT_EQ(expected_tethering, tethering);
204}
205
Jay Srinivasan43488792012-06-19 00:25:31 -0700206TEST_F(ConnectionManagerTest, SimpleTest) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700207 TestWithServiceType(shill::kTypeEthernet, nullptr, kNetEthernet);
208 TestWithServiceType(shill::kTypeWifi, nullptr, kNetWifi);
209 TestWithServiceType(shill::kTypeWimax, nullptr, kNetWimax);
210 TestWithServiceType(shill::kTypeBluetooth, nullptr, kNetBluetooth);
211 TestWithServiceType(shill::kTypeCellular, nullptr, kNetCellular);
Alex Deymo1c4e6382013-07-15 12:09:51 -0700212}
213
214TEST_F(ConnectionManagerTest, PhysicalTechnologyTest) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700215 TestWithServiceType(shill::kTypeVPN, nullptr, kNetUnknown);
Ben Chanc6007e42013-09-19 23:49:22 -0700216 TestWithServiceType(shill::kTypeVPN, shill::kTypeVPN, kNetUnknown);
217 TestWithServiceType(shill::kTypeVPN, shill::kTypeWifi, kNetWifi);
218 TestWithServiceType(shill::kTypeVPN, shill::kTypeWimax, kNetWimax);
Jay Srinivasan43488792012-06-19 00:25:31 -0700219}
220
Alex Deymo6ae91202014-03-10 19:21:25 -0700221TEST_F(ConnectionManagerTest, TetheringTest) {
222 TestWithServiceTethering(shill::kTetheringConfirmedState,
223 NetworkTethering::kConfirmed);
224 TestWithServiceTethering(shill::kTetheringNotDetectedState,
225 NetworkTethering::kNotDetected);
226 TestWithServiceTethering(shill::kTetheringSuspectedState,
227 NetworkTethering::kSuspected);
228 TestWithServiceTethering("I'm not a valid property value =)",
229 NetworkTethering::kUnknown);
230}
231
Jay Srinivasan43488792012-06-19 00:25:31 -0700232TEST_F(ConnectionManagerTest, UnknownTest) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700233 TestWithServiceType("foo", nullptr, kNetUnknown);
Jay Srinivasan43488792012-06-19 00:25:31 -0700234}
235
236TEST_F(ConnectionManagerTest, AllowUpdatesOverEthernetTest) {
Jay Srinivasan43488792012-06-19 00:25:31 -0700237 // Updates over Ethernet are allowed even if there's no policy.
Alex Deymo6ae91202014-03-10 19:21:25 -0700238 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet,
239 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700240}
241
242TEST_F(ConnectionManagerTest, AllowUpdatesOverWifiTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700243 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi, NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700244}
245
246TEST_F(ConnectionManagerTest, AllowUpdatesOverWimaxTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700247 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWimax,
248 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700249}
250
251TEST_F(ConnectionManagerTest, BlockUpdatesOverBluetoothTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700252 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetBluetooth,
253 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700254}
255
256TEST_F(ConnectionManagerTest, AllowUpdatesOnlyOver3GPerPolicyTest) {
257 policy::MockDevicePolicy allow_3g_policy;
258
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700259 fake_system_state_.set_device_policy(&allow_3g_policy);
Jay Srinivasan43488792012-06-19 00:25:31 -0700260
Alex Deymof4867c42013-06-28 14:41:39 -0700261 // This test tests cellular (3G) being the only connection type being allowed.
Jay Srinivasan43488792012-06-19 00:25:31 -0700262 set<string> allowed_set;
263 allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
264
265 EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
266 .Times(1)
267 .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
268
Alex Deymo6ae91202014-03-10 19:21:25 -0700269 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetCellular,
270 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700271}
272
273TEST_F(ConnectionManagerTest, AllowUpdatesOver3GAndOtherTypesPerPolicyTest) {
274 policy::MockDevicePolicy allow_3g_policy;
275
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700276 fake_system_state_.set_device_policy(&allow_3g_policy);
Jay Srinivasan43488792012-06-19 00:25:31 -0700277
278 // This test tests multiple connection types being allowed, with
Alex Deymof4867c42013-06-28 14:41:39 -0700279 // 3G one among them. Only Cellular is currently enforced by the policy
280 // setting, the others are ignored (see Bluetooth for example).
Jay Srinivasan43488792012-06-19 00:25:31 -0700281 set<string> allowed_set;
Jay Srinivasan43488792012-06-19 00:25:31 -0700282 allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
Alex Deymof4867c42013-06-28 14:41:39 -0700283 allowed_set.insert(cmut_.StringForConnectionType(kNetBluetooth));
Jay Srinivasan43488792012-06-19 00:25:31 -0700284
285 EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
Alex Deymo6ae91202014-03-10 19:21:25 -0700286 .Times(3)
287 .WillRepeatedly(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
Jay Srinivasan43488792012-06-19 00:25:31 -0700288
Alex Deymo6ae91202014-03-10 19:21:25 -0700289 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet,
290 NetworkTethering::kUnknown));
291 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet,
292 NetworkTethering::kNotDetected));
293 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetCellular,
294 NetworkTethering::kUnknown));
295 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi, NetworkTethering::kUnknown));
296 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWimax, NetworkTethering::kUnknown));
297 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetBluetooth,
298 NetworkTethering::kUnknown));
299
300 // Tethered networks are treated in the same way as Cellular networks and
301 // thus allowed.
302 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet,
303 NetworkTethering::kConfirmed));
304 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi,
305 NetworkTethering::kConfirmed));
Jay Srinivasan43488792012-06-19 00:25:31 -0700306}
307
Alex Deymof4867c42013-06-28 14:41:39 -0700308TEST_F(ConnectionManagerTest, BlockUpdatesOverCellularByDefaultTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700309 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
310 NetworkTethering::kUnknown));
311}
312
313TEST_F(ConnectionManagerTest, BlockUpdatesOverTetheredNetworkByDefaultTest) {
Alex Deymo6ae91202014-03-10 19:21:25 -0700314 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetWifi,
315 NetworkTethering::kConfirmed));
316 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetEthernet,
317 NetworkTethering::kConfirmed));
318 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi,
319 NetworkTethering::kSuspected));
Jay Srinivasan43488792012-06-19 00:25:31 -0700320}
321
322TEST_F(ConnectionManagerTest, BlockUpdatesOver3GPerPolicyTest) {
323 policy::MockDevicePolicy block_3g_policy;
324
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700325 fake_system_state_.set_device_policy(&block_3g_policy);
Jay Srinivasan43488792012-06-19 00:25:31 -0700326
327 // Test that updates for 3G are blocked while updates are allowed
328 // over several other types.
329 set<string> allowed_set;
330 allowed_set.insert(cmut_.StringForConnectionType(kNetEthernet));
331 allowed_set.insert(cmut_.StringForConnectionType(kNetWifi));
332 allowed_set.insert(cmut_.StringForConnectionType(kNetWimax));
333
334 EXPECT_CALL(block_3g_policy, GetAllowedConnectionTypesForUpdate(_))
335 .Times(1)
336 .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
337
Alex Deymo6ae91202014-03-10 19:21:25 -0700338 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
339 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700340}
341
342TEST_F(ConnectionManagerTest, BlockUpdatesOver3GIfErrorInPolicyFetchTest) {
343 policy::MockDevicePolicy allow_3g_policy;
344
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700345 fake_system_state_.set_device_policy(&allow_3g_policy);
Jay Srinivasan43488792012-06-19 00:25:31 -0700346
347 set<string> allowed_set;
348 allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
349
350 // Return false for GetAllowedConnectionTypesForUpdate and see
351 // that updates are still blocked for 3G despite the value being in
352 // the string set above.
353 EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
354 .Times(1)
355 .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(false)));
356
Alex Deymo6ae91202014-03-10 19:21:25 -0700357 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
358 NetworkTethering::kUnknown));
Jay Srinivasan43488792012-06-19 00:25:31 -0700359}
360
Alex Deymof4867c42013-06-28 14:41:39 -0700361TEST_F(ConnectionManagerTest, UseUserPrefForUpdatesOverCellularIfNoPolicyTest) {
362 policy::MockDevicePolicy no_policy;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700363 testing::NiceMock<PrefsMock>* prefs = fake_system_state_.mock_prefs();
Alex Deymof4867c42013-06-28 14:41:39 -0700364
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700365 fake_system_state_.set_device_policy(&no_policy);
Alex Deymof4867c42013-06-28 14:41:39 -0700366
367 // No setting enforced by the device policy, user prefs should be used.
368 EXPECT_CALL(no_policy, GetAllowedConnectionTypesForUpdate(_))
369 .Times(3)
370 .WillRepeatedly(Return(false));
371
372 // No user pref: block.
373 EXPECT_CALL(*prefs, Exists(kPrefsUpdateOverCellularPermission))
374 .Times(1)
375 .WillOnce(Return(false));
Alex Deymo6ae91202014-03-10 19:21:25 -0700376 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
377 NetworkTethering::kUnknown));
Alex Deymof4867c42013-06-28 14:41:39 -0700378
379 // Allow per user pref.
380 EXPECT_CALL(*prefs, Exists(kPrefsUpdateOverCellularPermission))
381 .Times(1)
382 .WillOnce(Return(true));
Alex Deymoefb7c4c2013-07-09 14:34:00 -0700383 EXPECT_CALL(*prefs, GetBoolean(kPrefsUpdateOverCellularPermission, _))
Alex Deymof4867c42013-06-28 14:41:39 -0700384 .Times(1)
Alex Deymoefb7c4c2013-07-09 14:34:00 -0700385 .WillOnce(DoAll(SetArgumentPointee<1>(true), Return(true)));
Alex Deymo6ae91202014-03-10 19:21:25 -0700386 EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetCellular,
387 NetworkTethering::kUnknown));
Alex Deymof4867c42013-06-28 14:41:39 -0700388
389 // Block per user pref.
390 EXPECT_CALL(*prefs, Exists(kPrefsUpdateOverCellularPermission))
391 .Times(1)
392 .WillOnce(Return(true));
Alex Deymoefb7c4c2013-07-09 14:34:00 -0700393 EXPECT_CALL(*prefs, GetBoolean(kPrefsUpdateOverCellularPermission, _))
Alex Deymof4867c42013-06-28 14:41:39 -0700394 .Times(1)
Alex Deymoefb7c4c2013-07-09 14:34:00 -0700395 .WillOnce(DoAll(SetArgumentPointee<1>(false), Return(true)));
Alex Deymo6ae91202014-03-10 19:21:25 -0700396 EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular,
397 NetworkTethering::kUnknown));
Alex Deymof4867c42013-06-28 14:41:39 -0700398}
399
Jay Srinivasan43488792012-06-19 00:25:31 -0700400TEST_F(ConnectionManagerTest, StringForConnectionTypeTest) {
Ben Chanc6007e42013-09-19 23:49:22 -0700401 EXPECT_STREQ(shill::kTypeEthernet,
Jay Srinivasan43488792012-06-19 00:25:31 -0700402 cmut_.StringForConnectionType(kNetEthernet));
Ben Chanc6007e42013-09-19 23:49:22 -0700403 EXPECT_STREQ(shill::kTypeWifi,
Jay Srinivasan43488792012-06-19 00:25:31 -0700404 cmut_.StringForConnectionType(kNetWifi));
Ben Chanc6007e42013-09-19 23:49:22 -0700405 EXPECT_STREQ(shill::kTypeWimax,
Jay Srinivasan43488792012-06-19 00:25:31 -0700406 cmut_.StringForConnectionType(kNetWimax));
Ben Chanc6007e42013-09-19 23:49:22 -0700407 EXPECT_STREQ(shill::kTypeBluetooth,
Jay Srinivasan43488792012-06-19 00:25:31 -0700408 cmut_.StringForConnectionType(kNetBluetooth));
Ben Chanc6007e42013-09-19 23:49:22 -0700409 EXPECT_STREQ(shill::kTypeCellular,
Jay Srinivasan43488792012-06-19 00:25:31 -0700410 cmut_.StringForConnectionType(kNetCellular));
411 EXPECT_STREQ("Unknown",
412 cmut_.StringForConnectionType(kNetUnknown));
413 EXPECT_STREQ("Unknown",
414 cmut_.StringForConnectionType(
415 static_cast<NetworkConnectionType>(999999)));
416}
417
418TEST_F(ConnectionManagerTest, MalformedServiceList) {
419 SetupMocks("/service/guest-network");
Alex Deymo5665d0c2014-05-28 17:45:43 -0700420 SetManagerReply(kServicePath_, DBUS_TYPE_G_STRING_ARRAY);
Jay Srinivasan43488792012-06-19 00:25:31 -0700421
422 NetworkConnectionType type;
Alex Deymo6ae91202014-03-10 19:21:25 -0700423 NetworkTethering tethering;
424 EXPECT_FALSE(cmut_.GetConnectionProperties(&dbus_iface_, &type, &tethering));
Jay Srinivasan43488792012-06-19 00:25:31 -0700425}
426
427} // namespace chromeos_update_engine