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 --- BUILD.gn | 1 - fpdfsdk/fpdfview_unittest.cpp | 20 ----------- testing/test_support.h | 8 +++++ testing/unit_test_main.cpp | 59 +++++++++++++++++++++++++++++++ xfa/fgas/layout/cfx_rtfbreak_unittest.cpp | 18 ++-------- 5 files changed, 69 insertions(+), 37 deletions(-) delete mode 100644 fpdfsdk/fpdfview_unittest.cpp diff --git a/BUILD.gn b/BUILD.gn index f7163ddf98..9eb7fb04af 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -1932,7 +1932,6 @@ test("pdfium_unittests") { "core/fxge/dib/cstretchengine_unittest.cpp", "fpdfsdk/fpdfdoc_unittest.cpp", "fpdfsdk/fpdfeditimg_unittest.cpp", - "fpdfsdk/fpdfview_unittest.cpp", "testing/unit_test_main.cpp", ] deps = [ diff --git a/fpdfsdk/fpdfview_unittest.cpp b/fpdfsdk/fpdfview_unittest.cpp deleted file mode 100644 index 27680b3d4e..0000000000 --- a/fpdfsdk/fpdfview_unittest.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2016 PDFium 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 "public/fpdfview.h" - -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/test_support.h" - -TEST(FPDFView, DoubleInit) { - FPDF_InitLibrary(); - FPDF_InitLibrary(); - FPDF_DestroyLibrary(); -} - -TEST(FPDFView, DoubleDestroy) { - FPDF_InitLibrary(); - FPDF_DestroyLibrary(); - FPDF_DestroyLibrary(); -} 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(); diff --git a/xfa/fgas/layout/cfx_rtfbreak_unittest.cpp b/xfa/fgas/layout/cfx_rtfbreak_unittest.cpp index cef215fe2a..8997edc083 100644 --- a/xfa/fgas/layout/cfx_rtfbreak_unittest.cpp +++ b/xfa/fgas/layout/cfx_rtfbreak_unittest.cpp @@ -18,17 +18,8 @@ class CFX_RTFBreakTest : public testing::Test { public: void SetUp() override { - 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 - - font_ = CFGAS_GEFont::LoadFont(L"Arial Black", 0, 0, font_mgr_.get()); + font_ = + CFGAS_GEFont::LoadFont(L"Arial Black", 0, 0, GetGlobalFontManager()); ASSERT(font_.Get() != nullptr); } @@ -39,12 +30,7 @@ class CFX_RTFBreakTest : public testing::Test { } private: - std::unique_ptr font_mgr_; CFX_RetainPtr font_; - -#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ - std::unique_ptr font_source_; -#endif }; // As soon as you get one of the control characters the break is complete -- cgit v1.2.3