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