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

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

Issue 8519003: More unittests for webRequest API and better conflict resolution (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Improve merging of header modifications in webRequest.OnHeadersReceived 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 ca68822f41683dc4d63478256491842fa8d23eb3..d89797212cdd02f01db09a1f12e893daa5e63b39 100644
--- a/chrome/browser/extensions/extension_webrequest_api_unittest.cc
+++ b/chrome/browser/extensions/extension_webrequest_api_unittest.cc
@@ -3,12 +3,14 @@
// found in the LICENSE file.
#include <queue>
+#include <map>
#include "base/bind.h"
#include "base/callback.h"
#include "base/file_util.h"
#include "base/json/json_value_serializer.h"
#include "base/path_service.h"
+#include "base/stl_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/extensions/extension_event_router_forwarder.h"
#include "chrome/browser/extensions/extension_webrequest_api.h"
@@ -41,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 SearchKey(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
@@ -820,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(SearchKey(delta->added_response_headers,
+ ResponseHeader("Key2", "Value1")));
+ EXPECT_TRUE(SearchKey(delta->added_response_headers,
+ ResponseHeader("Key4", "Value4")));
+ EXPECT_EQ(2u, delta->deleted_response_headers.size());
+ EXPECT_TRUE(SearchKey(delta->deleted_response_headers,
+ ResponseHeader("Key2", "Value2")));
+ EXPECT_TRUE(SearchKey(delta->deleted_response_headers,
+ ResponseHeader("Key3", "Value3")));
}
TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) {
@@ -856,3 +884,412 @@ TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) {
EXPECT_EQ(password, delta->auth_credentials->password());
}
+TEST(ExtensionWebRequestHelpersTest, TestMergeCancelOfResponses) {
+ using namespace extension_webrequest_api_helpers;
+ EventResponseDeltas deltas;
+ EventLogEntries event_log;
+ bool canceled = false;
+
+ // Single event that does not cancel.
+ linked_ptr<EventResponseDelta> d1(
+ new EventResponseDelta("extid1", base::Time::FromInternalValue(1000)));
+ d1->cancel = false;
+ deltas.push_back(d1);
+ MergeCancelOfResponses(deltas, &canceled, &event_log);
+ EXPECT_FALSE(canceled);
+ EXPECT_TRUE(event_log.empty());
+
+ // Second event that cancels the request
+ linked_ptr<EventResponseDelta> d2(
+ new EventResponseDelta("extid2", base::Time::FromInternalValue(500)));
+ d2->cancel = true;
+ deltas.push_back(d2);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ MergeCancelOfResponses(deltas, &canceled, &event_log);
+ EXPECT_TRUE(canceled);
+ EXPECT_EQ(1u, event_log.size());
+}
+
+TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses) {
+ using namespace extension_webrequest_api_helpers;
+ EventResponseDeltas deltas;
+ EventLogEntries event_log;
+ std::set<std::string> conflicting_extensions;
+ GURL effective_new_url;
+
+ // No redirect
+ linked_ptr<EventResponseDelta> d0(
+ new EventResponseDelta("extid0", base::Time::FromInternalValue(0)));
+ deltas.push_back(d0);
+ MergeOnBeforeRequestResponses(
+ deltas, &effective_new_url, &conflicting_extensions, &event_log);
+ EXPECT_TRUE(effective_new_url.is_empty());
+
+ // Single redirect.
+ GURL new_url_1("http://foo.com");
+ linked_ptr<EventResponseDelta> d1(
+ new EventResponseDelta("extid1", base::Time::FromInternalValue(1000)));
+ d1->new_url = GURL(new_url_1);
+ deltas.push_back(d1);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ event_log.clear();
+ MergeOnBeforeRequestResponses(
+ deltas, &effective_new_url, &conflicting_extensions, &event_log);
+ EXPECT_EQ(new_url_1, effective_new_url);
+ EXPECT_TRUE(conflicting_extensions.empty());
+ EXPECT_EQ(1u, event_log.size());
+
+ // Ignored redirect (due to precedence).
+ GURL new_url_2("http://bar.com");
+ linked_ptr<EventResponseDelta> d2(
+ new EventResponseDelta("extid2", base::Time::FromInternalValue(500)));
+ d2->new_url = GURL(new_url_2);
+ deltas.push_back(d2);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ event_log.clear();
+ MergeOnBeforeRequestResponses(
+ deltas, &effective_new_url, &conflicting_extensions, &event_log);
+ EXPECT_EQ(new_url_1, effective_new_url);
+ EXPECT_EQ(1u, conflicting_extensions.size());
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
+ EXPECT_EQ(2u, event_log.size());
+
+ // Overriding redirect.
+ GURL new_url_3("http://baz.com");
+ linked_ptr<EventResponseDelta> d3(
+ new EventResponseDelta("extid3", base::Time::FromInternalValue(1500)));
+ d3->new_url = GURL(new_url_3);
+ deltas.push_back(d3);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ conflicting_extensions.clear();
+ event_log.clear();
+ MergeOnBeforeRequestResponses(
+ deltas, &effective_new_url, &conflicting_extensions, &event_log);
+ EXPECT_EQ(new_url_3, effective_new_url);
+ EXPECT_EQ(2u, conflicting_extensions.size());
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1"));
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
+ EXPECT_EQ(3u, event_log.size());
+
+ // Check that identical redirects don't cause a conflict.
+ linked_ptr<EventResponseDelta> d4(
+ new EventResponseDelta("extid4", base::Time::FromInternalValue(2000)));
+ d4->new_url = GURL(new_url_3);
+ deltas.push_back(d4);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ conflicting_extensions.clear();
+ event_log.clear();
+ MergeOnBeforeRequestResponses(
+ deltas, &effective_new_url, &conflicting_extensions, &event_log);
+ EXPECT_EQ(new_url_3, effective_new_url);
+ EXPECT_EQ(2u, conflicting_extensions.size());
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1"));
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
+ EXPECT_EQ(4u, event_log.size());
+}
+
+TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) {
+ using namespace extension_webrequest_api_helpers;
+ net::HttpRequestHeaders base_headers;
+ base_headers.AddHeaderFromString("key1: value 1");
+ base_headers.AddHeaderFromString("key2: value 2");
+ EventLogEntries event_log;
+ std::set<std::string> conflicting_extensions;
+ std::string header_value;
+ EventResponseDeltas deltas;
+
+ // Check that we can handle not changing the headers.
+ linked_ptr<EventResponseDelta> d0(
+ new EventResponseDelta("extid0", base::Time::FromInternalValue(2500)));
+ deltas.push_back(d0);
+ net::HttpRequestHeaders headers0;
+ headers0.MergeFrom(base_headers);
+ MergeOnBeforeSendHeadersResponses(
+ deltas, &headers0, &conflicting_extensions, &event_log);
+ ASSERT_TRUE(headers0.GetHeader("key1", &header_value));
+ EXPECT_EQ("value 1", header_value);
+ ASSERT_TRUE(headers0.GetHeader("key2", &header_value));
+ EXPECT_EQ("value 2", header_value);
+ EXPECT_EQ(0u, conflicting_extensions.size());
+ EXPECT_EQ(0u, event_log.size());
+
+ // Delete, modify and add a header.
+ linked_ptr<EventResponseDelta> d1(
+ new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
+ d1->deleted_request_headers.push_back("key1");
+ d1->modified_request_headers.AddHeaderFromString("key2: value 3");
+ d1->modified_request_headers.AddHeaderFromString("key3: value 3");
+ deltas.push_back(d1);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ net::HttpRequestHeaders headers1;
+ headers1.MergeFrom(base_headers);
+ MergeOnBeforeSendHeadersResponses(
+ deltas, &headers1, &conflicting_extensions, &event_log);
+ EXPECT_FALSE(headers1.HasHeader("key1"));
+ ASSERT_TRUE(headers1.GetHeader("key2", &header_value));
+ EXPECT_EQ("value 3", header_value);
+ ASSERT_TRUE(headers1.GetHeader("key3", &header_value));
+ EXPECT_EQ("value 3", header_value);
+ EXPECT_EQ(0u, conflicting_extensions.size());
+ EXPECT_EQ(1u, event_log.size());
+
+ // Check that conflicts are atomic, i.e. if one header modification
+ // collides all other conflicts of the same extension are declined as well.
+ linked_ptr<EventResponseDelta> d2(
+ new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
+ // This one conflicts:
+ d2->modified_request_headers.AddHeaderFromString("key3: value 0");
+ d2->modified_request_headers.AddHeaderFromString("key4: value 4");
+ deltas.push_back(d2);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ conflicting_extensions.clear();
+ event_log.clear();
+ net::HttpRequestHeaders headers2;
+ headers2.MergeFrom(base_headers);
+ MergeOnBeforeSendHeadersResponses(
+ deltas, &headers2, &conflicting_extensions, &event_log);
+ EXPECT_FALSE(headers2.HasHeader("key1"));
+ ASSERT_TRUE(headers2.GetHeader("key2", &header_value));
+ EXPECT_EQ("value 3", header_value);
+ ASSERT_TRUE(headers2.GetHeader("key3", &header_value));
+ EXPECT_EQ("value 3", header_value);
+ EXPECT_FALSE(headers2.HasHeader("key4"));
+ EXPECT_EQ(1u, conflicting_extensions.size());
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
+ EXPECT_EQ(2u, event_log.size());
+
+ // Check that identical modifications don't conflict and operations
+ // can be merged.
+ linked_ptr<EventResponseDelta> d3(
+ new EventResponseDelta("extid3", base::Time::FromInternalValue(1000)));
+ d3->deleted_request_headers.push_back("key1");
+ d3->modified_request_headers.AddHeaderFromString("key2: value 3");
+ d3->modified_request_headers.AddHeaderFromString("key5: value 5");
+ deltas.push_back(d3);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ conflicting_extensions.clear();
+ event_log.clear();
+ net::HttpRequestHeaders headers3;
+ headers3.MergeFrom(base_headers);
+ MergeOnBeforeSendHeadersResponses(
+ deltas, &headers3, &conflicting_extensions, &event_log);
+ EXPECT_FALSE(headers3.HasHeader("key1"));
+ ASSERT_TRUE(headers3.GetHeader("key2", &header_value));
+ EXPECT_EQ("value 3", header_value);
+ ASSERT_TRUE(headers3.GetHeader("key3", &header_value));
+ EXPECT_EQ("value 3", header_value);
+ ASSERT_TRUE(headers3.GetHeader("key5", &header_value));
+ EXPECT_EQ("value 5", header_value);
+ EXPECT_EQ(1u, conflicting_extensions.size());
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
+ EXPECT_EQ(3u, event_log.size());
+}
+
+TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
+ 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"
+ "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(
+ new EventResponseDelta("extid0", base::Time::FromInternalValue(3000)));
+ deltas.push_back(d0);
+ scoped_refptr<net::HttpResponseHeaders> new_headers0(
+ new net::HttpResponseHeaders(
+ net::HttpUtil::AssembleRawHeaders(
+ base_headers_string, sizeof(base_headers_string))));
+ MergeOnHeadersReceivedResponses(
+ deltas, &new_headers0, &conflicting_extensions, &event_log);
+ EXPECT_TRUE(new_headers0.get());
+ EXPECT_EQ(0u, conflicting_extensions.size());
+ EXPECT_EQ(0u, event_log.size());
+
+ linked_ptr<EventResponseDelta> d1(
+ new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
+ 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(
+ new net::HttpResponseHeaders(
+ net::HttpUtil::AssembleRawHeaders(
+ base_headers_string, sizeof(base_headers_string))));
+ conflicting_extensions.clear();
+ event_log.clear();
+ MergeOnHeadersReceivedResponses(
+ deltas, &new_headers1, &conflicting_extensions, &event_log);
+ 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.
+ scoped_refptr<net::HttpResponseHeaders> headers2(
+ new net::HttpResponseHeaders(
+ net::HttpUtil::AssembleRawHeaders(
+ base_headers_string, sizeof(base_headers_string))));
+ linked_ptr<EventResponseDelta> d2(
+ new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
+ // 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);
+ conflicting_extensions.clear();
+ event_log.clear();
+ MergeOnHeadersReceivedResponses(
+ deltas, &headers2, &conflicting_extensions, &event_log);
+ iter = NULL;
+ std::multimap<std::string, std::string> actual2;
+ while (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";
+
+ 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> headers1(
+ new net::HttpResponseHeaders(
+ net::HttpUtil::AssembleRawHeaders(
+ base_headers_string, sizeof(base_headers_string))));
+ MergeOnHeadersReceivedResponses(
+ deltas, &headers1, &conflicting_extensions, &event_log);
+ 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 (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;
+ std::set<std::string> conflicting_extensions;
+ EventResponseDeltas deltas;
+ string16 username = ASCIIToUTF16("foo");
+ string16 password = ASCIIToUTF16("bar");
+ string16 password2 = ASCIIToUTF16("baz");
+
+ // Check that we can handle if not returning credentials.
+ linked_ptr<EventResponseDelta> d0(
+ new EventResponseDelta("extid0", base::Time::FromInternalValue(3000)));
+ deltas.push_back(d0);
+ net::AuthCredentials auth0;
+ bool credentials_set = MergeOnAuthRequiredResponses(
+ deltas, &auth0, &conflicting_extensions, &event_log);
+ EXPECT_FALSE(credentials_set);
+ EXPECT_TRUE(auth0.Empty());
+ EXPECT_EQ(0u, conflicting_extensions.size());
+ EXPECT_EQ(0u, event_log.size());
+
+ // Check that we can set AuthCredentials.
+ linked_ptr<EventResponseDelta> d1(
+ new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
+ d1->auth_credentials.reset(new net::AuthCredentials(username, password));
+ deltas.push_back(d1);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ conflicting_extensions.clear();
+ event_log.clear();
+ net::AuthCredentials auth1;
+ credentials_set = MergeOnAuthRequiredResponses(
+ deltas, &auth1, &conflicting_extensions, &event_log);
+ EXPECT_TRUE(credentials_set);
+ EXPECT_FALSE(auth1.Empty());
+ EXPECT_EQ(username, auth1.username());
+ EXPECT_EQ(password, auth1.password());
+ EXPECT_EQ(0u, conflicting_extensions.size());
+ EXPECT_EQ(1u, event_log.size());
+
+ // Check that we set AuthCredentials only once.
+ linked_ptr<EventResponseDelta> d2(
+ new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
+ d2->auth_credentials.reset(new net::AuthCredentials(username, password2));
+ deltas.push_back(d2);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ conflicting_extensions.clear();
+ event_log.clear();
+ net::AuthCredentials auth2;
+ credentials_set = MergeOnAuthRequiredResponses(
+ deltas, &auth2, &conflicting_extensions, &event_log);
+ EXPECT_TRUE(credentials_set);
+ EXPECT_FALSE(auth2.Empty());
+ EXPECT_EQ(username, auth1.username());
+ EXPECT_EQ(password, auth1.password());
+ EXPECT_EQ(1u, conflicting_extensions.size());
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
+ EXPECT_EQ(2u, event_log.size());
+
+ // Check that we can set identical AuthCredentials twice without causing
+ // a conflict.
+ linked_ptr<EventResponseDelta> d3(
+ new EventResponseDelta("extid3", base::Time::FromInternalValue(1000)));
+ d3->auth_credentials.reset(new net::AuthCredentials(username, password));
+ deltas.push_back(d3);
+ deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+ conflicting_extensions.clear();
+ event_log.clear();
+ net::AuthCredentials auth3;
+ credentials_set = MergeOnAuthRequiredResponses(
+ deltas, &auth3, &conflicting_extensions, &event_log);
+ EXPECT_TRUE(credentials_set);
+ EXPECT_FALSE(auth3.Empty());
+ EXPECT_EQ(username, auth1.username());
+ EXPECT_EQ(password, auth1.password());
+ EXPECT_EQ(1u, conflicting_extensions.size());
+ EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
+ EXPECT_EQ(3u, event_log.size());
+}
« 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