15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "components/search_provider_logos/logo_cache.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <string>
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/callback.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/files/scoped_temp_dir.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/run_loop.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/time/time.h"
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gtest/include/gtest/gtest.h"
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace search_provider_logos {
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuLogoMetadata GetExampleMetadata() {
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LogoMetadata metadata;
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.source_url = "http://google.com/mylogo";
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.fingerprint = "LC4JVIZ5HVITQFKH0V70";
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(base::Time::FromString("98-05-05 05:05:06 GMT",
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     &metadata.expiration_time));
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.can_show_after_expiration = true;
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.on_click_url = "https://www.google.com/search?q=chicken";
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.alt_text = "A logo about chickens";
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.mime_type = "image/jpeg";
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return metadata;
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuLogoMetadata GetExampleMetadata2() {
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LogoMetadata metadata;
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.source_url = "https://www.example.com/thebestlogo?size=large";
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.fingerprint = "bh4PLHdnEaQAPxNGRyMao1rOmVFTXuOdVhdrMmPV";
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(base::Time::FromString("17-04-04 07:10:58 GMT",
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     &metadata.expiration_time));
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.can_show_after_expiration = false;
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.on_click_url = "http://www.example.co.uk/welcome.php#top";
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.alt_text = "This is a logo";
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.mime_type = "image/png";
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return metadata;
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::RefCountedString* CreateExampleImage(size_t num_bytes) {
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::RefCountedString* encoded_image_str = new base::RefCountedString();
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string& str = encoded_image_str->data();
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  str.resize(num_bytes);
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (size_t i = 0; i < num_bytes; ++i)
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    str[i] = static_cast<char>(i);
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return encoded_image_str;
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuEncodedLogo GetExampleLogo() {
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EncodedLogo logo;
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  logo.encoded_image = CreateExampleImage(837);
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  logo.metadata = GetExampleMetadata();
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return logo;
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuEncodedLogo GetExampleLogo2() {
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EncodedLogo logo;
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  logo.encoded_image = CreateExampleImage(345);
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  logo.metadata = GetExampleMetadata2();
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return logo;
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ExpectMetadataEqual(const LogoMetadata& expected_metadata,
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                         const LogoMetadata& actual_metadata) {
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(expected_metadata.source_url, actual_metadata.source_url);
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(expected_metadata.fingerprint, actual_metadata.fingerprint);
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(expected_metadata.can_show_after_expiration,
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            actual_metadata.can_show_after_expiration);
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(expected_metadata.expiration_time, actual_metadata.expiration_time);
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(expected_metadata.on_click_url, actual_metadata.on_click_url);
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(expected_metadata.alt_text, actual_metadata.alt_text);
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(expected_metadata.mime_type, actual_metadata.mime_type);
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ExpectLogosEqual(const EncodedLogo& expected_logo,
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      const EncodedLogo& actual_logo) {
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(expected_logo.encoded_image.get());
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(actual_logo.encoded_image.get());
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(expected_logo.encoded_image->Equals(actual_logo.encoded_image));
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadataEqual(expected_logo.metadata, actual_logo.metadata);
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Removes 1 byte from the end of the file at |path|.
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ShortenFile(base::FilePath path) {
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_WRITE);
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int64 file_length = file.GetLength();
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_NE(file_length, 0);
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.SetLength(file_length - 1);
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass LogoCacheTest : public ::testing::Test {
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected:
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void SetUp() OVERRIDE {
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ASSERT_TRUE(cache_parent_dir_.CreateUniqueTempDir());
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InitCache();
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void InitCache() {
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    cache_.reset(new LogoCache(
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        cache_parent_dir_.path().Append(FILE_PATH_LITERAL("cache"))));
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void ExpectMetadata(const LogoMetadata* expected_metadata) {
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const LogoMetadata* retrieved_metadata = cache_->GetCachedLogoMetadata();
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (expected_metadata) {
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ASSERT_TRUE(retrieved_metadata != NULL);
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ExpectMetadataEqual(*expected_metadata, *retrieved_metadata);
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    } else {
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ASSERT_TRUE(retrieved_metadata == NULL);
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void ExpectLogo(const EncodedLogo* expected_logo) {
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    scoped_ptr<EncodedLogo> retrieved_logo(cache_->GetCachedLogo());
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (expected_logo) {
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ASSERT_TRUE(retrieved_logo.get() != NULL);
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ExpectLogosEqual(*expected_logo, *retrieved_logo);
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    } else {
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ASSERT_TRUE(retrieved_logo.get() == NULL);
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Deletes the existing LogoCache and creates a new one. This clears any
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // logo or metadata cached in memory to simulate restarting Chrome.
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void SimulateRestart() {
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InitCache();
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<LogoCache> cache_;
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::ScopedTempDir cache_parent_dir_;
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Tests -----------------------------------------------------------------------
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST(LogoCacheSerializationTest, SerializeMetadata) {
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LogoMetadata metadata = GetExampleMetadata();
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string metadata_str;
1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int logo_num_bytes = 33;
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LogoCache::LogoMetadataToString(metadata, logo_num_bytes, &metadata_str);
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<LogoMetadata> metadata2 =
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      LogoCache::LogoMetadataFromString(metadata_str, &logo_num_bytes);
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(metadata2);
1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadataEqual(metadata, *metadata2);
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST(LogoCacheSerializationTest, DeserializeCorruptMetadata) {
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int logo_num_bytes = 33;
1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<LogoMetadata> metadata =
1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      LogoCache::LogoMetadataFromString("", &logo_num_bytes);
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(metadata.get() == NULL);
1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LogoMetadata example_metadata = GetExampleMetadata2();
1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string corrupt_str;
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LogoCache::LogoMetadataToString(
1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      example_metadata, logo_num_bytes, &corrupt_str);
1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  corrupt_str.append("@");
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata = LogoCache::LogoMetadataFromString(corrupt_str, &logo_num_bytes);
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(metadata.get() == NULL);
1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(LogoCacheTest, StoreAndRetrieveMetadata) {
1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Expect no metadata at first.
1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadata(NULL);
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Set initial metadata.
1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EncodedLogo logo = GetExampleLogo();
1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LogoMetadata& metadata = logo.metadata;
1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cache_->SetCachedLogo(&logo);
1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadata(&metadata);
1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Update metadata.
1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  metadata.on_click_url = "http://anotherwebsite.com";
1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cache_->UpdateCachedLogoMetadata(metadata);
1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadata(&metadata);
1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Read metadata back from disk.
1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SimulateRestart();
1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadata(&metadata);
1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Ensure metadata is cached in memory.
1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::DeleteFile(cache_->GetMetadataPath(), false);
1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadata(&metadata);
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(LogoCacheTest, StoreAndRetrieveLogo) {
1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Expect no metadata at first.
1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(NULL);
1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Set initial logo.
1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EncodedLogo logo = GetExampleLogo();
1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cache_->SetCachedLogo(&logo);
1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(&logo);
1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Update logo to NULL.
2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cache_->SetCachedLogo(NULL);
2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(NULL);
2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Read logo back from disk.
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SimulateRestart();
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(NULL);
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Update logo.
2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  logo = GetExampleLogo2();
2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cache_->SetCachedLogo(&logo);
2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(&logo);
2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Read logo back from disk.
2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SimulateRestart();
2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(&logo);
2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(LogoCacheTest, RetrieveCorruptMetadata) {
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Set initial logo.
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EncodedLogo logo = GetExampleLogo2();
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cache_->SetCachedLogo(&logo);
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(&logo);
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Corrupt metadata and expect NULL for both logo and metadata.
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SimulateRestart();
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ShortenFile(cache_->GetMetadataPath());
2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadata(NULL);
2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(NULL);
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Ensure corrupt cache files are deleted.
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(base::PathExists(cache_->GetMetadataPath()));
2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(base::PathExists(cache_->GetLogoPath()));
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(LogoCacheTest, RetrieveCorruptLogo) {
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Set initial logo.
2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EncodedLogo logo = GetExampleLogo();
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cache_->SetCachedLogo(&logo);
2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(&logo);
2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Corrupt logo and expect NULL.
2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SimulateRestart();
2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ShortenFile(cache_->GetLogoPath());
2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectLogo(NULL);
2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Once the logo is noticed to be NULL, the metadata should also be cleared.
2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExpectMetadata(NULL);
2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Ensure corrupt cache files are deleted.
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(base::PathExists(cache_->GetMetadataPath()));
2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(base::PathExists(cache_->GetLogoPath()));
2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace search_provider_logos
253