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