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