Index: chrome/browser/extensions/api/web_request/form_data_parser_unittest.cc |
diff --git a/chrome/browser/extensions/api/web_request/form_data_parser_unittest.cc b/chrome/browser/extensions/api/web_request/form_data_parser_unittest.cc |
deleted file mode 100644 |
index fa04aeb2e97efa999491d217798d670d09903eeb..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/api/web_request/form_data_parser_unittest.cc |
+++ /dev/null |
@@ -1,250 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/basictypes.h" |
-#include "base/logging.h" |
-#include "base/strings/string_piece.h" |
-#include "chrome/browser/extensions/api/web_request/form_data_parser.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace extensions { |
- |
-namespace { |
- |
-// Attempts to create a parser corresponding to the |content_type_header|. |
-// On success, returns the parser. |
-scoped_ptr<FormDataParser> InitParser(const std::string& content_type_header) { |
- scoped_ptr<FormDataParser> parser( |
- FormDataParser::CreateFromContentTypeHeader(&content_type_header)); |
- if (parser.get() == NULL) |
- return scoped_ptr<FormDataParser>(); |
- return parser.Pass(); |
-} |
- |
-// Attempts to run the parser corresponding to the |content_type_header| |
-// on the source represented by the concatenation of blocks from |bytes|. |
-// On success, returns true and the parsed |output|, else false. |
-// Parsed |output| has names on even positions (0, 2, ...), values on odd ones. |
-bool RunParser(const std::string& content_type_header, |
- const std::vector<const base::StringPiece*>& bytes, |
- std::vector<std::string>* output) { |
- DCHECK(output); |
- output->clear(); |
- scoped_ptr<FormDataParser> parser(InitParser(content_type_header)); |
- if (!parser.get()) |
- return false; |
- FormDataParser::Result result; |
- for (size_t block = 0; block < bytes.size(); ++block) { |
- if (!parser->SetSource(*(bytes[block]))) |
- return false; |
- while (parser->GetNextNameValue(&result)) { |
- output->push_back(result.name()); |
- output->push_back(result.value()); |
- } |
- } |
- return parser->AllDataReadOK(); |
-} |
- |
-// Attempts to run the parser corresponding to the |content_type_header| |
-// on the source represented by the concatenation of blocks from |bytes|. |
-// Checks that the parser fails parsing. |
-bool CheckParserFails(const std::string& content_type_header, |
- const std::vector<const base::StringPiece*>& bytes) { |
- std::vector<std::string> output; |
- scoped_ptr<FormDataParser> parser(InitParser(content_type_header)); |
- if (!parser.get()) |
- return false; |
- FormDataParser::Result result; |
- for (size_t block = 0; block < bytes.size(); ++block) { |
- if (!parser->SetSource(*(bytes[block]))) |
- break; |
- while (parser->GetNextNameValue(&result)) { |
- output.push_back(result.name()); |
- output.push_back(result.value()); |
- } |
- } |
- return !parser->AllDataReadOK(); |
-} |
- |
-} // namespace |
- |
-TEST(WebRequestFormDataParserTest, Parsing) { |
- // We verify that POST data parsers cope with various formats of POST data. |
- // Construct the test data. |
- const std::string kBoundary = "THIS_IS_A_BOUNDARY"; |
- const std::string kBlockStr1 = |
- std::string("--") + kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"text\"\r\n" |
- "\r\n" |
- "test\rtext\nwith non-CRLF line breaks\r\n" |
- "--" + |
- kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"file\"; filename=\"test\"\r\n" |
- "Content-Type: application/octet-stream\r\n" |
- "\r\n"; |
- const std::string kBlockStr2 = |
- std::string("\r\n--") + kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"password\"\r\n" |
- "\r\n" |
- "test password\r\n" |
- "--" + |
- kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"radio\"\r\n" |
- "\r\n" |
- "Yes\r\n" |
- "--" + |
- kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"check\"\r\n" |
- "\r\n" |
- "option A\r\n" |
- "--" + |
- kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"check\"\r\n" |
- "\r\n" |
- "option B\r\n" |
- "--" + |
- kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"txtarea\"\r\n" |
- "\r\n" |
- "Some text.\r\n" |
- "Other.\r\n" |
- "\r\n" |
- "--" + |
- kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"select\"\r\n" |
- "\r\n" |
- "one\r\n" |
- "--" + |
- kBoundary + "--"; |
- // POST data input. |
- const std::string kBigBlock = kBlockStr1 + kBlockStr2; |
- const std::string kUrlEncodedBlock = |
- "text=test%0Dtext%0Awith+non-CRLF+line+breaks" |
- "&file=test&password=test+password&radio=Yes&check=option+A" |
- "&check=option+B&txtarea=Some+text.%0D%0AOther.%0D%0A&select=one"; |
- const base::StringPiece kMultipartBytes(kBigBlock); |
- const base::StringPiece kMultipartBytesSplit1(kBlockStr1); |
- const base::StringPiece kMultipartBytesSplit2(kBlockStr2); |
- const base::StringPiece kUrlEncodedBytes(kUrlEncodedBlock); |
- const std::string kPlainBlock = "abc"; |
- const base::StringPiece kTextPlainBytes(kPlainBlock); |
- // Headers. |
- const std::string kUrlEncoded = "application/x-www-form-urlencoded"; |
- const std::string kTextPlain = "text/plain"; |
- const std::string kMultipart = |
- std::string("multipart/form-data; boundary=") + kBoundary; |
- // Expected output. |
- const char* kPairs[] = { |
- "text", "test\rtext\nwith non-CRLF line breaks", |
- "file", "test", |
- "password", "test password", |
- "radio", "Yes", |
- "check", "option A", |
- "check", "option B", |
- "txtarea", "Some text.\r\nOther.\r\n", |
- "select", "one" |
- }; |
- const std::vector<std::string> kExpected(kPairs, kPairs + arraysize(kPairs)); |
- |
- std::vector<const base::StringPiece*> input; |
- std::vector<std::string> output; |
- |
- // First test: multipart POST data in one lump. |
- input.push_back(&kMultipartBytes); |
- EXPECT_TRUE(RunParser(kMultipart, input, &output)); |
- EXPECT_EQ(kExpected, output); |
- |
- // Second test: multipart POST data in several lumps. |
- input.clear(); |
- input.push_back(&kMultipartBytesSplit1); |
- input.push_back(&kMultipartBytesSplit2); |
- EXPECT_TRUE(RunParser(kMultipart, input, &output)); |
- EXPECT_EQ(kExpected, output); |
- |
- // Third test: URL-encoded POST data. |
- input.clear(); |
- input.push_back(&kUrlEncodedBytes); |
- EXPECT_TRUE(RunParser(kUrlEncoded, input, &output)); |
- EXPECT_EQ(kExpected, output); |
- |
- // Fourth test: text/plain POST data in one lump. |
- input.clear(); |
- input.push_back(&kTextPlainBytes); |
- // This should fail, text/plain is ambiguous and thus unparseable. |
- EXPECT_FALSE(RunParser(kTextPlain, input, &output)); |
-} |
- |
-TEST(WebRequestFormDataParserTest, MalformedPayload) { |
- // We verify that POST data parsers reject malformed data. |
- // Construct the test data. |
- const std::string kBoundary = "THIS_IS_A_BOUNDARY"; |
- const std::string kBlockStr = |
- std::string("--") + kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"text\"\r\n" |
- "\r\n" |
- "test\rtext\nwith non-CRLF line breaks\r\n" |
- "-" + |
- kBoundary + |
- "\r\n" /* Missing '-'. */ |
- "Content-Disposition: form-data; name=\"file\"; filename=\"test\"\r\n" |
- "Content-Type: application/octet-stream\r\n" |
- /* Two CRLF missing. */ |
- "--" + |
- kBoundary + |
- "\r\n" |
- "Content-Disposition: form-data; name=\"select\"\r\n" |
- "\r\n" |
- "one\r\n" |
- "--" + |
- kBoundary + "-" /* Missing '-' at the end. */; |
- // POST data input. |
- // The following block is corrupted -- contains a "==" substring. |
- const std::string kUrlEncodedBlock = |
- "text=test%0Dtext%0Awith+non-CRLF+line+breaks" |
- "&file==test&password=test+password&radio=Yes&check=option+A" |
- "&check=option+B&txtarea=Some+text.%0D%0AOther.%0D%0A&select=one"; |
- const base::StringPiece kMultipartBytes(kBlockStr); |
- const base::StringPiece kMultipartBytesEmpty(""); |
- const base::StringPiece kUrlEncodedBytes(kUrlEncodedBlock); |
- const base::StringPiece kUrlEncodedBytesEmpty(""); |
- // Headers. |
- const std::string kUrlEncoded = "application/x-www-form-urlencoded"; |
- const std::string kMultipart = |
- std::string("multipart/form-data; boundary=") + kBoundary; |
- |
- std::vector<const base::StringPiece*> input; |
- |
- // First test: malformed multipart POST data. |
- input.push_back(&kMultipartBytes); |
- EXPECT_TRUE(CheckParserFails(kMultipart, input)); |
- |
- // Second test: empty multipart POST data. |
- input.clear(); |
- input.push_back(&kMultipartBytesEmpty); |
- EXPECT_TRUE(CheckParserFails(kMultipart, input)); |
- |
- // Third test: malformed URL-encoded POST data. |
- input.clear(); |
- input.push_back(&kUrlEncodedBytes); |
- EXPECT_TRUE(CheckParserFails(kUrlEncoded, input)); |
- |
- // Fourth test: empty URL-encoded POST data. Note that an empty string is a |
- // valid url-encoded value, so this should parse correctly. |
- std::vector<std::string> output; |
- input.clear(); |
- input.push_back(&kUrlEncodedBytesEmpty); |
- EXPECT_TRUE(RunParser(kUrlEncoded, input, &output)); |
- EXPECT_EQ(0u, output.size()); |
-} |
- |
-} // namespace extensions |