| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <map> | 5 #include <map> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "chrome/renderer/extensions/extension_localization_peer.h" | 9 #include "chrome/renderer/extensions/extension_localization_peer.h" |
| 10 #include "extensions/common/message_bundle.h" | 10 #include "extensions/common/message_bundle.h" |
| 11 #include "ipc/ipc_sender.h" | 11 #include "ipc/ipc_sender.h" |
| 12 #include "ipc/ipc_sync_message.h" | 12 #include "ipc/ipc_sync_message.h" |
| 13 #include "net/base/net_errors.h" | 13 #include "net/base/net_errors.h" |
| 14 #include "net/url_request/redirect_info.h" | 14 #include "net/url_request/redirect_info.h" |
| 15 #include "net/url_request/url_request_status.h" | 15 #include "net/url_request/url_request_status.h" |
| 16 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 18 |
| 19 namespace { |
| 20 |
| 19 using testing::_; | 21 using testing::_; |
| 20 using testing::DoAll; | 22 using testing::DoAll; |
| 21 using testing::Invoke; | 23 using testing::Invoke; |
| 22 using testing::StrEq; | 24 using testing::StrEq; |
| 23 using testing::Return; | 25 using testing::Return; |
| 26 using ReceivedData = content::RequestPeer::ReceivedData; |
| 27 using FixedReceivedData = content::RequestPeer::FixedReceivedData; |
| 24 | 28 |
| 25 static const char* const kExtensionUrl_1 = | 29 static const char* const kExtensionUrl_1 = |
| 26 "chrome-extension://some_id/popup.css"; | 30 "chrome-extension://some_id/popup.css"; |
| 27 | 31 |
| 28 static const char* const kExtensionUrl_2 = | 32 static const char* const kExtensionUrl_2 = |
| 29 "chrome-extension://some_id2/popup.css"; | 33 "chrome-extension://some_id2/popup.css"; |
| 30 | 34 |
| 31 static const char* const kExtensionUrl_3 = | 35 static const char* const kExtensionUrl_3 = |
| 32 "chrome-extension://some_id3/popup.css"; | 36 "chrome-extension://some_id3/popup.css"; |
| 33 | 37 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 55 MockRequestPeer() {} | 59 MockRequestPeer() {} |
| 56 virtual ~MockRequestPeer() {} | 60 virtual ~MockRequestPeer() {} |
| 57 | 61 |
| 58 MOCK_METHOD2(OnUploadProgress, void(uint64 position, uint64 size)); | 62 MOCK_METHOD2(OnUploadProgress, void(uint64 position, uint64 size)); |
| 59 MOCK_METHOD2(OnReceivedRedirect, | 63 MOCK_METHOD2(OnReceivedRedirect, |
| 60 bool(const net::RedirectInfo& redirect_info, | 64 bool(const net::RedirectInfo& redirect_info, |
| 61 const content::ResourceResponseInfo& info)); | 65 const content::ResourceResponseInfo& info)); |
| 62 MOCK_METHOD1(OnReceivedResponse, | 66 MOCK_METHOD1(OnReceivedResponse, |
| 63 void(const content::ResourceResponseInfo& info)); | 67 void(const content::ResourceResponseInfo& info)); |
| 64 MOCK_METHOD2(OnDownloadedData, void(int len, int encoded_data_length)); | 68 MOCK_METHOD2(OnDownloadedData, void(int len, int encoded_data_length)); |
| 65 MOCK_METHOD3(OnReceivedData, void(const char* data, | 69 void OnReceivedData(scoped_ptr<ReceivedData> data) override { |
| 66 int data_length, | 70 OnReceivedDataInternal(data->payload(), data->length(), |
| 67 int encoded_data_length)); | 71 data->encoded_length()); |
| 72 } |
| 73 MOCK_METHOD3(OnReceivedDataInternal, |
| 74 void(const char* data, |
| 75 int data_length, |
| 76 int encoded_data_length)); |
| 68 MOCK_METHOD6(OnCompletedRequest, void( | 77 MOCK_METHOD6(OnCompletedRequest, void( |
| 69 int error_code, | 78 int error_code, |
| 70 bool was_ignored_by_handler, | 79 bool was_ignored_by_handler, |
| 71 bool stale_copy_in_cache, | 80 bool stale_copy_in_cache, |
| 72 const std::string& security_info, | 81 const std::string& security_info, |
| 73 const base::TimeTicks& completion_time, | 82 const base::TimeTicks& completion_time, |
| 74 int64_t total_transfer_size)); | 83 int64_t total_transfer_size)); |
| 75 | 84 |
| 76 private: | 85 private: |
| 77 DISALLOW_COPY_AND_ASSIGN(MockRequestPeer); | 86 DISALLOW_COPY_AND_ASSIGN(MockRequestPeer); |
| 78 }; | 87 }; |
| 79 | 88 |
| 89 } // namespace |
| 90 |
| 80 class ExtensionLocalizationPeerTest : public testing::Test { | 91 class ExtensionLocalizationPeerTest : public testing::Test { |
| 81 protected: | 92 protected: |
| 82 void SetUp() override { | 93 void SetUp() override { |
| 83 sender_.reset(new MockIpcMessageSender()); | 94 sender_.reset(new MockIpcMessageSender()); |
| 84 original_peer_.reset(new MockRequestPeer()); | 95 original_peer_.reset(new MockRequestPeer()); |
| 85 filter_peer_.reset( | 96 filter_peer_.reset( |
| 86 ExtensionLocalizationPeer::CreateExtensionLocalizationPeer( | 97 ExtensionLocalizationPeer::CreateExtensionLocalizationPeer( |
| 87 original_peer_.get(), sender_.get(), "text/css", | 98 original_peer_.get(), sender_.get(), "text/css", |
| 88 GURL(kExtensionUrl_1))); | 99 GURL(kExtensionUrl_1))); |
| 89 } | 100 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 118 } | 129 } |
| 119 | 130 |
| 120 TEST_F(ExtensionLocalizationPeerTest, CreateWithValidInput) { | 131 TEST_F(ExtensionLocalizationPeerTest, CreateWithValidInput) { |
| 121 EXPECT_TRUE(NULL != filter_peer_.get()); | 132 EXPECT_TRUE(NULL != filter_peer_.get()); |
| 122 } | 133 } |
| 123 | 134 |
| 124 TEST_F(ExtensionLocalizationPeerTest, OnReceivedData) { | 135 TEST_F(ExtensionLocalizationPeerTest, OnReceivedData) { |
| 125 EXPECT_TRUE(GetData(filter_peer_.get()).empty()); | 136 EXPECT_TRUE(GetData(filter_peer_.get()).empty()); |
| 126 | 137 |
| 127 const std::string data_chunk("12345"); | 138 const std::string data_chunk("12345"); |
| 128 filter_peer_->OnReceivedData(data_chunk.c_str(), data_chunk.length(), -1); | 139 filter_peer_->OnReceivedData(make_scoped_ptr( |
| 140 new FixedReceivedData(data_chunk.data(), data_chunk.length(), -1))); |
| 129 | 141 |
| 130 EXPECT_EQ(data_chunk, GetData(filter_peer_.get())); | 142 EXPECT_EQ(data_chunk, GetData(filter_peer_.get())); |
| 131 | 143 |
| 132 filter_peer_->OnReceivedData(data_chunk.c_str(), data_chunk.length(), -1); | 144 filter_peer_->OnReceivedData(make_scoped_ptr( |
| 145 new FixedReceivedData(data_chunk.data(), data_chunk.length(), -1))); |
| 133 EXPECT_EQ(data_chunk + data_chunk, GetData(filter_peer_.get())); | 146 EXPECT_EQ(data_chunk + data_chunk, GetData(filter_peer_.get())); |
| 134 } | 147 } |
| 135 | 148 |
| 136 MATCHER_P(IsURLRequestEqual, status, "") { return arg.status() == status; } | 149 MATCHER_P(IsURLRequestEqual, status, "") { return arg.status() == status; } |
| 137 | 150 |
| 138 TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestBadURLRequestStatus) { | 151 TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestBadURLRequestStatus) { |
| 139 // It will self-delete once it exits OnCompletedRequest. | 152 // It will self-delete once it exits OnCompletedRequest. |
| 140 ExtensionLocalizationPeer* filter_peer = filter_peer_.release(); | 153 ExtensionLocalizationPeer* filter_peer = filter_peer_.release(); |
| 141 | 154 |
| 142 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)); | 155 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)); |
| 143 EXPECT_CALL(*original_peer_, OnCompletedRequest( | 156 EXPECT_CALL(*original_peer_, OnCompletedRequest( |
| 144 net::ERR_ABORTED, false, false, "", base::TimeTicks(), -1)); | 157 net::ERR_ABORTED, false, false, "", base::TimeTicks(), -1)); |
| 145 | 158 |
| 146 filter_peer->OnCompletedRequest( | 159 filter_peer->OnCompletedRequest( |
| 147 net::ERR_FAILED, false, false, std::string(), base::TimeTicks(), -1); | 160 net::ERR_FAILED, false, false, std::string(), base::TimeTicks(), -1); |
| 148 } | 161 } |
| 149 | 162 |
| 150 TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestEmptyData) { | 163 TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestEmptyData) { |
| 151 // It will self-delete once it exits OnCompletedRequest. | 164 // It will self-delete once it exits OnCompletedRequest. |
| 152 ExtensionLocalizationPeer* filter_peer = filter_peer_.release(); | 165 ExtensionLocalizationPeer* filter_peer = filter_peer_.release(); |
| 153 | 166 |
| 154 EXPECT_CALL(*original_peer_, OnReceivedData(_, _, _)).Times(0); | 167 EXPECT_CALL(*original_peer_, OnReceivedDataInternal(_, _, _)).Times(0); |
| 155 EXPECT_CALL(*sender_, Send(_)).Times(0); | 168 EXPECT_CALL(*sender_, Send(_)).Times(0); |
| 156 | 169 |
| 157 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)); | 170 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)); |
| 158 EXPECT_CALL(*original_peer_, OnCompletedRequest( | 171 EXPECT_CALL(*original_peer_, OnCompletedRequest( |
| 159 net::OK, false, false, "", base::TimeTicks(), -1)); | 172 net::OK, false, false, "", base::TimeTicks(), -1)); |
| 160 | 173 |
| 161 filter_peer->OnCompletedRequest( | 174 filter_peer->OnCompletedRequest( |
| 162 net::OK, false, false, std::string(), base::TimeTicks(), -1); | 175 net::OK, false, false, std::string(), base::TimeTicks(), -1); |
| 163 } | 176 } |
| 164 | 177 |
| 165 TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestNoCatalogs) { | 178 TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestNoCatalogs) { |
| 166 // It will self-delete once it exits OnCompletedRequest. | 179 // It will self-delete once it exits OnCompletedRequest. |
| 167 ExtensionLocalizationPeer* filter_peer = filter_peer_.release(); | 180 ExtensionLocalizationPeer* filter_peer = filter_peer_.release(); |
| 168 | 181 |
| 169 SetData(filter_peer, "some text"); | 182 SetData(filter_peer, "some text"); |
| 170 | 183 |
| 171 EXPECT_CALL(*sender_, Send(_)); | 184 EXPECT_CALL(*sender_, Send(_)); |
| 172 | 185 |
| 173 std::string data = GetData(filter_peer); | 186 std::string data = GetData(filter_peer); |
| 174 EXPECT_CALL(*original_peer_, | 187 EXPECT_CALL(*original_peer_, |
| 175 OnReceivedData(StrEq(data.data()), data.length(), -1)).Times(2); | 188 OnReceivedDataInternal(StrEq(data.c_str()), data.length(), -1)) |
| 176 | 189 .Times(2); |
| 177 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)).Times(2); | 190 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)).Times(2); |
| 178 EXPECT_CALL(*original_peer_, OnCompletedRequest( | 191 EXPECT_CALL(*original_peer_, OnCompletedRequest( |
| 179 net::OK, false, false, "", base::TimeTicks(), -1)).Times(2); | 192 net::OK, false, false, "", base::TimeTicks(), -1)).Times(2); |
| 180 | 193 |
| 181 filter_peer->OnCompletedRequest( | 194 filter_peer->OnCompletedRequest( |
| 182 net::OK, false, false, std::string(), base::TimeTicks(), -1); | 195 net::OK, false, false, std::string(), base::TimeTicks(), -1); |
| 183 | 196 |
| 184 // Test if Send gets called again (it shouldn't be) when first call returned | 197 // Test if Send gets called again (it shouldn't be) when first call returned |
| 185 // an empty dictionary. | 198 // an empty dictionary. |
| 186 filter_peer = | 199 filter_peer = |
| (...skipping 15 matching lines...) Expand all Loading... |
| 202 l10n_messages_map["some_id2"] = messages; | 215 l10n_messages_map["some_id2"] = messages; |
| 203 | 216 |
| 204 SetData(filter_peer, "some __MSG_text__"); | 217 SetData(filter_peer, "some __MSG_text__"); |
| 205 | 218 |
| 206 // We already have messages in memory, Send will be skipped. | 219 // We already have messages in memory, Send will be skipped. |
| 207 EXPECT_CALL(*sender_, Send(_)).Times(0); | 220 EXPECT_CALL(*sender_, Send(_)).Times(0); |
| 208 | 221 |
| 209 // __MSG_text__ gets replaced with "new text". | 222 // __MSG_text__ gets replaced with "new text". |
| 210 std::string data("some new text"); | 223 std::string data("some new text"); |
| 211 EXPECT_CALL(*original_peer_, | 224 EXPECT_CALL(*original_peer_, |
| 212 OnReceivedData(StrEq(data.data()), data.length(), -1)); | 225 OnReceivedDataInternal(StrEq(data.c_str()), data.length(), -1)); |
| 213 | 226 |
| 214 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)); | 227 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)); |
| 215 EXPECT_CALL(*original_peer_, OnCompletedRequest( | 228 EXPECT_CALL(*original_peer_, OnCompletedRequest( |
| 216 net::OK, false, false, "", base::TimeTicks(), -1)); | 229 net::OK, false, false, "", base::TimeTicks(), -1)); |
| 217 | 230 |
| 218 filter_peer->OnCompletedRequest( | 231 filter_peer->OnCompletedRequest( |
| 219 net::OK, false, false, std::string(), base::TimeTicks(), -1); | 232 net::OK, false, false, std::string(), base::TimeTicks(), -1); |
| 220 } | 233 } |
| 221 | 234 |
| 222 TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestReplaceMessagesFails) { | 235 TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestReplaceMessagesFails) { |
| 223 // It will self-delete once it exits OnCompletedRequest. | 236 // It will self-delete once it exits OnCompletedRequest. |
| 224 ExtensionLocalizationPeer* filter_peer = | 237 ExtensionLocalizationPeer* filter_peer = |
| 225 CreateExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_3)); | 238 CreateExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_3)); |
| 226 | 239 |
| 227 extensions::L10nMessagesMap messages; | 240 extensions::L10nMessagesMap messages; |
| 228 messages.insert(std::make_pair("text", "new text")); | 241 messages.insert(std::make_pair("text", "new text")); |
| 229 extensions::ExtensionToL10nMessagesMap& l10n_messages_map = | 242 extensions::ExtensionToL10nMessagesMap& l10n_messages_map = |
| 230 *extensions::GetExtensionToL10nMessagesMap(); | 243 *extensions::GetExtensionToL10nMessagesMap(); |
| 231 l10n_messages_map["some_id3"] = messages; | 244 l10n_messages_map["some_id3"] = messages; |
| 232 | 245 |
| 233 std::string message("some __MSG_missing_message__"); | 246 std::string message("some __MSG_missing_message__"); |
| 234 SetData(filter_peer, message); | 247 SetData(filter_peer, message); |
| 235 | 248 |
| 236 // We already have messages in memory, Send will be skipped. | 249 // We already have messages in memory, Send will be skipped. |
| 237 EXPECT_CALL(*sender_, Send(_)).Times(0); | 250 EXPECT_CALL(*sender_, Send(_)).Times(0); |
| 238 | 251 |
| 239 // __MSG_missing_message__ is missing, so message stays the same. | 252 // __MSG_missing_message__ is missing, so message stays the same. |
| 240 EXPECT_CALL(*original_peer_, | 253 EXPECT_CALL(*original_peer_, OnReceivedDataInternal(StrEq(message.c_str()), |
| 241 OnReceivedData(StrEq(message.data()), message.length(), -1)); | 254 message.length(), -1)); |
| 242 | 255 |
| 243 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)); | 256 EXPECT_CALL(*original_peer_, OnReceivedResponse(_)); |
| 244 EXPECT_CALL(*original_peer_, OnCompletedRequest( | 257 EXPECT_CALL(*original_peer_, OnCompletedRequest( |
| 245 net::OK, false, false, "", base::TimeTicks(), -1)); | 258 net::OK, false, false, "", base::TimeTicks(), -1)); |
| 246 | 259 |
| 247 filter_peer->OnCompletedRequest( | 260 filter_peer->OnCompletedRequest( |
| 248 net::OK, false, false, std::string(), base::TimeTicks(), -1); | 261 net::OK, false, false, std::string(), base::TimeTicks(), -1); |
| 249 } | 262 } |
| OLD | NEW |