google_logo_api_unittest.cc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/search_provider_logos/google_logo_api.h"
  5. #include <memory>
  6. #include <string>
  7. #include "base/files/file_path.h"
  8. #include "base/files/file_util.h"
  9. #include "base/path_service.h"
  10. #include "testing/gmock/include/gmock/gmock.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. #include "url/gurl.h"
  13. namespace search_provider_logos {
  14. TEST(GoogleNewLogoApiTest, UsesHttps) {
  15. // "https://" remains in place, even for .cn.
  16. EXPECT_EQ(GURL("https://www.google.com/async/ddljson"),
  17. GetGoogleDoodleURL(GURL("https://www.google.com")));
  18. EXPECT_EQ(GURL("https://www.google.de/async/ddljson"),
  19. GetGoogleDoodleURL(GURL("https://www.google.de")));
  20. EXPECT_EQ(GURL("https://www.google.cn/async/ddljson"),
  21. GetGoogleDoodleURL(GURL("https://www.google.cn")));
  22. EXPECT_EQ(GURL("https://www.google.com.cn/async/ddljson"),
  23. GetGoogleDoodleURL(GURL("https://www.google.com.cn")));
  24. // But "http://" gets replaced by "https://".
  25. EXPECT_EQ(GURL("https://www.google.com/async/ddljson"),
  26. GetGoogleDoodleURL(GURL("http://www.google.com")));
  27. EXPECT_EQ(GURL("https://www.google.de/async/ddljson"),
  28. GetGoogleDoodleURL(GURL("http://www.google.de")));
  29. // ...except for .cn, which is allowed to keep "http://".
  30. EXPECT_EQ(GURL("http://www.google.cn/async/ddljson"),
  31. GetGoogleDoodleURL(GURL("http://www.google.cn")));
  32. EXPECT_EQ(GURL("http://www.google.com.cn/async/ddljson"),
  33. GetGoogleDoodleURL(GURL("http://www.google.com.cn")));
  34. }
  35. TEST(GoogleNewLogoApiTest, AppendPreliminaryParamsParsing) {
  36. const std::string base_url = "http://foo.bar/";
  37. EXPECT_EQ(GURL("http://foo.bar/?async=ntp:1"),
  38. AppendPreliminaryParamsToDoodleURL(false, false, GURL(base_url)));
  39. EXPECT_EQ(GURL("http://foo.bar/?test=param&async=ntp:1"),
  40. AppendPreliminaryParamsToDoodleURL(false, false,
  41. GURL(base_url + "?test=param")));
  42. EXPECT_EQ(GURL("http://foo.bar/?async=inside,ntp:1&test=param"),
  43. AppendPreliminaryParamsToDoodleURL(
  44. false, false, GURL(base_url + "?async=inside&test=param")));
  45. EXPECT_EQ(GURL("http://foo.bar/?async=inside,ntp:1&async=param"),
  46. AppendPreliminaryParamsToDoodleURL(
  47. false, false, GURL(base_url + "?async=inside&async=param")));
  48. }
  49. TEST(GoogleNewLogoApiTest, AppendPreliminaryParams) {
  50. const GURL logo_url("https://base.doo/target");
  51. EXPECT_EQ(GURL("https://base.doo/target?async=ntp:1"),
  52. AppendPreliminaryParamsToDoodleURL(false, false, logo_url));
  53. EXPECT_EQ(GURL("https://base.doo/target?async=ntp:1,graybg:1"),
  54. AppendPreliminaryParamsToDoodleURL(true, false, logo_url));
  55. EXPECT_EQ(GURL("https://base.doo/target?async=ntp:2"),
  56. AppendPreliminaryParamsToDoodleURL(false, true, logo_url));
  57. }
  58. TEST(GoogleNewLogoApiTest, AppendFingerprintParam) {
  59. EXPECT_EQ(GURL("https://base.doo/target?async=es_dfp:fingerprint"),
  60. AppendFingerprintParamToDoodleURL(GURL("https://base.doo/target"),
  61. "fingerprint"));
  62. EXPECT_EQ(
  63. GURL("https://base.doo/target?async=ntp:1,graybg:1,es_dfp:fingerprint"),
  64. AppendFingerprintParamToDoodleURL(
  65. GURL("https://base.doo/target?async=ntp:1,graybg:1"), "fingerprint"));
  66. }
  67. TEST(GoogleNewLogoApiTest, ResolvesRelativeUrl) {
  68. const GURL base_url("https://base.doo/");
  69. const std::string json = R"json()]}'
  70. {
  71. "ddljson": {
  72. "target_url": "/target"
  73. }
  74. })json";
  75. bool failed = false;
  76. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  77. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  78. ASSERT_FALSE(failed);
  79. ASSERT_TRUE(logo);
  80. EXPECT_EQ(GURL("https://base.doo/target"), logo->metadata.on_click_url);
  81. }
  82. TEST(GoogleNewLogoApiTest, DoesNotResolveAbsoluteUrl) {
  83. const GURL base_url("https://base.doo/");
  84. const std::string json = R"json()]}'
  85. {
  86. "ddljson": {
  87. "target_url": "https://www.doodle.com/target"
  88. }
  89. })json";
  90. bool failed = false;
  91. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  92. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  93. ASSERT_FALSE(failed);
  94. ASSERT_TRUE(logo);
  95. EXPECT_EQ(GURL("https://www.doodle.com/target"), logo->metadata.on_click_url);
  96. }
  97. TEST(GoogleNewLogoApiTest, RequiresHttpsForContainedUrls) {
  98. const GURL base_url("https://base.doo/");
  99. const std::string json = R"json()]}'
  100. {
  101. "ddljson": {
  102. "doodle_type": "INTERACTIVE",
  103. "target_url": "http://www.doodle.com/target",
  104. "fullpage_interactive_url": "http://www.doodle.com/interactive",
  105. "iframe_width_px": 500,
  106. "iframe_height_px": 200
  107. }
  108. })json";
  109. bool failed = false;
  110. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  111. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  112. ASSERT_FALSE(failed);
  113. ASSERT_TRUE(logo);
  114. // Since the base URL is secure https://, the contained non-secure http://
  115. // URLs should be ignored.
  116. EXPECT_EQ(GURL(), logo->metadata.on_click_url);
  117. EXPECT_EQ(GURL(), logo->metadata.full_page_url);
  118. }
  119. TEST(GoogleNewLogoApiTest, AcceptsHttpForContainedUrlsIfBaseInsecure) {
  120. const GURL base_url("http://base.doo/");
  121. const std::string json = R"json()]}'
  122. {
  123. "ddljson": {
  124. "doodle_type": "INTERACTIVE",
  125. "target_url": "http://www.doodle.com/target",
  126. "fullpage_interactive_url": "http://www.doodle.com/interactive",
  127. "iframe_width_px": 500,
  128. "iframe_height_px": 200
  129. }
  130. })json";
  131. bool failed = false;
  132. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  133. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  134. ASSERT_FALSE(failed);
  135. ASSERT_TRUE(logo);
  136. // Since the base URL itself is non-secure http://, the contained non-secure
  137. // URLs should also be accepted.
  138. EXPECT_EQ(GURL("http://www.doodle.com/target"), logo->metadata.on_click_url);
  139. EXPECT_EQ(GURL("http://www.doodle.com/interactive"),
  140. logo->metadata.full_page_url);
  141. }
  142. TEST(GoogleNewLogoApiTest, ParsesStaticImage) {
  143. const GURL base_url("https://base.doo/");
  144. // Note: The base64 encoding of "abc" is "YWJj".
  145. // Note: The base64 encoding of "xyz" is "eHl6".
  146. const std::string json = R"json()]}'
  147. {
  148. "ddljson": {
  149. "target_url": "/target",
  150. "data_uri": "data:image/png;base64,YWJj",
  151. "dark_data_uri": "data:image/png;base64,eHl6"
  152. }
  153. })json";
  154. bool failed = false;
  155. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  156. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  157. ASSERT_FALSE(failed);
  158. ASSERT_TRUE(logo);
  159. EXPECT_EQ("abc", logo->encoded_image->data());
  160. EXPECT_EQ("xyz", logo->dark_encoded_image->data());
  161. EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
  162. }
  163. TEST(GoogleNewLogoApiTest, ParsesShareButtonForSimpleDoodle) {
  164. const GURL base_url("https://base.doo/");
  165. // Note: The base64 encoding of "abc" is "YWJj".
  166. const std::string json = R"json()]}'
  167. {
  168. "ddljson": {
  169. "doodle_type": "SIMPLE",
  170. "data_uri": "data:image/png;base64,YWJj",
  171. "short_link": "//g.co",
  172. "share_button": {
  173. "background_color": "#fe8080",
  174. "icon_image": "test_img",
  175. "offset_x": 111,
  176. "offset_y": 222,
  177. "opacity": 0.5
  178. },
  179. "dark_share_button": {
  180. "background_color": "#ee22bb",
  181. "icon_image": "dark_test_img",
  182. "offset_x": 99,
  183. "offset_y": 191,
  184. "opacity": 0.7
  185. }
  186. }
  187. })json";
  188. bool failed = false;
  189. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  190. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  191. ASSERT_FALSE(failed);
  192. ASSERT_TRUE(logo);
  193. EXPECT_EQ("abc", logo->encoded_image->data());
  194. EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
  195. EXPECT_EQ("https://g.co/", logo->metadata.short_link);
  196. EXPECT_EQ("#fe8080", logo->metadata.share_button_bg);
  197. EXPECT_EQ("test_img", logo->metadata.share_button_icon);
  198. EXPECT_EQ(111, logo->metadata.share_button_x);
  199. EXPECT_EQ(222, logo->metadata.share_button_y);
  200. EXPECT_EQ(0.5, logo->metadata.share_button_opacity);
  201. EXPECT_EQ("#ee22bb", logo->metadata.dark_share_button_bg);
  202. EXPECT_EQ("dark_test_img", logo->metadata.dark_share_button_icon);
  203. EXPECT_EQ(99, logo->metadata.dark_share_button_x);
  204. EXPECT_EQ(191, logo->metadata.dark_share_button_y);
  205. EXPECT_EQ(0.7, logo->metadata.dark_share_button_opacity);
  206. }
  207. TEST(GoogleNewLogoApiTest, ParsesNoShareButtonIfWrongShortLinkFormat) {
  208. const GURL base_url("https://base.doo/");
  209. // Note: The base64 encoding of "abc" is "YWJj".
  210. const std::string json = R"json()]}'
  211. {
  212. "ddljson": {
  213. "doodle_type": "SIMPLE",
  214. "data_uri": "data:image/png;base64,YWJj",
  215. "short_link": "www.//g.co",
  216. "share_button": {
  217. "background_color": "#fe8080",
  218. "icon_image": "test_img",
  219. "offset_x": 111,
  220. "offset_y": 222,
  221. "opacity": 0.5
  222. },
  223. "dark_share_button": {
  224. "background_color": "#ee22bb",
  225. "icon_image": "dark_test_img",
  226. "offset_x": 99,
  227. "offset_y": 191,
  228. "opacity": 0.7
  229. }
  230. }
  231. })json";
  232. bool failed = false;
  233. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  234. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  235. ASSERT_FALSE(failed);
  236. ASSERT_TRUE(logo);
  237. EXPECT_EQ("abc", logo->encoded_image->data());
  238. EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
  239. ASSERT_TRUE(logo->metadata.short_link.is_empty());
  240. ASSERT_TRUE(logo->metadata.share_button_icon.empty());
  241. EXPECT_EQ(-1, logo->metadata.share_button_x);
  242. EXPECT_EQ(-1, logo->metadata.share_button_y);
  243. EXPECT_EQ(0, logo->metadata.share_button_opacity);
  244. ASSERT_TRUE(logo->metadata.dark_share_button_icon.empty());
  245. EXPECT_EQ(-1, logo->metadata.dark_share_button_x);
  246. EXPECT_EQ(-1, logo->metadata.dark_share_button_y);
  247. EXPECT_EQ(0, logo->metadata.dark_share_button_opacity);
  248. }
  249. TEST(GoogleNewLogoApiTest, ParsesNoShareButtonIfShortLinkInvalid) {
  250. const GURL base_url("https://base.doo/");
  251. // Note: The base64 encoding of "abc" is "YWJj".
  252. const std::string json = R"json()]}'
  253. {
  254. "ddljson": {
  255. "doodle_type": "SIMPLE",
  256. "data_uri": "data:image/png;base64,YWJj",
  257. "short_link": "//dsdjf2(*&^%&",
  258. "share_button": {
  259. "background_color": "#fe8080",
  260. "icon_image": "test_img",
  261. "offset_x": 111,
  262. "offset_y": 222,
  263. "opacity": 0.5
  264. },
  265. "dark_share_button": {
  266. "background_color": "#ee22bb",
  267. "icon_image": "dark_test_img",
  268. "offset_x": 99,
  269. "offset_y": 191,
  270. "opacity": 0.7
  271. }
  272. }
  273. })json";
  274. bool failed = false;
  275. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  276. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  277. ASSERT_FALSE(failed);
  278. ASSERT_TRUE(logo);
  279. EXPECT_EQ("abc", logo->encoded_image->data());
  280. EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
  281. ASSERT_FALSE(logo->metadata.short_link.is_valid());
  282. ASSERT_TRUE(logo->metadata.share_button_icon.empty());
  283. EXPECT_EQ(-1, logo->metadata.share_button_x);
  284. EXPECT_EQ(-1, logo->metadata.share_button_y);
  285. EXPECT_EQ(0, logo->metadata.share_button_opacity);
  286. ASSERT_TRUE(logo->metadata.dark_share_button_icon.empty());
  287. EXPECT_EQ(-1, logo->metadata.dark_share_button_x);
  288. EXPECT_EQ(-1, logo->metadata.dark_share_button_y);
  289. EXPECT_EQ(0, logo->metadata.dark_share_button_opacity);
  290. }
  291. TEST(GoogleNewLogoApiTest, ParsesShareButtonForAnimatedDoodle) {
  292. const GURL base_url("https://base.doo/");
  293. // Note: The base64 encoding of "abc" is "YWJj".
  294. const std::string json = R"json()]}'
  295. {
  296. "ddljson": {
  297. "doodle_type": "ANIMATED",
  298. "target_url": "/target",
  299. "large_image": {
  300. "is_animated_gif": true,
  301. "url": "https://www.doodle.com/image.gif"
  302. },
  303. "short_link": "//g.co",
  304. "cta_data_uri": "data:image/png;base64,YWJj",
  305. "share_button": {
  306. "background_color": "#fe8080",
  307. "icon_image": "test_img",
  308. "offset_x": 111,
  309. "offset_y": 222,
  310. "opacity": 0.5
  311. },
  312. "dark_share_button": {
  313. "background_color": "#ee22bb",
  314. "icon_image": "dark_test_img",
  315. "offset_x": 99,
  316. "offset_y": 191,
  317. "opacity": 0.7
  318. }
  319. }
  320. })json";
  321. bool failed = false;
  322. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  323. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  324. ASSERT_FALSE(failed);
  325. ASSERT_TRUE(logo);
  326. EXPECT_EQ(GURL("https://www.doodle.com/image.gif"),
  327. logo->metadata.animated_url);
  328. EXPECT_EQ("abc", logo->encoded_image->data());
  329. EXPECT_EQ(LogoType::ANIMATED, logo->metadata.type);
  330. EXPECT_EQ("https://g.co/", logo->metadata.short_link);
  331. EXPECT_EQ("#fe8080", logo->metadata.share_button_bg);
  332. EXPECT_EQ("test_img", logo->metadata.share_button_icon);
  333. EXPECT_EQ(111, logo->metadata.share_button_x);
  334. EXPECT_EQ(222, logo->metadata.share_button_y);
  335. EXPECT_EQ(0.5, logo->metadata.share_button_opacity);
  336. EXPECT_EQ("#ee22bb", logo->metadata.dark_share_button_bg);
  337. EXPECT_EQ("dark_test_img", logo->metadata.dark_share_button_icon);
  338. EXPECT_EQ(99, logo->metadata.dark_share_button_x);
  339. EXPECT_EQ(191, logo->metadata.dark_share_button_y);
  340. EXPECT_EQ(0.7, logo->metadata.dark_share_button_opacity);
  341. }
  342. TEST(GoogleNewLogoApiTest, ParsesAnimatedImage) {
  343. const GURL base_url("https://base.doo/");
  344. // Note: The base64 encoding of "abc" is "YWJj".
  345. // Note: The base64 encoding of "xyz" is "eHl6".
  346. const std::string json = R"json()]}'
  347. {
  348. "ddljson": {
  349. "doodle_type": "ANIMATED",
  350. "target_url": "/target",
  351. "large_image": {
  352. "is_animated_gif": true,
  353. "url": "https://www.doodle.com/image.gif"
  354. },
  355. "dark_large_image": {
  356. "is_animated_gif": true,
  357. "url": "https://www.doodle.com/dark_image.gif",
  358. "background_color": "#ABCDEF"
  359. },
  360. "cta_data_uri": "data:image/png;base64,YWJj",
  361. "dark_cta_data_uri": "data:image/png;base64,eHl6"
  362. }
  363. })json";
  364. bool failed = false;
  365. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  366. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  367. ASSERT_FALSE(failed);
  368. ASSERT_TRUE(logo);
  369. EXPECT_EQ(GURL("https://www.doodle.com/image.gif"),
  370. logo->metadata.animated_url);
  371. EXPECT_EQ(GURL("https://www.doodle.com/dark_image.gif"),
  372. logo->metadata.dark_animated_url);
  373. EXPECT_EQ("#ABCDEF", logo->metadata.dark_background_color);
  374. EXPECT_EQ("abc", logo->encoded_image->data());
  375. EXPECT_EQ("xyz", logo->dark_encoded_image->data());
  376. EXPECT_EQ(LogoType::ANIMATED, logo->metadata.type);
  377. }
  378. TEST(GoogleNewLogoApiTest, ParsesLoggingUrls) {
  379. const GURL base_url("https://base.doo/");
  380. const std::string json = R"json()]}'
  381. {
  382. "ddljson": {
  383. "doodle_type": "ANIMATED",
  384. "target_url": "/target",
  385. "large_image": {
  386. "is_animated_gif": true,
  387. "url": "https://www.doodle.com/image.gif"
  388. },
  389. "log_url": "/log?a=b",
  390. "dark_log_url": "/log?a=dark",
  391. "cta_log_url": "/ctalog?c=d",
  392. "dark_cta_log_url": "/ctalog?c=dark"
  393. }
  394. })json";
  395. bool failed = false;
  396. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  397. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  398. ASSERT_FALSE(failed);
  399. ASSERT_TRUE(logo);
  400. EXPECT_EQ(GURL("https://base.doo/log?a=b"), logo->metadata.log_url);
  401. EXPECT_EQ(GURL("https://base.doo/log?a=dark"), logo->metadata.dark_log_url);
  402. EXPECT_EQ(GURL("https://base.doo/ctalog?c=d"), logo->metadata.cta_log_url);
  403. EXPECT_EQ(GURL("https://base.doo/ctalog?c=dark"),
  404. logo->metadata.dark_cta_log_url);
  405. }
  406. TEST(GoogleNewLogoApiTest, ParsesImageSize) {
  407. const GURL base_url("https://base.doo/");
  408. const std::string json = R"json()]}'
  409. {
  410. "ddljson": {
  411. "large_image": {
  412. "width": 500,
  413. "height": 200
  414. },
  415. "dark_large_image": {
  416. "width": 600,
  417. "height": 230
  418. }
  419. }
  420. })json";
  421. bool failed = false;
  422. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  423. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  424. ASSERT_FALSE(failed);
  425. EXPECT_EQ(500, logo->metadata.width_px);
  426. EXPECT_EQ(200, logo->metadata.height_px);
  427. EXPECT_EQ(600, logo->metadata.dark_width_px);
  428. EXPECT_EQ(230, logo->metadata.dark_height_px);
  429. }
  430. TEST(GoogleNewLogoApiTest, ParsesInteractiveDoodle) {
  431. const GURL base_url("https://base.doo/");
  432. const std::string json = R"json()]}'
  433. {
  434. "ddljson": {
  435. "doodle_type": "INTERACTIVE",
  436. "fullpage_interactive_url": "/fullpage",
  437. "target_url": "/target",
  438. "iframe_width_px": 500,
  439. "iframe_height_px": 200
  440. }
  441. })json";
  442. bool failed = false;
  443. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  444. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  445. ASSERT_FALSE(failed);
  446. ASSERT_TRUE(logo);
  447. EXPECT_EQ(GURL("https://base.doo/fullpage"), logo->metadata.full_page_url);
  448. EXPECT_EQ(LogoType::INTERACTIVE, logo->metadata.type);
  449. EXPECT_EQ(500, logo->metadata.iframe_width_px);
  450. EXPECT_EQ(200, logo->metadata.iframe_height_px);
  451. EXPECT_EQ(nullptr, logo->encoded_image);
  452. }
  453. TEST(GoogleNewLogoApiTest, ParsesInteractiveDoodleWithNewWindowAsSimple) {
  454. const GURL base_url("https://base.doo/");
  455. // Note: The base64 encoding of "abc" is "YWJj".
  456. const std::string json = R"json()]}'
  457. {
  458. "ddljson": {
  459. "doodle_type": "INTERACTIVE",
  460. "target_url": "/search?q=interactive",
  461. "fullpage_interactive_url": "/play",
  462. "launch_interactive_behavior": "NEW_WINDOW",
  463. "data_uri": "data:image/png;base64,YWJj",
  464. "iframe_width_px": 500,
  465. "iframe_height_px": 200
  466. }
  467. })json";
  468. bool failed = false;
  469. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  470. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  471. ASSERT_FALSE(failed);
  472. ASSERT_TRUE(logo);
  473. EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type);
  474. EXPECT_EQ(GURL("https://base.doo/play"), logo->metadata.on_click_url);
  475. EXPECT_EQ(GURL("https://base.doo/play"), logo->metadata.full_page_url);
  476. EXPECT_EQ(0, logo->metadata.iframe_width_px);
  477. EXPECT_EQ(0, logo->metadata.iframe_height_px);
  478. EXPECT_EQ("abc", logo->encoded_image->data());
  479. }
  480. TEST(GoogleNewLogoApiTest, DefaultsInteractiveIframeSize) {
  481. const GURL base_url("https://base.doo/");
  482. const std::string json = R"json()]}'
  483. {
  484. "ddljson": {
  485. "doodle_type": "INTERACTIVE",
  486. "target_url": "/search?q=interactive",
  487. "fullpage_interactive_url": "/play"
  488. }
  489. })json";
  490. bool failed = false;
  491. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  492. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  493. ASSERT_FALSE(failed);
  494. ASSERT_TRUE(logo);
  495. EXPECT_EQ(LogoType::INTERACTIVE, logo->metadata.type);
  496. EXPECT_EQ(GURL("https://base.doo/play"), logo->metadata.full_page_url);
  497. EXPECT_EQ(500, logo->metadata.iframe_width_px);
  498. EXPECT_EQ(200, logo->metadata.iframe_height_px);
  499. }
  500. TEST(GoogleNewLogoApiTest, ParsesCapturedApiResult) {
  501. const GURL base_url("https://base.doo/");
  502. base::FilePath test_data_dir;
  503. ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
  504. test_data_dir = test_data_dir.AppendASCII("components")
  505. .AppendASCII("test")
  506. .AppendASCII("data")
  507. .AppendASCII("search_provider_logos");
  508. const struct TestCase {
  509. const char* file;
  510. bool has_image_data;
  511. } test_cases[] = {
  512. {"ddljson_android0.json", true}, {"ddljson_android0_fp.json", false},
  513. {"ddljson_android1.json", true}, {"ddljson_android1_fp.json", false},
  514. {"ddljson_android2.json", true}, {"ddljson_android2_fp.json", false},
  515. {"ddljson_android3.json", true}, {"ddljson_android3_fp.json", false},
  516. {"ddljson_android4.json", true}, {"ddljson_android4_fp.json", false},
  517. {"ddljson_desktop0.json", true}, {"ddljson_desktop0_fp.json", false},
  518. {"ddljson_desktop1.json", true}, {"ddljson_desktop1_fp.json", false},
  519. {"ddljson_desktop2.json", true}, {"ddljson_desktop2_fp.json", false},
  520. {"ddljson_desktop3.json", true}, {"ddljson_desktop3_fp.json", false},
  521. {"ddljson_desktop4.json", true}, {"ddljson_desktop4_fp.json", false},
  522. {"ddljson_ios0.json", true}, {"ddljson_ios0_fp.json", false},
  523. {"ddljson_ios1.json", true}, {"ddljson_ios1_fp.json", false},
  524. {"ddljson_ios2.json", true}, {"ddljson_ios2_fp.json", false},
  525. {"ddljson_ios3.json", true}, {"ddljson_ios3_fp.json", false},
  526. {"ddljson_ios4.json", true}, {"ddljson_ios4_fp.json", false},
  527. };
  528. for (const TestCase& test_case : test_cases) {
  529. std::string json;
  530. ASSERT_TRUE(base::ReadFileToString(
  531. test_data_dir.AppendASCII(test_case.file), &json))
  532. << test_case.file;
  533. bool failed = false;
  534. std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse(
  535. base_url, std::make_unique<std::string>(json), base::Time(), &failed);
  536. EXPECT_FALSE(failed) << test_case.file;
  537. EXPECT_TRUE(logo) << test_case.file;
  538. bool has_image_data = logo && logo->encoded_image.get();
  539. EXPECT_EQ(has_image_data, test_case.has_image_data) << test_case.file;
  540. }
  541. }
  542. } // namespace search_provider_logos