Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1073)

Unified Diff: content/browser/font_access/font_access_service_unittest.cc

Issue 1615133002: Implement API for accessing fonts installed locally on the system. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing Nasko. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/font_access/font_access_service_impl.cc ('k') | content/browser/font_access/font_getter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/font_access/font_access_service_unittest.cc
diff --git a/content/browser/font_access/font_access_service_unittest.cc b/content/browser/font_access/font_access_service_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0a38804613db84557f6b6e1b078fe03ccd2789cb
--- /dev/null
+++ b/content/browser/font_access/font_access_service_unittest.cc
@@ -0,0 +1,294 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/run_loop.h"
+#include "content/browser/font_access/font_access_service_impl.h"
+#include "content/browser/font_access/font_getter.h"
+#include "content/common/font_access/font_access_service.mojom.h"
+#include "content/public/test/mock_render_process_host.h"
+#include "content/public/test/test_browser_context.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "mojo/public/cpp/bindings/interface_ptr.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/system/buffer.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+class CacheClobberCounter {
+ public:
+ CacheClobberCounter() : counter(0) {}
+
+ void SetCacheMap(const FontCacheMap& cache_map) { cache_map_ = cache_map; }
+
+ scoped_ptr<FontCacheMap> GetFakeCacheMap() {
+ scoped_ptr<FontCacheMap> clone_map(new FontCacheMap(cache_map_));
+ counter++;
+ return clone_map;
+ }
+
+ int counter;
+ FontCacheMap cache_map_;
+};
+
+class FontAccessServiceTest : public testing::Test {
+ public:
+ FontAccessServiceTest()
+ : context_(new TestBrowserContext()),
+ host_(new MockRenderProcessHost(context_.get())),
+ counter_(new CacheClobberCounter()) {}
+
+ void SetUp() override {
+ // Create a dummy mojo channel so that the FontAccessServiceImpl can be
+ // instantiated
+ mojo::InterfaceRequest<FontAccessService> request =
+ mojo::GetProxy(&interface_ptr_);
+ // Create a new FontAccessServiceImpl bound to the dummy channel.
+ service_impl_.reset(new FontAccessServiceImpl(
+ base::Bind(&CacheClobberCounter::GetFakeCacheMap,
+ base::Unretained(counter_.get())),
+ std::move(request)));
+ base::RunLoop().RunUntilIdle();
+ }
+
+ void SetCacheMap(const FontCacheMap& cache_map) {
+ counter_->SetCacheMap(cache_map);
+ }
+
+ static void VerifyFontListCallback(
+ const FontCacheMap& real_map,
+ size_t expected_fonts,
+ base::Closure quit,
+ const mojo::Array<FontDescriptionPtr>& values) {
+ EXPECT_EQ(expected_fonts, values.size());
+ // Verify that all of the fonts were there.
+ for (size_t i = 0; i < values.size(); i++) {
+ FontCacheMap::const_iterator iter;
+ iter = real_map.find(values[i]->family);
+ EXPECT_NE(iter, real_map.end());
+ FontStyleMap::const_iterator faceIter;
+ faceIter = iter->second.find(values[i]->style);
+ EXPECT_NE(faceIter, iter->second.end());
+ }
+
+ quit.Run();
+ }
+
+ static void VerifyFontBlobCallback(int64_t expected_length,
+ base::Closure quit,
+ mojo::ScopedSharedBufferHandle buffer,
+ int64_t length) {
+ quit.Run();
+ EXPECT_EQ(length, expected_length);
+ }
+
+ mojo::InterfacePtr<FontAccessService> interface_ptr_;
+ content::TestBrowserThreadBundle thread_bundle_;
+ scoped_ptr<TestBrowserContext> context_;
+ scoped_ptr<MockRenderProcessHost> host_;
+ scoped_ptr<FontAccessServiceImpl> service_impl_;
+ scoped_ptr<CacheClobberCounter> counter_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FontAccessServiceTest);
+};
+
+TEST_F(FontAccessServiceTest, GetFonts) {
+ FontCacheMap fonts;
+ FontStyleMap face_map;
+ face_map.insert(
+ std::make_pair("Style1", FontInformation("Path", "FullName")));
+ fonts.insert(std::make_pair("Font", face_map));
+ SetCacheMap(fonts);
+
+ base::RunLoop run_loop;
+ service_impl_->GetFontList(
+ base::Bind(&FontAccessServiceTest::VerifyFontListCallback, fonts, 1,
+ run_loop.QuitClosure()));
+ run_loop.Run();
+ EXPECT_EQ(1, counter_->counter);
+}
+
+TEST_F(FontAccessServiceTest, GetFontsRecaches) {
+ FontCacheMap fonts;
+ FontStyleMap face_map;
+ face_map.insert(
+ std::make_pair("Style1", FontInformation("Path", "FullName")));
+ fonts.insert(std::make_pair("Font", face_map));
+ SetCacheMap(fonts);
+
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontList(
+ base::Bind(&FontAccessServiceTest::VerifyFontListCallback, fonts, 1,
+ run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+
+ fonts.insert(std::make_pair("Font2", face_map));
+ SetCacheMap(fonts);
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontList(
+ base::Bind(&FontAccessServiceTest::VerifyFontListCallback, fonts, 2,
+ run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+
+ EXPECT_EQ(2, counter_->counter);
+}
+
+TEST_F(FontAccessServiceTest, GetFontBlob) {
+ base::ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+ base::FilePath file_path = temp_dir.path().AppendASCII("test_file.ttf");
+ base::File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_READ |
+ base::File::FLAG_WRITE);
+ ASSERT_TRUE(file.IsValid());
+
+ char data_to_write[] = "test";
+ const int kTestDataSize = 4;
+ int bytes_written = file.Write(0, data_to_write, kTestDataSize);
+ EXPECT_EQ(kTestDataSize, bytes_written);
+
+ FontCacheMap fonts;
+ FontStyleMap face_map;
+ face_map.insert(std::make_pair(
+ "Style1", FontInformation(file_path.AsUTF8Unsafe(), "FullName")));
+ fonts.insert(std::make_pair("Font", face_map));
+ SetCacheMap(fonts);
+
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontData(
+ "Font", "Style1",
+ base::Bind(&FontAccessServiceTest::VerifyFontBlobCallback,
+ kTestDataSize, run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+
+ EXPECT_EQ(1, counter_->counter);
+}
+
+TEST_F(FontAccessServiceTest, GetFontBlobIsCached) {
+ base::ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+ base::FilePath file_path = temp_dir.path().AppendASCII("test_file.ttf");
+ base::File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_READ |
+ base::File::FLAG_WRITE);
+ ASSERT_TRUE(file.IsValid());
+
+ char data_to_write[] = "test";
+ const int kTestDataSize = 4;
+ int bytes_written = file.Write(0, data_to_write, kTestDataSize);
+ EXPECT_EQ(kTestDataSize, bytes_written);
+
+ FontCacheMap fonts;
+ FontStyleMap face_map;
+ face_map.insert(std::make_pair(
+ "Style1", FontInformation(file_path.AsUTF8Unsafe(), "FullName")));
+ fonts.insert(std::make_pair("Font", face_map));
+ SetCacheMap(fonts);
+
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontData(
+ "Font", "Style1",
+ base::Bind(&FontAccessServiceTest::VerifyFontBlobCallback,
+ kTestDataSize, run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontData(
+ "Font", "Style1",
+ base::Bind(&FontAccessServiceTest::VerifyFontBlobCallback,
+ kTestDataSize, run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+
+ EXPECT_EQ(1, counter_->counter);
+}
+
+TEST_F(FontAccessServiceTest, GetFontBlobRecachesOnMiss) {
+ base::ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+ base::FilePath file_path = temp_dir.path().AppendASCII("test_file.ttf");
+ base::File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_READ |
+ base::File::FLAG_WRITE);
+ ASSERT_TRUE(file.IsValid());
+
+ char data_to_write[] = "test";
+ const int kTestDataSize = 4;
+ int bytes_written = file.Write(0, data_to_write, kTestDataSize);
+ EXPECT_EQ(kTestDataSize, bytes_written);
+
+ FontCacheMap fonts;
+ FontStyleMap face_map;
+ face_map.insert(std::make_pair(
+ "Style1", FontInformation(file_path.AsUTF8Unsafe(), "FullName")));
+ fonts.insert(std::make_pair("Font", face_map));
+ SetCacheMap(fonts);
+
+ // Populates the cache and returns the first font.
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontData(
+ "Font", "Style1",
+ base::Bind(&FontAccessServiceTest::VerifyFontBlobCallback,
+ kTestDataSize, run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+
+ // Expected cache miss and a second miss after recaching.
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontData(
+ "Font2", "Style1",
+ base::Bind(&FontAccessServiceTest::VerifyFontBlobCallback, 0,
+ run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+ EXPECT_EQ(2, counter_->counter);
+
+ fonts.insert(std::make_pair("Font2", face_map));
+ SetCacheMap(fonts);
+
+ // Expected cache miss with eventual result on recache.
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontData(
+ "Font2", "Style1",
+ base::Bind(&FontAccessServiceTest::VerifyFontBlobCallback,
+ kTestDataSize, run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+
+ EXPECT_EQ(3, counter_->counter);
+}
+
+TEST_F(FontAccessServiceTest, FontBlobPathIsInvalid) {
+ base::ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+ base::FilePath file_path = temp_dir.path().AppendASCII("test_file.ttf");
+
+ FontCacheMap fonts;
+ FontStyleMap face_map;
+ face_map.insert(std::make_pair(
+ "Style1", FontInformation(file_path.AsUTF8Unsafe(), "FullName")));
+ fonts.insert(std::make_pair("Font", face_map));
+ SetCacheMap(fonts);
+
+ {
+ base::RunLoop run_loop;
+ service_impl_->GetFontData(
+ "Font", "Style1",
+ base::Bind(&FontAccessServiceTest::VerifyFontBlobCallback, 0,
+ run_loop.QuitClosure()));
+ run_loop.Run();
+ }
+
+ EXPECT_EQ(1, counter_->counter);
+}
+}
« no previous file with comments | « content/browser/font_access/font_access_service_impl.cc ('k') | content/browser/font_access/font_getter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698