| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/doodle/doodle_fetcher_impl.h" | 5 #include "components/doodle/doodle_fetcher_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/json/json_reader.h" | 12 #include "base/json/json_reader.h" |
| 13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
| 14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 15 #include "base/test/simple_test_clock.h" | |
| 16 #include "base/values.h" | 15 #include "base/values.h" |
| 17 #include "components/google/core/browser/google_switches.h" | 16 #include "components/google/core/browser/google_switches.h" |
| 18 #include "components/google/core/browser/google_url_tracker.h" | 17 #include "components/google/core/browser/google_url_tracker.h" |
| 19 #include "net/http/http_status_code.h" | 18 #include "net/http/http_status_code.h" |
| 20 #include "net/url_request/test_url_fetcher_factory.h" | 19 #include "net/url_request/test_url_fetcher_factory.h" |
| 21 #include "net/url_request/url_request_status.h" | 20 #include "net/url_request/url_request_status.h" |
| 22 #include "net/url_request/url_request_test_util.h" | 21 #include "net/url_request/url_request_test_util.h" |
| 23 #include "testing/gmock/include/gmock/gmock.h" | 22 #include "testing/gmock/include/gmock/gmock.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 25 | 24 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 69 |
| 71 class DoodleFetcherImplTest : public testing::Test { | 70 class DoodleFetcherImplTest : public testing::Test { |
| 72 public: | 71 public: |
| 73 DoodleFetcherImplTest() | 72 DoodleFetcherImplTest() |
| 74 : url_(GURL(GoogleURLTracker::kDefaultGoogleHomepage)), | 73 : url_(GURL(GoogleURLTracker::kDefaultGoogleHomepage)), |
| 75 google_url_tracker_(base::MakeUnique<GoogleURLTrackerClientStub>(), | 74 google_url_tracker_(base::MakeUnique<GoogleURLTrackerClientStub>(), |
| 76 GoogleURLTracker::UNIT_TEST_MODE), | 75 GoogleURLTracker::UNIT_TEST_MODE), |
| 77 doodle_fetcher_( | 76 doodle_fetcher_( |
| 78 new net::TestURLRequestContextGetter(message_loop_.task_runner()), | 77 new net::TestURLRequestContextGetter(message_loop_.task_runner()), |
| 79 &google_url_tracker_, | 78 &google_url_tracker_, |
| 80 base::Bind(ParseJson)) { | 79 base::Bind(ParseJson)) {} |
| 81 // Random difference to ensure that expiry_dates are really relative. | |
| 82 auto clock = base::MakeUnique<base::SimpleTestClock>(); | |
| 83 clock_ = clock.get(); | |
| 84 clock_->Advance(base::TimeDelta::FromMilliseconds(1123581321)); | |
| 85 doodle_fetcher_.SetClockForTesting(std::move(clock)); | |
| 86 } | |
| 87 | 80 |
| 88 void RespondWithData(const std::string& data) { | 81 void RespondWithData(const std::string& data) { |
| 89 RespondToFetcherWithData(GetRunningFetcher(), data); | 82 RespondToFetcherWithData(GetRunningFetcher(), data); |
| 90 } | 83 } |
| 91 | 84 |
| 92 void RespondToFetcherWithData(net::TestURLFetcher* url_fetcher, | 85 void RespondToFetcherWithData(net::TestURLFetcher* url_fetcher, |
| 93 const std::string& data) { | 86 const std::string& data) { |
| 94 url_fetcher->set_status(net::URLRequestStatus()); | 87 url_fetcher->set_status(net::URLRequestStatus()); |
| 95 url_fetcher->set_response_code(net::HTTP_OK); | 88 url_fetcher->set_response_code(net::HTTP_OK); |
| 96 url_fetcher->SetResponseString(data); | 89 url_fetcher->SetResponseString(data); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 126 *config_out = config; | 119 *config_out = config; |
| 127 } | 120 } |
| 128 }, | 121 }, |
| 129 state_out, config_out); | 122 state_out, config_out); |
| 130 } | 123 } |
| 131 | 124 |
| 132 DoodleFetcherImpl* doodle_fetcher() { return &doodle_fetcher_; } | 125 DoodleFetcherImpl* doodle_fetcher() { return &doodle_fetcher_; } |
| 133 | 126 |
| 134 GURL GetGoogleBaseURL() { return google_url_tracker_.google_url(); } | 127 GURL GetGoogleBaseURL() { return google_url_tracker_.google_url(); } |
| 135 | 128 |
| 136 base::Time TimeFromNow(uint64_t milliseconds) { | |
| 137 return clock_->Now() + base::TimeDelta::FromMilliseconds(milliseconds); | |
| 138 } | |
| 139 | |
| 140 private: | 129 private: |
| 141 base::MessageLoop message_loop_; | 130 base::MessageLoop message_loop_; |
| 142 GURL url_; | 131 GURL url_; |
| 143 net::TestURLFetcherFactory url_fetcher_factory_; | 132 net::TestURLFetcherFactory url_fetcher_factory_; |
| 144 base::SimpleTestClock* clock_; // Owned by the doodle_fetcher. | |
| 145 GoogleURLTracker google_url_tracker_; | 133 GoogleURLTracker google_url_tracker_; |
| 146 DoodleFetcherImpl doodle_fetcher_; | 134 DoodleFetcherImpl doodle_fetcher_; |
| 147 }; | 135 }; |
| 148 | 136 |
| 149 TEST_F(DoodleFetcherImplTest, ReturnsFromFetchWithoutError) { | 137 TEST_F(DoodleFetcherImplTest, ReturnsFromFetchWithoutError) { |
| 150 DoodleState state(DoodleState::NO_DOODLE); | 138 DoodleState state(DoodleState::NO_DOODLE); |
| 151 base::Optional<DoodleConfig> response; | 139 base::Optional<DoodleConfig> response; |
| 152 | 140 |
| 153 doodle_fetcher()->FetchDoodle( | 141 doodle_fetcher()->FetchDoodle( |
| 154 CreateResponseSavingCallback(&state, &response)); | 142 CreateResponseSavingCallback(&state, &response)); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 EXPECT_TRUE(config.fullpage_interactive_url.is_empty()); | 213 EXPECT_TRUE(config.fullpage_interactive_url.is_empty()); |
| 226 EXPECT_TRUE(config.target_url.is_valid()); | 214 EXPECT_TRUE(config.target_url.is_valid()); |
| 227 EXPECT_THAT(config.target_url, | 215 EXPECT_THAT(config.target_url, |
| 228 Eq(Resolve("/search?q\u003dtest\u0026sa\u003dX\u0026ved\u003d" | 216 Eq(Resolve("/search?q\u003dtest\u0026sa\u003dX\u0026ved\u003d" |
| 229 "0ahUKEw"))); | 217 "0ahUKEw"))); |
| 230 EXPECT_THAT(config.doodle_type, Eq(DoodleType::SIMPLE)); | 218 EXPECT_THAT(config.doodle_type, Eq(DoodleType::SIMPLE)); |
| 231 EXPECT_THAT(config.alt_text, Eq("Mouseover Text")); | 219 EXPECT_THAT(config.alt_text, Eq("Mouseover Text")); |
| 232 EXPECT_THAT(config.interactive_html, | 220 EXPECT_THAT(config.interactive_html, |
| 233 Eq("\u003cstyle\u003e\u003c/style\u003e")); | 221 Eq("\u003cstyle\u003e\u003c/style\u003e")); |
| 234 | 222 |
| 235 EXPECT_THAT(config.expiry_date, Eq(TimeFromNow(55000))); | 223 EXPECT_THAT(config.time_to_live, |
| 224 Eq(base::TimeDelta::FromMilliseconds(55000))); |
| 236 } | 225 } |
| 237 | 226 |
| 238 TEST_F(DoodleFetcherImplTest, DoodleExpiresWithinThirtyDaysForTooLargeTTL) { | 227 TEST_F(DoodleFetcherImplTest, DoodleExpiresWithinThirtyDaysForTooLargeTTL) { |
| 239 DoodleState state(DoodleState::NO_DOODLE); | 228 DoodleState state(DoodleState::NO_DOODLE); |
| 240 base::Optional<DoodleConfig> response; | 229 base::Optional<DoodleConfig> response; |
| 241 | 230 |
| 242 doodle_fetcher()->FetchDoodle( | 231 doodle_fetcher()->FetchDoodle( |
| 243 CreateResponseSavingCallback(&state, &response)); | 232 CreateResponseSavingCallback(&state, &response)); |
| 244 RespondWithData(R"json({"ddljson": { | 233 RespondWithData(R"json({"ddljson": { |
| 245 "time_to_live_ms":5184000000, | 234 "time_to_live_ms":5184000000, |
| 246 "large_image": {"url":"/logos/doodles/2015/some.gif"} | 235 "large_image": {"url":"/logos/doodles/2015/some.gif"} |
| 247 }})json"); // 60 days | 236 }})json"); // 60 days |
| 248 | 237 |
| 249 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); | 238 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); |
| 250 ASSERT_TRUE(response.has_value()); | 239 ASSERT_TRUE(response.has_value()); |
| 251 EXPECT_THAT(response.value().expiry_date, | 240 EXPECT_THAT(response.value().time_to_live, |
| 252 Eq(TimeFromNow(30ul * 24 * 60 * 60 * 1000 /* ms */))); // 30 days | 241 Eq(base::TimeDelta::FromMilliseconds(30ul * 24 * 60 * 60 * |
| 242 1000))); // 30 days |
| 253 } | 243 } |
| 254 | 244 |
| 255 TEST_F(DoodleFetcherImplTest, DoodleExpiresNowWithNegativeTTL) { | 245 TEST_F(DoodleFetcherImplTest, DoodleExpiresImmediatelyWithNegativeTTL) { |
| 256 DoodleState state(DoodleState::NO_DOODLE); | 246 DoodleState state(DoodleState::NO_DOODLE); |
| 257 base::Optional<DoodleConfig> response; | 247 base::Optional<DoodleConfig> response; |
| 258 | 248 |
| 259 doodle_fetcher()->FetchDoodle( | 249 doodle_fetcher()->FetchDoodle( |
| 260 CreateResponseSavingCallback(&state, &response)); | 250 CreateResponseSavingCallback(&state, &response)); |
| 261 RespondWithData(R"json({"ddljson": { | 251 RespondWithData(R"json({"ddljson": { |
| 262 "time_to_live_ms":-1, | 252 "time_to_live_ms":-1, |
| 263 "large_image": {"url":"/logos/doodles/2015/some.gif"} | 253 "large_image": {"url":"/logos/doodles/2015/some.gif"} |
| 264 }})json"); | 254 }})json"); |
| 265 | 255 |
| 266 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); | 256 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); |
| 267 ASSERT_TRUE(response.has_value()); | 257 ASSERT_TRUE(response.has_value()); |
| 268 EXPECT_THAT(response.value().expiry_date, Eq(TimeFromNow(0))); | 258 EXPECT_THAT(response.value().time_to_live, |
| 259 Eq(base::TimeDelta::FromMilliseconds(0))); |
| 269 } | 260 } |
| 270 | 261 |
| 271 TEST_F(DoodleFetcherImplTest, DoodleExpiresNowWithoutValidTTL) { | 262 TEST_F(DoodleFetcherImplTest, DoodleExpiresImmediatelyWithoutValidTTL) { |
| 272 DoodleState state(DoodleState::NO_DOODLE); | 263 DoodleState state(DoodleState::NO_DOODLE); |
| 273 base::Optional<DoodleConfig> response; | 264 base::Optional<DoodleConfig> response; |
| 274 | 265 |
| 275 doodle_fetcher()->FetchDoodle( | 266 doodle_fetcher()->FetchDoodle( |
| 276 CreateResponseSavingCallback(&state, &response)); | 267 CreateResponseSavingCallback(&state, &response)); |
| 277 RespondWithData(R"json({"ddljson": { | 268 RespondWithData(R"json({"ddljson": { |
| 278 "large_image": {"url":"/logos/doodles/2015/some.gif"} | 269 "large_image": {"url":"/logos/doodles/2015/some.gif"} |
| 279 }})json"); | 270 }})json"); |
| 280 | 271 |
| 281 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); | 272 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); |
| 282 ASSERT_TRUE(response.has_value()); | 273 ASSERT_TRUE(response.has_value()); |
| 283 EXPECT_THAT(response.value().expiry_date, Eq(TimeFromNow(0))); | 274 EXPECT_THAT(response.value().time_to_live, |
| 275 Eq(base::TimeDelta::FromMilliseconds(0))); |
| 284 } | 276 } |
| 285 | 277 |
| 286 TEST_F(DoodleFetcherImplTest, ReturnsNoDoodleForMissingLargeImageUrl) { | 278 TEST_F(DoodleFetcherImplTest, ReturnsNoDoodleForMissingLargeImageUrl) { |
| 287 DoodleState state(DoodleState::AVAILABLE); | 279 DoodleState state(DoodleState::AVAILABLE); |
| 288 base::Optional<DoodleConfig> response; | 280 base::Optional<DoodleConfig> response; |
| 289 | 281 |
| 290 doodle_fetcher()->FetchDoodle( | 282 doodle_fetcher()->FetchDoodle( |
| 291 CreateResponseSavingCallback(&state, &response)); | 283 CreateResponseSavingCallback(&state, &response)); |
| 292 RespondWithData(R"json({"ddljson": { | 284 RespondWithData(R"json({"ddljson": { |
| 293 "time_to_live_ms":55000, | 285 "time_to_live_ms":55000, |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 switches::kGoogleBaseURL, "http://www.google.kz"); | 408 switches::kGoogleBaseURL, "http://www.google.kz"); |
| 417 | 409 |
| 418 doodle_fetcher()->FetchDoodle( | 410 doodle_fetcher()->FetchDoodle( |
| 419 CreateResponseSavingCallback(/*state=*/nullptr, /*response=*/nullptr)); | 411 CreateResponseSavingCallback(/*state=*/nullptr, /*response=*/nullptr)); |
| 420 | 412 |
| 421 EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(), | 413 EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(), |
| 422 Eq(GURL("http://www.google.kz").Resolve(kDoodleConfigPath))); | 414 Eq(GURL("http://www.google.kz").Resolve(kDoodleConfigPath))); |
| 423 } | 415 } |
| 424 | 416 |
| 425 } // namespace doodle | 417 } // namespace doodle |
| OLD | NEW |