15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/font_family_cache.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestingFontFamilyCache : public FontFamilyCache {
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit TestingFontFamilyCache(Profile* profile)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : FontFamilyCache(profile), fetch_font_count_(0) {}
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~TestingFontFamilyCache() {}
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual base::string16 FetchFont(const char* script,
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                   const char* map_name) OVERRIDE {
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ++fetch_font_count_;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return FontFamilyCache::FetchFont(script, map_name);
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int fetch_font_count_;
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestingFontFamilyCache);
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Tests that the cache is correctly set and cleared.
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(FontFamilyCacheTest, Caching) {
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestingProfile profile;
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestingFontFamilyCache cache(&profile);
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService();
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string font1("font 1");
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string font2("font 2");
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string map_name("webkit.webprefs.fonts.pictograph");
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string script("Zzyxca");
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string pref_name(map_name + '.' + script);
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string pref_name2(map_name + '.' + "adsf");
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Registers 2 preferences, and sets the first one.
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  prefs->registry()->RegisterStringPref(
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pref_name.c_str(),
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      std::string(),
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  prefs->registry()->RegisterStringPref(
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pref_name2.c_str(),
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      std::string(),
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  prefs->SetString(pref_name.c_str(), font1.c_str());
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Check that the right preference is returned.
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string result = base::UTF16ToUTF8(
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      cache.FetchAndCacheFont(script.c_str(), map_name.c_str()));
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(font1, result);
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1, cache.fetch_font_count_);
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Check that the second access uses the cache.
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  result = base::UTF16ToUTF8(
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      cache.FetchAndCacheFont(script.c_str(), map_name.c_str()));
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(font1, result);
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1, cache.fetch_font_count_);
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Changing another preference should have no effect.
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  prefs->SetString(pref_name2.c_str(), "katy perry");
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  result = base::UTF16ToUTF8(
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      cache.FetchAndCacheFont(script.c_str(), map_name.c_str()));
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(font1, result);
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1, cache.fetch_font_count_);
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Changing the preferences invalidates the cache.
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  prefs->SetString(pref_name.c_str(), font2.c_str());
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  result = base::UTF16ToUTF8(
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      cache.FetchAndCacheFont(script.c_str(), map_name.c_str()));
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(font2, result);
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2, cache.fetch_font_count_);
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
83