OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |