From 574d4408a5174bb410cf4ec3db24283671bcce79 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Mon, 28 Aug 2017 10:11:24 -0400 Subject: Add a global font loader in XFA tests This CL creates a global font loader for use in XFA tests. This is needed because the CFGAS_FontMangaer takes a linearly increasing amount of time to load fonts each time it's loaded. This can get excessively slow for test suites which run a lot of tests. Change-Id: Ie389844b56598ce414f4f761654fa4ed465955fd Reviewed-on: https://pdfium-review.googlesource.com/12090 Reviewed-by: Henrique Nakashima Reviewed-by: Ryan Harrison Commit-Queue: dsinclair --- testing/test_support.h | 8 +++++++ testing/unit_test_main.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) (limited to 'testing') diff --git a/testing/test_support.h b/testing/test_support.h index feec4bbe0b..7525c10b36 100644 --- a/testing/test_support.h +++ b/testing/test_support.h @@ -13,6 +13,10 @@ #include "public/fpdfview.h" +#if PDF_ENABLE_XFA +#include "xfa/fgas/font/cfgas_fontmgr.h" +#endif // PDF_ENABLE_XFA + namespace pdfium { #define STR_IN_TEST_CASE(input_literal, ...) \ @@ -110,4 +114,8 @@ class TestLoader { const size_t m_Len; }; +#if PDF_ENABLE_XFA +CFGAS_FontMgr* GetGlobalFontManager(); +#endif // PDF_ENABLE_XFA + #endif // TESTING_TEST_SUPPORT_H_ diff --git a/testing/unit_test_main.cpp b/testing/unit_test_main.cpp index f57ec3c555..1b1dcb0e32 100644 --- a/testing/unit_test_main.cpp +++ b/testing/unit_test_main.cpp @@ -2,14 +2,73 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include + #include "core/fxcrt/fx_memory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#if PDF_ENABLE_XFA +#include "core/fxge/cfx_gemodule.h" +#include "xfa/fgas/font/cfgas_fontmgr.h" +#include "xfa/fgas/font/cfgas_gefont.h" + +namespace { + +// The loading time of the CFGAS_FontMgr is linear in the number of times it is +// loaded. So, if a test suite has a lot of tests that need a font manager they +// can end up executing very, very slowly. +class Environment : public testing::Environment { + public: + void SetUp() override { + // TODO(dsinclair): This font loading is slow. We should make a test font + // loader which loads up a single font we use in all tests. + CFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo( + IFX_SystemFontInfo::CreateDefault(nullptr)); + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + font_mgr_ = CFGAS_FontMgr::Create(FX_GetDefFontEnumerator()); +#else + font_source_ = pdfium::MakeUnique(); + font_mgr_ = CFGAS_FontMgr::Create(font_source_.get()); +#endif + } + + void TearDown() override { + font_mgr_.reset(); +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + font_source_.reset(); +#endif + } + CFGAS_FontMgr* FontManager() const { return font_mgr_.get(); } + + private: +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + std::unique_ptr font_source_; +#endif + std::unique_ptr font_mgr_; +}; + +Environment* env_ = nullptr; + +} // namespace + +CFGAS_FontMgr* GetGlobalFontManager() { + return env_->FontManager(); +} +#endif // PDF_ENABLE_XFA + // Can't use gtest-provided main since we need to initialize partition // alloc before invoking any test. int main(int argc, char** argv) { FXMEM_InitializePartitionAlloc(); + +#if PDF_ENABLE_XFA + env_ = new Environment(); + // The env will be deleted by gtest. + AddGlobalTestEnvironment(env_); +#endif // PDF_ENABLE_XFA + testing::InitGoogleTest(&argc, argv); testing::InitGoogleMock(&argc, argv); return RUN_ALL_TESTS(); -- cgit v1.2.3