diff --git a/webrtc/base/common.h b/webrtc/base/common.h index afb747d7f6..a8358df547 100644 --- a/webrtc/base/common.h +++ b/webrtc/base/common.h @@ -113,9 +113,17 @@ inline bool Assert(bool result, const char* function, const char* file, if (!result) { LogAssert(function, file, line, expression); Break(); - return false; } - return true; + return result; +} + +// Same as Assert above, but does not call Break(). Used in assert macros +// that implement their own breaking. +inline bool AssertNoBreak(bool result, const char* function, const char* file, + int line, const char* expression) { + if (!result) + LogAssert(function, file, line, expression); + return result; } } // namespace rtc @@ -125,13 +133,28 @@ inline bool Assert(bool result, const char* function, const char* file, #endif #ifndef ASSERT +#if defined(WIN32) +// Using debugbreak() inline on Windows directly in the ASSERT macro, has the +// benefit of breaking exactly where the failing expression is and not two +// calls up the stack. +#define ASSERT(x) \ + (rtc::AssertNoBreak((x), __FUNCTION__, __FILE__, __LINE__, #x) ? \ + (void)(1) : __debugbreak()) +#else #define ASSERT(x) \ (void)rtc::Assert((x), __FUNCTION__, __FILE__, __LINE__, #x) #endif +#endif #ifndef VERIFY +#if defined(WIN32) +#define VERIFY(x) \ + (rtc::AssertNoBreak((x), __FUNCTION__, __FILE__, __LINE__, #x) ? \ + true : (__debugbreak(), false)) +#else #define VERIFY(x) rtc::Assert((x), __FUNCTION__, __FILE__, __LINE__, #x) #endif +#endif #else // !ENABLE_DEBUG diff --git a/webrtc/base/socketaddress.cc b/webrtc/base/socketaddress.cc index 47ddd0400e..e6717e4bbc 100644 --- a/webrtc/base/socketaddress.cc +++ b/webrtc/base/socketaddress.cc @@ -227,25 +227,20 @@ bool SocketAddress::operator==(const SocketAddress& addr) const { } bool SocketAddress::operator<(const SocketAddress& addr) const { - if (ip_ < addr.ip_) - return true; - else if (addr.ip_ < ip_) - return false; + if (ip_ != addr.ip_) + return ip_ < addr.ip_; - // We only check hostnames if both IPs are zero. This matches EqualIPs() - if (addr.IsAnyIP()) { - if (hostname_ < addr.hostname_) - return true; - else if (addr.hostname_ < hostname_) - return false; - } + // We only check hostnames if both IPs are ANY or unspecified. This matches + // EqualIPs(). + if ((IPIsAny(ip_) || IPIsUnspec(ip_)) && hostname_ != addr.hostname_) + return hostname_ < addr.hostname_; return port_ < addr.port_; } bool SocketAddress::EqualIPs(const SocketAddress& addr) const { return (ip_ == addr.ip_) && - ((!IPIsAny(ip_)) || (hostname_ == addr.hostname_)); + ((!IPIsAny(ip_) && !IPIsUnspec(ip_)) || (hostname_ == addr.hostname_)); } bool SocketAddress::EqualPorts(const SocketAddress& addr) const { diff --git a/webrtc/base/socketaddress_unittest.cc b/webrtc/base/socketaddress_unittest.cc index 6166183feb..6e9f089561 100644 --- a/webrtc/base/socketaddress_unittest.cc +++ b/webrtc/base/socketaddress_unittest.cc @@ -273,10 +273,18 @@ TEST(SocketAddressTest, TestEqualityOperators) { addr2 = SocketAddress("fe80::1", 5678); EXPECT_PRED2(AreUnequal, addr1, addr2); + + SocketAddress addr3("a.b.c.d", 1); + SocketAddress addr4("b.b.c.d", 1); + EXPECT_PRED2(AreUnequal, addr3, addr4); + EXPECT_PRED2(AreEqual, addr3, addr3); + + addr3.SetIP(addr1.ip()); + addr4.SetIP(addr1.ip()); + EXPECT_PRED2(AreEqual,addr3, addr4); } -bool IsLessThan(const SocketAddress& addr1, - const SocketAddress& addr2) { +bool IsLessThan(const SocketAddress& addr1, const SocketAddress& addr2) { return addr1 < addr2 && !(addr2 < addr1) && !(addr1 == addr2); @@ -307,6 +315,10 @@ TEST(SocketAddressTest, TestComparisonOperator) { addr2 = SocketAddress("fe80::1", 5678); EXPECT_FALSE(addr1 < addr2); EXPECT_FALSE(addr2 < addr1); + + SocketAddress addr3("a.b.c.d", 1); + SocketAddress addr4("b.b.c.d", 1); + EXPECT_PRED2(IsLessThan, addr3, addr4); } TEST(SocketAddressTest, TestToSensitiveString) {