Chromium Code Reviews| 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/time/time.h" | |
| 15 #include "base/values.h" | 16 #include "base/values.h" |
| 16 #include "components/google/core/browser/google_switches.h" | 17 #include "components/google/core/browser/google_switches.h" |
| 17 #include "components/google/core/browser/google_url_tracker.h" | 18 #include "components/google/core/browser/google_url_tracker.h" |
| 18 #include "net/http/http_status_code.h" | 19 #include "net/http/http_status_code.h" |
| 19 #include "net/url_request/test_url_fetcher_factory.h" | 20 #include "net/url_request/test_url_fetcher_factory.h" |
| 20 #include "net/url_request/url_request_status.h" | 21 #include "net/url_request/url_request_status.h" |
| 21 #include "net/url_request/url_request_test_util.h" | 22 #include "net/url_request/url_request_test_util.h" |
| 22 #include "testing/gmock/include/gmock/gmock.h" | 23 #include "testing/gmock/include/gmock/gmock.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 25 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 100 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 100 } | 101 } |
| 101 | 102 |
| 102 net::TestURLFetcher* GetRunningFetcher() { | 103 net::TestURLFetcher* GetRunningFetcher() { |
| 103 // All created TestURLFetchers have ID 0 by default. | 104 // All created TestURLFetchers have ID 0 by default. |
| 104 net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0); | 105 net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 105 DCHECK(url_fetcher); | 106 DCHECK(url_fetcher); |
| 106 return url_fetcher; | 107 return url_fetcher; |
| 107 } | 108 } |
| 108 | 109 |
| 109 DoodleFetcherImpl::FinishedCallback CreateResponseSavingCallback( | 110 DoodleFetcherImpl::FinishedCallback CreateResponseSavingCallback( |
|
mastiz
2017/03/02 19:55:42
Optional: this function can likely be replaced wit
Marc Treib
2017/03/03 09:35:26
Added a TODO for now. I agree that this is probabl
| |
| 110 DoodleState* state_out, | 111 DoodleState* state_out, |
| 112 base::TimeDelta* time_to_live_out, | |
| 111 base::Optional<DoodleConfig>* config_out) { | 113 base::Optional<DoodleConfig>* config_out) { |
| 112 return base::BindOnce( | 114 return base::BindOnce( |
| 113 [](DoodleState* state_out, base::Optional<DoodleConfig>* config_out, | 115 [](DoodleState* state_out, base::TimeDelta* time_to_live_out, |
| 114 DoodleState state, const base::Optional<DoodleConfig>& config) { | 116 base::Optional<DoodleConfig>* config_out, DoodleState state, |
| 117 base::TimeDelta time_to_live, | |
| 118 const base::Optional<DoodleConfig>& config) { | |
| 115 if (state_out) { | 119 if (state_out) { |
| 116 *state_out = state; | 120 *state_out = state; |
| 117 } | 121 } |
| 122 if (time_to_live_out) { | |
| 123 *time_to_live_out = time_to_live; | |
| 124 } | |
| 118 if (config_out) { | 125 if (config_out) { |
| 119 *config_out = config; | 126 *config_out = config; |
| 120 } | 127 } |
| 121 }, | 128 }, |
| 122 state_out, config_out); | 129 state_out, time_to_live_out, config_out); |
| 123 } | 130 } |
| 124 | 131 |
| 125 DoodleFetcherImpl* doodle_fetcher() { return &doodle_fetcher_; } | 132 DoodleFetcherImpl* doodle_fetcher() { return &doodle_fetcher_; } |
| 126 | 133 |
| 127 GURL GetGoogleBaseURL() { return google_url_tracker_.google_url(); } | 134 GURL GetGoogleBaseURL() { return google_url_tracker_.google_url(); } |
| 128 | 135 |
| 129 private: | 136 private: |
| 130 base::MessageLoop message_loop_; | 137 base::MessageLoop message_loop_; |
| 131 GURL url_; | 138 GURL url_; |
| 132 net::TestURLFetcherFactory url_fetcher_factory_; | 139 net::TestURLFetcherFactory url_fetcher_factory_; |
| 133 GoogleURLTracker google_url_tracker_; | 140 GoogleURLTracker google_url_tracker_; |
| 134 DoodleFetcherImpl doodle_fetcher_; | 141 DoodleFetcherImpl doodle_fetcher_; |
| 135 }; | 142 }; |
| 136 | 143 |
| 137 TEST_F(DoodleFetcherImplTest, ReturnsFromFetchWithoutError) { | 144 TEST_F(DoodleFetcherImplTest, ReturnsFromFetchWithoutError) { |
| 138 DoodleState state(DoodleState::NO_DOODLE); | 145 DoodleState state(DoodleState::NO_DOODLE); |
| 139 base::Optional<DoodleConfig> response; | 146 base::Optional<DoodleConfig> response; |
| 140 | 147 |
| 141 doodle_fetcher()->FetchDoodle( | 148 doodle_fetcher()->FetchDoodle( |
| 142 CreateResponseSavingCallback(&state, &response)); | 149 CreateResponseSavingCallback(&state, nullptr, &response)); |
| 143 RespondWithData(R"json({"ddljson": { | 150 RespondWithData(R"json({"ddljson": { |
| 144 "time_to_live_ms":55000, | 151 "time_to_live_ms":55000, |
| 145 "large_image": {"url":"/logos/doodles/2015/some.gif"} | 152 "large_image": {"url":"/logos/doodles/2015/some.gif"} |
| 146 }})json"); | 153 }})json"); |
| 147 | 154 |
| 148 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); | 155 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); |
| 149 EXPECT_TRUE(response.has_value()); | 156 EXPECT_TRUE(response.has_value()); |
| 150 } | 157 } |
| 151 | 158 |
| 152 TEST_F(DoodleFetcherImplTest, ReturnsFrom404FetchWithError) { | 159 TEST_F(DoodleFetcherImplTest, ReturnsFrom404FetchWithError) { |
| 153 DoodleState state(DoodleState::NO_DOODLE); | 160 DoodleState state(DoodleState::NO_DOODLE); |
| 154 base::Optional<DoodleConfig> response; | 161 base::Optional<DoodleConfig> response; |
| 155 | 162 |
| 156 doodle_fetcher()->FetchDoodle( | 163 doodle_fetcher()->FetchDoodle( |
| 157 CreateResponseSavingCallback(&state, &response)); | 164 CreateResponseSavingCallback(&state, nullptr, &response)); |
| 158 RespondWithError(net::ERR_FILE_NOT_FOUND); | 165 RespondWithError(net::ERR_FILE_NOT_FOUND); |
| 159 | 166 |
| 160 EXPECT_THAT(state, Eq(DoodleState::DOWNLOAD_ERROR)); | 167 EXPECT_THAT(state, Eq(DoodleState::DOWNLOAD_ERROR)); |
| 161 EXPECT_FALSE(response.has_value()); | 168 EXPECT_FALSE(response.has_value()); |
| 162 } | 169 } |
| 163 | 170 |
| 164 TEST_F(DoodleFetcherImplTest, ReturnsErrorForInvalidJson) { | 171 TEST_F(DoodleFetcherImplTest, ReturnsErrorForInvalidJson) { |
| 165 DoodleState state(DoodleState::NO_DOODLE); | 172 DoodleState state(DoodleState::NO_DOODLE); |
| 166 base::Optional<DoodleConfig> response; | 173 base::Optional<DoodleConfig> response; |
| 167 | 174 |
| 168 doodle_fetcher()->FetchDoodle( | 175 doodle_fetcher()->FetchDoodle( |
| 169 CreateResponseSavingCallback(&state, &response)); | 176 CreateResponseSavingCallback(&state, nullptr, &response)); |
| 170 RespondWithData("}"); | 177 RespondWithData("}"); |
| 171 | 178 |
| 172 EXPECT_THAT(state, Eq(DoodleState::PARSING_ERROR)); | 179 EXPECT_THAT(state, Eq(DoodleState::PARSING_ERROR)); |
| 173 EXPECT_FALSE(response.has_value()); | 180 EXPECT_FALSE(response.has_value()); |
| 174 } | 181 } |
| 175 | 182 |
| 176 TEST_F(DoodleFetcherImplTest, ReturnsErrorForIncompleteJson) { | 183 TEST_F(DoodleFetcherImplTest, ReturnsErrorForIncompleteJson) { |
| 177 DoodleState state(DoodleState::NO_DOODLE); | 184 DoodleState state(DoodleState::NO_DOODLE); |
| 178 base::Optional<DoodleConfig> response; | 185 base::Optional<DoodleConfig> response; |
| 179 | 186 |
| 180 doodle_fetcher()->FetchDoodle( | 187 doodle_fetcher()->FetchDoodle( |
| 181 CreateResponseSavingCallback(&state, &response)); | 188 CreateResponseSavingCallback(&state, nullptr, &response)); |
| 182 RespondWithData("{}"); | 189 RespondWithData("{}"); |
| 183 | 190 |
| 184 EXPECT_THAT(state, Eq(DoodleState::PARSING_ERROR)); | 191 EXPECT_THAT(state, Eq(DoodleState::PARSING_ERROR)); |
| 185 EXPECT_FALSE(response.has_value()); | 192 EXPECT_FALSE(response.has_value()); |
| 186 } | 193 } |
| 187 | 194 |
| 188 TEST_F(DoodleFetcherImplTest, ResponseContainsValidBaseInformation) { | 195 TEST_F(DoodleFetcherImplTest, ResponseContainsValidBaseInformation) { |
| 189 DoodleState state(DoodleState::NO_DOODLE); | 196 DoodleState state(DoodleState::NO_DOODLE); |
| 197 base::TimeDelta time_to_live; | |
| 190 base::Optional<DoodleConfig> response; | 198 base::Optional<DoodleConfig> response; |
| 191 | 199 |
| 192 doodle_fetcher()->FetchDoodle( | 200 doodle_fetcher()->FetchDoodle( |
| 193 CreateResponseSavingCallback(&state, &response)); | 201 CreateResponseSavingCallback(&state, &time_to_live, &response)); |
| 194 RespondWithData(R"json()]}'{ | 202 RespondWithData(R"json()]}'{ |
| 195 "ddljson": { | 203 "ddljson": { |
| 196 "alt_text":"Mouseover Text", | 204 "alt_text":"Mouseover Text", |
| 197 "doodle_type":"SIMPLE", | 205 "doodle_type":"SIMPLE", |
| 198 "interactive_html":"\u003cstyle\u003e\u003c\/style\u003e", | 206 "interactive_html":"\u003cstyle\u003e\u003c\/style\u003e", |
| 199 "search_url":"/search?q\u003dtest", | 207 "search_url":"/search?q\u003dtest", |
| 200 "target_url":"/search?q\u003dtest\u0026sa\u003dX\u0026ved\u003d0ahUKEw", | 208 "target_url":"/search?q\u003dtest\u0026sa\u003dX\u0026ved\u003d0ahUKEw", |
| 201 "time_to_live_ms":55000, | 209 "time_to_live_ms":55000, |
| 202 "large_image": { | 210 "large_image": { |
| 203 "url":"/logos/doodles/2015/new-years-eve-2015-59854387958251-hp.gif" | 211 "url":"/logos/doodles/2015/new-years-eve-2015-59854387958251-hp.gif" |
| 204 } | 212 } |
| 205 }})json"); | 213 }})json"); |
| 206 | 214 |
| 207 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); | 215 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); |
| 208 ASSERT_TRUE(response.has_value()); | 216 ASSERT_TRUE(response.has_value()); |
| 209 DoodleConfig config = response.value(); | 217 DoodleConfig config = response.value(); |
| 210 | 218 |
| 211 EXPECT_TRUE(config.search_url.is_valid()); | 219 EXPECT_TRUE(config.search_url.is_valid()); |
| 212 EXPECT_THAT(config.search_url, Eq(Resolve("/search?q\u003dtest"))); | 220 EXPECT_THAT(config.search_url, Eq(Resolve("/search?q\u003dtest"))); |
| 213 EXPECT_TRUE(config.fullpage_interactive_url.is_empty()); | 221 EXPECT_TRUE(config.fullpage_interactive_url.is_empty()); |
| 214 EXPECT_TRUE(config.target_url.is_valid()); | 222 EXPECT_TRUE(config.target_url.is_valid()); |
| 215 EXPECT_THAT(config.target_url, | 223 EXPECT_THAT(config.target_url, |
| 216 Eq(Resolve("/search?q\u003dtest\u0026sa\u003dX\u0026ved\u003d" | 224 Eq(Resolve("/search?q\u003dtest\u0026sa\u003dX\u0026ved\u003d" |
| 217 "0ahUKEw"))); | 225 "0ahUKEw"))); |
| 218 EXPECT_THAT(config.doodle_type, Eq(DoodleType::SIMPLE)); | 226 EXPECT_THAT(config.doodle_type, Eq(DoodleType::SIMPLE)); |
| 219 EXPECT_THAT(config.alt_text, Eq("Mouseover Text")); | 227 EXPECT_THAT(config.alt_text, Eq("Mouseover Text")); |
| 220 EXPECT_THAT(config.interactive_html, | 228 EXPECT_THAT(config.interactive_html, |
| 221 Eq("\u003cstyle\u003e\u003c/style\u003e")); | 229 Eq("\u003cstyle\u003e\u003c/style\u003e")); |
| 222 | 230 |
| 223 EXPECT_THAT(config.time_to_live, | 231 EXPECT_THAT(time_to_live, Eq(base::TimeDelta::FromMilliseconds(55000))); |
| 224 Eq(base::TimeDelta::FromMilliseconds(55000))); | |
| 225 } | 232 } |
| 226 | 233 |
| 227 TEST_F(DoodleFetcherImplTest, DoodleExpiresWithinThirtyDaysForTooLargeTTL) { | 234 TEST_F(DoodleFetcherImplTest, DoodleExpiresWithinThirtyDaysForTooLargeTTL) { |
| 228 DoodleState state(DoodleState::NO_DOODLE); | 235 DoodleState state(DoodleState::NO_DOODLE); |
| 236 base::TimeDelta time_to_live; | |
| 229 base::Optional<DoodleConfig> response; | 237 base::Optional<DoodleConfig> response; |
| 230 | 238 |
| 231 doodle_fetcher()->FetchDoodle( | 239 doodle_fetcher()->FetchDoodle( |
| 232 CreateResponseSavingCallback(&state, &response)); | 240 CreateResponseSavingCallback(&state, &time_to_live, &response)); |
| 233 RespondWithData(R"json({"ddljson": { | 241 RespondWithData(R"json({"ddljson": { |
| 234 "time_to_live_ms":5184000000, | 242 "time_to_live_ms":5184000000, |
| 235 "large_image": {"url":"/logos/doodles/2015/some.gif"} | 243 "large_image": {"url":"/logos/doodles/2015/some.gif"} |
| 236 }})json"); // 60 days | 244 }})json"); // 60 days |
| 237 | 245 |
| 238 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); | 246 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); |
| 239 ASSERT_TRUE(response.has_value()); | 247 EXPECT_TRUE(response.has_value()); |
| 240 EXPECT_THAT(response.value().time_to_live, | 248 EXPECT_THAT(time_to_live, |
| 241 Eq(base::TimeDelta::FromMilliseconds(30ul * 24 * 60 * 60 * | 249 Eq(base::TimeDelta::FromMilliseconds(30ul * 24 * 60 * 60 * |
| 242 1000))); // 30 days | 250 1000))); // 30 days |
| 243 } | 251 } |
| 244 | 252 |
| 245 TEST_F(DoodleFetcherImplTest, DoodleExpiresImmediatelyWithNegativeTTL) { | 253 TEST_F(DoodleFetcherImplTest, DoodleExpiresImmediatelyWithNegativeTTL) { |
| 246 DoodleState state(DoodleState::NO_DOODLE); | 254 DoodleState state(DoodleState::NO_DOODLE); |
| 255 base::TimeDelta time_to_live; | |
| 247 base::Optional<DoodleConfig> response; | 256 base::Optional<DoodleConfig> response; |
| 248 | 257 |
| 249 doodle_fetcher()->FetchDoodle( | 258 doodle_fetcher()->FetchDoodle( |
| 250 CreateResponseSavingCallback(&state, &response)); | 259 CreateResponseSavingCallback(&state, &time_to_live, &response)); |
| 251 RespondWithData(R"json({"ddljson": { | 260 RespondWithData(R"json({"ddljson": { |
| 252 "time_to_live_ms":-1, | 261 "time_to_live_ms":-1, |
| 253 "large_image": {"url":"/logos/doodles/2015/some.gif"} | 262 "large_image": {"url":"/logos/doodles/2015/some.gif"} |
| 254 }})json"); | 263 }})json"); |
| 255 | 264 |
| 256 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); | 265 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); |
| 257 ASSERT_TRUE(response.has_value()); | 266 EXPECT_TRUE(response.has_value()); |
| 258 EXPECT_THAT(response.value().time_to_live, | 267 EXPECT_THAT(time_to_live, Eq(base::TimeDelta::FromMilliseconds(0))); |
| 259 Eq(base::TimeDelta::FromMilliseconds(0))); | |
| 260 } | 268 } |
| 261 | 269 |
| 262 TEST_F(DoodleFetcherImplTest, DoodleExpiresImmediatelyWithoutValidTTL) { | 270 TEST_F(DoodleFetcherImplTest, DoodleExpiresImmediatelyWithoutValidTTL) { |
| 263 DoodleState state(DoodleState::NO_DOODLE); | 271 DoodleState state(DoodleState::NO_DOODLE); |
| 272 base::TimeDelta time_to_live; | |
| 264 base::Optional<DoodleConfig> response; | 273 base::Optional<DoodleConfig> response; |
| 265 | 274 |
| 266 doodle_fetcher()->FetchDoodle( | 275 doodle_fetcher()->FetchDoodle( |
| 267 CreateResponseSavingCallback(&state, &response)); | 276 CreateResponseSavingCallback(&state, &time_to_live, &response)); |
| 268 RespondWithData(R"json({"ddljson": { | 277 RespondWithData(R"json({"ddljson": { |
| 269 "large_image": {"url":"/logos/doodles/2015/some.gif"} | 278 "large_image": {"url":"/logos/doodles/2015/some.gif"} |
| 270 }})json"); | 279 }})json"); |
| 271 | 280 |
| 272 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); | 281 EXPECT_THAT(state, Eq(DoodleState::AVAILABLE)); |
| 273 ASSERT_TRUE(response.has_value()); | 282 EXPECT_TRUE(response.has_value()); |
| 274 EXPECT_THAT(response.value().time_to_live, | 283 EXPECT_THAT(time_to_live, Eq(base::TimeDelta::FromMilliseconds(0))); |
| 275 Eq(base::TimeDelta::FromMilliseconds(0))); | |
| 276 } | 284 } |
| 277 | 285 |
| 278 TEST_F(DoodleFetcherImplTest, ReturnsNoDoodleForMissingLargeImageUrl) { | 286 TEST_F(DoodleFetcherImplTest, ReturnsNoDoodleForMissingLargeImageUrl) { |
| 279 DoodleState state(DoodleState::AVAILABLE); | 287 DoodleState state(DoodleState::AVAILABLE); |
| 280 base::Optional<DoodleConfig> response; | 288 base::Optional<DoodleConfig> response; |
| 281 | 289 |
| 282 doodle_fetcher()->FetchDoodle( | 290 doodle_fetcher()->FetchDoodle( |
| 283 CreateResponseSavingCallback(&state, &response)); | 291 CreateResponseSavingCallback(&state, nullptr, &response)); |
| 284 RespondWithData(R"json({"ddljson": { | 292 RespondWithData(R"json({"ddljson": { |
| 285 "time_to_live_ms":55000, | 293 "time_to_live_ms":55000, |
| 286 "large_image": {} | 294 "large_image": {} |
| 287 }})json"); | 295 }})json"); |
| 288 | 296 |
| 289 EXPECT_THAT(state, Eq(DoodleState::NO_DOODLE)); | 297 EXPECT_THAT(state, Eq(DoodleState::NO_DOODLE)); |
| 290 EXPECT_FALSE(response.has_value()); | 298 EXPECT_FALSE(response.has_value()); |
| 291 } | 299 } |
| 292 | 300 |
| 293 TEST_F(DoodleFetcherImplTest, EmptyResponsesCausesNoDoodleState) { | 301 TEST_F(DoodleFetcherImplTest, EmptyResponsesCausesNoDoodleState) { |
| 294 DoodleState state(DoodleState::AVAILABLE); | 302 DoodleState state(DoodleState::AVAILABLE); |
| 295 base::Optional<DoodleConfig> response; | 303 base::Optional<DoodleConfig> response; |
| 296 | 304 |
| 297 doodle_fetcher()->FetchDoodle( | 305 doodle_fetcher()->FetchDoodle( |
| 298 CreateResponseSavingCallback(&state, &response)); | 306 CreateResponseSavingCallback(&state, nullptr, &response)); |
| 299 RespondWithData("{\"ddljson\":{}}"); | 307 RespondWithData("{\"ddljson\":{}}"); |
| 300 | 308 |
| 301 EXPECT_THAT(state, Eq(DoodleState::NO_DOODLE)); | 309 EXPECT_THAT(state, Eq(DoodleState::NO_DOODLE)); |
| 302 EXPECT_FALSE(response.has_value()); | 310 EXPECT_FALSE(response.has_value()); |
| 303 } | 311 } |
| 304 | 312 |
| 305 TEST_F(DoodleFetcherImplTest, ResponseContainsExactlyTheSampleImages) { | 313 TEST_F(DoodleFetcherImplTest, ResponseContainsExactlyTheSampleImages) { |
| 306 DoodleState state(DoodleState::NO_DOODLE); | 314 DoodleState state(DoodleState::NO_DOODLE); |
| 307 base::Optional<DoodleConfig> response; | 315 base::Optional<DoodleConfig> response; |
| 308 | 316 |
| 309 doodle_fetcher()->FetchDoodle( | 317 doodle_fetcher()->FetchDoodle( |
| 310 CreateResponseSavingCallback(&state, &response)); | 318 CreateResponseSavingCallback(&state, nullptr, &response)); |
| 311 RespondWithData(R"json()]}'{ | 319 RespondWithData(R"json()]}'{ |
| 312 "ddljson": { | 320 "ddljson": { |
| 313 "time_to_live_ms":55000, | 321 "time_to_live_ms":55000, |
| 314 "large_image": { | 322 "large_image": { |
| 315 "height":225, | 323 "height":225, |
| 316 "is_animated_gif":true, | 324 "is_animated_gif":true, |
| 317 "is_cta":false, | 325 "is_cta":false, |
| 318 "url":"/logos/doodles/2015/new-years-eve-2015-59854387958251-hp.gif", | 326 "url":"/logos/doodles/2015/new-years-eve-2015-59854387958251-hp.gif", |
| 319 "width":489 | 327 "width":489 |
| 320 }, | 328 }, |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 367 } | 375 } |
| 368 | 376 |
| 369 TEST_F(DoodleFetcherImplTest, RespondsToMultipleRequestsWithSameFetcher) { | 377 TEST_F(DoodleFetcherImplTest, RespondsToMultipleRequestsWithSameFetcher) { |
| 370 DoodleState state1(DoodleState::NO_DOODLE); | 378 DoodleState state1(DoodleState::NO_DOODLE); |
| 371 DoodleState state2(DoodleState::NO_DOODLE); | 379 DoodleState state2(DoodleState::NO_DOODLE); |
| 372 base::Optional<DoodleConfig> response1; | 380 base::Optional<DoodleConfig> response1; |
| 373 base::Optional<DoodleConfig> response2; | 381 base::Optional<DoodleConfig> response2; |
| 374 | 382 |
| 375 // Trigger two requests. | 383 // Trigger two requests. |
| 376 doodle_fetcher()->FetchDoodle( | 384 doodle_fetcher()->FetchDoodle( |
| 377 CreateResponseSavingCallback(&state1, &response1)); | 385 CreateResponseSavingCallback(&state1, nullptr, &response1)); |
| 378 net::URLFetcher* first_created_fetcher = GetRunningFetcher(); | 386 net::URLFetcher* first_created_fetcher = GetRunningFetcher(); |
| 379 doodle_fetcher()->FetchDoodle( | 387 doodle_fetcher()->FetchDoodle( |
| 380 CreateResponseSavingCallback(&state2, &response2)); | 388 CreateResponseSavingCallback(&state2, nullptr, &response2)); |
| 381 net::URLFetcher* second_created_fetcher = GetRunningFetcher(); | 389 net::URLFetcher* second_created_fetcher = GetRunningFetcher(); |
| 382 | 390 |
| 383 // Expect that only one fetcher handles both requests. | 391 // Expect that only one fetcher handles both requests. |
| 384 EXPECT_THAT(first_created_fetcher, Eq(second_created_fetcher)); | 392 EXPECT_THAT(first_created_fetcher, Eq(second_created_fetcher)); |
| 385 | 393 |
| 386 RespondWithData(R"json({"ddljson": { | 394 RespondWithData(R"json({"ddljson": { |
| 387 "time_to_live_ms":55000, | 395 "time_to_live_ms":55000, |
| 388 "large_image": {"url":"/logos/doodles/2015/some.gif"} | 396 "large_image": {"url":"/logos/doodles/2015/some.gif"} |
| 389 }})json"); | 397 }})json"); |
| 390 | 398 |
| 391 // Ensure that both requests received a response. | 399 // Ensure that both requests received a response. |
| 392 EXPECT_THAT(state1, Eq(DoodleState::AVAILABLE)); | 400 EXPECT_THAT(state1, Eq(DoodleState::AVAILABLE)); |
| 393 EXPECT_TRUE(response1.has_value()); | 401 EXPECT_TRUE(response1.has_value()); |
| 394 EXPECT_THAT(state2, Eq(DoodleState::AVAILABLE)); | 402 EXPECT_THAT(state2, Eq(DoodleState::AVAILABLE)); |
| 395 EXPECT_TRUE(response2.has_value()); | 403 EXPECT_TRUE(response2.has_value()); |
| 396 } | 404 } |
| 397 | 405 |
| 398 TEST_F(DoodleFetcherImplTest, ReceivesBaseUrlFromTracker) { | 406 TEST_F(DoodleFetcherImplTest, ReceivesBaseUrlFromTracker) { |
| 399 doodle_fetcher()->FetchDoodle( | 407 doodle_fetcher()->FetchDoodle(CreateResponseSavingCallback( |
| 400 CreateResponseSavingCallback(/*state=*/nullptr, /*response=*/nullptr)); | 408 /*state=*/nullptr, nullptr, /*response=*/nullptr)); |
| 401 | 409 |
| 402 EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(), | 410 EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(), |
| 403 Eq(GetGoogleBaseURL().Resolve(kDoodleConfigPath))); | 411 Eq(GetGoogleBaseURL().Resolve(kDoodleConfigPath))); |
| 404 } | 412 } |
| 405 | 413 |
| 406 TEST_F(DoodleFetcherImplTest, OverridesBaseUrlWithCommandLineArgument) { | 414 TEST_F(DoodleFetcherImplTest, OverridesBaseUrlWithCommandLineArgument) { |
| 407 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 415 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 408 switches::kGoogleBaseURL, "http://www.google.kz"); | 416 switches::kGoogleBaseURL, "http://www.google.kz"); |
| 409 | 417 |
| 410 doodle_fetcher()->FetchDoodle( | 418 doodle_fetcher()->FetchDoodle(CreateResponseSavingCallback( |
| 411 CreateResponseSavingCallback(/*state=*/nullptr, /*response=*/nullptr)); | 419 /*state=*/nullptr, nullptr, /*response=*/nullptr)); |
| 412 | 420 |
| 413 EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(), | 421 EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(), |
| 414 Eq(GURL("http://www.google.kz").Resolve(kDoodleConfigPath))); | 422 Eq(GURL("http://www.google.kz").Resolve(kDoodleConfigPath))); |
| 415 } | 423 } |
| 416 | 424 |
| 417 } // namespace doodle | 425 } // namespace doodle |
| OLD | NEW |