FontsContractCompatTest.java revision 56489fe7b61a3dd6d70fc7ff7a4e5b129773797c
1bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong/*
2bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * Copyright (C) 2017 The Android Open Source Project
3bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong *
4bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * Licensed under the Apache License, Version 2.0 (the "License");
5bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * you may not use this file except in compliance with the License.
6bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * You may obtain a copy of the License at
7bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong *
8bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong *      http://www.apache.org/licenses/LICENSE-2.0
9bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong *
10bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * Unless required by applicable law or agreed to in writing, software
11bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * distributed under the License is distributed on an "AS IS" BASIS,
12bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * See the License for the specific language governing permissions and
14bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong * limitations under the License.
15bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong */
16bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongpackage android.support.v4.provider;
17bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
18bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static android.support.v4.provider.FontsContractCompat.Columns.RESULT_CODE_FONT_NOT_FOUND;
19bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static android.support.v4.provider.FontsContractCompat.Columns.RESULT_CODE_FONT_UNAVAILABLE;
20bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static android.support.v4.provider.FontsContractCompat.Columns.RESULT_CODE_MALFORMED_QUERY;
21bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static android.support.v4.provider.FontsContractCompat.Columns.RESULT_CODE_OK;
22bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
23bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static org.junit.Assert.assertEquals;
24bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static org.junit.Assert.assertNotNull;
25cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport static org.junit.Assert.assertNotSame;
266a9babad6eb8ac3e79a5e036d878ed7408e79f26Igor Murashkinimport static org.junit.Assert.assertNull;
27bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static org.junit.Assert.assertTrue;
28bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static org.junit.Assert.fail;
29a0842b40441db5332a5290f941021636b1182761Sol Boucherimport static org.mockito.Matchers.anyInt;
30a0842b40441db5332a5290f941021636b1182761Sol Boucherimport static org.mockito.Matchers.anyString;
31bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static org.mockito.Mockito.mock;
32bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport static org.mockito.Mockito.when;
33bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
344f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucherimport android.app.Instrumentation;
354f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucherimport android.content.Context;
36bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.content.pm.ApplicationInfo;
37bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.content.pm.PackageInfo;
38bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.content.pm.PackageManager;
39bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.content.pm.PackageManager.NameNotFoundException;
40bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.content.pm.ProviderInfo;
41bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.content.pm.Signature;
42bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.graphics.Typeface;
43bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.support.test.InstrumentationRegistry;
44bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kongimport android.support.test.filters.SmallTest;
45a0842b40441db5332a5290f941021636b1182761Sol Boucherimport android.support.test.runner.AndroidJUnit4;
462d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Huimport android.support.v4.provider.FontsContractCompat.FontFamilyResult;
47cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport android.support.v4.provider.FontsContractCompat.FontInfo;
48a0842b40441db5332a5290f941021636b1182761Sol Boucherimport android.util.Base64;
49a0842b40441db5332a5290f941021636b1182761Sol Boucher
50cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport org.junit.After;
51cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport org.junit.Before;
52cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport org.junit.Test;
53cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport org.junit.runner.RunWith;
54cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
55cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport java.util.ArrayList;
56cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport java.util.Arrays;
57cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport java.util.Collections;
58cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherimport java.util.List;
59cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
60cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher/**
61cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher * Unit tests for {@link FontsContractCompat}.
62cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher */
63cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher@RunWith(AndroidJUnit4.class)
64cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher@SmallTest
65cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucherpublic class FontsContractCompatTest {
66cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private static final String AUTHORITY = "android.provider.fonts.font";
67cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private static final String PACKAGE = "android.support.compat.test";
68cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
69cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    // Signature to be used for authentication to access content provider.
70cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    // In this test case, the content provider and consumer live in the same package, self package's
71cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    // signature works.
72cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private static final List<List<byte[]>> SIGNATURE;
73cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    static {
74cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
75a0842b40441db5332a5290f941021636b1182761Sol Boucher        try {
76cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            PackageManager manager = context.getPackageManager();
77cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            PackageInfo info = manager.getPackageInfo(
78cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher                    context.getPackageName(), PackageManager.GET_SIGNATURES);
79cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            ArrayList<byte[]> out = new ArrayList<>();
80cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            for (Signature sig : info.signatures) {
81cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher                out.add(sig.toByteArray());
82cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            }
83cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            SIGNATURE = new ArrayList<>();
84cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            SIGNATURE.add(out);
85cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        } catch (PackageManager.NameNotFoundException e) {
86cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            throw new RuntimeException(e);
87cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        }
88cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    }
89cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
90cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private static final byte[] BYTE_ARRAY =
91cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            Base64.decode("e04fd020ea3a6910a2d808002b30", Base64.DEFAULT);
92cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    // Use a different instance to test byte array comparison
93cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private static final byte[] BYTE_ARRAY_COPY =
94cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            Base64.decode("e04fd020ea3a6910a2d808002b30", Base64.DEFAULT);
95cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private static final byte[] BYTE_ARRAY_2 =
96cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            Base64.decode("e04fd020ea3a6910a2d808002b32", Base64.DEFAULT);
97cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private Instrumentation mInstrumentation;
98cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private Context mContext;
99cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
100cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    @Before
101cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    public void setUp() throws Exception {
102cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        mInstrumentation = InstrumentationRegistry.getInstrumentation();
103cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        mContext = mInstrumentation.getTargetContext();
104cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        MockFontProvider.prepareFontFiles(
105cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher                InstrumentationRegistry.getInstrumentation().getTargetContext());
106cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    }
107cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
108cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    @After
109cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    public void tearDown() {
110cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        MockFontProvider.cleanUpFontFiles(
111cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher                InstrumentationRegistry.getInstrumentation().getTargetContext());
112cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    }
113cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
114cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    private static class TestCallback extends FontsContractCompat.FontRequestCallback {
115cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        private Typeface mTypeface;
116cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
117a0842b40441db5332a5290f941021636b1182761Sol Boucher        private int mSuccessCallCount;
118cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        private int mFailedCallCount;
119cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
120cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        public void onTypefaceRetrieved(Typeface typeface) {
121cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            mTypeface = typeface;
122cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            mSuccessCallCount++;
123cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        }
124cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
125cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        public void onTypefaceRequestFailed(int reason) {
126a0842b40441db5332a5290f941021636b1182761Sol Boucher            mFailedCallCount++;
127cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        }
128cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
129cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        public Typeface getTypeface() {
130cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            return mTypeface;
131cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        }
132cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
133cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        public int getSuccessCallCount() {
134cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            return mSuccessCallCount;
135a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
136cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
137cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        public int getFailedCallCount() {
138cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher            return mFailedCallCount;
139cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        }
140cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    }
141cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
142cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    @Test
143cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher    public void typefaceNotCacheTest() throws NameNotFoundException {
144a0842b40441db5332a5290f941021636b1182761Sol Boucher        FontRequest request = new FontRequest(
145cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher                AUTHORITY, PACKAGE, MockFontProvider.SINGLE_FONT_FAMILY_QUERY, SIGNATURE);
146cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        FontFamilyResult result = FontsContractCompat.fetchFonts(
147cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher                mContext, null /* cancellation signal */, request);
1484f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher        assertEquals(FontFamilyResult.STATUS_OK, result.getStatusCode());
149cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        Typeface typeface = FontsContractCompat.buildTypeface(
150cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher                mContext, null /* cancellation signal */, result.getFonts());
151cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher
152cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        FontFamilyResult result2 = FontsContractCompat.fetchFonts(
153a0842b40441db5332a5290f941021636b1182761Sol Boucher                mContext, null /* cancellation signal */, request);
154cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        assertEquals(FontFamilyResult.STATUS_OK, result2.getStatusCode());
155cef46862d6937bc98bf1a6b087c5daa22b5239f3Sol Boucher        Typeface typeface2 = FontsContractCompat.buildTypeface(
156bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                mContext, null /* cancellation signal */, result2.getFonts());
157bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
158bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        // Neither fetchFonts nor buildTypeface should cache the Typeface.
159bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotSame(typeface, typeface2);
160bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
161a0842b40441db5332a5290f941021636b1182761Sol Boucher
162bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    @Test
163bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetFontFromProvider_resultOK() {
164bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest request = new FontRequest(
165bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, PACKAGE, MockFontProvider.SINGLE_FONT_FAMILY2_QUERY, SIGNATURE);
166bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo[] fonts = FontsContractCompat.getFontFromProvider(
167bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                mContext, request, AUTHORITY, null);
168bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotNull(fonts);
169a0842b40441db5332a5290f941021636b1182761Sol Boucher        assertEquals(1, fonts.length);
170bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo font = fonts[0];
171bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(0, font.getTtcIndex());
172bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(700, font.getWeight());
173bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertTrue(font.isItalic());
174bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotNull(font.getUri());
175bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_OK, font.getResultCode());
176bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
177a0842b40441db5332a5290f941021636b1182761Sol Boucher
178bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    @Test
179bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetFontFromProvider_providerDoesntReturnAllFields() {
180bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest request = new FontRequest(
181bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, PACKAGE, MockFontProvider.MANDATORY_FIELDS_ONLY_QUERY, SIGNATURE);
182bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo[] fonts = FontsContractCompat.getFontFromProvider(
183bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                mContext, request, AUTHORITY, null);
184bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotNull(fonts);
185a0842b40441db5332a5290f941021636b1182761Sol Boucher        assertEquals(1, fonts.length);
186bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo font = fonts[0];
187bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(0, font.getTtcIndex());
188bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_OK, font.getResultCode());
189bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
190bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
191bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    @Test
192bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetFontFromProvider_resultFontNotFound() {
193a0842b40441db5332a5290f941021636b1182761Sol Boucher        FontRequest request = new FontRequest(
194bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, PACKAGE, MockFontProvider.NOT_FOUND_QUERY, SIGNATURE);
195bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo[] fonts = FontsContractCompat.getFontFromProvider(
196bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                mContext, request, AUTHORITY, null);
197bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotNull(fonts);
198bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(1, fonts.length);
199bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo font = fonts[0];
200bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_FONT_NOT_FOUND, font.getResultCode());
201a0842b40441db5332a5290f941021636b1182761Sol Boucher    }
202bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
203bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    @Test
204bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetFontFromProvider_resultFontUnavailable() {
205bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest request = new FontRequest(
206bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, PACKAGE, MockFontProvider.UNAVAILABLE_QUERY, SIGNATURE);
207bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo[] fonts = FontsContractCompat.getFontFromProvider(
208bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                mContext, request, AUTHORITY, null);
209a0842b40441db5332a5290f941021636b1182761Sol Boucher
210bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotNull(fonts);
211bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(1, fonts.length);
212bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo font = fonts[0];
213bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_FONT_UNAVAILABLE, font.getResultCode());
214bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
215bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
216bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    @Test
217bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetFontFromProvider_resultMalformedQuery() {
218bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest request = new FontRequest(
219bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, PACKAGE, MockFontProvider.MALFORMED_QUERY, SIGNATURE);
2207e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        FontInfo[] fonts = FontsContractCompat.getFontFromProvider(
2217e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong                mContext, request, AUTHORITY, null);
222a0842b40441db5332a5290f941021636b1182761Sol Boucher
2237e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        assertNotNull(fonts);
2247e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        assertEquals(1, fonts.length);
2257e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        FontInfo font = fonts[0];
2267e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        assertEquals(RESULT_CODE_MALFORMED_QUERY, font.getResultCode());
2277e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong    }
2287e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong
2297e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong    @Test
23060520c4df78e595964605cf8acfa21bbafaeba84Angus Kong    public void testGetFontFromProvider_resultFontNotFoundSecondRow() {
231bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest request = new FontRequest(
232bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, PACKAGE, MockFontProvider.NOT_FOUND_SECOND_QUERY, SIGNATURE);
233bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo[] fonts = FontsContractCompat.getFontFromProvider(
234bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                mContext, request, AUTHORITY, null);
235a0842b40441db5332a5290f941021636b1182761Sol Boucher
236bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotNull(fonts);
237bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(2, fonts.length);
238bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
239bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo font = fonts[0];
240bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_OK, font.getResultCode());
241bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
242bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        font = fonts[1];
243bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_FONT_NOT_FOUND, font.getResultCode());
244bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
245bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
246bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    @Test
247bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetFontFromProvider_resultFontNotFoundOtherRow() {
248bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest request = new FontRequest(
249bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, PACKAGE, MockFontProvider.NOT_FOUND_THIRD_QUERY, SIGNATURE);
250bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo[] fonts = FontsContractCompat.getFontFromProvider(
251bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                mContext, request, AUTHORITY, null);
252bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
253bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotNull(fonts);
254b00b7a67213ee6868eb792b2a63ba0dca888a01fAngus Kong        assertEquals(3, fonts.length);
255bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
256b00b7a67213ee6868eb792b2a63ba0dca888a01fAngus Kong        FontInfo font = fonts[0];
257bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_OK, font.getResultCode());
258bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
259bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        font = fonts[1];
260bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_FONT_NOT_FOUND, font.getResultCode());
261bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
262bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        font = fonts[2];
26360520c4df78e595964605cf8acfa21bbafaeba84Angus Kong        assertEquals(RESULT_CODE_OK, font.getResultCode());
264bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
265bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
266bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetFontFromProvider_resultCodeIsNegativeNumber() {
267bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest request = new FontRequest(
268bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, PACKAGE, MockFontProvider.NEGATIVE_ERROR_CODE_QUERY, SIGNATURE);
2694f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher        FontInfo[] fonts = FontsContractCompat.getFontFromProvider(
270bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                mContext, request, AUTHORITY, null);
271bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
2724f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher
273bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertNotNull(fonts);
274bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(1, fonts.length);
275bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontInfo font = fonts[0];
276bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(RESULT_CODE_FONT_NOT_FOUND, font.getResultCode());
277bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
2784f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher
2794f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher    @Test
280bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetProvider_providerNotFound() {
281bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        PackageManager packageManager = mock(PackageManager.class);
282bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        when(packageManager.resolveContentProvider(anyString(), anyInt())).thenReturn(null);
28360520c4df78e595964605cf8acfa21bbafaeba84Angus Kong
284bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest request = new FontRequest(AUTHORITY, PACKAGE, "query", SIGNATURE);
285bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        try {
286a0842b40441db5332a5290f941021636b1182761Sol Boucher            FontsContractCompat.getProvider(packageManager, request, null);
287a0842b40441db5332a5290f941021636b1182761Sol Boucher            fail();
2882d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        } catch (NameNotFoundException e) {
2892d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu            // pass
2902d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        }
2912d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    }
2922d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu
2932d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    @Test
2942d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    public void testGetProvider_noCerts()
2952d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu            throws PackageManager.NameNotFoundException {
2962d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        PackageManager packageManager = mContext.getPackageManager();
2972d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu
2982d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        List<List<byte[]>> emptyList = Collections.emptyList();
299a0842b40441db5332a5290f941021636b1182761Sol Boucher
30060520c4df78e595964605cf8acfa21bbafaeba84Angus Kong        FontRequest request = new FontRequest(AUTHORITY, PACKAGE, "query", emptyList);
30160520c4df78e595964605cf8acfa21bbafaeba84Angus Kong        assertNull(FontsContractCompat.getProvider(packageManager, request, null));
30260520c4df78e595964605cf8acfa21bbafaeba84Angus Kong    }
30360520c4df78e595964605cf8acfa21bbafaeba84Angus Kong
30460520c4df78e595964605cf8acfa21bbafaeba84Angus Kong    @Test
30560520c4df78e595964605cf8acfa21bbafaeba84Angus Kong    public void testGetProvider_wrongCerts()
30660520c4df78e595964605cf8acfa21bbafaeba84Angus Kong            throws PackageManager.NameNotFoundException {
307a0842b40441db5332a5290f941021636b1182761Sol Boucher        PackageManager packageManager = mock(PackageManager.class);
3082d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        setupPackageManager(packageManager);
3092d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu
3102d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
3112d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        List<byte[]> certList = Arrays.asList(wrongCert);
3122d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        FontRequest requestWrongCerts = new FontRequest(
3132d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu                AUTHORITY, PACKAGE, "query", Arrays.asList(certList));
3142d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu
3152d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        assertNull(FontsContractCompat.getProvider(packageManager, requestWrongCerts, null));
3162d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    }
3172d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu
3182d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    @Test
3192d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    public void testGetProvider_correctCerts()
3202d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu            throws PackageManager.NameNotFoundException {
3212d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        PackageManager packageManager = mock(PackageManager.class);
3222d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        ProviderInfo info = setupPackageManager(packageManager);
3232d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu
3242d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        List<byte[]> certList = Arrays.asList(BYTE_ARRAY);
3252d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        FontRequest requestRightCerts = new FontRequest(
3262d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu                AUTHORITY, PACKAGE, "query", Arrays.asList(certList));
3272d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        ProviderInfo result =
3282d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu                FontsContractCompat.getProvider(packageManager, requestRightCerts, null);
3292d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu
3302d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        assertEquals(info, result);
3312d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    }
332a0842b40441db5332a5290f941021636b1182761Sol Boucher
333a0842b40441db5332a5290f941021636b1182761Sol Boucher    @Test
334bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    public void testGetProvider_moreCerts()
335bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong            throws PackageManager.NameNotFoundException {
3367e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        PackageManager packageManager = mock(PackageManager.class);
3377e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        setupPackageManager(packageManager);
3387e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong
3392d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
3407e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        List<byte[]> certList = Arrays.asList(wrongCert, BYTE_ARRAY);
3417e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        FontRequest requestRightCerts = new FontRequest(
3424f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher                AUTHORITY, PACKAGE, "query", Arrays.asList(certList));
3437e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        assertNull(FontsContractCompat.getProvider(packageManager, requestRightCerts, null));
3447e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong    }
345a0842b40441db5332a5290f941021636b1182761Sol Boucher
3467e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong    @Test
3477e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong    public void testGetProvider_duplicateCerts()
3487e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong            throws PackageManager.NameNotFoundException {
3497e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        PackageManager packageManager = mock(PackageManager.class);
350a0842b40441db5332a5290f941021636b1182761Sol Boucher        setupPackageManager(packageManager);
351a0842b40441db5332a5290f941021636b1182761Sol Boucher        PackageInfo packageInfo = new PackageInfo();
352a0842b40441db5332a5290f941021636b1182761Sol Boucher        Signature signature = mock(Signature.class);
353a0842b40441db5332a5290f941021636b1182761Sol Boucher        when(signature.toByteArray()).thenReturn(BYTE_ARRAY_COPY);
354a0842b40441db5332a5290f941021636b1182761Sol Boucher        Signature signature2 = mock(Signature.class);
355a0842b40441db5332a5290f941021636b1182761Sol Boucher        when(signature2.toByteArray()).thenReturn(BYTE_ARRAY_COPY);
356a0842b40441db5332a5290f941021636b1182761Sol Boucher        packageInfo.packageName = PACKAGE;
357a0842b40441db5332a5290f941021636b1182761Sol Boucher        packageInfo.signatures = new Signature[] { signature, signature2 };
358a0842b40441db5332a5290f941021636b1182761Sol Boucher        when(packageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo);
359a0842b40441db5332a5290f941021636b1182761Sol Boucher
360a0842b40441db5332a5290f941021636b1182761Sol Boucher        // The provider has {BYTE_ARRAY_COPY, BYTE_ARRAY_COPY}, the request has
3617e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        // {BYTE_ARRAY_2, BYTE_ARRAY_COPY}.
3627e6c76ef7faf26aa1060b4abc1c65934b4e45338Angus Kong        List<byte[]> certList = Arrays.asList(BYTE_ARRAY_2, BYTE_ARRAY_COPY);
3632d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        FontRequest requestRightCerts = new FontRequest(
3642d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu                AUTHORITY, PACKAGE, "query", Arrays.asList(certList));
3652d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        assertNull(FontsContractCompat.getProvider(packageManager, requestRightCerts, null));
3662d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    }
3672d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu
3682d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    @Test
3692d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu    public void testGetProvider_correctCertsSeveralSets()
3702d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu            throws PackageManager.NameNotFoundException {
3712d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        PackageManager packageManager = mock(PackageManager.class);
3722d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        ProviderInfo info = setupPackageManager(packageManager);
373bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
374bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        List<List<byte[]>> certList = new ArrayList<>();
375bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
376bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        certList.add(Arrays.asList(wrongCert));
3772d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        certList.add(Arrays.asList(BYTE_ARRAY));
378bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        FontRequest requestRightCerts = new FontRequest(AUTHORITY, PACKAGE, "query", certList);
379bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        ProviderInfo result =
380bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                FontsContractCompat.getProvider(packageManager, requestRightCerts, null);
381bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
382bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        assertEquals(info, result);
383bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
384bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong
385bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    @Test
386a0842b40441db5332a5290f941021636b1182761Sol Boucher    public void testGetProvider_wrongPackage()
387bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong            throws PackageManager.NameNotFoundException {
388bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        PackageManager packageManager = mContext.getPackageManager();
389c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
3904f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher        List<List<byte[]>> certList = new ArrayList<>();
391bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        certList.add(Arrays.asList(BYTE_ARRAY));
392a0842b40441db5332a5290f941021636b1182761Sol Boucher        FontRequest requestRightCerts = new FontRequest(
393bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong                AUTHORITY, "com.wrong.package.name", "query", certList);
394bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        try {
395b30d2c670f1262f0d60181e40dad33f2151fee4aSol Boucher            FontsContractCompat.getProvider(packageManager, requestRightCerts, null);
396b30d2c670f1262f0d60181e40dad33f2151fee4aSol Boucher            fail();
397a0842b40441db5332a5290f941021636b1182761Sol Boucher        } catch (NameNotFoundException e) {
398b30d2c670f1262f0d60181e40dad33f2151fee4aSol Boucher            // pass
399b30d2c670f1262f0d60181e40dad33f2151fee4aSol Boucher        }
400c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
401c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
402a0842b40441db5332a5290f941021636b1182761Sol Boucher    private ProviderInfo setupPackageManager(PackageManager packageManager)
403c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            throws PackageManager.NameNotFoundException {
404c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        ProviderInfo info = new ProviderInfo();
4052d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        info.packageName = PACKAGE;
4062d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        info.applicationInfo = new ApplicationInfo();
4072d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        when(packageManager.resolveContentProvider(anyString(), anyInt())).thenReturn(info);
4082d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        PackageInfo packageInfo = new PackageInfo();
4092d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu        Signature signature = mock(Signature.class);
410bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        when(signature.toByteArray()).thenReturn(BYTE_ARRAY_COPY);
4114f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher        packageInfo.packageName = PACKAGE;
4124f425ba476d62b4be7078f2084af37cf306b31c6Sol Boucher        packageInfo.signatures = new Signature[] { signature };
413bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        when(packageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo);
414bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong        return info;
415bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong    }
416bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong}
417bdaaaf5f0257168590fa8965e4d59b054636e6dfAngus Kong