blob: 63fafea3216c5d0d96107d32fcceb48afce6fc8e [file] [log] [blame]
battre4cdaa7c2016-01-07 11:30:271// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/feedback/anonymizer_tool.h"
6
7#include <gtest/gtest.h>
8
battre03910b42016-01-11 13:42:349#include "base/strings/string_util.h"
10
battre4cdaa7c2016-01-07 11:30:2711namespace feedback {
12
Jeffrey Kardatzke98761d92019-07-17 17:14:3313const char kFakeFirstPartyID[] = "nkoccljplnhpfnfiajclkommnmllphnl";
14const char* const kFakeFirstPartyExtensionIDs[] = {kFakeFirstPartyID, nullptr};
15
battre4cdaa7c2016-01-07 11:30:2716class AnonymizerToolTest : public testing::Test {
17 protected:
18 std::string AnonymizeMACAddresses(const std::string& input) {
19 return anonymizer_.AnonymizeMACAddresses(input);
20 }
21
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2722 std::string AnonymizeAndroidAppStoragePaths(const std::string& input) {
23 return anonymizer_.AnonymizeAndroidAppStoragePaths(input);
24 }
25
battre4cdaa7c2016-01-07 11:30:2726 std::string AnonymizeCustomPatterns(const std::string& input) {
27 return anonymizer_.AnonymizeCustomPatterns(input);
28 }
29
battre03910b42016-01-11 13:42:3430 std::string AnonymizeCustomPatternWithContext(
battre4cdaa7c2016-01-07 11:30:2731 const std::string& input,
32 const std::string& pattern,
33 std::map<std::string, std::string>* space) {
battre03910b42016-01-11 13:42:3434 return anonymizer_.AnonymizeCustomPatternWithContext(input, pattern, space);
35 }
36
37 std::string AnonymizeCustomPatternWithoutContext(
38 const std::string& input,
39 const CustomPatternWithoutContext& pattern,
40 std::map<std::string, std::string>* space) {
41 return anonymizer_.AnonymizeCustomPatternWithoutContext(input, pattern,
42 space);
battre4cdaa7c2016-01-07 11:30:2743 }
44
Jeffrey Kardatzke98761d92019-07-17 17:14:3345 AnonymizerTool anonymizer_{kFakeFirstPartyExtensionIDs};
battre4cdaa7c2016-01-07 11:30:2746};
47
48TEST_F(AnonymizerToolTest, Anonymize) {
49 EXPECT_EQ("", anonymizer_.Anonymize(""));
50 EXPECT_EQ("foo\nbar\n", anonymizer_.Anonymize("foo\nbar\n"));
51
52 // Make sure MAC address anonymization is invoked.
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2753 EXPECT_EQ("[MAC OUI=02:46:8a IFACE=1]",
54 anonymizer_.Anonymize("02:46:8a:ce:13:57"));
battre4cdaa7c2016-01-07 11:30:2755
56 // Make sure custom pattern anonymization is invoked.
57 EXPECT_EQ("Cell ID: '1'", AnonymizeCustomPatterns("Cell ID: 'A1B2'"));
afakhry5a59f952017-05-24 21:04:2658
59 // Make sure UUIDs are anonymized.
60 EXPECT_EQ(
61 "REQUEST localhost - - \"POST /printers/<UUID: 1> HTTP/1.1\" 200 291 "
62 "Create-Job successful-ok",
63 anonymizer_.Anonymize(
64 "REQUEST localhost - - \"POST /printers/"
65 "cb738a9f-6433-4d95-a81e-94e4ae0ed30b HTTP/1.1\" 200 291 Create-Job "
66 "successful-ok"));
67 EXPECT_EQ(
68 "REQUEST localhost - - \"POST /printers/<UUID: 2> HTTP/1.1\" 200 286 "
69 "Create-Job successful-ok",
70 anonymizer_.Anonymize(
71 "REQUEST localhost - - \"POST /printers/"
72 "d17188da-9cd3-44f4-b148-3e1d748a3b0f HTTP/1.1\" 200 286 Create-Job "
73 "successful-ok"));
battre4cdaa7c2016-01-07 11:30:2774}
75
76TEST_F(AnonymizerToolTest, AnonymizeMACAddresses) {
77 EXPECT_EQ("", AnonymizeMACAddresses(""));
78 EXPECT_EQ("foo\nbar\n", AnonymizeMACAddresses("foo\nbar\n"));
79 EXPECT_EQ("11:22:33:44:55", AnonymizeMACAddresses("11:22:33:44:55"));
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2780 EXPECT_EQ("[MAC OUI=aa:bb:cc IFACE=1]",
81 AnonymizeMACAddresses("aa:bb:cc:dd:ee:ff"));
82 EXPECT_EQ("00:00:00:00:00:00", AnonymizeMACAddresses("00:00:00:00:00:00"));
83 EXPECT_EQ("ff:ff:ff:ff:ff:ff", AnonymizeMACAddresses("ff:ff:ff:ff:ff:ff"));
battre4cdaa7c2016-01-07 11:30:2784 EXPECT_EQ(
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2785 "BSSID: [MAC OUI=aa:bb:cc IFACE=1] in the middle\n"
86 "[MAC OUI=bb:cc:dd IFACE=2] start of line\n"
87 "end of line [MAC OUI=aa:bb:cc IFACE=1]\n"
battre4cdaa7c2016-01-07 11:30:2788 "no match across lines aa:bb:cc:\n"
89 "dd:ee:ff two on the same line:\n"
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2790 "x [MAC OUI=bb:cc:dd IFACE=2] [MAC OUI=cc:dd:ee IFACE=3] x\n",
battre4cdaa7c2016-01-07 11:30:2791 AnonymizeMACAddresses("BSSID: aa:bb:cc:dd:ee:ff in the middle\n"
92 "bb:cc:dd:ee:ff:00 start of line\n"
93 "end of line aa:bb:cc:dd:ee:ff\n"
94 "no match across lines aa:bb:cc:\n"
95 "dd:ee:ff two on the same line:\n"
96 "x bb:cc:dd:ee:ff:00 cc:dd:ee:ff:00:11 x\n"));
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2797 EXPECT_EQ("Remember [MAC OUI=bb:cc:dd IFACE=2]?",
battre4cdaa7c2016-01-07 11:30:2798 AnonymizeMACAddresses("Remember bB:Cc:DD:ee:ff:00?"));
99}
100
101TEST_F(AnonymizerToolTest, AnonymizeCustomPatterns) {
102 EXPECT_EQ("", AnonymizeCustomPatterns(""));
103
104 EXPECT_EQ("Cell ID: '1'", AnonymizeCustomPatterns("Cell ID: 'A1B2'"));
105 EXPECT_EQ("Cell ID: '2'", AnonymizeCustomPatterns("Cell ID: 'C1D2'"));
106 EXPECT_EQ("foo Cell ID: '1' bar",
107 AnonymizeCustomPatterns("foo Cell ID: 'A1B2' bar"));
108
109 EXPECT_EQ("foo Location area code: '1' bar",
110 AnonymizeCustomPatterns("foo Location area code: 'A1B2' bar"));
111
112 EXPECT_EQ("foo\na SSID='1' b\n'",
113 AnonymizeCustomPatterns("foo\na SSID='Joe's' b\n'"));
114 EXPECT_EQ("ssid '2'", AnonymizeCustomPatterns("ssid 'My AP'"));
115 EXPECT_EQ("bssid 'aa:bb'", AnonymizeCustomPatterns("bssid 'aa:bb'"));
116
117 EXPECT_EQ("Scan SSID - hexdump(len=6): 1\nfoo",
118 AnonymizeCustomPatterns(
119 "Scan SSID - hexdump(len=6): 47 6f 6f 67 6c 65\nfoo"));
120
121 EXPECT_EQ(
122 "a\nb [SSID=1] [SSID=2] [SSID=foo\nbar] b",
123 AnonymizeCustomPatterns("a\nb [SSID=foo] [SSID=bar] [SSID=foo\nbar] b"));
battre03910b42016-01-11 13:42:34124
afakhry85eea802017-05-01 17:04:10125 EXPECT_EQ("SerialNumber: 1",
126 AnonymizeCustomPatterns("SerialNumber: 1217D7EF"));
127 EXPECT_EQ("serial number: 2",
128 AnonymizeCustomPatterns("serial number: 50C971FEE7F3x010900"));
129 EXPECT_EQ("SerialNumber: 3",
130 AnonymizeCustomPatterns("SerialNumber: EVT23-17BA01-004"));
Thiemo Nagel21a5d552017-12-12 18:21:19131 EXPECT_EQ("serial=4", AnonymizeCustomPatterns("serial=\"1234AA5678\""));
afakhry85eea802017-05-01 17:04:10132
Jeffrey Kardatzke4a9a1bd32019-06-17 21:30:22133 EXPECT_EQ("\"gaia_id\":\"1\"",
134 AnonymizeCustomPatterns("\"gaia_id\":\"1234567890\""));
135 EXPECT_EQ("gaia_id='2'", AnonymizeCustomPatterns("gaia_id='987654321'"));
136 EXPECT_EQ("{id: 1, email:",
137 AnonymizeCustomPatterns("{id: 123454321, email:"));
138
battre03910b42016-01-11 13:42:34139 EXPECT_EQ("<email: 1>",
140 AnonymizeCustomPatterns("[email protected]"));
141 EXPECT_EQ("Email: <email: 1>.",
142 AnonymizeCustomPatterns("Email: [email protected]."));
143 EXPECT_EQ("Email:\n<email: 2>\n",
144 AnonymizeCustomPatterns("Email:\[email protected]\n"));
145
146 EXPECT_EQ("[<IPv6: 1>]", AnonymizeCustomPatterns(
147 "[2001:0db8:0000:0000:0000:ff00:0042:8329]"));
148 EXPECT_EQ("[<IPv6: 2>]",
149 AnonymizeCustomPatterns("[2001:db8:0:0:0:ff00:42:8329]"));
150 EXPECT_EQ("[<IPv6: 3>]", AnonymizeCustomPatterns("[2001:db8::ff00:42:8329]"));
Garrick Evans5a5c24e2019-01-28 12:55:44151 EXPECT_EQ("[<IPv6: 4>]", AnonymizeCustomPatterns("[aa::bb]"));
Garrick Evans5fbf45d2019-01-18 12:37:26152 EXPECT_EQ("<IPv4: 1>", AnonymizeCustomPatterns("192.160.0.1"));
battre03910b42016-01-11 13:42:34153
154 EXPECT_EQ("<URL: 1>",
155 AnonymizeCustomPatterns("http://example.com/foo?test=1"));
156 EXPECT_EQ("Foo <URL: 2> Bar",
157 AnonymizeCustomPatterns("Foo http://192.168.0.1/foo?test=1#123 Bar"));
158 const char* kURLs[] = {
159 "http://example.com/foo?test=1",
160 "http://userid:[email protected]:8080",
161 "http://userid:[email protected]:8080/",
162 "http://@example.com",
163 "http://192.168.0.1",
164 "http://192.168.0.1/",
165 "http://اختبار.com",
166 "http://test.com/foo(bar)baz.html",
167 "http://test.com/foo%20bar",
168 "ftp://test:[email protected]",
169 "chrome://extensions/",
170 "chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/options.html",
171 "http://example.com/[email protected]",
pbond4104d692016-02-10 09:41:07172 "rtsp://[email protected]/",
173 "https://aaaaaaaaaaaaaaaa.com",
battre03910b42016-01-11 13:42:34174 };
Avi Drissman8171db7d2018-12-25 23:08:31175 for (size_t i = 0; i < base::size(kURLs); ++i) {
battre03910b42016-01-11 13:42:34176 SCOPED_TRACE(kURLs[i]);
177 std::string got = AnonymizeCustomPatterns(kURLs[i]);
178 EXPECT_TRUE(
179 base::StartsWith(got, "<URL: ", base::CompareCase::INSENSITIVE_ASCII));
180 EXPECT_TRUE(base::EndsWith(got, ">", base::CompareCase::INSENSITIVE_ASCII));
181 }
182 // Test that "Android:" is not considered a schema with empty hier part.
183 EXPECT_EQ("The following applies to Android:",
184 AnonymizeCustomPatterns("The following applies to Android:"));
battre4cdaa7c2016-01-07 11:30:27185}
186
battre03910b42016-01-11 13:42:34187TEST_F(AnonymizerToolTest, AnonymizeCustomPatternWithContext) {
battre4cdaa7c2016-01-07 11:30:27188 const char kPattern[] = "(\\b(?i)id:? ')(\\d+)(')";
189 std::map<std::string, std::string> space;
battre03910b42016-01-11 13:42:34190 EXPECT_EQ("", AnonymizeCustomPatternWithContext("", kPattern, &space));
battre4cdaa7c2016-01-07 11:30:27191 EXPECT_EQ("foo\nbar\n",
battre03910b42016-01-11 13:42:34192 AnonymizeCustomPatternWithContext("foo\nbar\n", kPattern, &space));
193 EXPECT_EQ("id '1'",
194 AnonymizeCustomPatternWithContext("id '2345'", kPattern, &space));
195 EXPECT_EQ("id '2'",
196 AnonymizeCustomPatternWithContext("id '1234'", kPattern, &space));
197 EXPECT_EQ("id: '2'",
198 AnonymizeCustomPatternWithContext("id: '1234'", kPattern, &space));
199 EXPECT_EQ("ID: '1'",
200 AnonymizeCustomPatternWithContext("ID: '2345'", kPattern, &space));
battre4cdaa7c2016-01-07 11:30:27201 EXPECT_EQ("x1 id '1' 1x id '2'\nid '1'\n",
battre03910b42016-01-11 13:42:34202 AnonymizeCustomPatternWithContext(
203 "x1 id '2345' 1x id '1234'\nid '2345'\n", kPattern, &space));
battre4cdaa7c2016-01-07 11:30:27204 space.clear();
battre03910b42016-01-11 13:42:34205 EXPECT_EQ("id '1'",
206 AnonymizeCustomPatternWithContext("id '1234'", kPattern, &space));
battre4cdaa7c2016-01-07 11:30:27207
208 space.clear();
battre03910b42016-01-11 13:42:34209 EXPECT_EQ("x1z",
210 AnonymizeCustomPatternWithContext("xyz", "()(y+)()", &space));
211}
212
213TEST_F(AnonymizerToolTest, AnonymizeCustomPatternWithoutContext) {
214 CustomPatternWithoutContext kPattern = {"pattern", "(o+)"};
215 std::map<std::string, std::string> space;
216 EXPECT_EQ("", AnonymizeCustomPatternWithoutContext("", kPattern, &space));
217 EXPECT_EQ("f<pattern: 1>\nf<pattern: 2>z\nf<pattern: 1>l\n",
218 AnonymizeCustomPatternWithoutContext("fo\nfooz\nfol\n", kPattern,
219 &space));
battre4cdaa7c2016-01-07 11:30:27220}
221
Dominic Battref091addfc2017-12-07 15:45:34222TEST_F(AnonymizerToolTest, AnonymizeChunk) {
Jeffrey Kardatzke8719d852019-07-02 19:31:31223 // For better readability, put all the pre/post redaction strings in an array
224 // of pairs, and then convert that to two strings which become the input and
225 // output of the anonymizer.
226 std::pair<std::string, std::string> data[] = {
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:27227 {"aaaaaaaa [SSID=123aaaaaa]aaaaa", // SSID.
228 "aaaaaaaa [SSID=1]aaaaa"},
229 {"aaaaaaaahttp://tets.comaaaaaaa", // URL.
230 "aaaaaaaa<URL: 1>"},
231 {"[email protected]", // Email address.
232 "<email: 1>"},
233 {"example@@1234", // No PII, it is not invalid email address.
234 "example@@1234"},
235 {"255.255.155.2", // IP address.
236 "<IPv4: 1>"},
237 {"255.255.155.255", // IP address.
238 "<IPv4: 2>"},
239 {"127.0.0.1", // IPv4 loopback.
240 "<127.0.0.0/8: 3>"},
241 {"127.255.0.1", // IPv4 loopback.
242 "<127.0.0.0/8: 4>"},
243 {"0.0.0.0", // Any IPv4.
244 "<0.0.0.0/8: 5>"},
245 {"0.255.255.255", // Any IPv4.
246 "<0.0.0.0/8: 6>"},
247 {"10.10.10.100", // IPv4 private class A.
248 "<10.0.0.0/8: 7>"},
249 {"10.10.10.100", // Intentional duplicate.
250 "<10.0.0.0/8: 7>"},
251 {"10.10.10.101", // IPv4 private class A.
252 "<10.0.0.0/8: 8>"},
253 {"10.255.255.255", // IPv4 private class A.
254 "<10.0.0.0/8: 9>"},
255 {"172.16.0.0", // IPv4 private class B.
256 "<172.16.0.0/12: 10>"},
257 {"172.31.255.255", // IPv4 private class B.
258 "<172.16.0.0/12: 11>"},
259 {"172.11.5.5", // IP address.
260 "<IPv4: 12>"},
261 {"172.111.5.5", // IP address.
262 "<IPv4: 13>"},
263 {"192.168.0.0", // IPv4 private class C.
264 "<192.168.0.0/16: 14>"},
265 {"192.168.255.255", // IPv4 private class C.
266 "<192.168.0.0/16: 15>"},
267 {"192.169.2.120", // IP address.
268 "<IPv4: 16>"},
269 {"169.254.0.1", // Link local.
270 "<169.254.0.0/16: 17>"},
271 {"169.200.0.1", // IP address.
272 "<IPv4: 18>"},
273 {"fe80::", // Link local.
274 "<fe80::/10: 1>"},
275 {"fe80::ffff", // Link local.
276 "<fe80::/10: 2>"},
277 {"febf:ffff::ffff", // Link local.
278 "<fe80::/10: 3>"},
279 {"fecc::1111", // IP address.
280 "<IPv6: 4>"},
281 {"224.0.0.24", // Multicast.
282 "<224.0.0.0/4: 19>"},
283 {"240.0.0.0", // IP address.
284 "<IPv4: 20>"},
285 {"255.255.255.255", // Broadcast.
286 "255.255.255.255"},
287 {"100.115.92.92", // ChromeOS.
288 "100.115.92.92"},
289 {"100.115.91.92", // IP address.
290 "<IPv4: 23>"},
291 {"1.1.1.1", // DNS
292 "1.1.1.1"},
293 {"8.8.8.8", // DNS
294 "8.8.8.8"},
295 {"8.8.4.4", // DNS
296 "8.8.4.4"},
297 {"8.8.8.4", // IP address.
298 "<IPv4: 27>"},
299 {"255.255.259.255", // Not an IP address.
300 "255.255.259.255"},
301 {"255.300.255.255", // Not an IP address.
302 "255.300.255.255"},
303 {"aaaa123.123.45.4aaa", // IP address.
304 "aaaa<IPv4: 28>aaa"},
305 {"11:11;11::11", // IP address.
306 "11:11;<IPv6: 5>"},
307 {"11::11", // IP address.
308 "<IPv6: 5>"},
309 {"11:11:abcdef:0:0:0:0:0", // No PII.
310 "11:11:abcdef:0:0:0:0:0"},
311 {"::", // Unspecified.
312 "::"},
313 {"::1", // Local host.
314 "::1"},
315 {"Instance::Set", // Ignore match, no PII.
316 "Instance::Set"},
317 {"Instant::ff", // Ignore match, no PII.
318 "Instant::ff"},
319 {"net::ERR_CONN_TIMEOUT", // Ignore match, no PII.
320 "net::ERR_CONN_TIMEOUT"},
321 {"ff01::1", // All nodes address (interface local).
322 "ff01::1"},
323 {"ff01::2", // All routers (interface local).
324 "ff01::2"},
325 {"ff01::3", // Multicast (interface local).
326 "<ff01::/16: 13>"},
327 {"ff02::1", // All nodes address (link local).
328 "ff02::1"},
329 {"ff02::2", // All routers (link local).
330 "ff02::2"},
331 {"ff02::3", // Multicast (link local).
332 "<ff02::/16: 16>"},
333 {"ff02::fb", // mDNSv6 (link local).
334 "<ff02::/16: 17>"},
335 {"ff08::fb", // mDNSv6.
336 "<IPv6: 18>"},
337 {"ff0f::101", // All NTP servers.
338 "<IPv6: 19>"},
339 {"::ffff:cb0c:10ea", // IPv4-mapped IPV6 (IP address).
340 "<IPv6: 20>"},
341 {"::ffff:a0a:a0a", // IPv4-mapped IPV6 (private class A).
342 "<M 10.0.0.0/8: 21>"},
343 {"::ffff:a0a:a0a", // Intentional duplicate.
344 "<M 10.0.0.0/8: 21>"},
345 {"::ffff:ac1e:1e1e", // IPv4-mapped IPV6 (private class B).
346 "<M 172.16.0.0/12: 22>"},
347 {"::ffff:c0a8:640a", // IPv4-mapped IPV6 (private class C).
348 "<M 192.168.0.0/16: 23>"},
349 {"::ffff:6473:5c01", // IPv4-mapped IPV6 (Chrome).
350 "<M 100.115.92.1: 24>"},
351 {"64:ff9b::a0a:a0a", // IPv4-translated 6to4 IPV6 (private class A).
352 "<T 10.0.0.0/8: 25>"},
353 {"64:ff9b::6473:5c01", // IPv4-translated 6to4 IPV6 (Chrome).
354 "<T 100.115.92.1: 26>"},
355 {"::0101:ffff:c0a8:640a", // IP address.
356 "<IPv6: 27>"},
357 {"aa:aa:aa:aa:aa:aa", // MAC address (BSSID).
358 "[MAC OUI=aa:aa:aa IFACE=1]"},
359 {"chrome://resources/foo", // Secure chrome resource, whitelisted.
360 "chrome://resources/foo"},
361 {"chrome://settings/crisper.js", // Whitelisted settings URLs.
362 "chrome://settings/crisper.js"},
363 // Whitelisted first party extension.
364 {"chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js",
365 "chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js"},
366 {"chrome://resources/f?user=bar", // Potentially PII in parameter.
367 "<URL: 2>"},
368 {"chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js?bar=x",
369 "<URL: 3>"}, // Potentially PII in parameter.
370#if defined(OS_CHROMEOS) // We only anonymize Android paths on Chrome OS.
371 // Allowed android storage path.
372 {"112K\t/home/root/deadbeef1234/android-data/data/system_de",
373 "112K\t/home/root/deadbeef1234/android-data/data/system_de"},
374 // Anonymized app-specific storage path.
375 {"8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/de",
376 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/d_"},
377#endif // defined(OS_CHROMEOS)
Jeffrey Kardatzke98761d92019-07-17 17:14:33378 };
Jeffrey Kardatzke8719d852019-07-02 19:31:31379 std::string anon_input;
380 std::string anon_output;
381 for (const auto& s : data) {
382 anon_input.append(s.first).append("\n");
383 anon_output.append(s.second).append("\n");
384 }
385 EXPECT_EQ(anon_output, anonymizer_.Anonymize(anon_input));
Dominic Battref091addfc2017-12-07 15:45:34386}
387
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:27388#if defined(OS_CHROMEOS) // We only anonymize Android paths on Chrome OS.
389TEST_F(AnonymizerToolTest, AnonymizeAndroidAppStoragePaths) {
390 EXPECT_EQ("", AnonymizeAndroidAppStoragePaths(""));
391 EXPECT_EQ("foo\nbar\n", AnonymizeAndroidAppStoragePaths("foo\nbar\n"));
392
393 constexpr char kDuOutput[] =
394 "112K\t/home/root/deadbeef1234/android-data/data/system_de\n"
395 // /data/data will be modified by the anonymizer.
396 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pack.age1/a\n"
397 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pack.age1/bc\n"
398 "24K\t/home/root/deadbeef1234/android-data/data/data/pack.age1\n"
399 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/de\n"
400 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/de/"
401 "\xe3\x81\x82\n"
402 "8.1K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/de/"
403 "\xe3\x81\x82\xe3\x81\x83\n"
404 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/ef\n"
405 "24K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2\n"
406 // /data/app won't.
407 "8.0K\t/home/root/deadbeef1234/android-data/data/app/pack.age1/a\n"
408 "8.0K\t/home/root/deadbeef1234/android-data/data/app/pack.age1/bc\n"
409 "24K\t/home/root/deadbeef1234/android-data/data/app/pack.age1\n"
410 // /data/user_de will.
411 "8.0K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1/a\n"
412 "8.0K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1/bc\n"
413 "24K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1\n"
414 "78M\t/home/root/deadbeef1234/android-data/data/data\n";
415 constexpr char kDuOutputRedacted[] =
416 "112K\t/home/root/deadbeef1234/android-data/data/system_de\n"
417 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pack.age1/a\n"
418 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pack.age1/b_\n"
419 "24K\t/home/root/deadbeef1234/android-data/data/data/pack.age1\n"
420 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/d_\n"
421 // The non-ASCII directory names will become '*_'.
422 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/d_/*_\n"
423 "8.1K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/d_/*_\n"
424 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/e_\n"
425 "24K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2\n"
426 "8.0K\t/home/root/deadbeef1234/android-data/data/app/pack.age1/a\n"
427 "8.0K\t/home/root/deadbeef1234/android-data/data/app/pack.age1/bc\n"
428 "24K\t/home/root/deadbeef1234/android-data/data/app/pack.age1\n"
429 "8.0K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1/a\n"
430 "8.0K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1/b_\n"
431 "24K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1\n"
432 "78M\t/home/root/deadbeef1234/android-data/data/data\n";
433 EXPECT_EQ(kDuOutputRedacted, AnonymizeAndroidAppStoragePaths(kDuOutput));
434}
435#endif // defined(OS_CHROMEOS)
436
battre4cdaa7c2016-01-07 11:30:27437} // namespace feedback