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

Unified Diff: chrome/browser/extensions/extension_webrequest_api_unittest.cc

Issue 8511063: Improve merging of header modifications in webRequest.OnHeadersReceived (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Disabled browser tests again Created 9 years, 1 month 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
« no previous file with comments | « chrome/browser/extensions/extension_webrequest_api_helpers.cc ('k') | net/http/http_response_headers.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/extension_webrequest_api_unittest.cc
diff --git a/chrome/browser/extensions/extension_webrequest_api_unittest.cc b/chrome/browser/extensions/extension_webrequest_api_unittest.cc
index cf4aa179bde58cdf781f414dcec8cb4d2c97c2ff..7d6d6936698be0cca704e97661067cd8563f9848 100644
--- a/chrome/browser/extensions/extension_webrequest_api_unittest.cc
+++ b/chrome/browser/extensions/extension_webrequest_api_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include <queue>
+#include <map>
#include "base/bind.h"
#include "base/callback.h"
@@ -42,6 +43,15 @@ static void EventHandledOnIOThread(
profile, extension_id, event_name, sub_event_name, request_id,
response);
}
+
+// Searches |key| in |collection| by iterating over its elements and returns
+// true if found.
+template <typename Collection, typename Key>
+bool Contains(const Collection& collection, const Key& key) {
+ return std::find(collection.begin(), collection.end(), key) !=
+ collection.end();
+}
+
} // namespace
// A mock event router that responds to events with a pre-arranged queue of
@@ -821,21 +831,38 @@ TEST(ExtensionWebRequestHelpersTest, TestCalculateOnBeforeSendHeadersDelta) {
TEST(ExtensionWebRequestHelpersTest, TestCalculateOnHeadersReceivedDelta) {
using namespace extension_webrequest_api_helpers;
const bool cancel = true;
- const char status_line[] = "HTTP/1.0 200 OK";
- const char response_headers_string[] = "key1: value1\n"
- "key2: value2\n\n";
+ char base_headers_string[] =
+ "HTTP/1.0 200 OK\r\n"
+ "Key1: Value1\r\n"
+ "Key2: Value2\r\n"
+ "Key3: Value3\r\n"
+ "\r\n";
+ scoped_refptr<net::HttpResponseHeaders> base_headers(
+ new net::HttpResponseHeaders(
+ net::HttpUtil::AssembleRawHeaders(
+ base_headers_string, sizeof(base_headers_string))));
+
+ ResponseHeaders new_headers;
+ new_headers.push_back(ResponseHeader("kEy1", "Value1")); // Unchanged
+ new_headers.push_back(ResponseHeader("Key2", "Value1")); // Modified
+ // Key3 is deleted
+ new_headers.push_back(ResponseHeader("Key4", "Value4")); // Added
scoped_ptr<EventResponseDelta> delta(
CalculateOnHeadersReceivedDelta("extid", base::Time::Now(), cancel,
- status_line, response_headers_string));
+ base_headers, &new_headers));
ASSERT_TRUE(delta.get());
EXPECT_TRUE(delta->cancel);
- ASSERT_TRUE(delta->new_response_headers.get());
- EXPECT_TRUE(delta->new_response_headers->HasHeader("key1"));
- EXPECT_TRUE(delta->new_response_headers->HasHeader("key2"));
- EXPECT_EQ(status_line, delta->new_response_headers->GetStatusLine());
- // net::HttpResponseHeaders does not have easy access to header values.
- // Let's be lazy and not test it here.
+ EXPECT_EQ(2u, delta->added_response_headers.size());
+ EXPECT_TRUE(Contains(delta->added_response_headers,
+ ResponseHeader("Key2", "Value1")));
+ EXPECT_TRUE(Contains(delta->added_response_headers,
+ ResponseHeader("Key4", "Value4")));
+ EXPECT_EQ(2u, delta->deleted_response_headers.size());
+ EXPECT_TRUE(Contains(delta->deleted_response_headers,
+ ResponseHeader("Key2", "Value2")));
+ EXPECT_TRUE(Contains(delta->deleted_response_headers,
+ ResponseHeader("Key3", "Value3")));
}
TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) {
@@ -1060,10 +1087,20 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) {
TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
using namespace extension_webrequest_api_helpers;
- EventLogEntries event_log;
- std::set<std::string> conflicting_extensions;
- std::string header_value;
- EventResponseDeltas deltas;
+ EventLogEntries event_log;
+ std::set<std::string> conflicting_extensions;
+ std::string header_value;
+ EventResponseDeltas deltas;
+
+ char base_headers_string[] =
+ "HTTP/1.0 200 OK\r\n"
+ "Key1: Value1\r\n"
+ "Key2: Value2\r\n"
+ "\r\n";
+ scoped_refptr<net::HttpResponseHeaders> base_headers(
+ new net::HttpResponseHeaders(
+ net::HttpUtil::AssembleRawHeaders(
+ base_headers_string, sizeof(base_headers_string))));
// Check that we can handle if not touching the response headers.
linked_ptr<EventResponseDelta> d0(
@@ -1071,59 +1108,112 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
deltas.push_back(d0);
scoped_refptr<net::HttpResponseHeaders> new_headers0;
MergeOnHeadersReceivedResponses(
- deltas, &new_headers0, &conflicting_extensions, &event_log);
+ deltas, base_headers.get(), &new_headers0, &conflicting_extensions,
+ &event_log);
EXPECT_FALSE(new_headers0.get());
EXPECT_EQ(0u, conflicting_extensions.size());
EXPECT_EQ(0u, event_log.size());
- // Check that we can replace response headers.
- char headers1_string[] =
- "HTTP/1.0 200 OK\r\n"
- "Foo: bar\r\n"
- "\r\n";
- scoped_refptr<net::HttpResponseHeaders> headers1(
- new net::HttpResponseHeaders(
- net::HttpUtil::AssembleRawHeaders(
- headers1_string, sizeof(headers1_string))));
linked_ptr<EventResponseDelta> d1(
new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
- d1->new_response_headers = headers1;
+ d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1"));
+ d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2"));
+ d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3"));
deltas.push_back(d1);
deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
- scoped_refptr<net::HttpResponseHeaders> new_headers1;
conflicting_extensions.clear();
event_log.clear();
+ scoped_refptr<net::HttpResponseHeaders> new_headers1;
MergeOnHeadersReceivedResponses(
- deltas, &new_headers1, &conflicting_extensions, &event_log);
- EXPECT_EQ(headers1.get(), new_headers1.get());
+ deltas, base_headers.get(), &new_headers1, &conflicting_extensions,
+ &event_log);
+ ASSERT_TRUE(new_headers1.get());
+ std::multimap<std::string, std::string> expected1;
+ expected1.insert(std::pair<std::string, std::string>("Key2", "Value3"));
+ void* iter = NULL;
+ std::string name;
+ std::string value;
+ std::multimap<std::string, std::string> actual1;
+ while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) {
+ actual1.insert(std::pair<std::string, std::string>(name, value));
+ }
+ EXPECT_EQ(expected1, actual1);
EXPECT_EQ(0u, conflicting_extensions.size());
EXPECT_EQ(1u, event_log.size());
// Check that we replace response headers only once.
- char headers2_string[] =
- "HTTP/1.0 200 OK\r\n"
- "Foo: baz\r\n"
- "\r\n";
- scoped_refptr<net::HttpResponseHeaders> headers2(
- new net::HttpResponseHeaders(
- net::HttpUtil::AssembleRawHeaders(
- headers2_string, sizeof(headers2_string))));
linked_ptr<EventResponseDelta> d2(
new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
- d2->new_response_headers = headers2;
+ // Note that we use a different capitalization of KeY2. This should not
+ // matter.
+ d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2"));
+ d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4"));
deltas.push_back(d2);
deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
- scoped_refptr<net::HttpResponseHeaders> new_headers2;
conflicting_extensions.clear();
event_log.clear();
+ scoped_refptr<net::HttpResponseHeaders> new_headers2;
MergeOnHeadersReceivedResponses(
- deltas, &new_headers2, &conflicting_extensions, &event_log);
- EXPECT_EQ(headers1.get(), new_headers1.get());
+ deltas, base_headers.get(), &new_headers2, &conflicting_extensions,
+ &event_log);
+ ASSERT_TRUE(new_headers2.get());
+ iter = NULL;
+ std::multimap<std::string, std::string> actual2;
+ while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) {
+ actual2.insert(std::pair<std::string, std::string>(name, value));
+ }
+ EXPECT_EQ(expected1, actual2);
EXPECT_EQ(1u, conflicting_extensions.size());
EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
EXPECT_EQ(2u, event_log.size());
}
+// Check that we do not delete too much
+TEST(ExtensionWebRequestHelpersTest,
+ TestMergeOnHeadersReceivedResponsesDeletion) {
+ using namespace extension_webrequest_api_helpers;
+ EventLogEntries event_log;
+ std::set<std::string> conflicting_extensions;
+ std::string header_value;
+ EventResponseDeltas deltas;
+
+ char base_headers_string[] =
+ "HTTP/1.0 200 OK\r\n"
+ "Key1: Value1\r\n"
+ "Key1: Value2\r\n"
+ "Key1: Value3\r\n"
+ "Key2: Value4\r\n"
+ "\r\n";
+ scoped_refptr<net::HttpResponseHeaders> base_headers(
+ new net::HttpResponseHeaders(
+ net::HttpUtil::AssembleRawHeaders(
+ base_headers_string, sizeof(base_headers_string))));
+
+ linked_ptr<EventResponseDelta> d1(
+ new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
+ d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2"));
+ deltas.push_back(d1);
+ scoped_refptr<net::HttpResponseHeaders> new_headers1;
+ MergeOnHeadersReceivedResponses(
+ deltas, base_headers.get(), &new_headers1, &conflicting_extensions,
+ &event_log);
+ ASSERT_TRUE(new_headers1.get());
+ std::multimap<std::string, std::string> expected1;
+ expected1.insert(std::pair<std::string, std::string>("Key1", "Value1"));
+ expected1.insert(std::pair<std::string, std::string>("Key1", "Value3"));
+ expected1.insert(std::pair<std::string, std::string>("Key2", "Value4"));
+ void* iter = NULL;
+ std::string name;
+ std::string value;
+ std::multimap<std::string, std::string> actual1;
+ while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) {
+ actual1.insert(std::pair<std::string, std::string>(name, value));
+ }
+ EXPECT_EQ(expected1, actual1);
+ EXPECT_EQ(0u, conflicting_extensions.size());
+ EXPECT_EQ(1u, event_log.size());
+}
+
TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) {
using namespace extension_webrequest_api_helpers;
EventLogEntries event_log;
« no previous file with comments | « chrome/browser/extensions/extension_webrequest_api_helpers.cc ('k') | net/http/http_response_headers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698