| 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;
|
|
|