| 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..caaf7fdbaa7ba4c7e243d0c56243f8c5923ae4a3 100644
|
| --- a/net/http/http_content_disposition_unittest.cc
|
| +++ b/net/http/http_content_disposition_unittest.cc
|
| @@ -512,4 +512,92 @@ TEST(HttpContentDispositionTest, tc2231) {
|
| }
|
| }
|
|
|
| +TEST(HttpContentDispositionTest, ParseResult) {
|
| + enum ParseResultFlags {
|
| + 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 },
|
| + { "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
|
|
|