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

Side by Side 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 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"
13 #include "base/stl_util.h"
12 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
13 #include "chrome/browser/extensions/extension_event_router_forwarder.h" 15 #include "chrome/browser/extensions/extension_event_router_forwarder.h"
14 #include "chrome/browser/extensions/extension_webrequest_api.h" 16 #include "chrome/browser/extensions/extension_webrequest_api.h"
15 #include "chrome/browser/extensions/extension_webrequest_api_constants.h" 17 #include "chrome/browser/extensions/extension_webrequest_api_constants.h"
16 #include "chrome/browser/extensions/extension_webrequest_api_helpers.h" 18 #include "chrome/browser/extensions/extension_webrequest_api_helpers.h"
17 #include "chrome/browser/net/chrome_network_delegate.h" 19 #include "chrome/browser/net/chrome_network_delegate.h"
18 #include "chrome/browser/prefs/pref_member.h" 20 #include "chrome/browser/prefs/pref_member.h"
19 #include "chrome/common/extensions/extension_messages.h" 21 #include "chrome/common/extensions/extension_messages.h"
20 #include "chrome/common/pref_names.h" 22 #include "chrome/common/pref_names.h"
21 #include "chrome/test/base/testing_browser_process.h" 23 #include "chrome/test/base/testing_browser_process.h"
(...skipping 12 matching lines...) Expand all
34 void* profile, 36 void* profile,
35 const std::string& extension_id, 37 const std::string& extension_id,
36 const std::string& event_name, 38 const std::string& event_name,
37 const std::string& sub_event_name, 39 const std::string& sub_event_name,
38 uint64 request_id, 40 uint64 request_id,
39 ExtensionWebRequestEventRouter::EventResponse* response) { 41 ExtensionWebRequestEventRouter::EventResponse* response) {
40 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( 42 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled(
41 profile, extension_id, event_name, sub_event_name, request_id, 43 profile, extension_id, event_name, sub_event_name, request_id,
42 response); 44 response);
43 } 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) {
51 return std::find(collection.begin(), collection.end(), key) !=
52 collection.end();
53 }
54
44 } // namespace 55 } // namespace
45 56
46 // 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
47 // Tasks. 58 // Tasks.
48 class TestIPCSender : public IPC::Message::Sender { 59 class TestIPCSender : public IPC::Message::Sender {
49 public: 60 public:
50 typedef std::list<linked_ptr<IPC::Message> > SentMessages; 61 typedef std::list<linked_ptr<IPC::Message> > SentMessages;
51 62
52 // 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
53 // dispatched. 64 // dispatched.
(...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 ASSERT_TRUE(delta_modified2.get()); 824 ASSERT_TRUE(delta_modified2.get());
814 EXPECT_TRUE(delta_modified2->deleted_request_headers.empty()); 825 EXPECT_TRUE(delta_modified2->deleted_request_headers.empty());
815 ASSERT_TRUE( 826 ASSERT_TRUE(
816 delta_modified2->modified_request_headers.GetHeader("key2", &value)); 827 delta_modified2->modified_request_headers.GetHeader("key2", &value));
817 EXPECT_EQ("value3", value); 828 EXPECT_EQ("value3", value);
818 } 829 }
819 830
820 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnHeadersReceivedDelta) { 831 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnHeadersReceivedDelta) {
821 using namespace extension_webrequest_api_helpers; 832 using namespace extension_webrequest_api_helpers;
822 const bool cancel = true; 833 const bool cancel = true;
823 const char status_line[] = "HTTP/1.0 200 OK"; 834 char base_headers_string[] =
824 const char response_headers_string[] = "key1: value1\n" 835 "HTTP/1.0 200 OK\r\n"
825 "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
826 850
827 scoped_ptr<EventResponseDelta> delta( 851 scoped_ptr<EventResponseDelta> delta(
828 CalculateOnHeadersReceivedDelta("extid", base::Time::Now(), cancel, 852 CalculateOnHeadersReceivedDelta("extid", base::Time::Now(), cancel,
829 status_line, response_headers_string)); 853 base_headers, &new_headers));
830 ASSERT_TRUE(delta.get()); 854 ASSERT_TRUE(delta.get());
831 EXPECT_TRUE(delta->cancel); 855 EXPECT_TRUE(delta->cancel);
832 ASSERT_TRUE(delta->new_response_headers.get()); 856 EXPECT_EQ(2u, delta->added_response_headers.size());
833 EXPECT_TRUE(delta->new_response_headers->HasHeader("key1")); 857 EXPECT_TRUE(SearchKey(delta->added_response_headers,
834 EXPECT_TRUE(delta->new_response_headers->HasHeader("key2")); 858 ResponseHeader("Key2", "Value1")));
835 EXPECT_EQ(status_line, delta->new_response_headers->GetStatusLine()); 859 EXPECT_TRUE(SearchKey(delta->added_response_headers,
836 // net::HttpResponseHeaders does not have easy access to header values. 860 ResponseHeader("Key4", "Value4")));
837 // 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")));
838 } 866 }
839 867
840 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { 868 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) {
841 using namespace extension_webrequest_api_helpers; 869 using namespace extension_webrequest_api_helpers;
842 const bool cancel = true; 870 const bool cancel = true;
843 871
844 string16 username = ASCIIToUTF16("foo"); 872 string16 username = ASCIIToUTF16("foo");
845 string16 password = ASCIIToUTF16("bar"); 873 string16 password = ASCIIToUTF16("bar");
846 scoped_ptr<net::AuthCredentials> credentials( 874 scoped_ptr<net::AuthCredentials> credentials(
847 new net::AuthCredentials(username, password)); 875 new net::AuthCredentials(username, password));
848 876
849 scoped_ptr<EventResponseDelta> delta( 877 scoped_ptr<EventResponseDelta> delta(
850 CalculateOnAuthRequiredDelta("extid", base::Time::Now(), cancel, 878 CalculateOnAuthRequiredDelta("extid", base::Time::Now(), cancel,
851 &credentials)); 879 &credentials));
852 ASSERT_TRUE(delta.get()); 880 ASSERT_TRUE(delta.get());
853 EXPECT_TRUE(delta->cancel); 881 EXPECT_TRUE(delta->cancel);
854 ASSERT_TRUE(delta->auth_credentials.get()); 882 ASSERT_TRUE(delta->auth_credentials.get());
855 EXPECT_EQ(username, delta->auth_credentials->username()); 883 EXPECT_EQ(username, delta->auth_credentials->username());
856 EXPECT_EQ(password, delta->auth_credentials->password()); 884 EXPECT_EQ(password, delta->auth_credentials->password());
857 } 885 }
858 886
887 TEST(ExtensionWebRequestHelpersTest, TestMergeCancelOfResponses) {
888 using namespace extension_webrequest_api_helpers;
889 EventResponseDeltas deltas;
890 EventLogEntries event_log;
891 bool canceled = false;
892
893 // Single event that does not cancel.
894 linked_ptr<EventResponseDelta> d1(
895 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000)));
896 d1->cancel = false;
897 deltas.push_back(d1);
898 MergeCancelOfResponses(deltas, &canceled, &event_log);
899 EXPECT_FALSE(canceled);
900 EXPECT_TRUE(event_log.empty());
901
902 // Second event that cancels the request
903 linked_ptr<EventResponseDelta> d2(
904 new EventResponseDelta("extid2", base::Time::FromInternalValue(500)));
905 d2->cancel = true;
906 deltas.push_back(d2);
907 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
908 MergeCancelOfResponses(deltas, &canceled, &event_log);
909 EXPECT_TRUE(canceled);
910 EXPECT_EQ(1u, event_log.size());
911 }
912
913 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses) {
914 using namespace extension_webrequest_api_helpers;
915 EventResponseDeltas deltas;
916 EventLogEntries event_log;
917 std::set<std::string> conflicting_extensions;
918 GURL effective_new_url;
919
920 // No redirect
921 linked_ptr<EventResponseDelta> d0(
922 new EventResponseDelta("extid0", base::Time::FromInternalValue(0)));
923 deltas.push_back(d0);
924 MergeOnBeforeRequestResponses(
925 deltas, &effective_new_url, &conflicting_extensions, &event_log);
926 EXPECT_TRUE(effective_new_url.is_empty());
927
928 // Single redirect.
929 GURL new_url_1("http://foo.com");
930 linked_ptr<EventResponseDelta> d1(
931 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000)));
932 d1->new_url = GURL(new_url_1);
933 deltas.push_back(d1);
934 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
935 event_log.clear();
936 MergeOnBeforeRequestResponses(
937 deltas, &effective_new_url, &conflicting_extensions, &event_log);
938 EXPECT_EQ(new_url_1, effective_new_url);
939 EXPECT_TRUE(conflicting_extensions.empty());
940 EXPECT_EQ(1u, event_log.size());
941
942 // Ignored redirect (due to precedence).
943 GURL new_url_2("http://bar.com");
944 linked_ptr<EventResponseDelta> d2(
945 new EventResponseDelta("extid2", base::Time::FromInternalValue(500)));
946 d2->new_url = GURL(new_url_2);
947 deltas.push_back(d2);
948 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
949 event_log.clear();
950 MergeOnBeforeRequestResponses(
951 deltas, &effective_new_url, &conflicting_extensions, &event_log);
952 EXPECT_EQ(new_url_1, effective_new_url);
953 EXPECT_EQ(1u, conflicting_extensions.size());
954 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
955 EXPECT_EQ(2u, event_log.size());
956
957 // Overriding redirect.
958 GURL new_url_3("http://baz.com");
959 linked_ptr<EventResponseDelta> d3(
960 new EventResponseDelta("extid3", base::Time::FromInternalValue(1500)));
961 d3->new_url = GURL(new_url_3);
962 deltas.push_back(d3);
963 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
964 conflicting_extensions.clear();
965 event_log.clear();
966 MergeOnBeforeRequestResponses(
967 deltas, &effective_new_url, &conflicting_extensions, &event_log);
968 EXPECT_EQ(new_url_3, effective_new_url);
969 EXPECT_EQ(2u, conflicting_extensions.size());
970 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1"));
971 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
972 EXPECT_EQ(3u, event_log.size());
973
974 // Check that identical redirects don't cause a conflict.
975 linked_ptr<EventResponseDelta> d4(
976 new EventResponseDelta("extid4", base::Time::FromInternalValue(2000)));
977 d4->new_url = GURL(new_url_3);
978 deltas.push_back(d4);
979 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
980 conflicting_extensions.clear();
981 event_log.clear();
982 MergeOnBeforeRequestResponses(
983 deltas, &effective_new_url, &conflicting_extensions, &event_log);
984 EXPECT_EQ(new_url_3, effective_new_url);
985 EXPECT_EQ(2u, conflicting_extensions.size());
986 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1"));
987 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
988 EXPECT_EQ(4u, event_log.size());
989 }
990
991 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) {
992 using namespace extension_webrequest_api_helpers;
993 net::HttpRequestHeaders base_headers;
994 base_headers.AddHeaderFromString("key1: value 1");
995 base_headers.AddHeaderFromString("key2: value 2");
996 EventLogEntries event_log;
997 std::set<std::string> conflicting_extensions;
998 std::string header_value;
999 EventResponseDeltas deltas;
1000
1001 // Check that we can handle not changing the headers.
1002 linked_ptr<EventResponseDelta> d0(
1003 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500)));
1004 deltas.push_back(d0);
1005 net::HttpRequestHeaders headers0;
1006 headers0.MergeFrom(base_headers);
1007 MergeOnBeforeSendHeadersResponses(
1008 deltas, &headers0, &conflicting_extensions, &event_log);
1009 ASSERT_TRUE(headers0.GetHeader("key1", &header_value));
1010 EXPECT_EQ("value 1", header_value);
1011 ASSERT_TRUE(headers0.GetHeader("key2", &header_value));
1012 EXPECT_EQ("value 2", header_value);
1013 EXPECT_EQ(0u, conflicting_extensions.size());
1014 EXPECT_EQ(0u, event_log.size());
1015
1016 // Delete, modify and add a header.
1017 linked_ptr<EventResponseDelta> d1(
1018 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
1019 d1->deleted_request_headers.push_back("key1");
1020 d1->modified_request_headers.AddHeaderFromString("key2: value 3");
1021 d1->modified_request_headers.AddHeaderFromString("key3: value 3");
1022 deltas.push_back(d1);
1023 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1024 net::HttpRequestHeaders headers1;
1025 headers1.MergeFrom(base_headers);
1026 MergeOnBeforeSendHeadersResponses(
1027 deltas, &headers1, &conflicting_extensions, &event_log);
1028 EXPECT_FALSE(headers1.HasHeader("key1"));
1029 ASSERT_TRUE(headers1.GetHeader("key2", &header_value));
1030 EXPECT_EQ("value 3", header_value);
1031 ASSERT_TRUE(headers1.GetHeader("key3", &header_value));
1032 EXPECT_EQ("value 3", header_value);
1033 EXPECT_EQ(0u, conflicting_extensions.size());
1034 EXPECT_EQ(1u, event_log.size());
1035
1036 // Check that conflicts are atomic, i.e. if one header modification
1037 // collides all other conflicts of the same extension are declined as well.
1038 linked_ptr<EventResponseDelta> d2(
1039 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
1040 // This one conflicts:
1041 d2->modified_request_headers.AddHeaderFromString("key3: value 0");
1042 d2->modified_request_headers.AddHeaderFromString("key4: value 4");
1043 deltas.push_back(d2);
1044 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1045 conflicting_extensions.clear();
1046 event_log.clear();
1047 net::HttpRequestHeaders headers2;
1048 headers2.MergeFrom(base_headers);
1049 MergeOnBeforeSendHeadersResponses(
1050 deltas, &headers2, &conflicting_extensions, &event_log);
1051 EXPECT_FALSE(headers2.HasHeader("key1"));
1052 ASSERT_TRUE(headers2.GetHeader("key2", &header_value));
1053 EXPECT_EQ("value 3", header_value);
1054 ASSERT_TRUE(headers2.GetHeader("key3", &header_value));
1055 EXPECT_EQ("value 3", header_value);
1056 EXPECT_FALSE(headers2.HasHeader("key4"));
1057 EXPECT_EQ(1u, conflicting_extensions.size());
1058 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1059 EXPECT_EQ(2u, event_log.size());
1060
1061 // Check that identical modifications don't conflict and operations
1062 // can be merged.
1063 linked_ptr<EventResponseDelta> d3(
1064 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000)));
1065 d3->deleted_request_headers.push_back("key1");
1066 d3->modified_request_headers.AddHeaderFromString("key2: value 3");
1067 d3->modified_request_headers.AddHeaderFromString("key5: value 5");
1068 deltas.push_back(d3);
1069 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1070 conflicting_extensions.clear();
1071 event_log.clear();
1072 net::HttpRequestHeaders headers3;
1073 headers3.MergeFrom(base_headers);
1074 MergeOnBeforeSendHeadersResponses(
1075 deltas, &headers3, &conflicting_extensions, &event_log);
1076 EXPECT_FALSE(headers3.HasHeader("key1"));
1077 ASSERT_TRUE(headers3.GetHeader("key2", &header_value));
1078 EXPECT_EQ("value 3", header_value);
1079 ASSERT_TRUE(headers3.GetHeader("key3", &header_value));
1080 EXPECT_EQ("value 3", header_value);
1081 ASSERT_TRUE(headers3.GetHeader("key5", &header_value));
1082 EXPECT_EQ("value 5", header_value);
1083 EXPECT_EQ(1u, conflicting_extensions.size());
1084 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1085 EXPECT_EQ(3u, event_log.size());
1086 }
1087
1088 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
1089 using namespace extension_webrequest_api_helpers;
1090 EventLogEntries event_log;
1091 std::set<std::string> conflicting_extensions;
1092 std::string header_value;
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))));
1104
1105 // Check that we can handle if not touching the response headers.
1106 linked_ptr<EventResponseDelta> d0(
1107 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000)));
1108 deltas.push_back(d0);
1109 scoped_refptr<net::HttpResponseHeaders> new_headers0(
1110 new net::HttpResponseHeaders(
1111 net::HttpUtil::AssembleRawHeaders(
1112 base_headers_string, sizeof(base_headers_string))));
1113 MergeOnHeadersReceivedResponses(
1114 deltas, &new_headers0, &conflicting_extensions, &event_log);
1115 EXPECT_TRUE(new_headers0.get());
1116 EXPECT_EQ(0u, conflicting_extensions.size());
1117 EXPECT_EQ(0u, event_log.size());
1118
1119 linked_ptr<EventResponseDelta> d1(
1120 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
1121 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1"));
1122 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2"));
1123 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3"));
1124 deltas.push_back(d1);
1125 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1126 scoped_refptr<net::HttpResponseHeaders> new_headers1(
1127 new net::HttpResponseHeaders(
1128 net::HttpUtil::AssembleRawHeaders(
1129 base_headers_string, sizeof(base_headers_string))));
1130 conflicting_extensions.clear();
1131 event_log.clear();
1132 MergeOnHeadersReceivedResponses(
1133 deltas, &new_headers1, &conflicting_extensions, &event_log);
1134 std::multimap<std::string, std::string> expected1;
1135 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3"));
1136 void* iter = NULL;
1137 std::string name;
1138 std::string value;
1139 std::multimap<std::string, std::string> actual1;
1140 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) {
1141 actual1.insert(std::pair<std::string, std::string>(name, value));
1142 }
1143 EXPECT_EQ(expected1, actual1);
1144 EXPECT_EQ(0u, conflicting_extensions.size());
1145 EXPECT_EQ(1u, event_log.size());
1146
1147 // Check that we replace response headers only once.
1148 scoped_refptr<net::HttpResponseHeaders> headers2(
1149 new net::HttpResponseHeaders(
1150 net::HttpUtil::AssembleRawHeaders(
1151 base_headers_string, sizeof(base_headers_string))));
1152 linked_ptr<EventResponseDelta> d2(
1153 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
1154 // Note that we use a different capitalization of KeY2. This should not
1155 // matter.
1156 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2"));
1157 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4"));
1158 deltas.push_back(d2);
1159 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1160 conflicting_extensions.clear();
1161 event_log.clear();
1162 MergeOnHeadersReceivedResponses(
1163 deltas, &headers2, &conflicting_extensions, &event_log);
1164 iter = NULL;
1165 std::multimap<std::string, std::string> actual2;
1166 while (headers2->EnumerateHeaderLines(&iter, &name, &value)) {
1167 actual2.insert(std::pair<std::string, std::string>(name, value));
1168 }
1169 EXPECT_EQ(expected1, actual2);
1170 EXPECT_EQ(1u, conflicting_extensions.size());
1171 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1172 EXPECT_EQ(2u, event_log.size());
1173 }
1174
1175 // Check that we do not delete too much
1176 TEST(ExtensionWebRequestHelpersTest,
1177 TestMergeOnHeadersReceivedResponsesDeletion) {
1178 using namespace extension_webrequest_api_helpers;
1179 EventLogEntries event_log;
1180 std::set<std::string> conflicting_extensions;
1181 std::string header_value;
1182 EventResponseDeltas deltas;
1183
1184 char base_headers_string[] =
1185 "HTTP/1.0 200 OK\r\n"
1186 "Key1: Value1\r\n"
1187 "Key1: Value2\r\n"
1188 "Key1: Value3\r\n"
1189 "Key2: Value4\r\n"
1190 "\r\n";
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> headers1(
1197 new net::HttpResponseHeaders(
1198 net::HttpUtil::AssembleRawHeaders(
1199 base_headers_string, sizeof(base_headers_string))));
1200 MergeOnHeadersReceivedResponses(
1201 deltas, &headers1, &conflicting_extensions, &event_log);
1202 std::multimap<std::string, std::string> expected1;
1203 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1"));
1204 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3"));
1205 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4"));
1206 void* iter = NULL;
1207 std::string name;
1208 std::string value;
1209 std::multimap<std::string, std::string> actual1;
1210 while (headers1->EnumerateHeaderLines(&iter, &name, &value)) {
1211 actual1.insert(std::pair<std::string, std::string>(name, value));
1212 }
1213 EXPECT_EQ(expected1, actual1);
1214 EXPECT_EQ(0u, conflicting_extensions.size());
1215 EXPECT_EQ(1u, event_log.size());
1216 }
1217
1218 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) {
1219 using namespace extension_webrequest_api_helpers;
1220 EventLogEntries event_log;
1221 std::set<std::string> conflicting_extensions;
1222 EventResponseDeltas deltas;
1223 string16 username = ASCIIToUTF16("foo");
1224 string16 password = ASCIIToUTF16("bar");
1225 string16 password2 = ASCIIToUTF16("baz");
1226
1227 // Check that we can handle if not returning credentials.
1228 linked_ptr<EventResponseDelta> d0(
1229 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000)));
1230 deltas.push_back(d0);
1231 net::AuthCredentials auth0;
1232 bool credentials_set = MergeOnAuthRequiredResponses(
1233 deltas, &auth0, &conflicting_extensions, &event_log);
1234 EXPECT_FALSE(credentials_set);
1235 EXPECT_TRUE(auth0.Empty());
1236 EXPECT_EQ(0u, conflicting_extensions.size());
1237 EXPECT_EQ(0u, event_log.size());
1238
1239 // Check that we can set AuthCredentials.
1240 linked_ptr<EventResponseDelta> d1(
1241 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
1242 d1->auth_credentials.reset(new net::AuthCredentials(username, password));
1243 deltas.push_back(d1);
1244 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1245 conflicting_extensions.clear();
1246 event_log.clear();
1247 net::AuthCredentials auth1;
1248 credentials_set = MergeOnAuthRequiredResponses(
1249 deltas, &auth1, &conflicting_extensions, &event_log);
1250 EXPECT_TRUE(credentials_set);
1251 EXPECT_FALSE(auth1.Empty());
1252 EXPECT_EQ(username, auth1.username());
1253 EXPECT_EQ(password, auth1.password());
1254 EXPECT_EQ(0u, conflicting_extensions.size());
1255 EXPECT_EQ(1u, event_log.size());
1256
1257 // Check that we set AuthCredentials only once.
1258 linked_ptr<EventResponseDelta> d2(
1259 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
1260 d2->auth_credentials.reset(new net::AuthCredentials(username, password2));
1261 deltas.push_back(d2);
1262 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1263 conflicting_extensions.clear();
1264 event_log.clear();
1265 net::AuthCredentials auth2;
1266 credentials_set = MergeOnAuthRequiredResponses(
1267 deltas, &auth2, &conflicting_extensions, &event_log);
1268 EXPECT_TRUE(credentials_set);
1269 EXPECT_FALSE(auth2.Empty());
1270 EXPECT_EQ(username, auth1.username());
1271 EXPECT_EQ(password, auth1.password());
1272 EXPECT_EQ(1u, conflicting_extensions.size());
1273 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1274 EXPECT_EQ(2u, event_log.size());
1275
1276 // Check that we can set identical AuthCredentials twice without causing
1277 // a conflict.
1278 linked_ptr<EventResponseDelta> d3(
1279 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000)));
1280 d3->auth_credentials.reset(new net::AuthCredentials(username, password));
1281 deltas.push_back(d3);
1282 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1283 conflicting_extensions.clear();
1284 event_log.clear();
1285 net::AuthCredentials auth3;
1286 credentials_set = MergeOnAuthRequiredResponses(
1287 deltas, &auth3, &conflicting_extensions, &event_log);
1288 EXPECT_TRUE(credentials_set);
1289 EXPECT_FALSE(auth3.Empty());
1290 EXPECT_EQ(username, auth1.username());
1291 EXPECT_EQ(password, auth1.password());
1292 EXPECT_EQ(1u, conflicting_extensions.size());
1293 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2"));
1294 EXPECT_EQ(3u, event_log.size());
1295 }
OLDNEW
« 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