189e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka/* 289e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * Copyright (C) 2016 The Android Open Source Project 389e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * 489e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License"); 589e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * you may not use this file except in compliance with the License. 689e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * You may obtain a copy of the License at 789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * 889e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * http://www.apache.org/licenses/LICENSE-2.0 989e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * 1089e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * Unless required by applicable law or agreed to in writing, software 1189e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS, 1289e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * See the License for the specific language governing permissions and 1489e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka * limitations under the License. 1589e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka */ 1689e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 1789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka#include "HbFontCache.h" 1889e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 19555d84c6f98eafcbe677cdcb8e9605760acd8ce5Mark Salyzyn#include <android/log.h> 20555d84c6f98eafcbe677cdcb8e9605760acd8ce5Mark Salyzyn#include <gtest/gtest.h> 21fd4124c53399581dd94eac5a9749bc07b474a294Seigo Nonaka#include <utils/Mutex.h> 2289e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 23dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka#include <memory> 24dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka 25555d84c6f98eafcbe677cdcb8e9605760acd8ce5Mark Salyzyn#include <hb.h> 26555d84c6f98eafcbe677cdcb8e9605760acd8ce5Mark Salyzyn 2789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka#include "MinikinInternal.h" 2889e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka#include "MinikinFontForTest.h" 2989e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka#include <minikin/MinikinFont.h> 3089e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 3114e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonakanamespace minikin { 3289e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 3389e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonakaclass HbFontCacheTest : public testing::Test { 3489e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonakapublic: 3589e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka virtual void TearDown() { 36fd4124c53399581dd94eac5a9749bc07b474a294Seigo Nonaka android::AutoMutex _l(gMinikinLock); 3789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka purgeHbFontCacheLocked(); 3889e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka } 3989e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka}; 4089e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 4189e80237bc27af084c9ff316d4f47abf426eced8Seigo NonakaTEST_F(HbFontCacheTest, getHbFontLockedTest) { 42dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka std::shared_ptr<MinikinFontForTest> fontA( 43fd77b01ff2cb5c55f02929b5821ddc41aee0cd05Seigo Nonaka new MinikinFontForTest(kTestFontDir "Regular.ttf")); 4481c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka 45dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka std::shared_ptr<MinikinFontForTest> fontB( 46fd77b01ff2cb5c55f02929b5821ddc41aee0cd05Seigo Nonaka new MinikinFontForTest(kTestFontDir "Bold.ttf")); 4789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 48dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka std::shared_ptr<MinikinFontForTest> fontC( 49fd77b01ff2cb5c55f02929b5821ddc41aee0cd05Seigo Nonaka new MinikinFontForTest(kTestFontDir "BoldItalic.ttf")); 5089e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 51fd4124c53399581dd94eac5a9749bc07b474a294Seigo Nonaka android::AutoMutex _l(gMinikinLock); 5289e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka // Never return NULL. 5381c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka EXPECT_NE(nullptr, getHbFontLocked(fontA.get())); 5481c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka EXPECT_NE(nullptr, getHbFontLocked(fontB.get())); 5581c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka EXPECT_NE(nullptr, getHbFontLocked(fontC.get())); 5689e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 5789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka EXPECT_NE(nullptr, getHbFontLocked(nullptr)); 5889e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 5989e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka // Must return same object if same font object is passed. 6081c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka EXPECT_EQ(getHbFontLocked(fontA.get()), getHbFontLocked(fontA.get())); 6181c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka EXPECT_EQ(getHbFontLocked(fontB.get()), getHbFontLocked(fontB.get())); 6281c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka EXPECT_EQ(getHbFontLocked(fontC.get()), getHbFontLocked(fontC.get())); 6389e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 6489e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka // Different object must be returned if the passed minikinFont has different ID. 6581c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka EXPECT_NE(getHbFontLocked(fontA.get()), getHbFontLocked(fontB.get())); 6681c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka EXPECT_NE(getHbFontLocked(fontA.get()), getHbFontLocked(fontC.get())); 6789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka} 6889e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 6989e80237bc27af084c9ff316d4f47abf426eced8Seigo NonakaTEST_F(HbFontCacheTest, purgeCacheTest) { 70dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka std::shared_ptr<MinikinFontForTest> minikinFont( 71fd77b01ff2cb5c55f02929b5821ddc41aee0cd05Seigo Nonaka new MinikinFontForTest(kTestFontDir "Regular.ttf")); 7289e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 73fd4124c53399581dd94eac5a9749bc07b474a294Seigo Nonaka android::AutoMutex _l(gMinikinLock); 7481c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka hb_font_t* font = getHbFontLocked(minikinFont.get()); 7589e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka ASSERT_NE(nullptr, font); 7689e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 7789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka // Set user data to identify the font object. 7889e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka hb_user_data_key_t key; 7989e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka void* data = (void*)0xdeadbeef; 8089e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka hb_font_set_user_data(font, &key, data, NULL, false); 8189e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka ASSERT_EQ(data, hb_font_get_user_data(font, &key)); 8289e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 8389e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka purgeHbFontCacheLocked(); 8489e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 8589e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka // By checking user data, confirm that the object after purge is different from previously 8689e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka // created one. Do not compare the returned pointer here since memory allocator may assign 8789e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka // same region for new object. 8881c79d6e1e49562c9bc33c14826017dd5e33ebecSeigo Nonaka font = getHbFontLocked(minikinFont.get()); 8989e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka EXPECT_EQ(nullptr, hb_font_get_user_data(font, &key)); 9089e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka} 9189e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka 9214e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonaka} // namespace minikin 93