connection_manager_unittest.cc revision 4348879380222dc8c74b0976e527bf3da66ba08f
14348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
24348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan// Use of this source code is governed by a BSD-style license that can be
34348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan// found in the LICENSE file.
44348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
54348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <base/logging.h>
64348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <chromeos/dbus/service_constants.h>
74348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <gtest/gtest.h>
84348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <string>
94348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
104348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/connection_manager.h"
114348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/mock_dbus_interface.h"
124348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/mock_system_state.h"
134348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
144348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing std::set;
154348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing std::string;
164348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing testing::_;
174348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing testing::AnyNumber;
184348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing testing::Return;
194348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing testing::SetArgumentPointee;
204348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing testing::StrEq;
214348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
224348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasannamespace chromeos_update_engine {
234348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
244348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanclass ConnectionManagerTest : public ::testing::Test {
254348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan public:
264348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  ConnectionManagerTest()
274348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      : kMockFlimFlamManagerProxy_(NULL),
284348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        kMockFlimFlamServiceProxy_(NULL),
294348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        kServicePath_(NULL),
304348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        cmut_(&mock_system_state_) {
314348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    mock_system_state_.SetConnectionManager(&cmut_);
324348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  }
334348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
344348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan protected:
354348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  void SetupMocks(const char* service_path);
364348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  void SetManagerReply(gconstpointer value, const GType& type);
374348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  void SetServiceReply(const char* service_type);
384348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  void TestWithServiceType(
394348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      const char* service_type, NetworkConnectionType expected_type);
404348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
414348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  static const char* kGetPropertiesMethod;
424348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  DBusGProxy* kMockFlimFlamManagerProxy_;
434348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  DBusGProxy* kMockFlimFlamServiceProxy_;
444348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  DBusGConnection* kMockSystemBus_;
454348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  const char* kServicePath_;
464348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  MockDbusGlib dbus_iface_;
474348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  ConnectionManager cmut_;  // ConnectionManager under test.
484348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  MockSystemState mock_system_state_;
494348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan};
504348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
514348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan// static
524348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanconst char* ConnectionManagerTest::kGetPropertiesMethod = "GetProperties";
534348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
544348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanvoid ConnectionManagerTest::SetupMocks(const char* service_path) {
554348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  int number = 1;
564348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  kMockSystemBus_ = reinterpret_cast<DBusGConnection*>(number++);
574348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  kMockFlimFlamManagerProxy_ = reinterpret_cast<DBusGProxy*>(number++);
584348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  kMockFlimFlamServiceProxy_ = reinterpret_cast<DBusGProxy*>(number++);
594348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  ASSERT_NE(kMockSystemBus_, reinterpret_cast<DBusGConnection*>(NULL));
604348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
614348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  kServicePath_ = service_path;
624348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
634348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  ON_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
644348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillByDefault(Return(kMockSystemBus_));
654348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
664348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(AnyNumber());
674348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
684348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
694348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanvoid ConnectionManagerTest::SetManagerReply(gconstpointer reply_value,
704348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                            const GType& reply_type) {
714348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Initialize return value for D-Bus call to Manager object.
724348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // TODO (jaysri): Free the objects allocated here.
734348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  GHashTable* manager_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
744348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
754348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  GArray* array = g_array_new(FALSE, FALSE, sizeof(const char*));
764348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  ASSERT_TRUE(array != NULL);
774348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
784348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_EQ(array, g_array_append_val(array, reply_value));
794348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  GValue* array_as_value = g_new0(GValue, 1);
804348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_EQ(array_as_value, g_value_init(array_as_value, reply_type));
814348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  g_value_take_boxed(array_as_value, array);
824348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  g_hash_table_insert(manager_hash_table,
834348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                      const_cast<char*>("Services"),
844348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                      array_as_value);
854348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
864348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Plumb return value into mock object.
874348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_, ProxyCall(kMockFlimFlamManagerProxy_,
884348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                     StrEq(kGetPropertiesMethod),
894348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                     _,
904348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                     G_TYPE_INVALID,
914348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                     dbus_g_type_get_map("GHashTable",
924348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                                         G_TYPE_STRING,
934348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                                         G_TYPE_VALUE),
944348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                     _,
954348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                     G_TYPE_INVALID))
964348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(DoAll(SetArgumentPointee<5>(manager_hash_table), Return(TRUE)));
974348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
984348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Set other expectations.
994348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_,
1004348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan              ProxyNewForNameOwner(kMockSystemBus_,
1014348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                   StrEq(flimflam::kFlimflamServiceName),
1024348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                   StrEq(flimflam::kFlimflamServicePath),
1034348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                   StrEq(flimflam::kFlimflamManagerInterface),
1044348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                   _))
1054348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(Return(kMockFlimFlamManagerProxy_));
1064348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_, ProxyUnref(kMockFlimFlamManagerProxy_));
1074348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
1084348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .RetiresOnSaturation();
1094348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1104348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1114348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanvoid ConnectionManagerTest::SetServiceReply(const char* service_type) {
1124348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Initialize return value for D-Bus call to Service object.
1134348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // TODO (jaysri): Free the objects allocated here.
1144348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  GHashTable* service_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
1154348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1164348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  GValue* service_type_value = g_new0(GValue, 1);
1174348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_EQ(service_type_value,
1184348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan            g_value_init(service_type_value, G_TYPE_STRING));
1194348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  g_value_set_static_string(service_type_value, service_type);
1204348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1214348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  g_hash_table_insert(service_hash_table,
1224348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                      const_cast<char*>("Type"),
1234348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                      service_type_value);
1244348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1254348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Plumb return value into mock object.
1264348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_, ProxyCall(kMockFlimFlamServiceProxy_,
1274348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                    StrEq(kGetPropertiesMethod),
1284348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                    _,
1294348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                    G_TYPE_INVALID,
1304348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                    dbus_g_type_get_map("GHashTable",
1314348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                                        G_TYPE_STRING,
1324348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                                        G_TYPE_VALUE),
1334348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                    _,
1344348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                    G_TYPE_INVALID))
1354348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(DoAll(SetArgumentPointee<5>(service_hash_table), Return(TRUE)));
1364348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1374348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Set other expectations.
1384348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_,
1394348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      ProxyNewForNameOwner(kMockSystemBus_,
1404348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                             StrEq(flimflam::kFlimflamServiceName),
1414348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                             StrEq(kServicePath_),
1424348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                             StrEq(flimflam::kFlimflamServiceInterface),
1434348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                             _))
1444348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(Return(kMockFlimFlamServiceProxy_));
1454348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_, ProxyUnref(kMockFlimFlamServiceProxy_));
1464348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(dbus_iface_, BusGet(DBUS_BUS_SYSTEM, _))
1474348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .RetiresOnSaturation();
1484348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1494348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1504348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanvoid ConnectionManagerTest::TestWithServiceType(
1514348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    const char* service_type,
1524348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    NetworkConnectionType expected_type) {
1534348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1544348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  SetupMocks("/service/guest-network");
1554348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  SetManagerReply(kServicePath_, DBUS_TYPE_G_OBJECT_PATH_ARRAY);
1564348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  SetServiceReply(service_type);
1574348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1584348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  NetworkConnectionType type;
1594348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_TRUE(cmut_.GetConnectionType(&dbus_iface_, &type));
1604348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_EQ(expected_type, type);
1614348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1624348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1634348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, SimpleTest) {
1644348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  TestWithServiceType(flimflam::kTypeEthernet, kNetEthernet);
1654348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  TestWithServiceType(flimflam::kTypeWifi, kNetWifi);
1664348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  TestWithServiceType(flimflam::kTypeWimax, kNetWimax);
1674348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  TestWithServiceType(flimflam::kTypeBluetooth, kNetBluetooth);
1684348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  TestWithServiceType(flimflam::kTypeCellular, kNetCellular);
1694348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1704348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1714348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, UnknownTest) {
1724348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  TestWithServiceType("foo", kNetUnknown);
1734348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1744348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1754348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, AllowUpdatesOverEthernetTest) {
1764348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy()).Times(0);
1774348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1784348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Updates over Ethernet are allowed even if there's no policy.
1794348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetEthernet));
1804348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1814348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1824348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, AllowUpdatesOverWifiTest) {
1834348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy()).Times(0);
1844348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWifi));
1854348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1864348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1874348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, AllowUpdatesOverWimaxTest) {
1884348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy()).Times(0);
1894348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetWimax));
1904348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1914348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1924348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, BlockUpdatesOverBluetoothTest) {
1934348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy()).Times(0);
1944348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetBluetooth));
1954348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
1964348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1974348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, AllowUpdatesOnlyOver3GPerPolicyTest) {
1984348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  policy::MockDevicePolicy allow_3g_policy;
1994348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2004348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy())
2014348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(1)
2024348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(Return(&allow_3g_policy));
2034348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2044348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // This test tests 3G being the only connection type being allowed.
2054348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  set<string> allowed_set;
2064348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
2074348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2084348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
2094348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(1)
2104348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
2114348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2124348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetCellular));
2134348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
2144348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2154348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, AllowUpdatesOver3GAndOtherTypesPerPolicyTest) {
2164348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  policy::MockDevicePolicy allow_3g_policy;
2174348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2184348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy())
2194348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(1)
2204348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(Return(&allow_3g_policy));
2214348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2224348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // This test tests multiple connection types being allowed, with
2234348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // 3G one among them.
2244348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  set<string> allowed_set;
2254348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  allowed_set.insert(cmut_.StringForConnectionType(kNetEthernet));
2264348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
2274348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  allowed_set.insert(cmut_.StringForConnectionType(kNetWifi));
2284348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2294348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
2304348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(1)
2314348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
2324348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2334348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_TRUE(cmut_.IsUpdateAllowedOver(kNetCellular));
2344348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
2354348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2364348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, BlockUpdatesOver3GByDefaultTest) {
2374348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy()).Times(1);
2384348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular));
2394348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
2404348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2414348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, BlockUpdatesOver3GPerPolicyTest) {
2424348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  policy::MockDevicePolicy block_3g_policy;
2434348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2444348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy())
2454348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(1)
2464348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(Return(&block_3g_policy));
2474348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2484348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Test that updates for 3G are blocked while updates are allowed
2494348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // over several other types.
2504348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  set<string> allowed_set;
2514348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  allowed_set.insert(cmut_.StringForConnectionType(kNetEthernet));
2524348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  allowed_set.insert(cmut_.StringForConnectionType(kNetWifi));
2534348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  allowed_set.insert(cmut_.StringForConnectionType(kNetWimax));
2544348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2554348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(block_3g_policy, GetAllowedConnectionTypesForUpdate(_))
2564348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(1)
2574348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(true)));
2584348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2594348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular));
2604348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
2614348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2624348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, BlockUpdatesOver3GIfErrorInPolicyFetchTest) {
2634348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  policy::MockDevicePolicy allow_3g_policy;
2644348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2654348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(mock_system_state_, GetDevicePolicy())
2664348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(1)
2674348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(Return(&allow_3g_policy));
2684348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2694348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  set<string> allowed_set;
2704348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  allowed_set.insert(cmut_.StringForConnectionType(kNetCellular));
2714348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2724348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // Return false for GetAllowedConnectionTypesForUpdate and see
2734348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // that updates are still blocked for 3G despite the value being in
2744348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  // the string set above.
2754348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_CALL(allow_3g_policy, GetAllowedConnectionTypesForUpdate(_))
2764348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .Times(1)
2774348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      .WillOnce(DoAll(SetArgumentPointee<0>(allowed_set), Return(false)));
2784348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2794348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_FALSE(cmut_.IsUpdateAllowedOver(kNetCellular));
2804348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
2814348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2824348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, StringForConnectionTypeTest) {
2834348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_STREQ(flimflam::kTypeEthernet,
2844348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan               cmut_.StringForConnectionType(kNetEthernet));
2854348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_STREQ(flimflam::kTypeWifi,
2864348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan               cmut_.StringForConnectionType(kNetWifi));
2874348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_STREQ(flimflam::kTypeWimax,
2884348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan               cmut_.StringForConnectionType(kNetWimax));
2894348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_STREQ(flimflam::kTypeBluetooth,
2904348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan               cmut_.StringForConnectionType(kNetBluetooth));
2914348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_STREQ(flimflam::kTypeCellular,
2924348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan               cmut_.StringForConnectionType(kNetCellular));
2934348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_STREQ("Unknown",
2944348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan               cmut_.StringForConnectionType(kNetUnknown));
2954348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_STREQ("Unknown",
2964348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan               cmut_.StringForConnectionType(
2974348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                   static_cast<NetworkConnectionType>(999999)));
2984348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
2994348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
3004348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanTEST_F(ConnectionManagerTest, MalformedServiceList) {
3014348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  SetupMocks("/service/guest-network");
3024348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  string service_name(kServicePath_);
3034348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  SetManagerReply(&service_name, DBUS_TYPE_G_STRING_ARRAY);
3044348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
3054348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  NetworkConnectionType type;
3064348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  EXPECT_FALSE(cmut_.GetConnectionType(&dbus_iface_, &type));
3074348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
3084348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
3094348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}  // namespace chromeos_update_engine
310