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

Side by Side 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: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <queue> 5 #include <queue>
6 #include <map>
6 7
7 #include "base/bind.h" 8 #include "base/bind.h"
8 #include "base/callback.h" 9 #include "base/callback.h"
9 #include "base/file_util.h" 10 #include "base/file_util.h"
10 #include "base/json/json_value_serializer.h" 11 #include "base/json/json_value_serializer.h"
11 #include "base/path_service.h" 12 #include "base/path_service.h"
12 #include "base/stl_util.h" 13 #include "base/stl_util.h"
13 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
14 #include "chrome/browser/extensions/extension_event_router_forwarder.h" 15 #include "chrome/browser/extensions/extension_event_router_forwarder.h"
15 #include "chrome/browser/extensions/extension_webrequest_api.h" 16 #include "chrome/browser/extensions/extension_webrequest_api.h"
(...skipping 19 matching lines...) Expand all
35 void* profile, 36 void* profile,
36 const std::string& extension_id, 37 const std::string& extension_id,
37 const std::string& event_name, 38 const std::string& event_name,
38 const std::string& sub_event_name, 39 const std::string& sub_event_name,
39 uint64 request_id, 40 uint64 request_id,
40 ExtensionWebRequestEventRouter::EventResponse* response) { 41 ExtensionWebRequestEventRouter::EventResponse* response) {
41 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( 42 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled(
42 profile, extension_id, event_name, sub_event_name, request_id, 43 profile, extension_id, event_name, sub_event_name, request_id,
43 response); 44 response);
44 } 45 }
46
47 // Searches |key| in |collection| by iterating over its elements and returns
48 // true if found.
49 template <typename Collection, typename Key>
50 bool SearchKey(const Collection& collection, const Key& key) {
Matt Perry 2011/11/11 22:05:08 rename to Contains?
battre 2011/11/17 12:01:04 I have renamed it to "Contains". Note that we alre
Matt Perry 2011/11/17 20:04:09 I think this 1-off is fine.
51 return std::find(collection.begin(), collection.end(), key) !=
52 collection.end();
53 }
54
45 } // namespace 55 } // namespace
46 56
47 // A mock event router that responds to events with a pre-arranged queue of 57 // A mock event router that responds to events with a pre-arranged queue of
48 // Tasks. 58 // Tasks.
49 class TestIPCSender : public IPC::Message::Sender { 59 class TestIPCSender : public IPC::Message::Sender {
50 public: 60 public:
51 typedef std::list<linked_ptr<IPC::Message> > SentMessages; 61 typedef std::list<linked_ptr<IPC::Message> > SentMessages;
52 62
53 // Adds a Task to the queue. We will fire these in order as events are 63 // Adds a Task to the queue. We will fire these in order as events are
54 // dispatched. 64 // dispatched.
(...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 ASSERT_TRUE(delta_modified2.get()); 824 ASSERT_TRUE(delta_modified2.get());
815 EXPECT_TRUE(delta_modified2->deleted_request_headers.empty()); 825 EXPECT_TRUE(delta_modified2->deleted_request_headers.empty());
816 ASSERT_TRUE( 826 ASSERT_TRUE(
817 delta_modified2->modified_request_headers.GetHeader("key2", &value)); 827 delta_modified2->modified_request_headers.GetHeader("key2", &value));
818 EXPECT_EQ("value3", value); 828 EXPECT_EQ("value3", value);
819 } 829 }
820 830
821 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnHeadersReceivedDelta) { 831 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnHeadersReceivedDelta) {
822 using namespace extension_webrequest_api_helpers; 832 using namespace extension_webrequest_api_helpers;
823 const bool cancel = true; 833 const bool cancel = true;
824 const char status_line[] = "HTTP/1.0 200 OK"; 834 char base_headers_string[] =
825 const char response_headers_string[] = "key1: value1\n" 835 "HTTP/1.0 200 OK\r\n"
826 "key2: value2\n\n"; 836 "Key1: Value1\r\n"
837 "Key2: Value2\r\n"
838 "Key3: Value3\r\n"
839 "\r\n";
840 scoped_refptr<net::HttpResponseHeaders> base_headers(
841 new net::HttpResponseHeaders(
842 net::HttpUtil::AssembleRawHeaders(
843 base_headers_string, sizeof(base_headers_string))));
844
845 ResponseHeaders new_headers;
846 new_headers.push_back(ResponseHeader("kEy1", "Value1")); // Unchanged
847 new_headers.push_back(ResponseHeader("Key2", "Value1")); // Modified
848 // Key3 is deleted
849 new_headers.push_back(ResponseHeader("Key4", "Value4")); // Added
827 850
828 scoped_ptr<EventResponseDelta> delta( 851 scoped_ptr<EventResponseDelta> delta(
829 CalculateOnHeadersReceivedDelta("extid", base::Time::Now(), cancel, 852 CalculateOnHeadersReceivedDelta("extid", base::Time::Now(), cancel,
830 status_line, response_headers_string)); 853 base_headers, &new_headers));
831 ASSERT_TRUE(delta.get()); 854 ASSERT_TRUE(delta.get());
832 EXPECT_TRUE(delta->cancel); 855 EXPECT_TRUE(delta->cancel);
833 ASSERT_TRUE(delta->new_response_headers.get()); 856 EXPECT_EQ(2u, delta->added_response_headers.size());
834 EXPECT_TRUE(delta->new_response_headers->HasHeader("key1")); 857 EXPECT_TRUE(SearchKey(delta->added_response_headers,
835 EXPECT_TRUE(delta->new_response_headers->HasHeader("key2")); 858 ResponseHeader("Key2", "Value1")));
836 EXPECT_EQ(status_line, delta->new_response_headers->GetStatusLine()); 859 EXPECT_TRUE(SearchKey(delta->added_response_headers,
837 // net::HttpResponseHeaders does not have easy access to header values. 860 ResponseHeader("Key4", "Value4")));
838 // Let's be lazy and not test it here. 861 EXPECT_EQ(2u, delta->deleted_response_headers.size());
862 EXPECT_TRUE(SearchKey(delta->deleted_response_headers,
863 ResponseHeader("Key2", "Value2")));
864 EXPECT_TRUE(SearchKey(delta->deleted_response_headers,
865 ResponseHeader("Key3", "Value3")));
839 } 866 }
840 867
841 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { 868 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) {
842 using namespace extension_webrequest_api_helpers; 869 using namespace extension_webrequest_api_helpers;
843 const bool cancel = true; 870 const bool cancel = true;
844 871
845 string16 username = ASCIIToUTF16("foo"); 872 string16 username = ASCIIToUTF16("foo");
846 string16 password = ASCIIToUTF16("bar"); 873 string16 password = ASCIIToUTF16("bar");
847 scoped_ptr<net::AuthCredentials> credentials( 874 scoped_ptr<net::AuthCredentials> credentials(
848 new net::AuthCredentials(username, password)); 875 new net::AuthCredentials(username, password));
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1053 EXPECT_EQ("value 3", header_value); 1080 EXPECT_EQ("value 3", header_value);
1054 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); 1081 ASSERT_TRUE(headers3.GetHeader("key5", &header_value));
1055 EXPECT_EQ("value 5", header_value); 1082 EXPECT_EQ("value 5", header_value);
1056 EXPECT_EQ(1u, conflicting_extensions.size()); 1083 EXPECT_EQ(1u, conflicting_extensions.size());
1057 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); 1084 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1058 EXPECT_EQ(3u, event_log.size()); 1085 EXPECT_EQ(3u, event_log.size());
1059 } 1086 }
1060 1087
1061 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { 1088 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
1062 using namespace extension_webrequest_api_helpers; 1089 using namespace extension_webrequest_api_helpers;
1063 EventLogEntries event_log; 1090 EventLogEntries event_log;
1064 std::set<std::string> conflicting_extensions; 1091 std::set<std::string> conflicting_extensions;
1065 std::string header_value; 1092 std::string header_value;
1066 EventResponseDeltas deltas; 1093 EventResponseDeltas deltas;
1094
1095 char base_headers_string[] =
1096 "HTTP/1.0 200 OK\r\n"
1097 "Key1: Value1\r\n"
1098 "Key2: Value2\r\n"
1099 "\r\n";
1100 scoped_refptr<net::HttpResponseHeaders> base_headers(
1101 new net::HttpResponseHeaders(
1102 net::HttpUtil::AssembleRawHeaders(
1103 base_headers_string, sizeof(base_headers_string))));
1067 1104
1068 // Check that we can handle if not touching the response headers. 1105 // Check that we can handle if not touching the response headers.
1069 linked_ptr<EventResponseDelta> d0( 1106 linked_ptr<EventResponseDelta> d0(
1070 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); 1107 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000)));
1071 deltas.push_back(d0); 1108 deltas.push_back(d0);
1072 scoped_refptr<net::HttpResponseHeaders> new_headers0; 1109 scoped_refptr<net::HttpResponseHeaders> new_headers0;
1073 MergeOnHeadersReceivedResponses( 1110 MergeOnHeadersReceivedResponses(
1074 deltas, &new_headers0, &conflicting_extensions, &event_log); 1111 deltas, base_headers.get(), &new_headers0, &conflicting_extensions,
1112 &event_log);
1075 EXPECT_FALSE(new_headers0.get()); 1113 EXPECT_FALSE(new_headers0.get());
1076 EXPECT_EQ(0u, conflicting_extensions.size()); 1114 EXPECT_EQ(0u, conflicting_extensions.size());
1077 EXPECT_EQ(0u, event_log.size()); 1115 EXPECT_EQ(0u, event_log.size());
1078 1116
1079 // Check that we can replace response headers.
1080 char headers1_string[] =
1081 "HTTP/1.0 200 OK\r\n"
1082 "Foo: bar\r\n"
1083 "\r\n";
1084 scoped_refptr<net::HttpResponseHeaders> headers1(
1085 new net::HttpResponseHeaders(
1086 net::HttpUtil::AssembleRawHeaders(
1087 headers1_string, sizeof(headers1_string))));
1088 linked_ptr<EventResponseDelta> d1( 1117 linked_ptr<EventResponseDelta> d1(
1089 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); 1118 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
1090 d1->new_response_headers = headers1; 1119 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1"));
1120 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2"));
1121 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3"));
1091 deltas.push_back(d1); 1122 deltas.push_back(d1);
1092 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); 1123 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1093 scoped_refptr<net::HttpResponseHeaders> new_headers1;
1094 conflicting_extensions.clear(); 1124 conflicting_extensions.clear();
1095 event_log.clear(); 1125 event_log.clear();
1126 scoped_refptr<net::HttpResponseHeaders> new_headers1;
1096 MergeOnHeadersReceivedResponses( 1127 MergeOnHeadersReceivedResponses(
1097 deltas, &new_headers1, &conflicting_extensions, &event_log); 1128 deltas, base_headers.get(), &new_headers1, &conflicting_extensions,
1098 EXPECT_EQ(headers1.get(), new_headers1.get()); 1129 &event_log);
1130 ASSERT_TRUE(new_headers1.get());
1131 std::multimap<std::string, std::string> expected1;
1132 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3"));
1133 void* iter = NULL;
1134 std::string name;
1135 std::string value;
1136 std::multimap<std::string, std::string> actual1;
1137 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) {
1138 actual1.insert(std::pair<std::string, std::string>(name, value));
1139 }
1140 EXPECT_EQ(expected1, actual1);
1099 EXPECT_EQ(0u, conflicting_extensions.size()); 1141 EXPECT_EQ(0u, conflicting_extensions.size());
1100 EXPECT_EQ(1u, event_log.size()); 1142 EXPECT_EQ(1u, event_log.size());
1101 1143
1102 // Check that we replace response headers only once. 1144 // Check that we replace response headers only once.
1103 char headers2_string[] =
1104 "HTTP/1.0 200 OK\r\n"
1105 "Foo: baz\r\n"
1106 "\r\n";
1107 scoped_refptr<net::HttpResponseHeaders> headers2(
1108 new net::HttpResponseHeaders(
1109 net::HttpUtil::AssembleRawHeaders(
1110 headers2_string, sizeof(headers2_string))));
1111 linked_ptr<EventResponseDelta> d2( 1145 linked_ptr<EventResponseDelta> d2(
1112 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); 1146 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
1113 d2->new_response_headers = headers2; 1147 // Note that we use a different capitalization of KeY2. This should not
1148 // matter.
1149 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2"));
1150 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4"));
1114 deltas.push_back(d2); 1151 deltas.push_back(d2);
1115 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); 1152 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1116 scoped_refptr<net::HttpResponseHeaders> new_headers2;
1117 conflicting_extensions.clear(); 1153 conflicting_extensions.clear();
1118 event_log.clear(); 1154 event_log.clear();
1155 scoped_refptr<net::HttpResponseHeaders> new_headers2;
1119 MergeOnHeadersReceivedResponses( 1156 MergeOnHeadersReceivedResponses(
1120 deltas, &new_headers2, &conflicting_extensions, &event_log); 1157 deltas, base_headers.get(), &new_headers2, &conflicting_extensions,
1121 EXPECT_EQ(headers1.get(), new_headers1.get()); 1158 &event_log);
1159 ASSERT_TRUE(new_headers2.get());
1160 iter = NULL;
1161 std::multimap<std::string, std::string> actual2;
1162 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) {
1163 actual2.insert(std::pair<std::string, std::string>(name, value));
1164 }
1165 EXPECT_EQ(expected1, actual2);
1122 EXPECT_EQ(1u, conflicting_extensions.size()); 1166 EXPECT_EQ(1u, conflicting_extensions.size());
1123 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); 1167 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1124 EXPECT_EQ(2u, event_log.size()); 1168 EXPECT_EQ(2u, event_log.size());
1125 } 1169 }
1126 1170
1171 // Check that we do not delete too much
1172 TEST(ExtensionWebRequestHelpersTest,
1173 TestMergeOnHeadersReceivedResponsesDeletion) {
1174 using namespace extension_webrequest_api_helpers;
1175 EventLogEntries event_log;
1176 std::set<std::string> conflicting_extensions;
1177 std::string header_value;
1178 EventResponseDeltas deltas;
1179
1180 char base_headers_string[] =
1181 "HTTP/1.0 200 OK\r\n"
1182 "Key1: Value1\r\n"
1183 "Key1: Value2\r\n"
1184 "Key1: Value3\r\n"
1185 "Key2: Value4\r\n"
1186 "\r\n";
1187 scoped_refptr<net::HttpResponseHeaders> base_headers(
1188 new net::HttpResponseHeaders(
1189 net::HttpUtil::AssembleRawHeaders(
1190 base_headers_string, sizeof(base_headers_string))));
1191
1192 linked_ptr<EventResponseDelta> d1(
1193 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
1194 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2"));
1195 deltas.push_back(d1);
1196 scoped_refptr<net::HttpResponseHeaders> new_headers1;
1197 MergeOnHeadersReceivedResponses(
1198 deltas, base_headers.get(), &new_headers1, &conflicting_extensions,
1199 &event_log);
1200 ASSERT_TRUE(new_headers1.get());
1201 std::multimap<std::string, std::string> expected1;
1202 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1"));
1203 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3"));
1204 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4"));
1205 void* iter = NULL;
1206 std::string name;
1207 std::string value;
1208 std::multimap<std::string, std::string> actual1;
1209 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) {
1210 actual1.insert(std::pair<std::string, std::string>(name, value));
1211 }
1212 EXPECT_EQ(expected1, actual1);
1213 EXPECT_EQ(0u, conflicting_extensions.size());
1214 EXPECT_EQ(1u, event_log.size());
1215 }
1216
1127 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { 1217 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) {
1128 using namespace extension_webrequest_api_helpers; 1218 using namespace extension_webrequest_api_helpers;
1129 EventLogEntries event_log; 1219 EventLogEntries event_log;
1130 std::set<std::string> conflicting_extensions; 1220 std::set<std::string> conflicting_extensions;
1131 EventResponseDeltas deltas; 1221 EventResponseDeltas deltas;
1132 string16 username = ASCIIToUTF16("foo"); 1222 string16 username = ASCIIToUTF16("foo");
1133 string16 password = ASCIIToUTF16("bar"); 1223 string16 password = ASCIIToUTF16("bar");
1134 string16 password2 = ASCIIToUTF16("baz"); 1224 string16 password2 = ASCIIToUTF16("baz");
1135 1225
1136 // Check that we can handle if not returning credentials. 1226 // Check that we can handle if not returning credentials.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 credentials_set = MergeOnAuthRequiredResponses( 1285 credentials_set = MergeOnAuthRequiredResponses(
1196 deltas, &auth3, &conflicting_extensions, &event_log); 1286 deltas, &auth3, &conflicting_extensions, &event_log);
1197 EXPECT_TRUE(credentials_set); 1287 EXPECT_TRUE(credentials_set);
1198 EXPECT_FALSE(auth3.Empty()); 1288 EXPECT_FALSE(auth3.Empty());
1199 EXPECT_EQ(username, auth1.username()); 1289 EXPECT_EQ(username, auth1.username());
1200 EXPECT_EQ(password, auth1.password()); 1290 EXPECT_EQ(password, auth1.password());
1201 EXPECT_EQ(1u, conflicting_extensions.size()); 1291 EXPECT_EQ(1u, conflicting_extensions.size());
1202 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); 1292 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1203 EXPECT_EQ(3u, event_log.size()); 1293 EXPECT_EQ(3u, event_log.size());
1204 } 1294 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698