1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2014 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
1626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_bearer.h"
1826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
1926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan#include <ModemManager/ModemManager.h>
2026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
21608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu#include "shill/mock_control.h"
2226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan#include "shill/mock_dbus_properties_proxy.h"
2326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan#include "shill/testing.h"
2426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
2526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanusing std::string;
2626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanusing std::vector;
2726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanusing testing::Return;
2826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanusing testing::ReturnNull;
2926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanusing testing::_;
3026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
3126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Channamespace shill {
3226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
3326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Channamespace {
3426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
3526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst char kBearerDBusPath[] = "/org/freedesktop/ModemManager/Bearer/0";
3626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst char kBearerDBusService[] = "org.freedesktop.ModemManager";
3726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst char kDataInterface[] = "/dev/ppp0";
3826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst char kIPv4Address[] = "10.0.0.1";
3926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst char kIPv4Gateway[] = "10.0.0.254";
4026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst int kIPv4SubnetPrefix = 8;
412f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewartconst char* const kIPv4DNS[] = { "10.0.0.2", "8.8.4.4", "8.8.8.8" };
4226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst char kIPv6Address[] = "0:0:0:0:0:ffff:a00:1";
4326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst char kIPv6Gateway[] = "0:0:0:0:0:ffff:a00:fe";
4426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanconst int kIPv6SubnetPrefix = 16;
452f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewartconst char* const kIPv6DNS[] = {
4626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  "0:0:0:0:0:ffff:a00:fe", "0:0:0:0:0:ffff:808:404", "0:0:0:0:0:ffff:808:808"
4726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan};
4826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
4926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan}  // namespace
5026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
5126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chanclass CellularBearerTest : public testing::Test {
5226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan public:
5326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  CellularBearerTest()
54608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu      : control_(new MockControl()),
55608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu        bearer_(control_.get(), kBearerDBusPath, kBearerDBusService) {}
5626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
5726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan protected:
5826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  void VerifyDefaultProperties() {
5926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kBearerDBusPath, bearer_.dbus_path());
6026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kBearerDBusService, bearer_.dbus_service());
6126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_FALSE(bearer_.connected());
6226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ("", bearer_.data_interface());
6326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(IPConfig::kMethodUnknown, bearer_.ipv4_config_method());
64ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan    EXPECT_EQ(nullptr, bearer_.ipv4_config_properties());;
6526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(IPConfig::kMethodUnknown, bearer_.ipv6_config_method());
66ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan    EXPECT_EQ(nullptr, bearer_.ipv6_config_properties());;
6726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  }
6826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
6905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  static KeyValueStore ConstructIPv4ConfigProperties(
7026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      MMBearerIpMethod ipconfig_method) {
7105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    KeyValueStore ipconfig_properties;
7205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    ipconfig_properties.SetUint("method", ipconfig_method);
7326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    if (ipconfig_method == MM_BEARER_IP_METHOD_STATIC) {
7405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("address", kIPv4Address);
7505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("gateway", kIPv4Gateway);
7605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetUint("prefix", kIPv4SubnetPrefix);
7705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("dns1", kIPv4DNS[0]);
7805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("dns2", kIPv4DNS[1]);
7905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("dns3", kIPv4DNS[2]);
8026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    }
8126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    return ipconfig_properties;
8226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  }
8326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
8405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  static KeyValueStore ConstructIPv6ConfigProperties(
8526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      MMBearerIpMethod ipconfig_method) {
8605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    KeyValueStore ipconfig_properties;
8705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    ipconfig_properties.SetUint("method", ipconfig_method);
8826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    if (ipconfig_method == MM_BEARER_IP_METHOD_STATIC) {
8905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("address", kIPv6Address);
9005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("gateway", kIPv6Gateway);
9105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetUint("prefix", kIPv6SubnetPrefix);
9205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("dns1", kIPv6DNS[0]);
9305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("dns2", kIPv6DNS[1]);
9405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ipconfig_properties.SetString("dns3", kIPv6DNS[2]);
9526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    }
9626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    return ipconfig_properties;
9726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  }
9826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
9905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  static KeyValueStore ConstructBearerProperties(
1002f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart      bool connected, const string& data_interface,
10126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      MMBearerIpMethod ipv4_config_method,
10226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      MMBearerIpMethod ipv6_config_method) {
10305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    KeyValueStore properties;
10405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    properties.SetBool(MM_BEARER_PROPERTY_CONNECTED, connected);
10505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    properties.SetString(MM_BEARER_PROPERTY_INTERFACE, data_interface);
10605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu
10705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    properties.SetKeyValueStore(
10805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu        MM_BEARER_PROPERTY_IP4CONFIG,
10905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu        ConstructIPv4ConfigProperties(ipv4_config_method));
11005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu    properties.SetKeyValueStore(
11105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu        MM_BEARER_PROPERTY_IP6CONFIG,
11205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu        ConstructIPv6ConfigProperties(ipv6_config_method));
11326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    return properties;
11426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  }
11526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
11626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  void VerifyStaticIPv4ConfigMethodAndProperties() {
11726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(IPConfig::kMethodStatic, bearer_.ipv4_config_method());
1182f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart    const IPConfig::Properties* ipv4_config_properties =
11926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan        bearer_.ipv4_config_properties();
120ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan    ASSERT_NE(nullptr, ipv4_config_properties);;
12126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(IPAddress::kFamilyIPv4, ipv4_config_properties->address_family);
12226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv4Address, ipv4_config_properties->address);
12326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv4Gateway, ipv4_config_properties->gateway);
12426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv4SubnetPrefix, ipv4_config_properties->subnet_prefix);
12526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    ASSERT_EQ(3, ipv4_config_properties->dns_servers.size());
12626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv4DNS[0], ipv4_config_properties->dns_servers[0]);
12726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv4DNS[1], ipv4_config_properties->dns_servers[1]);
12826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv4DNS[2], ipv4_config_properties->dns_servers[2]);
12926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  }
13026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
13126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  void VerifyStaticIPv6ConfigMethodAndProperties() {
13226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(IPConfig::kMethodStatic, bearer_.ipv6_config_method());
1332f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart    const IPConfig::Properties* ipv6_config_properties =
13426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan        bearer_.ipv6_config_properties();
135ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan    ASSERT_NE(nullptr, ipv6_config_properties);;
13626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(IPAddress::kFamilyIPv6, ipv6_config_properties->address_family);
13726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv6Address, ipv6_config_properties->address);
13826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv6Gateway, ipv6_config_properties->gateway);
13926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv6SubnetPrefix, ipv6_config_properties->subnet_prefix);
14026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    ASSERT_EQ(3, ipv6_config_properties->dns_servers.size());
14126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv6DNS[0], ipv6_config_properties->dns_servers[0]);
14226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv6DNS[1], ipv6_config_properties->dns_servers[1]);
14326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan    EXPECT_EQ(kIPv6DNS[2], ipv6_config_properties->dns_servers[2]);
14426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  }
14526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
146608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  std::unique_ptr<MockControl> control_;
14726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  CellularBearer bearer_;
14826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan};
14926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
15026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben ChanTEST_F(CellularBearerTest, Constructor) {
15126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  VerifyDefaultProperties();
15226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan}
15326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
15426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben ChanTEST_F(CellularBearerTest, Init) {
15526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  // Ownership of |properties_proxy| is transferred to |bearer_| via
156608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  // |control_|.
157c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan  std::unique_ptr<MockDBusPropertiesProxy> properties_proxy(
15826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      new MockDBusPropertiesProxy);
159608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  EXPECT_CALL(*control_.get(),
16026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan              CreateDBusPropertiesProxy(kBearerDBusPath, kBearerDBusService))
16126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      .WillOnce(ReturnAndReleasePointee(&properties_proxy));
16226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_CALL(*properties_proxy.get(), set_properties_changed_callback(_))
16326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      .Times(1);
16426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_CALL(*properties_proxy.get(), GetAll(MM_DBUS_INTERFACE_BEARER))
16526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      .WillOnce(Return(ConstructBearerProperties(true, kDataInterface,
16626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan                                                 MM_BEARER_IP_METHOD_STATIC,
16726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan                                                 MM_BEARER_IP_METHOD_STATIC)));
16826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  bearer_.Init();
16926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_TRUE(bearer_.connected());
17026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(kDataInterface, bearer_.data_interface());
17126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  VerifyStaticIPv4ConfigMethodAndProperties();
17226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  VerifyStaticIPv6ConfigMethodAndProperties();
17326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan}
17426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
17526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben ChanTEST_F(CellularBearerTest, InitAndCreateDBusPropertiesProxyFails) {
176608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  EXPECT_CALL(*control_.get(),
17726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan              CreateDBusPropertiesProxy(kBearerDBusPath, kBearerDBusService))
17826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan      .WillOnce(ReturnNull());
17926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  bearer_.Init();
18026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  VerifyDefaultProperties();
18126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan}
18226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
18305d87e34869f44473edc1eec25d2fe1110d777a7Peter QiuTEST_F(CellularBearerTest, OnPropertiesChanged) {
18405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  KeyValueStore properties;
18526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
18626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  // If interface is not MM_DBUS_INTERFACE_BEARER, no updates should be done.
18705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged("", properties, vector<string>());
18826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  VerifyDefaultProperties();
18926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
19005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetBool(MM_BEARER_PROPERTY_CONNECTED, true);
19105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged("", properties, vector<string>());
19226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  VerifyDefaultProperties();
19326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
19426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  // Update 'interface' property.
19505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
19605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetString(MM_BEARER_PROPERTY_INTERFACE, kDataInterface);
19705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
19805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
19926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(kDataInterface, bearer_.data_interface());
20026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
20126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  // Update 'connected' property.
20205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
20305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetBool(MM_BEARER_PROPERTY_CONNECTED, true);
20405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
20505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
20626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_TRUE(bearer_.connected());
20726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  // 'interface' property remains unchanged.
20826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(kDataInterface, bearer_.data_interface());
20926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
21026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  // Update 'ip4config' property.
21105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
21205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetKeyValueStore(
21305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      MM_BEARER_PROPERTY_IP4CONFIG,
21405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ConstructIPv4ConfigProperties(MM_BEARER_IP_METHOD_UNKNOWN));
21505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
21605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
21726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(IPConfig::kMethodUnknown, bearer_.ipv4_config_method());
21826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
21905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
22005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetKeyValueStore(
22105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      MM_BEARER_PROPERTY_IP4CONFIG,
22205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ConstructIPv4ConfigProperties(MM_BEARER_IP_METHOD_PPP));
22305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
22405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
22526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(IPConfig::kMethodPPP, bearer_.ipv4_config_method());
22626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
22705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
22805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetKeyValueStore(
22905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      MM_BEARER_PROPERTY_IP4CONFIG,
23005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ConstructIPv4ConfigProperties(MM_BEARER_IP_METHOD_STATIC));
23105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
23205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
23326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(IPConfig::kMethodStatic, bearer_.ipv4_config_method());
23426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  VerifyStaticIPv4ConfigMethodAndProperties();
23526692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
23605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
23705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetKeyValueStore(
23805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      MM_BEARER_PROPERTY_IP4CONFIG,
23905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ConstructIPv4ConfigProperties(MM_BEARER_IP_METHOD_DHCP));
24005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
24105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
24226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(IPConfig::kMethodDHCP, bearer_.ipv4_config_method());
24326692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
24426692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  // Update 'ip6config' property.
24505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
24605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetKeyValueStore(
24705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      MM_BEARER_PROPERTY_IP6CONFIG,
24805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ConstructIPv6ConfigProperties(MM_BEARER_IP_METHOD_UNKNOWN));
24905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
25005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
25126692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(IPConfig::kMethodUnknown, bearer_.ipv6_config_method());
25226692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
25305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
25405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetKeyValueStore(
25505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      MM_BEARER_PROPERTY_IP6CONFIG,
25605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ConstructIPv6ConfigProperties(MM_BEARER_IP_METHOD_PPP));
25705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
25805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
25926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(IPConfig::kMethodPPP, bearer_.ipv6_config_method());
26026692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
26105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
26205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetKeyValueStore(
26305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      MM_BEARER_PROPERTY_IP6CONFIG,
26405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ConstructIPv6ConfigProperties(MM_BEARER_IP_METHOD_STATIC));
26505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
26605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
26726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(IPConfig::kMethodStatic, bearer_.ipv6_config_method());
26826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  VerifyStaticIPv6ConfigMethodAndProperties();
26926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
27005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.Clear();
27105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  properties.SetKeyValueStore(
27205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      MM_BEARER_PROPERTY_IP6CONFIG,
27305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      ConstructIPv6ConfigProperties(MM_BEARER_IP_METHOD_DHCP));
27405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bearer_.OnPropertiesChanged(MM_DBUS_INTERFACE_BEARER, properties,
27505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                              vector<string>());
27626692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan  EXPECT_EQ(IPConfig::kMethodDHCP, bearer_.ipv6_config_method());
27726692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan}
27826692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan
27926692bd03e56c3e71d2887e83e4cbbe71a64a191Ben Chan}  // namespace shill
280