1 /*
2  * Copyright (C) 2017 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 package android.content.res;
18 
19 import static android.content.res.FontResourcesParser.FamilyResourceEntry;
20 import static android.content.res.FontResourcesParser.FontFamilyFilesResourceEntry;
21 import static android.content.res.FontResourcesParser.FontFileResourceEntry;
22 import static android.content.res.FontResourcesParser.ProviderResourceEntry;
23 
24 import static junit.framework.Assert.assertTrue;
25 
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28 
29 import android.app.Instrumentation;
30 import android.platform.test.annotations.Presubmit;
31 
32 import androidx.test.InstrumentationRegistry;
33 import androidx.test.filters.SmallTest;
34 import androidx.test.runner.AndroidJUnit4;
35 
36 import com.android.frameworks.coretests.R;
37 
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 import org.xmlpull.v1.XmlPullParserException;
42 
43 import java.io.IOException;
44 import java.util.List;
45 
46 /**
47  * Tests for {@link FontResourcesParser}.
48  */
49 @Presubmit
50 @SmallTest
51 @RunWith(AndroidJUnit4.class)
52 public class FontResourcesParserTest {
53 
54     private Instrumentation mInstrumentation;
55     private Resources mResources;
56 
57     @Before
setup()58     public void setup() {
59         mInstrumentation = InstrumentationRegistry.getInstrumentation();
60         mResources = mInstrumentation.getContext().getResources();
61     }
62 
63     @Test
testParse()64     public void testParse() throws XmlPullParserException, IOException {
65         XmlResourceParser parser = mResources.getXml(R.font.samplexmlfontforparsing);
66 
67         FamilyResourceEntry result = FontResourcesParser.parse(parser, mResources);
68 
69         assertNotNull(result);
70         FontFamilyFilesResourceEntry filesEntry = (FontFamilyFilesResourceEntry) result;
71         FontFileResourceEntry[] fileEntries = filesEntry.getEntries();
72         assertEquals(4, fileEntries.length);
73         FontFileResourceEntry font1 = fileEntries[0];
74         assertEquals(400, font1.getWeight());
75         assertEquals(0, font1.getItalic());
76         assertEquals("'wdth' 0.8", font1.getVariationSettings());
77         assertEquals(0, font1.getTtcIndex());
78         assertEquals("res/font/samplefont.ttf", font1.getFileName());
79         FontFileResourceEntry font2 = fileEntries[1];
80         assertEquals(400, font2.getWeight());
81         assertEquals(1, font2.getItalic());
82         assertEquals(1, font2.getTtcIndex());
83         assertEquals("'cntr' 0.5", font2.getVariationSettings());
84         assertEquals("res/font/samplefont2.ttf", font2.getFileName());
85         FontFileResourceEntry font3 = fileEntries[2];
86         assertEquals(800, font3.getWeight());
87         assertEquals(0, font3.getItalic());
88         assertEquals(2, font3.getTtcIndex());
89         assertEquals("'wdth' 500.0, 'wght' 300.0", font3.getVariationSettings());
90         assertEquals("res/font/samplefont3.ttf", font3.getFileName());
91         FontFileResourceEntry font4 = fileEntries[3];
92         assertEquals(800, font4.getWeight());
93         assertEquals(1, font4.getItalic());
94         assertEquals(0, font4.getTtcIndex());
95         assertEquals(null, font4.getVariationSettings());
96         assertEquals("res/font/samplefont4.ttf", font4.getFileName());
97     }
98 
99     @Test
testParseDownloadableFont()100     public void testParseDownloadableFont() throws IOException, XmlPullParserException {
101         XmlResourceParser parser = mResources.getXml(R.font.samplexmldownloadedfont);
102 
103         FamilyResourceEntry result = FontResourcesParser.parse(parser, mResources);
104 
105         assertNotNull(result);
106         ProviderResourceEntry providerEntry = (ProviderResourceEntry) result;
107         assertEquals("com.example.test.fontprovider.authority", providerEntry.getAuthority());
108         assertEquals("com.example.test.fontprovider.package", providerEntry.getPackage());
109         assertEquals("MyRequestedFont", providerEntry.getQuery());
110         assertEquals("my-request-font", providerEntry.getSystemFontFamilyName());
111     }
112 
113     @Test
testParseDownloadableFont_singleCerts()114     public void testParseDownloadableFont_singleCerts() throws IOException, XmlPullParserException {
115         XmlResourceParser parser = mResources.getXml(R.font.samplexmldownloadedfontsinglecerts);
116 
117         FamilyResourceEntry result = FontResourcesParser.parse(parser, mResources);
118 
119         assertNotNull(result);
120         assertTrue(result instanceof ProviderResourceEntry);
121         ProviderResourceEntry providerResourceEntry = (ProviderResourceEntry) result;
122         assertEquals("com.example.test.fontprovider", providerResourceEntry.getAuthority());
123         assertEquals("MyRequestedFont", providerResourceEntry.getQuery());
124         assertEquals("com.example.test.fontprovider.package", providerResourceEntry.getPackage());
125         List<List<String>> certList = providerResourceEntry.getCerts();
126         assertNotNull(certList);
127         assertEquals(1, certList.size());
128         List<String> certs = certList.get(0);
129         assertEquals(2, certs.size());
130         assertEquals("123456789", certs.get(0));
131         assertEquals("987654321", certs.get(1));
132     }
133 
134     @Test
testParseDownloadableFont_multipleCerts()135     public void testParseDownloadableFont_multipleCerts() throws IOException, XmlPullParserException {
136         XmlResourceParser parser = mResources.getXml(R.font.samplexmldownloadedfontmulticerts);
137 
138         FamilyResourceEntry result = FontResourcesParser.parse(parser, mResources);
139 
140         assertNotNull(result);
141         assertTrue(result instanceof ProviderResourceEntry);
142         ProviderResourceEntry providerResourceEntry = (ProviderResourceEntry) result;
143         assertEquals("com.example.test.fontprovider", providerResourceEntry.getAuthority());
144         assertEquals("MyRequestedFont", providerResourceEntry.getQuery());
145         assertEquals("com.example.test.fontprovider.package", providerResourceEntry.getPackage());
146         List<List<String>> certList = providerResourceEntry.getCerts();
147         assertNotNull(certList);
148         assertEquals(2, certList.size());
149         List<String> certs1 = certList.get(0);
150         assertEquals(2, certs1.size());
151         assertEquals("123456789", certs1.get(0));
152         assertEquals("987654321", certs1.get(1));
153         List<String> certs2 = certList.get(1);
154         assertEquals(2, certs2.size());
155         assertEquals("abcdefg", certs2.get(0));
156         assertEquals("gfedcba", certs2.get(1));
157     }
158 }
159