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

Unified Diff: net/http/http_content_disposition_unittest.cc

Issue 11478034: Add UMA for measuring Content-Dispostion header use and abuse. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Only measure valid C-D headers Created 8 years 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: net/http/http_content_disposition_unittest.cc
diff --git a/net/http/http_content_disposition_unittest.cc b/net/http/http_content_disposition_unittest.cc
index 240c69962e2ec8b90638792228105c9ef0cf4257..a96eb1c88533d4072603b25432107f460c115924 100644
--- a/net/http/http_content_disposition_unittest.cc
+++ b/net/http/http_content_disposition_unittest.cc
@@ -512,4 +512,94 @@ TEST(HttpContentDispositionTest, tc2231) {
}
}
+TEST(HttpContentDispositionTest, ParseResult) {
+ enum ParseResultFlags {
rvargas (doing something else) 2012/12/14 22:49:54 Funny... I was actually thinking that I would have
asanka 2012/12/15 01:57:32 Yeah. I changed the interface to use this. :)
rvargas (doing something else) 2012/12/15 02:46:57 wow, I was not expecting you to change it.
+ INVALID = 0,
+ HAS_DISPOSITION_TYPE = 1 << 0,
+ HAS_UNKNOWN_DISPOSITION_TYPE = 1 << 1,
+ HAS_NAME = 1 << 2,
+ HAS_FILENAME = 1 << 3,
+ HAS_EXT_FILENAME = 1 << 4,
+ HAS_NON_ASCII_STRINGS = 1 << 5,
+ HAS_PERCENT_ENCODED_STRINGS = 1 << 6,
+ HAS_RFC2047_ENCODED_STRINGS = 1 << 7
+ };
+
+ const struct ParseResultTestCase {
+ const char* header;
+ int expected_flags;
+ } kTestCases[] = {
+ // Basic feature tests
+ { "", INVALID },
+ { "example=x", INVALID },
+ { "attachment; filename=", HAS_DISPOSITION_TYPE },
+ { "attachment; name=", HAS_DISPOSITION_TYPE },
+ { "attachment; filename*=", HAS_DISPOSITION_TYPE },
+ { "attachment; filename==?utf-8?Q??=", HAS_DISPOSITION_TYPE },
+ { "filename=x", HAS_FILENAME },
+ { "example; filename=x",
+ HAS_DISPOSITION_TYPE | HAS_UNKNOWN_DISPOSITION_TYPE |
+ HAS_FILENAME},
+ { "attachment; filename=x",
+ HAS_DISPOSITION_TYPE | HAS_FILENAME },
+ { "attachment; filename=x; name=y",
+ HAS_DISPOSITION_TYPE | HAS_FILENAME | HAS_NAME },
+ { "attachment; name=y; filename*=utf-8''foo; name=x",
+ HAS_DISPOSITION_TYPE | HAS_EXT_FILENAME | HAS_NAME },
+
+ // Feature tests for 'filename' attribute.
+ { "filename=foo\xcc\x88",
+ HAS_FILENAME | HAS_NON_ASCII_STRINGS },
+ { "filename=foo%cc%88",
+ HAS_FILENAME | HAS_PERCENT_ENCODED_STRINGS },
+ { "filename==?utf-8?Q?foo?=",
+ HAS_FILENAME | HAS_RFC2047_ENCODED_STRINGS },
+ { "filename=\"=?utf-8?Q?foo?=\"",
+ HAS_FILENAME | HAS_RFC2047_ENCODED_STRINGS },
+ { "filename==?utf-8?Q?foo?", INVALID },
+ { "name=foo\xcc\x88",
+ HAS_NAME },
+
+ // Shouldn't set |has_non_ascii_strings| based on 'name' attribute.
+ { "filename=x; name=foo\xcc\x88",
+ HAS_FILENAME | HAS_NAME },
+ { "filename=foo\xcc\x88 foo%cc%88 =?utf-8?Q?foo?=",
+ HAS_FILENAME | HAS_NON_ASCII_STRINGS | HAS_PERCENT_ENCODED_STRINGS |
+ HAS_RFC2047_ENCODED_STRINGS },
+
+ // If 'filename' attribute is invalid, should set any flags based on it.
+ { "filename=foo\xcc\x88 foo%cc%88 =?utf-8?Q?foo?",
+ INVALID },
+ { "filename=foo\xcc\x88 foo%cc%88 =?utf-8?Q?foo?; name=x",
+ HAS_NAME },
+ };
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
+ const ParseResultTestCase& test_case = kTestCases[i];
+ HttpContentDisposition content_disposition(test_case.header, "utf-8");
+ const HttpContentDisposition::ParseResult& result =
+ content_disposition.parse_result();
+
+ SCOPED_TRACE(testing::Message() << "Test case " << i
+ << " with header " << test_case.header);
+
+ EXPECT_EQ(!!(test_case.expected_flags & HAS_DISPOSITION_TYPE),
+ result.has_disposition_type);
+ EXPECT_EQ(!!(test_case.expected_flags & HAS_UNKNOWN_DISPOSITION_TYPE),
+ result.has_unknown_disposition_type);
+ EXPECT_EQ(!!(test_case.expected_flags & HAS_NAME),
+ result.has_name);
+ EXPECT_EQ(!!(test_case.expected_flags & HAS_FILENAME),
+ result.has_filename);
+ EXPECT_EQ(!!(test_case.expected_flags & HAS_EXT_FILENAME),
+ result.has_ext_filename);
+ EXPECT_EQ(!!(test_case.expected_flags & HAS_NON_ASCII_STRINGS),
+ result.has_non_ascii_strings);
+ EXPECT_EQ(!!(test_case.expected_flags & HAS_PERCENT_ENCODED_STRINGS),
+ result.has_percent_encoded_strings);
+ EXPECT_EQ(!!(test_case.expected_flags & HAS_RFC2047_ENCODED_STRINGS),
+ result.has_rfc2047_encoded_strings);
+ }
+}
+
} // namespace net
« net/http/http_content_disposition.h ('K') | « net/http/http_content_disposition.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698