1daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka/*
2daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * Copyright (C) 2017 The Android Open Source Project
3daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka *
4daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
5daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * you may not use this file except in compliance with the License.
6daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * You may obtain a copy of the License at
7daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka *
8daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
9daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka *
10daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * Unless required by applicable law or agreed to in writing, software
11daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
12daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * See the License for the specific language governing permissions and
14daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka * limitations under the License.
15daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka */
16daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
17daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakapackage android.provider;
18daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
19daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport static org.junit.Assert.assertEquals;
20daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport static org.junit.Assert.assertNotNull;
21daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport static org.junit.Assert.assertNotSame;
22d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport static org.junit.Assert.assertNull;
23d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport static org.junit.Assert.assertSame;
24daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
25daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport android.app.Instrumentation;
26daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport android.content.Context;
27d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport android.content.pm.PackageInfo;
28d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport android.content.pm.PackageManager.NameNotFoundException;
29d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport android.content.pm.PackageManager;
30d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport android.content.pm.Signature;
31daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport android.graphics.Typeface;
32d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport android.os.Handler;
33d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport android.provider.FontsContract.Columns;
34daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport android.provider.FontsContract.FontFamilyResult;
35daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport android.provider.FontsContract.FontInfo;
36d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport android.provider.FontsContract;
37daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport android.support.test.InstrumentationRegistry;
38daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport android.support.test.filters.SmallTest;
39daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport android.support.test.runner.AndroidJUnit4;
40daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport java.util.ArrayList;
41d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonakaimport java.util.List;
42daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport org.junit.After;
43daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport org.junit.Before;
44daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport org.junit.Test;
45daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakaimport org.junit.runner.RunWith;
46daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
47daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka@SmallTest
48daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka@RunWith(AndroidJUnit4.class)
49daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonakapublic class FontsContractE2ETest {
50daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    private static final String AUTHORITY = "android.provider.fonts.font";
51daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    private static final String PACKAGE = "com.android.frameworks.coretests";
52daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
53daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    // Signature to be used for authentication to access content provider.
54daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    // In this test case, the content provider and consumer live in the same package, self package's
55daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    // signature works.
56daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    private static List<List<byte[]>> SIGNATURE;
57daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    static {
58daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
59daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        try {
60daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            PackageManager manager = context.getPackageManager();
61daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            PackageInfo info = manager.getPackageInfo(
62daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                    context.getPackageName(), PackageManager.GET_SIGNATURES);
63daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            ArrayList<byte[]> out = new ArrayList<>();
64daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            for (Signature sig : info.signatures) {
65daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                out.add(sig.toByteArray());
66daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            }
67daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            SIGNATURE = new ArrayList<>();
68daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            SIGNATURE.add(out);
69daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        } catch (PackageManager.NameNotFoundException e) {
70daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            throw new RuntimeException(e);
71daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        }
72daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    }
73daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
74daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    @Before
75daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    public void setUp() {
76daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        MockFontProvider.prepareFontFiles(
77daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                InstrumentationRegistry.getInstrumentation().getTargetContext());
78daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    }
79daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
80daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    @After
81daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    public void tearDown() {
82daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        MockFontProvider.cleanUpFontFiles(
83daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                InstrumentationRegistry.getInstrumentation().getTargetContext());
84daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    }
85daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
86daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    private static class TestCallback extends FontsContract.FontRequestCallback {
87daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        private Typeface mTypeface;
88daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
89daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        private int mSuccessCallCount;
90daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        private int mFailedCallCount;
91daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
92daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        public void onTypefaceRetrieved(Typeface typeface) {
93daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            mTypeface = typeface;
94daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            mSuccessCallCount++;
95daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        }
96daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
97daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        public void onTypefaceRequestFailed(int reason) {
98daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            mFailedCallCount++;
99daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        }
100daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
101daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        public Typeface getTypeface() {
102daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            return mTypeface;
103daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        }
104daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
105daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        public int getSuccessCallCount() {
106daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            return mSuccessCallCount;
107daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        }
108daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
109daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        public int getFailedCallCount() {
110daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            return mFailedCallCount;
111daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        }
112daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    }
113daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
114daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    @Test
115daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    public void typefaceCacheTest() throws NameNotFoundException {
116daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        Instrumentation inst = InstrumentationRegistry.getInstrumentation();
117daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        Context ctx = inst.getTargetContext();
118daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
119daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        final TestCallback callback = new TestCallback();
120daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        inst.runOnMainSync(() -> {
121daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            FontRequest request = new FontRequest(
122daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                    AUTHORITY, PACKAGE, "singleFontFamily", SIGNATURE);
1238ea62b036dd28231cb07beb210d361d9341c618eSeigo Nonaka            FontsContract.requestFonts(ctx, request, new Handler(), null, callback);
124daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        });
125daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        inst.waitForIdleSync();
126daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertEquals(1, callback.getSuccessCallCount());
127daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertEquals(0, callback.getFailedCallCount());
128daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertNotNull(callback.getTypeface());
129daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
130daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        final TestCallback callback2 = new TestCallback();
131daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        inst.runOnMainSync(() -> {
132daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            FontRequest request = new FontRequest(
133daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                    AUTHORITY, PACKAGE, "singleFontFamily", SIGNATURE);
1348ea62b036dd28231cb07beb210d361d9341c618eSeigo Nonaka            FontsContract.requestFonts(ctx, request, new Handler(), null, callback2);
135daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        });
136daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        inst.waitForIdleSync();
137daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertEquals(1, callback2.getSuccessCallCount());
138daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertEquals(0, callback2.getFailedCallCount());
139daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertSame(callback.getTypeface(), callback2.getTypeface());
140daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
141daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        final TestCallback callback3 = new TestCallback();
142daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        inst.runOnMainSync(() -> {
143daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka            FontRequest request = new FontRequest(
144daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                    AUTHORITY, PACKAGE, "singleFontFamily2", SIGNATURE);
1458ea62b036dd28231cb07beb210d361d9341c618eSeigo Nonaka            FontsContract.requestFonts(ctx, request, new Handler(), null, callback3);
146daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        });
147daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        inst.waitForIdleSync();
148daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertEquals(1, callback3.getSuccessCallCount());
149daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertEquals(0, callback3.getFailedCallCount());
150daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertNotSame(callback.getTypeface(), callback3.getTypeface());
151daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    }
152daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
153daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    @Test
154daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    public void typefaceNotCacheTest() throws NameNotFoundException {
155daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        Instrumentation inst = InstrumentationRegistry.getInstrumentation();
156daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        Context ctx = inst.getTargetContext();
157daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
158daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        FontRequest request = new FontRequest(
159daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                AUTHORITY, PACKAGE, "singleFontFamily", SIGNATURE);
160daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        FontFamilyResult result = FontsContract.fetchFonts(
161daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                ctx, null /* cancellation signal */, request);
162daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertEquals(FontFamilyResult.STATUS_OK, result.getStatusCode());
163daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        Typeface typeface = FontsContract.buildTypeface(
164daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                ctx, null /* cancellation signal */, result.getFonts());
165daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
166daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        FontFamilyResult result2 = FontsContract.fetchFonts(
167daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                ctx, null /* cancellation signal */, request);
168daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertEquals(FontFamilyResult.STATUS_OK, result2.getStatusCode());
169daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        Typeface typeface2 = FontsContract.buildTypeface(
170daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka                ctx, null /* cancellation signal */, result2.getFonts());
171daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka
172daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        // Neighter fetchFonts nor buildTypeface should cache the Typeface.
173daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka        assertNotSame(typeface, typeface2);
174daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka    }
175d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka
176d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    @Test
177d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    public void typefaceNullFdTest() throws NameNotFoundException {
178d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        Instrumentation inst = InstrumentationRegistry.getInstrumentation();
179d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        Context ctx = inst.getTargetContext();
180d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka
181d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        FontRequest request = new FontRequest(
182d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka                AUTHORITY, PACKAGE, MockFontProvider.NULL_FD_QUERY, SIGNATURE);
183d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        FontFamilyResult result = FontsContract.fetchFonts(
184d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka                ctx, null /* cancellation signal */, request);
185d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        assertNull(FontsContract.buildTypeface(
186d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka                ctx, null /* cancellation signal */, result.getFonts()));
187d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    }
188d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka
189d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    @Test
190d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    public void getFontSyncTest() {
191d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        FontRequest request = new FontRequest(AUTHORITY, PACKAGE, "singleFontFamily", SIGNATURE);
192d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        assertNotNull(FontsContract.getFontSync(request));
193d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    }
194d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka
195d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    @Test
196d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    public void getFontSyncTest_timeout() {
197d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        FontRequest request = new FontRequest(
198d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka                AUTHORITY, PACKAGE, MockFontProvider.BLOCKING_QUERY, SIGNATURE);
199d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        assertNull(FontsContract.getFontSync(request));
200d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka        MockFontProvider.unblock();
201d9de8be233d18ccc881cb647a5de2b32ff3e737cSeigo Nonaka    }
202daa8dfc690c4755510ccc15da5ed5bbdd9731fa4Seigo Nonaka}
203