Add "x"s in the end of a stripped IPv6 address string.

This makes it clearer that the IP address has been stripped.

BUG=chromium:254329

Review URL: https://codereview.webrtc.org/1516163003

Cr-Original-Commit-Position: refs/heads/master@{#11005}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: ac921d7365e83b1e271e05a2654ef705de5c60b7
diff --git a/base/ipaddress.cc b/base/ipaddress.cc
index 3b74d60..c85624d 100644
--- a/base/ipaddress.cc
+++ b/base/ipaddress.cc
@@ -27,6 +27,7 @@
 
 #include "webrtc/base/ipaddress.h"
 #include "webrtc/base/byteorder.h"
+#include "webrtc/base/checks.h"
 #include "webrtc/base/nethelpers.h"
 #include "webrtc/base/logging.h"
 #include "webrtc/base/win32.h"
@@ -157,9 +158,19 @@
       return address;
     }
     case AF_INET6: {
-      // TODO(grunell): Return a string of format 1:2:3:x:x:x:x:x or such
-      // instead of zeroing out.
-      return TruncateIP(*this, 128 - 80).ToString();
+      // Remove the last 5 groups (80 bits).
+      std::string address = TruncateIP(*this, 128 - 80).ToString();
+
+      // If all three remaining groups are written out explicitly in the string,
+      // remove one of the two trailing colons before appending the stripped
+      // groups as "x"s. There should be max 4 colons (2 between the 3 groups +
+      // 2 trailing) in the truncated address string.
+      size_t number_of_colons = std::count(address.begin(), address.end(), ':');
+      RTC_CHECK_LE(number_of_colons, 4u);
+      if (number_of_colons > 3)
+        address.resize(address.length() - 1);
+
+      return address + "x:x:x:x:x";
     }
   }
   return std::string();
diff --git a/base/ipaddress_unittest.cc b/base/ipaddress_unittest.cc
index 10eb074..e032c9f 100644
--- a/base/ipaddress_unittest.cc
+++ b/base/ipaddress_unittest.cc
@@ -25,6 +25,10 @@
                                            0x00, 0x04, 0x10, 0x00,
                                            0xbe, 0x30, 0x5b, 0xff,
                                            0xfe, 0xe5, 0x00, 0xc3}}};
+static const in6_addr kIPv6PublicAddr2 = {{{0x24, 0x01, 0x00, 0x00,
+                                            0x00, 0x00, 0x10, 0x00,
+                                            0xbe, 0x30, 0x5b, 0xff,
+                                            0xfe, 0xe5, 0x00, 0xc3}}};
 static const in6_addr kIPv4MappedAnyAddr = {{{0x00, 0x00, 0x00, 0x00,
                                               0x00, 0x00, 0x00, 0x00,
                                               0x00, 0x00, 0xff, 0xff,
@@ -52,7 +56,12 @@
     "2620:0:1008:1201:2089:6dda:385e:80c0";
 static const std::string kIPv6PublicAddrString =
     "2401:fa00:4:1000:be30:5bff:fee5:c3";
-static const std::string kIPv6PublicAddrAnonymizedString = "2401:fa00:4::";
+static const std::string kIPv6PublicAddr2String =
+    "2401::1000:be30:5bff:fee5:c3";
+static const std::string kIPv6PublicAddrAnonymizedString =
+    "2401:fa00:4:x:x:x:x:x";
+static const std::string kIPv6PublicAddr2AnonymizedString =
+    "2401::x:x:x:x:x";
 static const std::string kIPv4MappedAnyAddrString = "::ffff:0:0";
 static const std::string kIPv4MappedRFC1918AddrString = "::ffff:c0a8:701";
 static const std::string kIPv4MappedLoopbackAddrString = "::ffff:7f00:1";
@@ -889,14 +898,18 @@
 TEST(IPAddressTest, TestToSensitiveString) {
   IPAddress addr_v4 = IPAddress(kIPv4PublicAddr);
   IPAddress addr_v6 = IPAddress(kIPv6PublicAddr);
+  IPAddress addr_v6_2 = IPAddress(kIPv6PublicAddr2);
   EXPECT_EQ(kIPv4PublicAddrString, addr_v4.ToString());
   EXPECT_EQ(kIPv6PublicAddrString, addr_v6.ToString());
+  EXPECT_EQ(kIPv6PublicAddr2String, addr_v6_2.ToString());
 #if defined(NDEBUG)
   EXPECT_EQ(kIPv4PublicAddrAnonymizedString, addr_v4.ToSensitiveString());
   EXPECT_EQ(kIPv6PublicAddrAnonymizedString, addr_v6.ToSensitiveString());
+  EXPECT_EQ(kIPv6PublicAddr2AnonymizedString, addr_v6_2.ToSensitiveString());
 #else
   EXPECT_EQ(kIPv4PublicAddrString, addr_v4.ToSensitiveString());
   EXPECT_EQ(kIPv6PublicAddrString, addr_v6.ToSensitiveString());
+  EXPECT_EQ(kIPv6PublicAddr2String, addr_v6_2.ToSensitiveString());
 #endif  // defined(NDEBUG)
 }
 
diff --git a/base/socketaddress_unittest.cc b/base/socketaddress_unittest.cc
index 21412fa..e235447 100644
--- a/base/socketaddress_unittest.cc
+++ b/base/socketaddress_unittest.cc
@@ -27,10 +27,11 @@
                                     0x00, 0x00, 0xFF, 0xFF,
                                     0x01, 0x02, 0x03, 0x04} } };
 const std::string kTestV6AddrString = "2001:db8:1020:3040:5060:7080:90a0:b0c0";
-const std::string kTestV6AddrAnonymizedString = "2001:db8:1020::";
+const std::string kTestV6AddrAnonymizedString = "2001:db8:1020:x:x:x:x:x";
 const std::string kTestV6AddrFullString =
     "[2001:db8:1020:3040:5060:7080:90a0:b0c0]:5678";
-const std::string kTestV6AddrFullAnonymizedString = "[2001:db8:1020::]:5678";
+const std::string kTestV6AddrFullAnonymizedString =
+    "[2001:db8:1020:x:x:x:x:x]:5678";
 
 TEST(SocketAddressTest, TestDefaultCtor) {
   SocketAddress addr;