1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "HbFontCache.h" 18 19#include <android/log.h> 20#include <gtest/gtest.h> 21#include <utils/Mutex.h> 22 23#include <memory> 24 25#include <hb.h> 26 27#include "MinikinInternal.h" 28#include "MinikinFontForTest.h" 29#include <minikin/MinikinFont.h> 30 31namespace minikin { 32 33class HbFontCacheTest : public testing::Test { 34public: 35 virtual void TearDown() { 36 android::AutoMutex _l(gMinikinLock); 37 purgeHbFontCacheLocked(); 38 } 39}; 40 41TEST_F(HbFontCacheTest, getHbFontLockedTest) { 42 std::shared_ptr<MinikinFontForTest> fontA( 43 new MinikinFontForTest(kTestFontDir "Regular.ttf")); 44 45 std::shared_ptr<MinikinFontForTest> fontB( 46 new MinikinFontForTest(kTestFontDir "Bold.ttf")); 47 48 std::shared_ptr<MinikinFontForTest> fontC( 49 new MinikinFontForTest(kTestFontDir "BoldItalic.ttf")); 50 51 android::AutoMutex _l(gMinikinLock); 52 // Never return NULL. 53 EXPECT_NE(nullptr, getHbFontLocked(fontA.get())); 54 EXPECT_NE(nullptr, getHbFontLocked(fontB.get())); 55 EXPECT_NE(nullptr, getHbFontLocked(fontC.get())); 56 57 EXPECT_NE(nullptr, getHbFontLocked(nullptr)); 58 59 // Must return same object if same font object is passed. 60 EXPECT_EQ(getHbFontLocked(fontA.get()), getHbFontLocked(fontA.get())); 61 EXPECT_EQ(getHbFontLocked(fontB.get()), getHbFontLocked(fontB.get())); 62 EXPECT_EQ(getHbFontLocked(fontC.get()), getHbFontLocked(fontC.get())); 63 64 // Different object must be returned if the passed minikinFont has different ID. 65 EXPECT_NE(getHbFontLocked(fontA.get()), getHbFontLocked(fontB.get())); 66 EXPECT_NE(getHbFontLocked(fontA.get()), getHbFontLocked(fontC.get())); 67} 68 69TEST_F(HbFontCacheTest, purgeCacheTest) { 70 std::shared_ptr<MinikinFontForTest> minikinFont( 71 new MinikinFontForTest(kTestFontDir "Regular.ttf")); 72 73 android::AutoMutex _l(gMinikinLock); 74 hb_font_t* font = getHbFontLocked(minikinFont.get()); 75 ASSERT_NE(nullptr, font); 76 77 // Set user data to identify the font object. 78 hb_user_data_key_t key; 79 void* data = (void*)0xdeadbeef; 80 hb_font_set_user_data(font, &key, data, NULL, false); 81 ASSERT_EQ(data, hb_font_get_user_data(font, &key)); 82 83 purgeHbFontCacheLocked(); 84 85 // By checking user data, confirm that the object after purge is different from previously 86 // created one. Do not compare the returned pointer here since memory allocator may assign 87 // same region for new object. 88 font = getHbFontLocked(minikinFont.get()); 89 EXPECT_EQ(nullptr, hb_font_get_user_data(font, &key)); 90} 91 92} // namespace minikin 93