Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Unified Diff: webrtc/p2p/base/port_unittest.cc

Issue 1976683003: Update the type and cost of existing networks if its type is found later by network monitor (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Get network type from name matching only on IOS or Android. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/p2p/base/port_unittest.cc
diff --git a/webrtc/p2p/base/port_unittest.cc b/webrtc/p2p/base/port_unittest.cc
index ab48ec9af52dfb4797945e17ece9ed289315a0b2..abda90dd96344a9e941912e433b6762c9c82fa16 100644
--- a/webrtc/p2p/base/port_unittest.cc
+++ b/webrtc/p2p/base/port_unittest.cc
@@ -46,6 +46,7 @@ using rtc::NAT_SYMMETRIC;
using rtc::PacketSocketFactory;
using rtc::Socket;
using rtc::SocketAddress;
+using rtc::kMaxNetworkCost;
using namespace cricket;
static const int kTimeout = 1000;
@@ -64,6 +65,7 @@ static const SocketAddress kTurnUdpIntAddr("99.99.99.4", STUN_SERVER_PORT);
static const SocketAddress kTurnTcpIntAddr("99.99.99.4", 5010);
static const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0);
static const RelayCredentials kRelayCredentials("test", "test");
+static const uint16_t kCostForUnknownNetworkType = 10;
// TODO: Update these when RFC5245 is completely supported.
// Magic value of 30 is from RFC3484, for IPv4 addresses.
@@ -384,6 +386,18 @@ class PortTest : public testing::Test, public sigslot::has_slots<> {
network_.AddIP(rtc::IPAddress(INADDR_ANY));
}
+ void ConnectSignalNeworkCostChangdForPort(PortInterface* port) {
+ port->SignalNetworkCostChanged.connect(this,
+ &PortTest::OnPortNetworkCostChanged);
+ }
+
+ void OnPortNetworkCostChanged(PortInterface* port) {
+ port_network_cost_changed_ = true;
+ ;
+ }
+
+ bool port_network_cost_changed() { return port_network_cost_changed_; }
+
protected:
void TestLocalToLocal() {
Port* port1 = CreateUdpPort(kLocalAddr1);
@@ -759,7 +773,6 @@ class PortTest : public testing::Test, public sigslot::has_slots<> {
return &nat_socket_factory1_;
}
- protected:
rtc::VirtualSocketServer* vss() { return ss_.get(); }
private:
@@ -782,6 +795,7 @@ class PortTest : public testing::Test, public sigslot::has_slots<> {
std::string password_;
bool role_conflict_;
bool destroyed_;
+ bool port_network_cost_changed_ = false;
};
void PortTest::TestConnectivity(const char* name1, Port* port1,
@@ -1762,11 +1776,75 @@ TEST_F(PortTest, TestUseCandidateAttribute) {
ASSERT_TRUE(use_candidate_attr != NULL);
}
-TEST_F(PortTest, TestNetworkInfoAttribute) {
+// Tests that when the network type changes, the network cost of the port will
+// change, the network cost of the local candidates will change and a signal
+// will be fire to notify the network cost change if there are connections in
+// the port. Also tests that the remote network costs are updated with the stun
+// binding requests.
+TEST_F(PortTest, TestNetworkCostChange) {
std::unique_ptr<TestPort> lport(
CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
- // Set the network type for rport to be cellular so its cost will be 999.
+ std::unique_ptr<TestPort> rport(
+ CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
+ lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
+ lport->SetIceTiebreaker(kTiebreaker1);
+ rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
+ rport->SetIceTiebreaker(kTiebreaker2);
+ lport->PrepareAddress();
+ rport->PrepareAddress();
+ ConnectSignalNeworkCostChangdForPort(lport.get());
+
+ // Default local port cost is kCostForUnknownNetworkType.
+ EXPECT_EQ(kCostForUnknownNetworkType, lport->network_cost());
+ ASSERT_TRUE(!lport->Candidates().empty());
+ for (const cricket::Candidate& candidate : lport->Candidates()) {
+ EXPECT_EQ(kCostForUnknownNetworkType, candidate.network_cost());
+ }
+
+ // Change the network type to wifi.
+ SetNetworkType(rtc::ADAPTER_TYPE_WIFI);
+ EXPECT_EQ(0, lport->network_cost());
+ for (const cricket::Candidate& candidate : lport->Candidates()) {
+ EXPECT_EQ(0u, candidate.network_cost());
+ }
+ // There is no connection yet, should not fire the NetworkCostChanged event.
+ EXPECT_FALSE(port_network_cost_changed());
+
+ // Add a connection and then change the network type.
+ Connection* lconn =
+ lport->CreateConnection(rport->Candidates()[0], Port::ORIGIN_MESSAGE);
+ // Change the network type to cellular.
+ SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR);
+ EXPECT_EQ(kMaxNetworkCost, lport->network_cost());
+ for (const cricket::Candidate& candidate : lport->Candidates()) {
+ EXPECT_EQ(kMaxNetworkCost, candidate.network_cost());
+ }
+ // Should fire SignalNetworkCostChanged now.
+ EXPECT_TRUE(port_network_cost_changed());
+
+ SetNetworkType(rtc::ADAPTER_TYPE_WIFI);
+ Connection* rconn =
+ rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE);
SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR);
+ lconn->Ping(0);
+ // The rconn's remote candidate cost is 0, but the ping contains an attribute
+ // of network cost of kMaxNetworkCost. Once the message is handled in rconn,
+ // The rconn's remote candidate will have cost kMaxNetworkCost;
+ EXPECT_EQ(0u, rconn->remote_candidate().network_cost());
+ ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
+ IceMessage* msg = lport->last_stun_msg();
+ EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
+ // Pass the binding request to rport.
+ rconn->OnReadPacket(lport->last_stun_buf()->data<char>(),
+ lport->last_stun_buf()->size(), rtc::PacketTime());
+ // Wait until rport sends the response and then check the remote network cost.
+ ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000);
+ EXPECT_EQ(kMaxNetworkCost, rconn->remote_candidate().network_cost());
+}
+
+TEST_F(PortTest, TestNetworkInfoAttribute) {
+ std::unique_ptr<TestPort> lport(
+ CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
std::unique_ptr<TestPort> rport(
CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
@@ -1789,10 +1867,12 @@ TEST_F(PortTest, TestNetworkInfoAttribute) {
ASSERT_TRUE(network_info_attr != NULL);
uint32_t network_info = network_info_attr->value();
EXPECT_EQ(lnetwork_id, network_info >> 16);
- // Default network cost is 0.
- EXPECT_EQ(0U, network_info & 0xFFFF);
+ // Default network has unknown type and cost |kCostForUnknownNetworkType|.
+ EXPECT_EQ(kCostForUnknownNetworkType, network_info & 0xFFFF);
+ // Set the network type to be cellular so its cost will be 999.
// Send a fake ping from rport to lport.
+ SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR);
uint16_t rnetwork_id = 8;
rport->Network()->set_id(rnetwork_id);
Connection* rconn =
@@ -1804,7 +1884,7 @@ TEST_F(PortTest, TestNetworkInfoAttribute) {
ASSERT_TRUE(network_info_attr != NULL);
network_info = network_info_attr->value();
EXPECT_EQ(rnetwork_id, network_info >> 16);
- EXPECT_EQ(cricket::kMaxNetworkCost, network_info & 0xFFFF);
+ EXPECT_EQ(kMaxNetworkCost, network_info & 0xFFFF);
}
// Test handling STUN messages.

Powered by Google App Engine
This is Rietveld 408576698