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