1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 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//
16dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
17cddd2d09878704128d35ddfeec862109b7d7fdc9Alex Deymo#include "shill/connection.h"
18cddd2d09878704128d35ddfeec862109b7d7fdc9Alex Deymo
199a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart#include <arpa/inet.h>
209a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart#include <linux/rtnetlink.h>
219a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart
2222f1fbc11b69ee41af8370ec38f1b90577db6c3cBen Chan#include <memory>
23c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart#include <string>
249a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart#include <vector>
259a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart
26dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include <gtest/gtest.h>
27dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include <gmock/gmock.h>
28dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
29dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include "shill/ipconfig.h"
3013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov#include "shill/mock_connection.h"
31dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include "shill/mock_control.h"
32c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart#include "shill/mock_device.h"
339a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart#include "shill/mock_device_info.h"
34a330ecd23b1ce4112fd7a28f4b2a062b8df10735Peter Qiu#include "shill/mock_firewall_proxy.h"
358f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
36dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include "shill/mock_resolver.h"
379429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
389429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#include "shill/mock_dns_server_proxy.h"
399429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#include "shill/mock_dns_server_proxy_factory.h"
408f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
41dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include "shill/mock_routing_table.h"
428d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_rtnl_handler.h"
43dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include "shill/routing_table_entry.h"
44dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
45c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewartusing std::string;
469a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewartusing std::vector;
47dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartusing testing::_;
48e78ec548060d969fecdb488d6fed711d843bba91Paul Stewartusing testing::Mock;
49dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartusing testing::NiceMock;
50dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartusing testing::Return;
514a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewartusing testing::ReturnRef;
52dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartusing testing::StrictMock;
53dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartusing testing::Test;
54dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
55dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartnamespace shill {
56dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
57dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartnamespace {
58dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst char kTestDeviceName0[] = "netdev0";
59dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst int kTestDeviceInterfaceIndex0 = 123;
60dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst char kTestDeviceName1[] = "netdev1";
61dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst int kTestDeviceInterfaceIndex1 = 321;
62dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst char kIPAddress0[] = "192.168.1.1";
63dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst char kGatewayAddress0[] = "192.168.1.254";
649a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewartconst char kBroadcastAddress0[] = "192.168.1.255";
65dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst char kNameServer0[] = "8.8.8.8";
66dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst char kNameServer1[] = "8.8.9.9";
677fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst int32_t kPrefix0 = 24;
687fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst int32_t kPrefix1 = 31;
69dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst char kSearchDomain0[] = "chromium.org";
70dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartconst char kSearchDomain1[] = "google.com";
71b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiuconst char kIPv6Address[] = "2001:db8::1";
72b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiuconst char kIPv6NameServer0[] = "2001:db9::1";
73b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiuconst char kIPv6NameServer1[] = "2001:db9::2";
74a6bfe87a2c0bcb68d789473ca10988243229667bBen Chan}  // namespace
75dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
76dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartclass ConnectionTest : public Test {
77dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart public:
78dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  ConnectionTest()
799a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart      : device_info_(new StrictMock<MockDeviceInfo>(
809a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart            &control_,
81cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan            nullptr,
82cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan            nullptr,
83cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan            nullptr)),
849a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart        connection_(new Connection(
859a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart            kTestDeviceInterfaceIndex0,
869a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart            kTestDeviceName0,
87e00600e1ec769b3acf0709e843c1f0ae73bd2fdbPaul Stewart            Technology::kUnknown,
88608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu            device_info_.get(),
89608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu            &control_)),
905b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart        ipconfig_(new IPConfig(&control_, kTestDeviceName0)),
91b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu        ip6config_(new IPConfig(&control_, kTestDeviceName0)),
925b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart        local_address_(IPAddress::kFamilyIPv4),
935b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart        broadcast_address_(IPAddress::kFamilyIPv4),
945b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart        gateway_address_(IPAddress::kFamilyIPv4),
95b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu        default_address_(IPAddress::kFamilyIPv4),
96b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu        local_ipv6_address_(IPAddress::kFamilyIPv6) {}
97dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
98dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  virtual void SetUp() {
99c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart    ReplaceSingletons(connection_);
1005b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.address = kIPAddress0;
1015b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.subnet_prefix = kPrefix0;
1025b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.gateway = kGatewayAddress0;
1035b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.broadcast_address = kBroadcastAddress0;
1045b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.dns_servers.push_back(kNameServer0);
1055b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.dns_servers.push_back(kNameServer1);
1065b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.domain_search.push_back(kSearchDomain0);
1075b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.domain_search.push_back(kSearchDomain1);
1085b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    properties_.address_family = IPAddress::kFamilyIPv4;
1095b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    UpdateProperties();
110b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu    ipv6_properties_.address = kIPv6Address;
111b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu    ipv6_properties_.dns_servers.push_back(kIPv6NameServer0);
112b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu    ipv6_properties_.dns_servers.push_back(kIPv6NameServer1);
113b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu    ipv6_properties_.address_family = IPAddress::kFamilyIPv6;
114b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu    UpdateIPv6Properties();
1155b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    EXPECT_TRUE(local_address_.SetAddressFromString(kIPAddress0));
1165b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    EXPECT_TRUE(broadcast_address_.SetAddressFromString(kBroadcastAddress0));
1175b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart    EXPECT_TRUE(gateway_address_.SetAddressFromString(kGatewayAddress0));
118b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu    EXPECT_TRUE(local_ipv6_address_.SetAddressFromString(kIPv6Address));
119dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  }
120dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
1219a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart  virtual void TearDown() {
12213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    AddDestructorExpectations();
123cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    connection_ = nullptr;
1249a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart  }
1259a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart
126c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart  void ReplaceSingletons(ConnectionRefPtr connection) {
1278f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
128c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart    connection->resolver_ = &resolver_;
1299429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
1309429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu    connection->dns_server_proxy_factory_ = &dns_server_proxy_factory_;
1318f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
132c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart    connection->routing_table_ = &routing_table_;
133c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart    connection->rtnl_handler_ = &rtnl_handler_;
134c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart  }
135c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart
1365b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  void UpdateProperties() {
1373c3c36a37a885d0a2e180998587af8390744f757Samuel Tan    ipconfig_->UpdateProperties(properties_, true);
1385b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  }
1395b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart
140b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  void UpdateIPv6Properties() {
1413c3c36a37a885d0a2e180998587af8390744f757Samuel Tan    ip6config_->UpdateProperties(ipv6_properties_, true);
142b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  }
143b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu
144e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart  bool PinHostRoute(ConnectionRefPtr connection,
14573fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart                    const IPAddress trusted_ip,
14673fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart                    const IPAddress gateway) {
14773fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart    return connection->PinHostRoute(trusted_ip, gateway);
148e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart  }
149e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
1503b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  const IPAddress& GetLocalAddress(ConnectionRefPtr connection) {
1514a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart    return connection->local_;
1524a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  }
1534a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart
1543b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  const IPAddress& GetGatewayAddress(ConnectionRefPtr connection) {
1554a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart    return connection->gateway_;
1564a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  }
1574a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart
1584a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  bool GetHasBroadcastDomain(ConnectionRefPtr connection) {
1594a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart    return connection->has_broadcast_domain_;
1604a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  }
1614a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart
1627fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint32_t GetDefaultMetric() {
16305a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart      return Connection::kDefaultMetric;
16405a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  }
16505a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart
1667fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint32_t GetNonDefaultMetricBase() {
16705a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart      return Connection::kNonDefaultMetricBase;
16805a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  }
16905a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart
1703b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  void SetLocal(const IPAddress& local) {
1712cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart    connection_->local_ = local;
1722cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  }
1732cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart
1749429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#if defined(__ANDROID__)
1759429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  // Setting expectations for creating/starting DNS server proxy.
1769429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  void ExpectDNSServerProxyCreation(const vector<string>& dns_servers,
1779429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu                                    bool verify_servers) {
1789429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu    MockDNSServerProxy* dns_server_proxy = new MockDNSServerProxy();
1799429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu    if (verify_servers) {
1809429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu      EXPECT_CALL(dns_server_proxy_factory_,
1819429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu                  CreateDNSServerProxy(dns_servers))
1829429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu          .WillOnce(Return(dns_server_proxy));
1839429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu    } else {
1849429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu      EXPECT_CALL(dns_server_proxy_factory_, CreateDNSServerProxy(_))
1859429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu          .WillOnce(Return(dns_server_proxy));
1869429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu    }
1879429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu    EXPECT_CALL(*dns_server_proxy, Start());
1889429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  }
1899429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#endif  // __ANDROID__
1909429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu
191dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart protected:
19213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  class DisconnectCallbackTarget {
19313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov   public:
19413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    DisconnectCallbackTarget()
19513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov        : callback_(base::Bind(&DisconnectCallbackTarget::CallTarget,
19613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov                               base::Unretained(this))) {}
19713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
19813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    MOCK_METHOD0(CallTarget, void());
1993b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart    const base::Closure& callback() { return callback_; }
20013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
20113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov   private:
20213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    base::Closure callback_;
20313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  };
20413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
20513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  void AddDestructorExpectations() {
20613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_CALL(routing_table_, FlushRoutes(kTestDeviceInterfaceIndex0));
20713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_CALL(routing_table_, FlushRoutesWithTag(kTestDeviceInterfaceIndex0));
20813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_CALL(*device_info_.get(),
20913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov                FlushAddresses(kTestDeviceInterfaceIndex0));
21013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  }
21113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
21213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // Returns a new test connection object. The caller usually needs to call
21313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // AddDestructorExpectations before destroying the object.
21413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ConnectionRefPtr GetNewConnection() {
21513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    ConnectionRefPtr connection(new Connection(kTestDeviceInterfaceIndex0,
21613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov                                               kTestDeviceName0,
21713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov                                               Technology::kUnknown,
218608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu                                               device_info_.get(),
219608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu                                               &control_));
22013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    ReplaceSingletons(connection);
22113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    return connection;
22213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  }
22313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
22422f1fbc11b69ee41af8370ec38f1b90577db6c3cBen Chan  std::unique_ptr<StrictMock<MockDeviceInfo>> device_info_;
225dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  ConnectionRefPtr connection_;
226dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  MockControl control_;
227dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  IPConfigRefPtr ipconfig_;
228b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  IPConfigRefPtr ip6config_;
2295b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  IPConfig::Properties properties_;
230b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  IPConfig::Properties ipv6_properties_;
2315b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  IPAddress local_address_;
2325b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  IPAddress broadcast_address_;
2335b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  IPAddress gateway_address_;
2345b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  IPAddress default_address_;
235b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  IPAddress local_ipv6_address_;
2368f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
237dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  StrictMock<MockResolver> resolver_;
2389429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
2399429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  StrictMock<MockDNSServerProxyFactory> dns_server_proxy_factory_;
2408f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
241dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  StrictMock<MockRoutingTable> routing_table_;
242dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  StrictMock<MockRTNLHandler> rtnl_handler_;
243dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart};
244dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
24513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkovnamespace {
246dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
2475b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul StewartMATCHER_P2(IsIPAddress, address, prefix, "") {
2485b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  IPAddress match_address(address);
2495b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  match_address.set_prefix(prefix);
2505b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  return match_address.Equals(arg);
2515b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart}
2525b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart
253b25083f4ec00167ceed71a7f961e3f1435dbe070Peter QiuMATCHER_P(IsIPv6Address, address, "") {
254b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  IPAddress match_address(address);
255b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  return match_address.Equals(arg);
256b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu}
257b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu
25813e6d55b9dd86148ae68588f367c48e81ad33b74Darin PetkovMATCHER(IsNonNullCallback, "") {
25913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  return !arg.is_null();
26013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov}
26113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
262762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu KaliamoorthiMATCHER_P(IsValidRoutingTableEntry, dst, "") {
263762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  return dst.Equals(arg.dst);
264762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi}
265762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
266c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul StewartMATCHER_P(IsLinkRouteTo, dst, "") {
267c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  return dst.HasSameAddressAs(arg.dst) &&
268c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      arg.dst.prefix() ==
269c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart          IPAddress::GetMaxPrefixLength(IPAddress::kFamilyIPv4) &&
270c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      !arg.src.IsValid() && !arg.gateway.IsValid() &&
271c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      arg.scope == RT_SCOPE_LINK && !arg.from_rtnl;
272c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart}
273c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart
27413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov}  // namespace
27513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
27613e6d55b9dd86148ae68588f367c48e81ad33b74Darin PetkovTEST_F(ConnectionTest, InitState) {
27713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_EQ(kTestDeviceInterfaceIndex0, connection_->interface_index_);
27813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_EQ(kTestDeviceName0, connection_->interface_name_);
27913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(connection_->is_default());
28013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(connection_->routing_request_count_);
28113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov}
28213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
283dd60e4549cc8898f7f517283eacc58f67570bd1fPaul StewartTEST_F(ConnectionTest, AddConfig) {
28405a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(*device_info_,
28505a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart              HasOtherAddress(kTestDeviceInterfaceIndex0,
28605a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              IsIPAddress(local_address_, kPrefix0)))
28705a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart      .WillOnce(Return(false));
288dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  EXPECT_CALL(rtnl_handler_,
2895b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart              AddInterfaceAddress(kTestDeviceInterfaceIndex0,
2905b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(local_address_, kPrefix0),
2915b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(broadcast_address_, 0),
2925b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(default_address_, 0)));
2937cfca0467e47aa91b485c485b92befb33a1fd61fPaul Stewart  EXPECT_CALL(routing_table_,
2947cfca0467e47aa91b485c485b92befb33a1fd61fPaul Stewart              SetDefaultRoute(kTestDeviceInterfaceIndex0,
2955b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                              IsIPAddress(gateway_address_, 0),
29605a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              GetNonDefaultMetricBase() +
297762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              kTestDeviceInterfaceIndex0,
298762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
2993f68bb1e3768969a1db686325ae9a84c8fd06005Paul Stewart  EXPECT_CALL(routing_table_,
3003f68bb1e3768969a1db686325ae9a84c8fd06005Paul Stewart              ConfigureRoutes(kTestDeviceInterfaceIndex0,
3013f68bb1e3768969a1db686325ae9a84c8fd06005Paul Stewart                              ipconfig_,
302762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              GetDefaultMetric(),
303762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
304024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(kTestDeviceInterfaceIndex0,
305024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart                                             IPConfig::kDefaultMTU));
306dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  connection_->UpdateFromIPConfig(ipconfig_);
3074a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  IPAddress test_local_address(local_address_);
3084a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  test_local_address.set_prefix(kPrefix0);
3094a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_TRUE(test_local_address.Equals(GetLocalAddress(connection_)));
3104a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_TRUE(gateway_address_.Equals(GetGatewayAddress(connection_)));
3114a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_TRUE(GetHasBroadcastDomain(connection_));
312b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  EXPECT_FALSE(connection_->IsIPv6());
3134a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart
3144a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_CALL(routing_table_,
3154a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart              CreateLinkRoute(kTestDeviceInterfaceIndex0,
3164a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart                              IsIPAddress(local_address_, kPrefix0),
317762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              IsIPAddress(gateway_address_, 0),
318762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN))
3194a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart      .WillOnce(Return(true))
3204a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart      .WillOnce(Return(false));
3214a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_TRUE(connection_->CreateGatewayRoute());
3224a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_FALSE(connection_->CreateGatewayRoute());
3234a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  connection_->has_broadcast_domain_ = false;
3244a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_FALSE(connection_->CreateGatewayRoute());
325dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
326dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  EXPECT_CALL(routing_table_, SetDefaultMetric(kTestDeviceInterfaceIndex0,
32705a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                                               GetDefaultMetric()));
3288f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
329dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  EXPECT_CALL(resolver_, SetDNSFromLists(
330dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart      ipconfig_->properties().dns_servers,
33123ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal      ipconfig_->properties().domain_search));
3329429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
3339429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  ExpectDNSServerProxyCreation(ipconfig_->properties().dns_servers, true);
3348f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
335c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart  scoped_refptr<MockDevice> device(new StrictMock<MockDevice>(
336c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      &control_,
337cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
338cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
339cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
340c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      kTestDeviceName0,
341c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      string(),
342c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      kTestDeviceInterfaceIndex0));
343c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex0))
344c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      .WillOnce(Return(device));
345c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart  EXPECT_CALL(*device.get(), RequestPortalDetection())
346c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      .WillOnce(Return(true));
347e78ec548060d969fecdb488d6fed711d843bba91Paul Stewart  EXPECT_CALL(routing_table_, FlushCache())
348e78ec548060d969fecdb488d6fed711d843bba91Paul Stewart      .WillOnce(Return(true));
349c1dec4d5cad7c6ee2cd8dbc4f47e4d30403dcca1Paul Stewart  connection_->SetIsDefault(true);
350e78ec548060d969fecdb488d6fed711d843bba91Paul Stewart  Mock::VerifyAndClearExpectations(&routing_table_);
351dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  EXPECT_TRUE(connection_->is_default());
352dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
3537cfca0467e47aa91b485c485b92befb33a1fd61fPaul Stewart  EXPECT_CALL(routing_table_,
3547cfca0467e47aa91b485c485b92befb33a1fd61fPaul Stewart              SetDefaultMetric(kTestDeviceInterfaceIndex0,
35505a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                               GetNonDefaultMetricBase() +
3567cfca0467e47aa91b485c485b92befb33a1fd61fPaul Stewart                               kTestDeviceInterfaceIndex0));
357e78ec548060d969fecdb488d6fed711d843bba91Paul Stewart  EXPECT_CALL(routing_table_, FlushCache())
358e78ec548060d969fecdb488d6fed711d843bba91Paul Stewart      .WillOnce(Return(true));
359c1dec4d5cad7c6ee2cd8dbc4f47e4d30403dcca1Paul Stewart  connection_->SetIsDefault(false);
360dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  EXPECT_FALSE(connection_->is_default());
361dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart}
362dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
363762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu KaliamoorthiTEST_F(ConnectionTest, AddConfigUserTrafficOnly) {
364762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  ConnectionRefPtr connection = GetNewConnection();
365762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  const std::string kExcludeAddress1 = "192.0.1.0/24";
366762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  const std::string kExcludeAddress2 = "192.0.2.0/24";
367762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  IPAddress address1(IPAddress::kFamilyIPv4);
368762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  IPAddress address2(IPAddress::kFamilyIPv4);
369762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_TRUE(address1.SetAddressAndPrefixFromString(kExcludeAddress1));
370762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_TRUE(address2.SetAddressAndPrefixFromString(kExcludeAddress2));
371762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(*device_info_,
372762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              HasOtherAddress(kTestDeviceInterfaceIndex0,
373762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              IsIPAddress(local_address_, kPrefix0)))
374762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillOnce(Return(false));
375762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(rtnl_handler_,
376762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              AddInterfaceAddress(kTestDeviceInterfaceIndex0,
377762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                  IsIPAddress(local_address_, kPrefix0),
378762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                  IsIPAddress(broadcast_address_, 0),
379762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                  IsIPAddress(default_address_, 0)));
380762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_,
381762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              ConfigureRoutes(kTestDeviceInterfaceIndex0, ipconfig_,
382762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              GetDefaultMetric(), 1));
383762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(
384762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      routing_table_,
385762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      RequestRouteToHost(IsIPAddress(address1, address1.prefix()), -1,
386762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                         kTestDeviceInterfaceIndex0, IsNonNullCallback(), 1))
387762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillOnce(Return(true));
388762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(kTestDeviceInterfaceIndex0,
389762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                             IPConfig::kDefaultMTU));
39077e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi
391a330ecd23b1ce4112fd7a28f4b2a062b8df10735Peter Qiu  MockFirewallProxy* firewall_proxy = new MockFirewallProxy();
392a330ecd23b1ce4112fd7a28f4b2a062b8df10735Peter Qiu  connection->firewall_proxy_.reset(firewall_proxy);
393a330ecd23b1ce4112fd7a28f4b2a062b8df10735Peter Qiu  EXPECT_CALL(*firewall_proxy, RequestVpnSetup(_, _));
394762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  properties_.user_traffic_only = true;
3951f58903c02e9a8e29816f7a7659afa331b005d9cPrabhu Kaliamoorthi  properties_.default_route = false;
396762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  properties_.exclusion_list.push_back(kExcludeAddress1);
397762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  properties_.exclusion_list.push_back(kExcludeAddress2);
398762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  UpdateProperties();
399762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  connection->UpdateFromIPConfig(ipconfig_);
400762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
401762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  scoped_refptr<MockDevice> device1(
402762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      new MockDevice(&control_, nullptr, nullptr, nullptr, kTestDeviceName1,
403762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                     string(), kTestDeviceInterfaceIndex1));
404762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  scoped_refptr<MockConnection> mock_connection(
405762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      new MockConnection(device_info_.get()));
406762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  ConnectionRefPtr device_connection = mock_connection.get();
407762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
408762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(*device_info_.get(),
409762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              FlushAddresses(mock_connection->interface_index()));
410762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  const string kInterfaceName(kTestDeviceName1);
411762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(*mock_connection, interface_name())
412762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillRepeatedly(ReturnRef(kInterfaceName));
413762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(*device1, connection())
414762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillRepeatedly(testing::ReturnRef(device_connection));
415762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex1))
416762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillOnce(Return(device1));
417762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
418762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, AddRoute(kTestDeviceInterfaceIndex1,
419762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                       IsValidRoutingTableEntry(address2)))
420762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillOnce(Return(true));
421762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
422762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  connection->OnRouteQueryResponse(
423762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      kTestDeviceInterfaceIndex1,
424762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      RoutingTableEntry(default_address_, default_address_, default_address_, 1,
425762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                        1, false));
426762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
427762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  IPAddress test_local_address(local_address_);
428762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  test_local_address.set_prefix(kPrefix0);
429762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_TRUE(test_local_address.Equals(GetLocalAddress(connection)));
430762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_TRUE(gateway_address_.Equals(GetGatewayAddress(connection)));
431762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_TRUE(GetHasBroadcastDomain(connection));
432762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_FALSE(connection->IsIPv6());
433762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
434762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_,
435762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              CreateLinkRoute(kTestDeviceInterfaceIndex0,
436762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              IsIPAddress(local_address_, kPrefix0),
437762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              IsIPAddress(gateway_address_, 0), 1))
438762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillOnce(Return(true))
439762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillOnce(Return(false));
440762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_TRUE(connection->CreateGatewayRoute());
441762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_FALSE(connection->CreateGatewayRoute());
442762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  connection->has_broadcast_domain_ = false;
443762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_FALSE(connection->CreateGatewayRoute());
444762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
445762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_,
446762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              SetDefaultMetric(kTestDeviceInterfaceIndex0, GetDefaultMetric()));
4478f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
448762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(resolver_,
449762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              SetDNSFromLists(ipconfig_->properties().dns_servers,
450762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              ipconfig_->properties().domain_search));
4519429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
4529429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  ExpectDNSServerProxyCreation(ipconfig_->properties().dns_servers, true);
4538f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
454762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  scoped_refptr<MockDevice> device(new StrictMock<MockDevice>(
455762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      &control_, nullptr, nullptr, nullptr, kTestDeviceName0, string(),
456762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      kTestDeviceInterfaceIndex0));
457762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex0))
458762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi      .WillOnce(Return(device));
459762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(*device.get(), RequestPortalDetection()).WillOnce(Return(true));
460762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, FlushCache()).WillOnce(Return(true));
461762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  connection->SetIsDefault(true);
462762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  Mock::VerifyAndClearExpectations(&routing_table_);
463762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_TRUE(connection->is_default());
464762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
465762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, SetDefaultMetric(kTestDeviceInterfaceIndex0,
466762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                               GetNonDefaultMetricBase() +
467762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                                   kTestDeviceInterfaceIndex0));
468762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, FlushCache()).WillOnce(Return(true));
469762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  connection->SetIsDefault(false);
470762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_FALSE(connection->is_default());
471762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  AddDestructorExpectations();
472a330ecd23b1ce4112fd7a28f4b2a062b8df10735Peter Qiu  EXPECT_CALL(*firewall_proxy, RemoveVpnSetup());
473762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi}
474762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi
475b25083f4ec00167ceed71a7f961e3f1435dbe070Peter QiuTEST_F(ConnectionTest, AddConfigIPv6) {
476b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  EXPECT_CALL(*device_info_,
477b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu              HasOtherAddress(kTestDeviceInterfaceIndex0,
478b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu                              IsIPv6Address(local_ipv6_address_)))
479b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu      .WillOnce(Return(false));
480b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  EXPECT_CALL(rtnl_handler_,
481b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu              AddInterfaceAddress(kTestDeviceInterfaceIndex0,
482b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu                                  IsIPv6Address(local_ipv6_address_),
483b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu                                  _,
484b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu                                  _));
485b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  EXPECT_CALL(routing_table_,
486b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu              ConfigureRoutes(kTestDeviceInterfaceIndex0,
487b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu                              ip6config_,
488762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              GetDefaultMetric(),
489762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
490024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(kTestDeviceInterfaceIndex0,
491024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart                                             IPConfig::kDefaultMTU));
492b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  connection_->UpdateFromIPConfig(ip6config_);
493b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  IPAddress test_local_address(local_ipv6_address_);
494b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  EXPECT_TRUE(test_local_address.Equals(GetLocalAddress(connection_)));
495b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu  EXPECT_TRUE(connection_->IsIPv6());
496b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu}
497b25083f4ec00167ceed71a7f961e3f1435dbe070Peter Qiu
4985b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul StewartTEST_F(ConnectionTest, AddConfigWithPeer) {
4995b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  const string kPeerAddress("192.168.1.222");
5005b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  IPAddress peer_address(IPAddress::kFamilyIPv4);
5015b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  EXPECT_TRUE(peer_address.SetAddressFromString(kPeerAddress));
5025b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  properties_.peer_address = kPeerAddress;
5035b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  properties_.gateway = string();
5045b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  UpdateProperties();
50505a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(*device_info_,
50605a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart              HasOtherAddress(kTestDeviceInterfaceIndex0,
50705a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              IsIPAddress(local_address_, kPrefix0)))
50805a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart      .WillOnce(Return(false));
5095b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  EXPECT_CALL(rtnl_handler_,
5105b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart              AddInterfaceAddress(kTestDeviceInterfaceIndex0,
5115b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(local_address_, kPrefix0),
5125b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(broadcast_address_, 0),
5135b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(peer_address, 0)));
514762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, SetDefaultRoute(_, _, _, _)).Times(0);
5155b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  EXPECT_CALL(routing_table_,
5165b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart              ConfigureRoutes(kTestDeviceInterfaceIndex0,
5175b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                              ipconfig_,
518762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              GetDefaultMetric(),
519762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
520024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(kTestDeviceInterfaceIndex0,
521024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart                                             IPConfig::kDefaultMTU));
5225b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  connection_->UpdateFromIPConfig(ipconfig_);
5234a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_FALSE(GetHasBroadcastDomain(connection_));
5245b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart}
5255b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart
5265b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul StewartTEST_F(ConnectionTest, AddConfigWithBrokenNetmask) {
5275b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  // Assign a prefix that makes the gateway unreachable.
5285b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  properties_.subnet_prefix = kPrefix1;
5295b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  UpdateProperties();
5305b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart
531c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  // Connection should add a link route which will allow the
5325b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  // gateway to be reachable.
533c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  IPAddress gateway_address(IPAddress::kFamilyIPv4);
534c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_TRUE(gateway_address.SetAddressFromString(kGatewayAddress0));
535c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_CALL(routing_table_, AddRoute(kTestDeviceInterfaceIndex0,
536c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart                                       IsLinkRouteTo(gateway_address)))
537c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      .WillOnce(Return(true));
53805a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(*device_info_,
53905a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart              HasOtherAddress(kTestDeviceInterfaceIndex0,
540c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart                              IsIPAddress(local_address_, kPrefix1)))
54105a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart      .WillOnce(Return(false));
5425b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  EXPECT_CALL(rtnl_handler_,
5435b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart              AddInterfaceAddress(kTestDeviceInterfaceIndex0,
544c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart                                  IsIPAddress(local_address_, kPrefix1),
5455b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(broadcast_address_, 0),
5465b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(default_address_, 0)));
5475b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  EXPECT_CALL(routing_table_,
5485b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart              SetDefaultRoute(kTestDeviceInterfaceIndex0,
5495b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                              IsIPAddress(gateway_address_, 0),
55005a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              GetNonDefaultMetricBase() +
551762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              kTestDeviceInterfaceIndex0,
552762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
5535b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  EXPECT_CALL(routing_table_,
5545b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart              ConfigureRoutes(kTestDeviceInterfaceIndex0,
5555b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                              ipconfig_,
556762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              GetDefaultMetric(),
557762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
558024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(kTestDeviceInterfaceIndex0,
559024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart                                             IPConfig::kDefaultMTU));
5605b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart  connection_->UpdateFromIPConfig(ipconfig_);
5615b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart}
5625b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart
563dd60e4549cc8898f7f517283eacc58f67570bd1fPaul StewartTEST_F(ConnectionTest, AddConfigReverse) {
564dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  EXPECT_CALL(routing_table_, SetDefaultMetric(kTestDeviceInterfaceIndex0,
56505a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                                               GetDefaultMetric()));
566c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart  vector<string> empty_list;
5678f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
56823ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal  EXPECT_CALL(resolver_, SetDNSFromLists(empty_list, empty_list));
5699429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
5709429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  ExpectDNSServerProxyCreation(empty_list, true);
5718f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
572c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart  scoped_refptr<MockDevice> device(new StrictMock<MockDevice>(
573c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      &control_,
574cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
575cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
576cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
577c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      kTestDeviceName0,
578c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      string(),
579c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      kTestDeviceInterfaceIndex0));
580c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex0))
581c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      .WillOnce(Return(device));
582c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart  EXPECT_CALL(*device.get(), RequestPortalDetection())
583c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart      .WillOnce(Return(true));
584e78ec548060d969fecdb488d6fed711d843bba91Paul Stewart  EXPECT_CALL(routing_table_, FlushCache())
585e78ec548060d969fecdb488d6fed711d843bba91Paul Stewart      .WillOnce(Return(true));
586c1dec4d5cad7c6ee2cd8dbc4f47e4d30403dcca1Paul Stewart  connection_->SetIsDefault(true);
587e78ec548060d969fecdb488d6fed711d843bba91Paul Stewart  Mock::VerifyAndClearExpectations(&routing_table_);
588dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
58905a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(*device_info_,
59005a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart              HasOtherAddress(kTestDeviceInterfaceIndex0,
59105a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              IsIPAddress(local_address_, kPrefix0)))
59205a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart      .WillOnce(Return(false));
593dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  EXPECT_CALL(rtnl_handler_,
5945b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart              AddInterfaceAddress(kTestDeviceInterfaceIndex0,
5955b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(local_address_, kPrefix0),
5965b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(broadcast_address_, 0),
5975b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                  IsIPAddress(default_address_, 0)));
598dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  EXPECT_CALL(routing_table_, SetDefaultRoute(kTestDeviceInterfaceIndex0,
5995b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart                                              IsIPAddress(gateway_address_, 0),
600762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                              GetDefaultMetric(),
601762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                              RT_TABLE_MAIN));
6023f68bb1e3768969a1db686325ae9a84c8fd06005Paul Stewart  EXPECT_CALL(routing_table_,
6033f68bb1e3768969a1db686325ae9a84c8fd06005Paul Stewart              ConfigureRoutes(kTestDeviceInterfaceIndex0,
6043f68bb1e3768969a1db686325ae9a84c8fd06005Paul Stewart                              ipconfig_,
605762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              GetDefaultMetric(),
606762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
6078f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
60823ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal  EXPECT_CALL(resolver_,
60923ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal              SetDNSFromLists(ipconfig_->properties().dns_servers,
61023ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal                              ipconfig_->properties().domain_search));
6119429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
6129429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  ExpectDNSServerProxyCreation(ipconfig_->properties().dns_servers, true);
6138f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
614024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(kTestDeviceInterfaceIndex0,
615024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart                                             IPConfig::kDefaultMTU));
616dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  connection_->UpdateFromIPConfig(ipconfig_);
617dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart}
618dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
6194d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul StewartTEST_F(ConnectionTest, AddConfigWithDNSDomain) {
6204d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  const string kDomainName("chromium.org");
6214d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  properties_.domain_search.clear();
6224d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  properties_.domain_name = kDomainName;
6234d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  UpdateProperties();
6244d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  EXPECT_CALL(*device_info_, HasOtherAddress(_, _))
6254d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart      .WillOnce(Return(false));
6264d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  EXPECT_CALL(rtnl_handler_, AddInterfaceAddress(_, _, _, _));
627762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, SetDefaultRoute(_, _, _, _));
628762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, ConfigureRoutes(_, _, _, _));
629024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(_, _));
6304d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  connection_->UpdateFromIPConfig(ipconfig_);
6314d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart
6324d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  EXPECT_CALL(routing_table_, SetDefaultMetric(_, _));
6334d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  vector<string> domain_search_list;
6344d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  domain_search_list.push_back(kDomainName + ".");
6358f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
63623ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal  EXPECT_CALL(resolver_, SetDNSFromLists(_, domain_search_list));
6379429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
6389429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  ExpectDNSServerProxyCreation(vector<string>(), false);
6398f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
6404d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  DeviceRefPtr device;
6414d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  EXPECT_CALL(*device_info_, GetDevice(_)).WillOnce(Return(device));
6424d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  EXPECT_CALL(routing_table_, FlushCache()).WillOnce(Return(true));
6434d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart  connection_->SetIsDefault(true);
6444d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart}
6454d1868b5085dd0c5c38e9d8d5c52516c901bd2a0Paul Stewart
64605a42c23f1d37daa8689fc4240034e62ed89f8fcPaul StewartTEST_F(ConnectionTest, HasOtherAddress) {
64705a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(*device_info_,
64805a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart              HasOtherAddress(kTestDeviceInterfaceIndex0,
64905a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              IsIPAddress(local_address_, kPrefix0)))
65005a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart      .WillOnce(Return(true));
65105a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(routing_table_, FlushRoutes(kTestDeviceInterfaceIndex0));
65205a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(*device_info_, FlushAddresses(kTestDeviceInterfaceIndex0));
65305a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(rtnl_handler_,
65405a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart              AddInterfaceAddress(kTestDeviceInterfaceIndex0,
65505a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                                  IsIPAddress(local_address_, kPrefix0),
65605a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                                  IsIPAddress(broadcast_address_, 0),
65705a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                                  IsIPAddress(default_address_, 0)));
65805a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(routing_table_,
65905a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart              SetDefaultRoute(kTestDeviceInterfaceIndex0,
66005a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              IsIPAddress(gateway_address_, 0),
66105a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              GetNonDefaultMetricBase() +
662762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              kTestDeviceInterfaceIndex0,
663762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
66405a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  EXPECT_CALL(routing_table_,
66505a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart              ConfigureRoutes(kTestDeviceInterfaceIndex0,
66605a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart                              ipconfig_,
667762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              GetDefaultMetric(),
668762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                              RT_TABLE_MAIN));
669024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(kTestDeviceInterfaceIndex0,
670024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart                                             IPConfig::kDefaultMTU));
67105a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart  connection_->UpdateFromIPConfig(ipconfig_);
67205a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart}
67305a42c23f1d37daa8689fc4240034e62ed89f8fcPaul Stewart
674a89154bfedfd8872242083ffe4f084fdc774c078Peter QiuTEST_F(ConnectionTest, UpdateDNSServers) {
675a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  const char* kDnsServers[] = {"1.1.1.1", "1.1.1.2"};
676a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  vector<string> dns_servers(kDnsServers, std::end(kDnsServers));
677a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu
678a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  // Non-default connection.
679a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  connection_->is_default_ = false;
6808f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
681a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  EXPECT_CALL(resolver_, SetDNSFromLists(_, _)).Times(0);
6829429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
6839429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  EXPECT_CALL(dns_server_proxy_factory_, CreateDNSServerProxy(_)).Times(0);
6848f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
685a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  connection_->UpdateDNSServers(dns_servers);
6868f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
687a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  Mock::VerifyAndClearExpectations(&resolver_);
6889429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
6899429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  Mock::VerifyAndClearExpectations(&dns_server_proxy_factory_);
6908f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
691a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu
692a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  // Default connection.
693a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  connection_->is_default_ = true;
6948f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
695a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  EXPECT_CALL(resolver_, SetDNSFromLists(dns_servers, _));
6969429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
6979429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  ExpectDNSServerProxyCreation(dns_servers, true);
6988f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
699a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  connection_->UpdateDNSServers(dns_servers);
7008f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
701a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu  Mock::VerifyAndClearExpectations(&resolver_);
7029429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
7039429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  Mock::VerifyAndClearExpectations(&dns_server_proxy_factory_);
7048f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
705a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu}
706a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu
707c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul StewartTEST_F(ConnectionTest, RouteRequest) {
70813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ConnectionRefPtr connection = GetNewConnection();
709f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  scoped_refptr<MockDevice> device(new StrictMock<MockDevice>(
710f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart      &control_,
711cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
712cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
713cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
714f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart      kTestDeviceName0,
715f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart      string(),
716f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart      kTestDeviceInterfaceIndex0));
717f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex0))
718f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart      .WillRepeatedly(Return(device));
7192cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  EXPECT_CALL(*device.get(), SetLooseRouting(true)).Times(1);
720f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  connection->RequestRouting();
721f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  connection->RequestRouting();
722f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart
723f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  // The first release should only decrement the reference counter.
724f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  connection->ReleaseRouting();
725f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart
726f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  // Another release will re-enable reverse-path filter.
7272cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  EXPECT_CALL(*device.get(), SetLooseRouting(false));
728f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  EXPECT_CALL(routing_table_, FlushCache());
729f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  connection->ReleaseRouting();
730f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart
731f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  // The destructor will remove the routes and addresses.
73213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  AddDestructorExpectations();
733c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart}
734c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart
735dd60e4549cc8898f7f517283eacc58f67570bd1fPaul StewartTEST_F(ConnectionTest, Destructor) {
73613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ConnectionRefPtr connection(new Connection(kTestDeviceInterfaceIndex1,
73713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov                                             kTestDeviceName1,
73813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov                                             Technology::kUnknown,
739608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu                                             device_info_.get(),
740608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu                                             &control_));
7418f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#if !defined(__ANDROID__)
74213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection->resolver_ = &resolver_;
7439429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu#else
7449429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu  connection->dns_server_proxy_factory_ = &dns_server_proxy_factory_;
7458f203b86927727501227d640f592d1e41ce8fcbcPeter Qiu#endif  // __ANDROID__
74613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection->routing_table_ = &routing_table_;
74713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection->rtnl_handler_ = &rtnl_handler_;
748fb46caf4f23a41e73dfd87547121b5fb0230295aThieu Le  EXPECT_CALL(routing_table_, FlushRoutes(kTestDeviceInterfaceIndex1));
749e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart  EXPECT_CALL(routing_table_, FlushRoutesWithTag(kTestDeviceInterfaceIndex1));
7509a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart  EXPECT_CALL(*device_info_, FlushAddresses(kTestDeviceInterfaceIndex1));
751cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  connection = nullptr;
752dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart}
753dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart
754f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul StewartTEST_F(ConnectionTest, RequestHostRoute) {
75513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ConnectionRefPtr connection = GetNewConnection();
756f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  IPAddress address(IPAddress::kFamilyIPv4);
757f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  ASSERT_TRUE(address.SetAddressFromString(kIPAddress0));
758762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  size_t prefix_len = 16;
759762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  address.set_prefix(prefix_len);
76013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(routing_table_,
76113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov              RequestRouteToHost(IsIPAddress(address, prefix_len),
76213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov                                 -1,
76313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov                                 kTestDeviceInterfaceIndex0,
764762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                 IsNonNullCallback(),
765762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                 RT_TABLE_MAIN))
766f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart      .WillOnce(Return(true));
767f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  EXPECT_TRUE(connection->RequestHostRoute(address));
768f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart
769f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart  // The destructor will remove the routes and addresses.
77013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  AddDestructorExpectations();
771e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart}
772e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
773a016312b7470e124774aec197e3b43bc795637c3Ben ChanTEST_F(ConnectionTest, BlackholeIPv6) {
774a016312b7470e124774aec197e3b43bc795637c3Ben Chan  properties_.blackhole_ipv6 = true;
775a016312b7470e124774aec197e3b43bc795637c3Ben Chan  UpdateProperties();
776a016312b7470e124774aec197e3b43bc795637c3Ben Chan  EXPECT_CALL(*device_info_, HasOtherAddress(_, _))
777a016312b7470e124774aec197e3b43bc795637c3Ben Chan      .WillOnce(Return(false));
778a016312b7470e124774aec197e3b43bc795637c3Ben Chan  EXPECT_CALL(rtnl_handler_, AddInterfaceAddress(_, _, _, _));
779762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, SetDefaultRoute(_, _, _, _));
780762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, ConfigureRoutes(_, _, _, _));
781a016312b7470e124774aec197e3b43bc795637c3Ben Chan  EXPECT_CALL(routing_table_,
782a016312b7470e124774aec197e3b43bc795637c3Ben Chan              CreateBlackholeRoute(kTestDeviceInterfaceIndex0,
783a016312b7470e124774aec197e3b43bc795637c3Ben Chan                                   IPAddress::kFamilyIPv6,
784762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                   Connection::kDefaultMetric,
785762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                   RT_TABLE_MAIN))
786a016312b7470e124774aec197e3b43bc795637c3Ben Chan      .WillOnce(Return(true));
787024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(kTestDeviceInterfaceIndex0,
788024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart                                             IPConfig::kDefaultMTU));
789a016312b7470e124774aec197e3b43bc795637c3Ben Chan  connection_->UpdateFromIPConfig(ipconfig_);
790a016312b7470e124774aec197e3b43bc795637c3Ben Chan}
791a016312b7470e124774aec197e3b43bc795637c3Ben Chan
792e93b038972d43fd703b3c68603fb4d02bec6504ePaul StewartTEST_F(ConnectionTest, PinHostRoute) {
79313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ConnectionRefPtr connection = GetNewConnection();
794e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
79573fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  IPAddress gateway(IPAddress::kFamilyIPv4);
79673fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  IPAddress trusted_ip(IPAddress::kFamilyIPv4);
797e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
79873fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  // Should fail because neither IP address is set.
79973fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_FALSE(PinHostRoute(connection, trusted_ip, gateway));
800e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
80173fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  static const char kGateway[] = "10.242.2.13";
80273fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  ASSERT_TRUE(gateway.SetAddressFromString(kGateway));
803e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
80473fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  // Should fail because trusted IP is not set.
80573fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_FALSE(PinHostRoute(connection, trusted_ip, gateway));
806e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
807762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  static const char kTrustedIP[] = "10.0.1.1/8";
808762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  ASSERT_TRUE(trusted_ip.SetAddressAndPrefixFromString(kTrustedIP));
80973fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart
810e435d34d8bc77ab7b821833e9029eac990f677adPaul Stewart  // Should pass without calling RequestRouteToHost since if the gateway
811e435d34d8bc77ab7b821833e9029eac990f677adPaul Stewart  // is not set, there is no work to be done.
812762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_, RequestRouteToHost(_, _, _, _, _)).Times(0);
813e435d34d8bc77ab7b821833e9029eac990f677adPaul Stewart  EXPECT_TRUE(PinHostRoute(connection, trusted_ip,
814e435d34d8bc77ab7b821833e9029eac990f677adPaul Stewart                           IPAddress(gateway.family())));
815e435d34d8bc77ab7b821833e9029eac990f677adPaul Stewart  Mock::VerifyAndClearExpectations(&routing_table_);
81673fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart
817762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_,
818762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              RequestRouteToHost(IsIPAddress(trusted_ip, trusted_ip.prefix()),
819762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                 -1, kTestDeviceInterfaceIndex0, _,
820762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                 RT_TABLE_MAIN)).WillOnce(Return(false));
82173fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_FALSE(PinHostRoute(connection, trusted_ip, gateway));
822e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
823762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi  EXPECT_CALL(routing_table_,
824762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi              RequestRouteToHost(IsIPAddress(trusted_ip, trusted_ip.prefix()),
825762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                 -1, kTestDeviceInterfaceIndex0, _,
826762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi                                 RT_TABLE_MAIN)).WillOnce(Return(true));
82773fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_TRUE(PinHostRoute(connection, trusted_ip, gateway));
828e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart
829e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart  // The destructor will remove the routes and addresses.
83013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  AddDestructorExpectations();
831f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart}
832f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart
83353a303873f9a89ff0121777476d33afc9b77b987Paul StewartTEST_F(ConnectionTest, FixGatewayReachability) {
834c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  ConnectionRefPtr connection = GetNewConnection();
83553a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  static const char kLocal[] = "10.242.2.13";
83653a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  IPAddress local(IPAddress::kFamilyIPv4);
83753a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  ASSERT_TRUE(local.SetAddressFromString(kLocal));
83853a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  const int kPrefix = 24;
83953a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  local.set_prefix(kPrefix);
84053a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  IPAddress gateway(IPAddress::kFamilyIPv4);
84153a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  IPAddress peer(IPAddress::kFamilyIPv4);
84273fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  IPAddress trusted_ip(IPAddress::kFamilyIPv4);
84353a303873f9a89ff0121777476d33afc9b77b987Paul Stewart
84453a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  // Should fail because no gateway is set.
845c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_FALSE(connection->FixGatewayReachability(
846c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      local, &peer, &gateway, trusted_ip));
84753a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  EXPECT_EQ(kPrefix, local.prefix());
8484925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  EXPECT_FALSE(peer.IsValid());
84973fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_FALSE(gateway.IsValid());
85053a303873f9a89ff0121777476d33afc9b77b987Paul Stewart
85153a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  // Should succeed because with the given prefix, this gateway is reachable.
85253a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  static const char kReachableGateway[] = "10.242.2.14";
85353a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  ASSERT_TRUE(gateway.SetAddressFromString(kReachableGateway));
85473fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  IPAddress gateway_backup(gateway);
8554925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  peer = IPAddress(IPAddress::kFamilyIPv4);
856c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_TRUE(connection->FixGatewayReachability(
857c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      local, &peer, &gateway, trusted_ip));
85853a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  // Prefix should remain unchanged.
85953a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  EXPECT_EQ(kPrefix, local.prefix());
8604925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  // Peer should remain unchanged.
8614925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  EXPECT_FALSE(peer.IsValid());
86273fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  // Gateway should remain unchanged.
86373fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_TRUE(gateway_backup.Equals(gateway));
86453a303873f9a89ff0121777476d33afc9b77b987Paul Stewart
865c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  // Should succeed because we created a link route to the gateway.
866c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  static const char kRemoteGateway[] = "10.242.3.14";
867c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  ASSERT_TRUE(gateway.SetAddressFromString(kRemoteGateway));
86873fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  gateway_backup = gateway;
8694925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  peer = IPAddress(IPAddress::kFamilyIPv4);
870c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_CALL(routing_table_, AddRoute(kTestDeviceInterfaceIndex0,
871c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart                                       IsLinkRouteTo(gateway)))
872c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      .WillOnce(Return(true));
873c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_TRUE(connection->FixGatewayReachability(
874c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      local, &peer, &gateway, trusted_ip));
875c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart
8764925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  // Peer should remain unchanged.
8774925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  EXPECT_FALSE(peer.IsValid());
87873fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  // Gateway should remain unchanged.
87973fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_TRUE(gateway_backup.Equals(gateway));
88053a303873f9a89ff0121777476d33afc9b77b987Paul Stewart
881c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  // Should fail if AddRoute() fails.
882c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_CALL(routing_table_, AddRoute(kTestDeviceInterfaceIndex0,
883c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart                                       IsLinkRouteTo(gateway)))
884c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      .WillOnce(Return(false));
885c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_FALSE(connection->FixGatewayReachability(
886c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      local, &peer, &gateway, trusted_ip));
8872aa5d7db68824e198dfd930242e1fc6e48dcfb65Paul Stewart
8884925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  // If this is a peer-to-peer interface and the peer matches the gateway,
8894925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  // we should succeed.
8902aa5d7db68824e198dfd930242e1fc6e48dcfb65Paul Stewart  local.set_prefix(kPrefix);
891c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  static const char kUnreachableGateway[] = "11.242.2.14";
8922aa5d7db68824e198dfd930242e1fc6e48dcfb65Paul Stewart  ASSERT_TRUE(gateway.SetAddressFromString(kUnreachableGateway));
89373fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  gateway_backup = gateway;
89453a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  ASSERT_TRUE(peer.SetAddressFromString(kUnreachableGateway));
895c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_TRUE(connection->FixGatewayReachability(
896c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      local, &peer, &gateway, trusted_ip));
89753a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  EXPECT_EQ(kPrefix, local.prefix());
8984925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  EXPECT_TRUE(peer.Equals(gateway));
89973fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_TRUE(gateway_backup.Equals(gateway));
90053a303873f9a89ff0121777476d33afc9b77b987Paul Stewart
90153a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  // If there is a peer specified and it does not match the gateway (even
90253a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  // if it was reachable via netmask), we should fail.
90353a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  ASSERT_TRUE(gateway.SetAddressFromString(kReachableGateway));
904c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_FALSE(connection->FixGatewayReachability(
905c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      local, &peer, &gateway, trusted_ip));
90653a303873f9a89ff0121777476d33afc9b77b987Paul Stewart  EXPECT_EQ(kPrefix, local.prefix());
9074925829bd8be852a625086e3628a2fb89286ddd8Paul Stewart  EXPECT_FALSE(peer.Equals(gateway));
90873fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart
90973fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  // If this is a peer-to-peer interface and the peer matches the gateway,
91073fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  // but it also matches the trusted IP address, the gateway and peer address
91173fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  // should be modified to allow routing to work correctly.
91273fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  ASSERT_TRUE(gateway.SetAddressFromString(kUnreachableGateway));
91373fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  ASSERT_TRUE(peer.SetAddressFromString(kUnreachableGateway));
91455d9550e72197a203efbe06087edc2424676d886Paul Stewart  ASSERT_TRUE(trusted_ip.SetAddressAndPrefixFromString(
91555d9550e72197a203efbe06087edc2424676d886Paul Stewart      string(kUnreachableGateway) + "/32"));
916c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  EXPECT_TRUE(connection->FixGatewayReachability(
917c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart      local, &peer, &gateway, trusted_ip));
91873fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_TRUE(peer.IsDefault());
91973fcc3f6560240d0d5dde15927cc0b51dc692dd5Paul Stewart  EXPECT_TRUE(gateway.IsDefault());
920c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart
921c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  // The destructor will remove the routes and addresses.
922c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart  AddDestructorExpectations();
92353a303873f9a89ff0121777476d33afc9b77b987Paul Stewart}
92453a303873f9a89ff0121777476d33afc9b77b987Paul Stewart
92513e6d55b9dd86148ae68588f367c48e81ad33b74Darin PetkovTEST_F(ConnectionTest, Binders) {
92613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection_->binders_.empty());
92713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  DisconnectCallbackTarget target0;
92813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  DisconnectCallbackTarget target1;
92913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  DisconnectCallbackTarget target2;
93013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  DisconnectCallbackTarget target3;
93113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  Connection::Binder binder0("binder0", target0.callback());
93213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  Connection::Binder binder1("binder1", target1.callback());
93313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  Connection::Binder binder2("binder2", target2.callback());
93413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  Connection::Binder binder3("binder3", target3.callback());
93513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
93613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  binder0.Attach(connection_);
93713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  binder1.Attach(connection_);
93813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
93913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(target1, CallTarget()).Times(0);
94013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  binder1.Attach(connection_);
94113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
94213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  binder3.Attach(connection_);
94313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  binder2.Attach(connection_);
94413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
94513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(target3, CallTarget()).Times(0);
946cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  binder3.Attach(nullptr);
94713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
94813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ASSERT_EQ(3, connection_->binders_.size());
94913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection_->binders_.at(0) == &binder0);
95013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection_->binders_.at(1) == &binder1);
95113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection_->binders_.at(2) == &binder2);
95213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
95313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(target0, CallTarget()).Times(1);
95413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(target1, CallTarget()).Times(1);
95513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(target2, CallTarget()).Times(1);
95613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection_->NotifyBindersOnDisconnect();
95713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection_->binders_.empty());
95813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
95913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // Should be a no-op.
96013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection_->NotifyBindersOnDisconnect();
96113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov}
96213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
96313e6d55b9dd86148ae68588f367c48e81ad33b74Darin PetkovTEST_F(ConnectionTest, Binder) {
96413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // No connection should be bound initially.
9653b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  Connection::Binder* binder = &connection_->lower_binder_;
96613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_EQ(connection_->interface_name(), binder->name_);
96713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(binder->client_disconnect_callback_.is_null());
96813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(binder->IsBound());
96913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
97013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ConnectionRefPtr connection1 = GetNewConnection();
97113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection1->binders_.empty());
97213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
97313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // Bind lower |connection1| and check if it's bound.
97413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  binder->Attach(connection1);
97513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(binder->IsBound());
97613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_EQ(connection1.get(), binder->connection().get());
97713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ASSERT_FALSE(connection1->binders_.empty());
97813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(binder == connection1->binders_.at(0));
97913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
98013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // Unbind lower |connection1| and check if it's unbound.
981cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  binder->Attach(nullptr);
98213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(binder->IsBound());
98313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection1->binders_.empty());
98413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
98513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ConnectionRefPtr connection2 = GetNewConnection();
98613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
98713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // Bind lower |connection1| to upper |connection2| and destroy the upper
98813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // |connection2|. Make sure lower |connection1| is unbound (i.e., the
98913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // disconnect callback is deregistered).
99013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection2->lower_binder_.Attach(connection1);
99113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(connection1->binders_.empty());
99213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  AddDestructorExpectations();
993cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  connection2 = nullptr;
99413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection1->binders_.empty());
99513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
99613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // Bind lower |connection1| to upper |connection_| and destroy lower
99713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // |connection1|. Make sure lower |connection1| is unbound from upper
99813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // |connection_| and upper |connection_|'s registered disconnect callbacks are
99913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // run.
100013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  binder->Attach(connection1);
100113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  DisconnectCallbackTarget target;
100213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  Connection::Binder test_binder("from_test", target.callback());
100313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  test_binder.Attach(connection_);
100413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(target, CallTarget()).Times(1);
100513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ASSERT_FALSE(connection_->binders_.empty());
100613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  AddDestructorExpectations();
1007cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  connection1 = nullptr;
100813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(binder->IsBound());
100913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(test_binder.IsBound());
101013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(connection_->binders_.empty());
101113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
101213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  {
101313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    // Binding a connection to itself should be safe.
101413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    ConnectionRefPtr connection = GetNewConnection();
101513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
101613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    connection->lower_binder_.Attach(connection);
101713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
101813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_FALSE(connection->binders_.empty());
101913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
102013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    DisconnectCallbackTarget target;
102113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    Connection::Binder binder("test", target.callback());
102213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    binder.Attach(connection);
102313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
102413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    AddDestructorExpectations();
102513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_CALL(target, CallTarget()).Times(1);
1026cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    connection = nullptr;
102713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  }
102813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  {
102913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    // Circular binding of multiple connections should be safe.
103013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    ConnectionRefPtr connection_a = GetNewConnection();
103113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    ConnectionRefPtr connection_b = GetNewConnection();
103213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
103313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    connection_a->lower_binder_.Attach(connection_b);
103413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    connection_b->lower_binder_.Attach(connection_a);
103513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
103613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_FALSE(connection_a->binders_.empty());
103713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_FALSE(connection_b->binders_.empty());
103813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
103913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    DisconnectCallbackTarget target_a;
104013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    DisconnectCallbackTarget target_b;
104113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    Connection::Binder binder_a("test_a", target_a.callback());
104213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    Connection::Binder binder_b("test_b", target_b.callback());
104313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    binder_a.Attach(connection_a);
104413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    binder_b.Attach(connection_b);
104513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
104613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    AddDestructorExpectations();
104713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_CALL(target_a, CallTarget()).Times(1);
104813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_CALL(target_b, CallTarget()).Times(1);
1049cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    connection_b = nullptr;
105013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
105113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    EXPECT_TRUE(connection_a->binders_.empty());
105213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
105313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov    AddDestructorExpectations();
1054cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    connection_a = nullptr;
105513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  }
1056ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov  {
1057ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    // Test the weak pointer to the bound Connection. This is not a case that
1058ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    // should occur but the weak pointer should handle it gracefully.
1059ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    DisconnectCallbackTarget target;
1060ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    Connection::Binder binder("test_weak", target.callback());
1061ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    ConnectionRefPtr connection = GetNewConnection();
1062ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    binder.Attach(connection);
1063ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov
1064ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    // Make sure the connection doesn't notify the binder on destruction.
1065ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    connection->binders_.clear();
1066ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    AddDestructorExpectations();
1067ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov    EXPECT_CALL(target, CallTarget()).Times(0);
1068cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    connection = nullptr;
1069ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov
1070cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    // Ensure no crash -- the weak pointer to connection should be nullptr.
10715eb0542cb67358d9030367498a4ad741fc42af4fDarin Petkov    EXPECT_FALSE(binder.connection());
1072cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    binder.Attach(nullptr);
1073ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov  }
107413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov}
107513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
107613e6d55b9dd86148ae68588f367c48e81ad33b74Darin PetkovTEST_F(ConnectionTest, OnRouteQueryResponse) {
10773b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  Connection::Binder* binder = &connection_->lower_binder_;
107813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  ConnectionRefPtr connection = GetNewConnection();
107913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  scoped_refptr<MockDevice> device(new StrictMock<MockDevice>(
108013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      &control_,
1081cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
1082cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
1083cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan      nullptr,
108413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      kTestDeviceName1,
108513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      string(),
108613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      kTestDeviceInterfaceIndex1));
108713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
108813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // Make sure we unbind the old lower connection even if we can't lookup the
108913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // lower connection device.
109013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  binder->Attach(connection);
109113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  scoped_refptr<MockDevice> null_device;
109213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex1))
109313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      .WillOnce(Return(null_device));
109413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection_->OnRouteQueryResponse(
109513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      kTestDeviceInterfaceIndex1, RoutingTableEntry());
109613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(binder->IsBound());
109713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
10989a0f121f98ebc46704773555334b43af14842abePaul Stewart  // Check for graceful handling of a connection loop.
10999a0f121f98ebc46704773555334b43af14842abePaul Stewart  EXPECT_CALL(*device, connection())
11009a0f121f98ebc46704773555334b43af14842abePaul Stewart      .WillRepeatedly(testing::ReturnRef(connection_));
11019a0f121f98ebc46704773555334b43af14842abePaul Stewart  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex1))
11029a0f121f98ebc46704773555334b43af14842abePaul Stewart      .WillOnce(Return(device));
11039a0f121f98ebc46704773555334b43af14842abePaul Stewart  connection_->OnRouteQueryResponse(
11049a0f121f98ebc46704773555334b43af14842abePaul Stewart      kTestDeviceInterfaceIndex1, RoutingTableEntry());
11059a0f121f98ebc46704773555334b43af14842abePaul Stewart  EXPECT_FALSE(binder->IsBound());
11069a0f121f98ebc46704773555334b43af14842abePaul Stewart
110713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  // Check for graceful handling of a device with no connection.
11082cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  ConnectionRefPtr device_connection;
11092cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  EXPECT_CALL(*device, connection())
11102cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart      .WillRepeatedly(testing::ReturnRef(device_connection));
111113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex1))
111213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      .WillOnce(Return(device));
111313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection_->OnRouteQueryResponse(
111413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      kTestDeviceInterfaceIndex1, RoutingTableEntry());
111513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_FALSE(binder->IsBound());
111613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
1117f407d5934100e6f2106aeeede46bafb0074cee35mukesh agrawal  // Create a mock connection that will be used for binding.
11184a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  scoped_refptr<MockConnection> mock_connection(
11194a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart      new StrictMock<MockConnection>(device_info_.get()));
11204a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_CALL(*device_info_.get(),
11214a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart      FlushAddresses(mock_connection->interface_index()));
11224a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  const string kInterfaceName(kTestDeviceName0);
11234a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_CALL(*mock_connection, interface_name())
11244a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart      .WillRepeatedly(ReturnRef(kInterfaceName));
11252cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  device_connection = mock_connection.get();
11262cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  EXPECT_CALL(*device, connection())
11272cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart      .WillRepeatedly(testing::ReturnRef(device_connection));
112813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_CALL(*device_info_, GetDevice(kTestDeviceInterfaceIndex1))
112913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      .WillOnce(Return(device));
11304a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart
1131a6bfe87a2c0bcb68d789473ca10988243229667bBen Chan  // Check that the binding process completes, causing its upper
11324a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  // connection to create a gateway route.
11334a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_CALL(*mock_connection, CreateGatewayRoute())
11344a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart      .WillOnce(Return(true));
11358596f9f1341d3698543e1010ac1710cbe91e35d5Paul Stewart
11368596f9f1341d3698543e1010ac1710cbe91e35d5Paul Stewart  // Ensure that the Device is notified of the change to the connection.
11378596f9f1341d3698543e1010ac1710cbe91e35d5Paul Stewart  EXPECT_CALL(*device, OnConnectionUpdated()).Times(1);
113813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  connection_->OnRouteQueryResponse(
113913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov      kTestDeviceInterfaceIndex1, RoutingTableEntry());
11404a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart
11414a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  // Check that the upper connection is bound to the lower connection.
114213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  EXPECT_TRUE(binder->IsBound());
11434a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart  EXPECT_EQ(mock_connection.get(), binder->connection().get());
114413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
114513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov  AddDestructorExpectations();
1146cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  connection = nullptr;
114713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov}
114813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov
1149fddc09ac26ba77cabb59810f01b705fca2efd10bAlex DeymoTEST_F(ConnectionTest, GetCarrierConnection) {
1150fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  EXPECT_EQ(connection_.get(), connection_->GetCarrierConnection().get());
1151fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
1152fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  ConnectionRefPtr connection1 = GetNewConnection();
1153fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  ConnectionRefPtr connection2 = GetNewConnection();
1154fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  ConnectionRefPtr connection3 = GetNewConnection();
1155fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
1156fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  connection_->lower_binder_.Attach(connection1);
1157fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  EXPECT_EQ(connection1.get(), connection_->GetCarrierConnection().get());
1158fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
1159fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  connection1->lower_binder_.Attach(connection2);
1160fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  EXPECT_EQ(connection2.get(), connection_->GetCarrierConnection().get());
1161fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
1162fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  connection2->lower_binder_.Attach(connection3);
1163fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  EXPECT_EQ(connection3.get(), connection_->GetCarrierConnection().get());
1164fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
1165fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  // Create a cycle back to |connection1|.
1166fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  connection3->lower_binder_.Attach(connection1);
1167cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  EXPECT_EQ(nullptr, connection_->GetCarrierConnection().get());
1168fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
1169fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  AddDestructorExpectations();
1170cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  connection3 = nullptr;
1171fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
1172fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  AddDestructorExpectations();
1173cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  connection2 = nullptr;
1174fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
1175fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo  AddDestructorExpectations();
1176cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  connection1 = nullptr;
1177fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo}
1178fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo
11792cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul StewartTEST_F(ConnectionTest, GetSubnetName) {
1180182888eab7478f28001b1235f8d2b75063445db8Paul Stewart  EXPECT_EQ("", connection_->GetSubnetName());
11812cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  IPAddress local("1.2.3.4");
11822cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  local.set_prefix(24);
11832cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  SetLocal(local);
11842cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart  EXPECT_EQ("1.2.3.0/24", connection_->GetSubnetName());
11852cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart}
11862cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart
1187024a6c80bc8474d828af6d961ea7fe0d67d69587Paul StewartTEST_F(ConnectionTest, SetMTU) {
1188024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  testing::InSequence seq;
1189024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1190024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kDefaultMTU));
1191024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(0);
1192024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1193024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1194024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kDefaultMTU));
1195024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(IPConfig::kUndefinedMTU);
1196024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1197024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  // Test IPv4 minimum MTU.
1198024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  SetLocal(local_address_);
1199024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1200024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kMinIPv4MTU));
1201024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(1);
1202024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1203024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1204024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kMinIPv4MTU));
1205024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(IPConfig::kMinIPv4MTU - 1);
1206024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1207024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1208024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kMinIPv4MTU));
1209024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(IPConfig::kMinIPv4MTU);
1210024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1211024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1212024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kMinIPv4MTU + 1));
1213024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(IPConfig::kMinIPv4MTU + 1);
1214024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1215024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  // Test IPv6 minimum MTU.
1216024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  SetLocal(local_ipv6_address_);
1217024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1218024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kMinIPv6MTU));
1219024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(1);
1220024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1221024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1222024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kMinIPv6MTU));
1223024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(IPConfig::kMinIPv6MTU - 1);
1224024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1225024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1226024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kMinIPv6MTU));
1227024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(IPConfig::kMinIPv6MTU);
1228024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1229024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  EXPECT_CALL(rtnl_handler_, SetInterfaceMTU(
1230024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart      kTestDeviceInterfaceIndex0, IPConfig::kMinIPv6MTU + 1));
1231024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart  connection_->SetMTU(IPConfig::kMinIPv6MTU + 1);
1232024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart}
1233024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart
1234dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart}  // namespace shill
1235