Fixing invalid operator< implementation.
It was possible that "A < B" and "B < A" both evaluated to true.
This manifested as an assert on Windows, and a memory leak on Linux.
Note that the concept of "less than" is meaningless for this object.
The operator is only needed so the object can be used as a key in an
std::map.
BUG=webrtc:6068
R=honghaiz@webrtc.org, kjellander@webrtc.org, skvlad@webrtc.org
Review URL: https://codereview.webrtc.org/2187913002 .
Cr-Commit-Position: refs/heads/master@{#13598}
diff --git a/webrtc/BUILD.gn b/webrtc/BUILD.gn
index be0e88e..cef4c4e 100644
--- a/webrtc/BUILD.gn
+++ b/webrtc/BUILD.gn
@@ -502,6 +502,7 @@
"p2p/base/transportcontroller_unittest.cc",
"p2p/base/transportdescriptionfactory_unittest.cc",
"p2p/base/turnport_unittest.cc",
+ "p2p/base/turnserver_unittest.cc",
"p2p/client/basicportallocator_unittest.cc",
"p2p/stunprober/stunprober_unittest.cc",
]
diff --git a/webrtc/p2p/base/turnserver.cc b/webrtc/p2p/base/turnserver.cc
index dac7e38..7dd9e19 100644
--- a/webrtc/p2p/base/turnserver.cc
+++ b/webrtc/p2p/base/turnserver.cc
@@ -10,6 +10,8 @@
#include "webrtc/p2p/base/turnserver.h"
+#include <tuple> // for std::tie
+
#include "webrtc/p2p/base/asyncstuntcpsocket.h"
#include "webrtc/p2p/base/common.h"
#include "webrtc/p2p/base/packetsocketfactory.h"
@@ -544,7 +546,7 @@
}
bool TurnServerConnection::operator<(const TurnServerConnection& c) const {
- return src_ < c.src_ || dst_ < c.dst_ || proto_ < c.proto_;
+ return std::tie(src_, dst_, proto_) < std::tie(c.src_, c.dst_, c.proto_);
}
std::string TurnServerConnection::ToString() const {
diff --git a/webrtc/p2p/base/turnserver_unittest.cc b/webrtc/p2p/base/turnserver_unittest.cc
new file mode 100644
index 0000000..a63670b
--- /dev/null
+++ b/webrtc/p2p/base/turnserver_unittest.cc
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2016 The WebRTC Project Authors. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "webrtc/base/gunit.h"
+#include "webrtc/base/physicalsocketserver.h"
+#include "webrtc/base/virtualsocketserver.h"
+#include "webrtc/p2p/base/basicpacketsocketfactory.h"
+#include "webrtc/p2p/base/turnserver.h"
+
+// NOTE: This is a work in progress. Currently this file only has tests for
+// TurnServerConnection, a primitive class used by TurnServer.
+
+namespace cricket {
+
+class TurnServerConnectionTest : public testing::Test {
+ public:
+ TurnServerConnectionTest() : vss_(&pss_), ss_scope_(&vss_) {}
+
+ void ExpectEqual(const TurnServerConnection& a,
+ const TurnServerConnection& b) {
+ EXPECT_TRUE(a == b);
+ EXPECT_FALSE(a < b);
+ EXPECT_FALSE(b < a);
+ }
+
+ void ExpectNotEqual(const TurnServerConnection& a,
+ const TurnServerConnection& b) {
+ EXPECT_FALSE(a == b);
+ // We don't care which is less than the other, as long as only one is less
+ // than the other.
+ EXPECT_TRUE((a < b) != (b < a));
+ }
+
+ protected:
+ rtc::PhysicalSocketServer pss_;
+ rtc::VirtualSocketServer vss_;
+ rtc::SocketServerScope ss_scope_;
+ // Since this is constructed after |ss_scope_|, it will pick up |ss_scope_|'s
+ // socket server.
+ rtc::BasicPacketSocketFactory socket_factory_;
+};
+
+TEST_F(TurnServerConnectionTest, ComparisonOperators) {
+ std::unique_ptr<rtc::AsyncPacketSocket> socket1(
+ socket_factory_.CreateUdpSocket(rtc::SocketAddress("1.1.1.1", 1), 0, 0));
+ std::unique_ptr<rtc::AsyncPacketSocket> socket2(
+ socket_factory_.CreateUdpSocket(rtc::SocketAddress("2.2.2.2", 2), 0, 0));
+ TurnServerConnection connection1(socket2->GetLocalAddress(), PROTO_UDP,
+ socket1.get());
+ TurnServerConnection connection2(socket2->GetLocalAddress(), PROTO_UDP,
+ socket1.get());
+ TurnServerConnection connection3(socket1->GetLocalAddress(), PROTO_UDP,
+ socket2.get());
+ TurnServerConnection connection4(socket2->GetLocalAddress(), PROTO_TCP,
+ socket1.get());
+ ExpectEqual(connection1, connection2);
+ ExpectNotEqual(connection1, connection3);
+ ExpectNotEqual(connection1, connection4);
+}
+
+} // namespace cricket
diff --git a/webrtc/p2p/client/basicportallocator_unittest.cc b/webrtc/p2p/client/basicportallocator_unittest.cc
index b61d131..d430cce 100644
--- a/webrtc/p2p/client/basicportallocator_unittest.cc
+++ b/webrtc/p2p/client/basicportallocator_unittest.cc
@@ -1291,17 +1291,9 @@
rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
}
-// Test has an assert error on win_x64_dbg and win_dbg. See: webrtc:6068
-#if defined(WEBRTC_WIN)
-#define MAYBE_TestEachInterfaceHasItsOwnTurnPorts \
- DISABLED_TestEachInterfaceHasItsOwnTurnPort
-#else
-#define MAYBE_TestEachInterfaceHasItsOwnTurnPorts \
- TestEachInterfaceHasItsOwnTurnPorts
-#endif
// Tests that if prune_turn_ports is set, each network interface
// will has its own set of TurnPorts based on their priorities.
-TEST_F(BasicPortAllocatorTest, MAYBE_TestEachInterfaceHasItsOwnTurnPorts) {
+TEST_F(BasicPortAllocatorTest, TestEachInterfaceHasItsOwnTurnPorts) {
turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
turn_server_.AddInternalSocket(kTurnUdpIntIPv6Addr, PROTO_UDP);
turn_server_.AddInternalSocket(kTurnTcpIntIPv6Addr, PROTO_TCP);
diff --git a/webrtc/webrtc_tests.gypi b/webrtc/webrtc_tests.gypi
index f1217eb..b5da843 100644
--- a/webrtc/webrtc_tests.gypi
+++ b/webrtc/webrtc_tests.gypi
@@ -117,6 +117,7 @@
'p2p/base/transportdescriptionfactory_unittest.cc',
'p2p/base/tcpport_unittest.cc',
'p2p/base/turnport_unittest.cc',
+ 'p2p/base/turnserver_unittest.cc',
'p2p/client/basicportallocator_unittest.cc',
'p2p/stunprober/stunprober_unittest.cc',
],