blob: 88d162b34144ef294d9ce8796cd6a7aba5dd1a58 [file] [log] [blame]
Tony Makba228422018-10-25 21:30:40 +01001/*
2 * Copyright (C) 2018 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 */
16package android.view.textclassifier;
17
18import static com.google.common.truth.Truth.assertThat;
19
20import static org.mockito.Mockito.when;
21
22import android.os.LocaleList;
23import android.support.test.InstrumentationRegistry;
24import android.support.test.filters.SmallTest;
25import android.support.test.runner.AndroidJUnit4;
26
27import org.junit.After;
28import org.junit.Before;
29import org.junit.Test;
30import org.junit.runner.RunWith;
31import org.mockito.Mock;
32import org.mockito.MockitoAnnotations;
33
34import java.io.File;
35import java.io.IOException;
36import java.util.Arrays;
37import java.util.Collections;
38import java.util.List;
39import java.util.Locale;
40import java.util.function.Supplier;
41import java.util.stream.Collectors;
42
43@SmallTest
44@RunWith(AndroidJUnit4.class)
45public class ModelFileManagerTest {
Tony Makadbebcc2018-10-30 18:59:06 +000046 private static final Locale DEFAULT_LOCALE = Locale.forLanguageTag("en-US");
Tony Makba228422018-10-25 21:30:40 +010047 @Mock
48 private Supplier<List<ModelFileManager.ModelFile>> mModelFileSupplier;
49 private ModelFileManager.ModelFileSupplierImpl mModelFileSupplierImpl;
50 private ModelFileManager mModelFileManager;
51 private File mRootTestDir;
52 private File mFactoryModelDir;
53 private File mUpdatedModelFile;
54
55 @Before
56 public void setup() {
57 MockitoAnnotations.initMocks(this);
58 mModelFileManager = new ModelFileManager(mModelFileSupplier);
59 mRootTestDir = InstrumentationRegistry.getContext().getCacheDir();
60 mFactoryModelDir = new File(mRootTestDir, "factory");
61 mUpdatedModelFile = new File(mRootTestDir, "updated.model");
62
63 mModelFileSupplierImpl =
64 new ModelFileManager.ModelFileSupplierImpl(
65 mFactoryModelDir,
66 "test\\d.model",
67 mUpdatedModelFile,
68 fd -> 1,
69 fd -> ModelFileManager.ModelFile.LANGUAGE_INDEPENDENT
70 );
71
72 mRootTestDir.mkdirs();
73 mFactoryModelDir.mkdirs();
Tony Makadbebcc2018-10-30 18:59:06 +000074
75 Locale.setDefault(DEFAULT_LOCALE);
Tony Makba228422018-10-25 21:30:40 +010076 }
77
78 @After
79 public void removeTestDir() {
80 recursiveDelete(mRootTestDir);
81 }
82
83 @Test
84 public void get() {
85 ModelFileManager.ModelFile modelFile =
86 new ModelFileManager.ModelFile(
87 new File("/path/a"), 1, Collections.emptyList(), true);
88 when(mModelFileSupplier.get()).thenReturn(Collections.singletonList(modelFile));
89
90 List<ModelFileManager.ModelFile> modelFiles = mModelFileManager.listModelFiles();
91
92 assertThat(modelFiles).hasSize(1);
93 assertThat(modelFiles.get(0)).isEqualTo(modelFile);
94 }
95
96 @Test
97 public void findBestModel_versionCode() {
98 ModelFileManager.ModelFile olderModelFile =
99 new ModelFileManager.ModelFile(
100 new File("/path/a"), 1,
101 Collections.emptyList(), true);
102
103 ModelFileManager.ModelFile newerModelFile =
104 new ModelFileManager.ModelFile(
105 new File("/path/b"), 2,
106 Collections.emptyList(), true);
107 when(mModelFileSupplier.get())
108 .thenReturn(Arrays.asList(olderModelFile, newerModelFile));
109
110 ModelFileManager.ModelFile bestModelFile =
111 mModelFileManager.findBestModelFile(LocaleList.getEmptyLocaleList());
112
113 assertThat(bestModelFile).isEqualTo(newerModelFile);
114 }
115
116 @Test
117 public void findBestModel_languageDependentModelIsPreferred() {
118 Locale locale = Locale.forLanguageTag("ja");
119 ModelFileManager.ModelFile languageIndependentModelFile =
120 new ModelFileManager.ModelFile(
121 new File("/path/a"), 1,
122 Collections.emptyList(), true);
123
124 ModelFileManager.ModelFile languageDependentModelFile =
125 new ModelFileManager.ModelFile(
126 new File("/path/b"), 1,
127 Collections.singletonList(locale), false);
128 when(mModelFileSupplier.get())
129 .thenReturn(
130 Arrays.asList(languageIndependentModelFile, languageDependentModelFile));
131
132 ModelFileManager.ModelFile bestModelFile =
133 mModelFileManager.findBestModelFile(
134 LocaleList.forLanguageTags(locale.toLanguageTag()));
135 assertThat(bestModelFile).isEqualTo(languageDependentModelFile);
136 }
137
138 @Test
Tony Makadbebcc2018-10-30 18:59:06 +0000139 public void findBestModel_noMatchedLanguageModel() {
Tony Makba228422018-10-25 21:30:40 +0100140 Locale locale = Locale.forLanguageTag("ja");
141 ModelFileManager.ModelFile languageIndependentModelFile =
142 new ModelFileManager.ModelFile(
143 new File("/path/a"), 1,
144 Collections.emptyList(), true);
145
146 ModelFileManager.ModelFile languageDependentModelFile =
147 new ModelFileManager.ModelFile(
148 new File("/path/b"), 1,
149 Collections.singletonList(locale), false);
150
151 when(mModelFileSupplier.get())
152 .thenReturn(
153 Arrays.asList(languageIndependentModelFile, languageDependentModelFile));
154
155 ModelFileManager.ModelFile bestModelFile =
156 mModelFileManager.findBestModelFile(
157 LocaleList.forLanguageTags("zh-hk"));
158 assertThat(bestModelFile).isEqualTo(languageIndependentModelFile);
159 }
160
161 @Test
Tony Makadbebcc2018-10-30 18:59:06 +0000162 public void findBestModel_noMatchedLanguageModel_defaultLocaleModelExists() {
163 ModelFileManager.ModelFile languageIndependentModelFile =
164 new ModelFileManager.ModelFile(
165 new File("/path/a"), 1,
166 Collections.emptyList(), true);
167
168 ModelFileManager.ModelFile languageDependentModelFile =
169 new ModelFileManager.ModelFile(
170 new File("/path/b"), 1,
171 Collections.singletonList(DEFAULT_LOCALE), false);
172
173 when(mModelFileSupplier.get())
174 .thenReturn(
175 Arrays.asList(languageIndependentModelFile, languageDependentModelFile));
176
177 ModelFileManager.ModelFile bestModelFile =
178 mModelFileManager.findBestModelFile(
179 LocaleList.forLanguageTags("zh-hk"));
180 assertThat(bestModelFile).isEqualTo(languageIndependentModelFile);
181 }
182
183 @Test
Tony Makba228422018-10-25 21:30:40 +0100184 public void findBestModel_languageIsMoreImportantThanVersion() {
185 ModelFileManager.ModelFile matchButOlderModel =
186 new ModelFileManager.ModelFile(
187 new File("/path/a"), 1,
188 Collections.singletonList(Locale.forLanguageTag("fr")), false);
189
190 ModelFileManager.ModelFile mismatchButNewerModel =
191 new ModelFileManager.ModelFile(
192 new File("/path/b"), 2,
193 Collections.singletonList(Locale.forLanguageTag("ja")), false);
194
195 when(mModelFileSupplier.get())
196 .thenReturn(
197 Arrays.asList(matchButOlderModel, mismatchButNewerModel));
198
199 ModelFileManager.ModelFile bestModelFile =
200 mModelFileManager.findBestModelFile(
201 LocaleList.forLanguageTags("fr"));
202 assertThat(bestModelFile).isEqualTo(matchButOlderModel);
203 }
204
205 @Test
Tony Mak9d209612018-11-14 21:09:03 +0000206 public void findBestModel_languageIsMoreImportantThanVersion_bestModelComesFirst() {
207 ModelFileManager.ModelFile matchLocaleModel =
208 new ModelFileManager.ModelFile(
209 new File("/path/b"), 1,
210 Collections.singletonList(Locale.forLanguageTag("ja")), false);
211
212 ModelFileManager.ModelFile languageIndependentModel =
213 new ModelFileManager.ModelFile(
214 new File("/path/a"), 2,
215 Collections.emptyList(), true);
216 when(mModelFileSupplier.get())
217 .thenReturn(
218 Arrays.asList(matchLocaleModel, languageIndependentModel));
219
220 ModelFileManager.ModelFile bestModelFile =
221 mModelFileManager.findBestModelFile(
222 LocaleList.forLanguageTags("ja"));
223
224 assertThat(bestModelFile).isEqualTo(matchLocaleModel);
225 }
226
227 @Test
Tony Makba228422018-10-25 21:30:40 +0100228 public void modelFileEquals() {
229 ModelFileManager.ModelFile modelA =
230 new ModelFileManager.ModelFile(
231 new File("/path/a"), 1,
232 Collections.singletonList(Locale.forLanguageTag("ja")), false);
233
234 ModelFileManager.ModelFile modelB =
235 new ModelFileManager.ModelFile(
236 new File("/path/a"), 1,
237 Collections.singletonList(Locale.forLanguageTag("ja")), false);
238
239 assertThat(modelA).isEqualTo(modelB);
240 }
241
242 @Test
243 public void modelFile_different() {
244 ModelFileManager.ModelFile modelA =
245 new ModelFileManager.ModelFile(
246 new File("/path/a"), 1,
247 Collections.singletonList(Locale.forLanguageTag("ja")), false);
248
249 ModelFileManager.ModelFile modelB =
250 new ModelFileManager.ModelFile(
251 new File("/path/b"), 1,
252 Collections.singletonList(Locale.forLanguageTag("ja")), false);
253
254 assertThat(modelA).isNotEqualTo(modelB);
255 }
256
257
258 @Test
259 public void modelFile_getPath() {
260 ModelFileManager.ModelFile modelA =
261 new ModelFileManager.ModelFile(
262 new File("/path/a"), 1,
263 Collections.singletonList(Locale.forLanguageTag("ja")), false);
264
265 assertThat(modelA.getPath()).isEqualTo("/path/a");
266 }
267
268 @Test
269 public void modelFile_getName() {
270 ModelFileManager.ModelFile modelA =
271 new ModelFileManager.ModelFile(
272 new File("/path/a"), 1,
273 Collections.singletonList(Locale.forLanguageTag("ja")), false);
274
275 assertThat(modelA.getName()).isEqualTo("a");
276 }
277
278 @Test
279 public void modelFile_isPreferredTo_languageDependentIsBetter() {
280 ModelFileManager.ModelFile modelA =
281 new ModelFileManager.ModelFile(
282 new File("/path/a"), 1,
283 Collections.singletonList(Locale.forLanguageTag("ja")), false);
284
285 ModelFileManager.ModelFile modelB =
286 new ModelFileManager.ModelFile(
287 new File("/path/b"), 2,
288 Collections.emptyList(), true);
289
290 assertThat(modelA.isPreferredTo(modelB)).isTrue();
291 }
292
293 @Test
294 public void modelFile_isPreferredTo_version() {
295 ModelFileManager.ModelFile modelA =
296 new ModelFileManager.ModelFile(
297 new File("/path/a"), 2,
298 Collections.singletonList(Locale.forLanguageTag("ja")), false);
299
300 ModelFileManager.ModelFile modelB =
301 new ModelFileManager.ModelFile(
302 new File("/path/b"), 1,
303 Collections.emptyList(), false);
304
305 assertThat(modelA.isPreferredTo(modelB)).isTrue();
306 }
307
308 @Test
309 public void testFileSupplierImpl_updatedFileOnly() throws IOException {
310 mUpdatedModelFile.createNewFile();
311 File model1 = new File(mFactoryModelDir, "test1.model");
312 model1.createNewFile();
313 File model2 = new File(mFactoryModelDir, "test2.model");
314 model2.createNewFile();
315 new File(mFactoryModelDir, "not_match_regex.model").createNewFile();
316
317 List<ModelFileManager.ModelFile> modelFiles = mModelFileSupplierImpl.get();
318 List<String> modelFilePaths =
319 modelFiles
320 .stream()
321 .map(modelFile -> modelFile.getPath())
322 .collect(Collectors.toList());
323
324 assertThat(modelFiles).hasSize(3);
325 assertThat(modelFilePaths).containsExactly(
326 mUpdatedModelFile.getAbsolutePath(),
327 model1.getAbsolutePath(),
328 model2.getAbsolutePath());
329 }
330
331 @Test
332 public void testFileSupplierImpl_empty() {
333 mFactoryModelDir.delete();
334 List<ModelFileManager.ModelFile> modelFiles = mModelFileSupplierImpl.get();
335
336 assertThat(modelFiles).hasSize(0);
337 }
338
339 private static void recursiveDelete(File f) {
340 if (f.isDirectory()) {
341 for (File innerFile : f.listFiles()) {
342 recursiveDelete(innerFile);
343 }
344 }
345 f.delete();
346 }
347}