blob: 79e1406f6ae69c6db81fbde8ef0b233a22abb547 [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 */
Tadashi G. Takaokab4470f22019-01-15 18:29:15 +090016
Tony Makba228422018-10-25 21:30:40 +010017package android.view.textclassifier;
18
19import static com.google.common.truth.Truth.assertThat;
20
21import static org.mockito.Mockito.when;
22
23import android.os.LocaleList;
Tadashi G. Takaokab4470f22019-01-15 18:29:15 +090024
25import androidx.test.InstrumentationRegistry;
26import androidx.test.filters.SmallTest;
27import androidx.test.runner.AndroidJUnit4;
Tony Makba228422018-10-25 21:30:40 +010028
29import org.junit.After;
30import org.junit.Before;
31import org.junit.Test;
32import org.junit.runner.RunWith;
33import org.mockito.Mock;
34import org.mockito.MockitoAnnotations;
35
36import java.io.File;
37import java.io.IOException;
38import java.util.Arrays;
39import java.util.Collections;
40import java.util.List;
41import java.util.Locale;
42import java.util.function.Supplier;
43import java.util.stream.Collectors;
44
45@SmallTest
46@RunWith(AndroidJUnit4.class)
47public class ModelFileManagerTest {
Tony Makadbebcc2018-10-30 18:59:06 +000048 private static final Locale DEFAULT_LOCALE = Locale.forLanguageTag("en-US");
Tony Makba228422018-10-25 21:30:40 +010049 @Mock
50 private Supplier<List<ModelFileManager.ModelFile>> mModelFileSupplier;
51 private ModelFileManager.ModelFileSupplierImpl mModelFileSupplierImpl;
52 private ModelFileManager mModelFileManager;
53 private File mRootTestDir;
54 private File mFactoryModelDir;
55 private File mUpdatedModelFile;
56
57 @Before
58 public void setup() {
59 MockitoAnnotations.initMocks(this);
60 mModelFileManager = new ModelFileManager(mModelFileSupplier);
61 mRootTestDir = InstrumentationRegistry.getContext().getCacheDir();
62 mFactoryModelDir = new File(mRootTestDir, "factory");
63 mUpdatedModelFile = new File(mRootTestDir, "updated.model");
64
65 mModelFileSupplierImpl =
66 new ModelFileManager.ModelFileSupplierImpl(
67 mFactoryModelDir,
68 "test\\d.model",
69 mUpdatedModelFile,
70 fd -> 1,
71 fd -> ModelFileManager.ModelFile.LANGUAGE_INDEPENDENT
72 );
73
74 mRootTestDir.mkdirs();
75 mFactoryModelDir.mkdirs();
Tony Makadbebcc2018-10-30 18:59:06 +000076
77 Locale.setDefault(DEFAULT_LOCALE);
Tony Makba228422018-10-25 21:30:40 +010078 }
79
80 @After
81 public void removeTestDir() {
82 recursiveDelete(mRootTestDir);
83 }
84
85 @Test
86 public void get() {
87 ModelFileManager.ModelFile modelFile =
88 new ModelFileManager.ModelFile(
Tony Mak20fe1872019-03-22 15:35:15 +000089 new File("/path/a"), 1, Collections.emptyList(), "", true);
Tony Makba228422018-10-25 21:30:40 +010090 when(mModelFileSupplier.get()).thenReturn(Collections.singletonList(modelFile));
91
92 List<ModelFileManager.ModelFile> modelFiles = mModelFileManager.listModelFiles();
93
94 assertThat(modelFiles).hasSize(1);
95 assertThat(modelFiles.get(0)).isEqualTo(modelFile);
96 }
97
98 @Test
99 public void findBestModel_versionCode() {
100 ModelFileManager.ModelFile olderModelFile =
101 new ModelFileManager.ModelFile(
102 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000103 Collections.emptyList(), "", true);
Tony Makba228422018-10-25 21:30:40 +0100104
105 ModelFileManager.ModelFile newerModelFile =
106 new ModelFileManager.ModelFile(
107 new File("/path/b"), 2,
Tony Mak20fe1872019-03-22 15:35:15 +0000108 Collections.emptyList(), "", true);
Tony Makba228422018-10-25 21:30:40 +0100109 when(mModelFileSupplier.get())
110 .thenReturn(Arrays.asList(olderModelFile, newerModelFile));
111
112 ModelFileManager.ModelFile bestModelFile =
113 mModelFileManager.findBestModelFile(LocaleList.getEmptyLocaleList());
114
115 assertThat(bestModelFile).isEqualTo(newerModelFile);
116 }
117
118 @Test
119 public void findBestModel_languageDependentModelIsPreferred() {
120 Locale locale = Locale.forLanguageTag("ja");
121 ModelFileManager.ModelFile languageIndependentModelFile =
122 new ModelFileManager.ModelFile(
123 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000124 Collections.emptyList(), "", true);
Tony Makba228422018-10-25 21:30:40 +0100125
126 ModelFileManager.ModelFile languageDependentModelFile =
127 new ModelFileManager.ModelFile(
128 new File("/path/b"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000129 Collections.singletonList(locale), locale.toLanguageTag(), false);
Tony Makba228422018-10-25 21:30:40 +0100130 when(mModelFileSupplier.get())
131 .thenReturn(
132 Arrays.asList(languageIndependentModelFile, languageDependentModelFile));
133
134 ModelFileManager.ModelFile bestModelFile =
135 mModelFileManager.findBestModelFile(
136 LocaleList.forLanguageTags(locale.toLanguageTag()));
137 assertThat(bestModelFile).isEqualTo(languageDependentModelFile);
138 }
139
140 @Test
Tony Makadbebcc2018-10-30 18:59:06 +0000141 public void findBestModel_noMatchedLanguageModel() {
Tony Makba228422018-10-25 21:30:40 +0100142 Locale locale = Locale.forLanguageTag("ja");
143 ModelFileManager.ModelFile languageIndependentModelFile =
144 new ModelFileManager.ModelFile(
145 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000146 Collections.emptyList(), "", true);
Tony Makba228422018-10-25 21:30:40 +0100147
148 ModelFileManager.ModelFile languageDependentModelFile =
149 new ModelFileManager.ModelFile(
150 new File("/path/b"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000151 Collections.singletonList(locale), locale.toLanguageTag(), false);
Tony Makba228422018-10-25 21:30:40 +0100152
153 when(mModelFileSupplier.get())
154 .thenReturn(
155 Arrays.asList(languageIndependentModelFile, languageDependentModelFile));
156
157 ModelFileManager.ModelFile bestModelFile =
158 mModelFileManager.findBestModelFile(
159 LocaleList.forLanguageTags("zh-hk"));
160 assertThat(bestModelFile).isEqualTo(languageIndependentModelFile);
161 }
162
163 @Test
Tony Makadbebcc2018-10-30 18:59:06 +0000164 public void findBestModel_noMatchedLanguageModel_defaultLocaleModelExists() {
165 ModelFileManager.ModelFile languageIndependentModelFile =
166 new ModelFileManager.ModelFile(
167 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000168 Collections.emptyList(), "", true);
Tony Makadbebcc2018-10-30 18:59:06 +0000169
170 ModelFileManager.ModelFile languageDependentModelFile =
171 new ModelFileManager.ModelFile(
172 new File("/path/b"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000173 Collections.singletonList(
174 DEFAULT_LOCALE), DEFAULT_LOCALE.toLanguageTag(), false);
Tony Makadbebcc2018-10-30 18:59:06 +0000175
176 when(mModelFileSupplier.get())
177 .thenReturn(
178 Arrays.asList(languageIndependentModelFile, languageDependentModelFile));
179
180 ModelFileManager.ModelFile bestModelFile =
181 mModelFileManager.findBestModelFile(
182 LocaleList.forLanguageTags("zh-hk"));
183 assertThat(bestModelFile).isEqualTo(languageIndependentModelFile);
184 }
185
186 @Test
Tony Makba228422018-10-25 21:30:40 +0100187 public void findBestModel_languageIsMoreImportantThanVersion() {
188 ModelFileManager.ModelFile matchButOlderModel =
189 new ModelFileManager.ModelFile(
190 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000191 Collections.singletonList(Locale.forLanguageTag("fr")), "fr", false);
Tony Makba228422018-10-25 21:30:40 +0100192
193 ModelFileManager.ModelFile mismatchButNewerModel =
194 new ModelFileManager.ModelFile(
195 new File("/path/b"), 2,
Tony Mak20fe1872019-03-22 15:35:15 +0000196 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100197
198 when(mModelFileSupplier.get())
199 .thenReturn(
200 Arrays.asList(matchButOlderModel, mismatchButNewerModel));
201
202 ModelFileManager.ModelFile bestModelFile =
203 mModelFileManager.findBestModelFile(
204 LocaleList.forLanguageTags("fr"));
205 assertThat(bestModelFile).isEqualTo(matchButOlderModel);
206 }
207
208 @Test
Tony Mak9d209612018-11-14 21:09:03 +0000209 public void findBestModel_languageIsMoreImportantThanVersion_bestModelComesFirst() {
210 ModelFileManager.ModelFile matchLocaleModel =
211 new ModelFileManager.ModelFile(
212 new File("/path/b"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000213 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Mak9d209612018-11-14 21:09:03 +0000214
215 ModelFileManager.ModelFile languageIndependentModel =
216 new ModelFileManager.ModelFile(
217 new File("/path/a"), 2,
Tony Mak20fe1872019-03-22 15:35:15 +0000218 Collections.emptyList(), "", true);
Tony Mak9d209612018-11-14 21:09:03 +0000219 when(mModelFileSupplier.get())
220 .thenReturn(
221 Arrays.asList(matchLocaleModel, languageIndependentModel));
222
223 ModelFileManager.ModelFile bestModelFile =
224 mModelFileManager.findBestModelFile(
225 LocaleList.forLanguageTags("ja"));
226
227 assertThat(bestModelFile).isEqualTo(matchLocaleModel);
228 }
229
230 @Test
Tony Makba228422018-10-25 21:30:40 +0100231 public void modelFileEquals() {
232 ModelFileManager.ModelFile modelA =
233 new ModelFileManager.ModelFile(
234 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000235 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100236
237 ModelFileManager.ModelFile modelB =
238 new ModelFileManager.ModelFile(
239 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000240 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100241
242 assertThat(modelA).isEqualTo(modelB);
243 }
244
245 @Test
246 public void modelFile_different() {
247 ModelFileManager.ModelFile modelA =
248 new ModelFileManager.ModelFile(
249 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000250 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100251
252 ModelFileManager.ModelFile modelB =
253 new ModelFileManager.ModelFile(
254 new File("/path/b"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000255 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100256
257 assertThat(modelA).isNotEqualTo(modelB);
258 }
259
260
261 @Test
262 public void modelFile_getPath() {
263 ModelFileManager.ModelFile modelA =
264 new ModelFileManager.ModelFile(
265 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000266 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100267
268 assertThat(modelA.getPath()).isEqualTo("/path/a");
269 }
270
271 @Test
272 public void modelFile_getName() {
273 ModelFileManager.ModelFile modelA =
274 new ModelFileManager.ModelFile(
275 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000276 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100277
278 assertThat(modelA.getName()).isEqualTo("a");
279 }
280
281 @Test
282 public void modelFile_isPreferredTo_languageDependentIsBetter() {
283 ModelFileManager.ModelFile modelA =
284 new ModelFileManager.ModelFile(
285 new File("/path/a"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000286 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100287
288 ModelFileManager.ModelFile modelB =
289 new ModelFileManager.ModelFile(
290 new File("/path/b"), 2,
Tony Mak20fe1872019-03-22 15:35:15 +0000291 Collections.emptyList(), "", true);
Tony Makba228422018-10-25 21:30:40 +0100292
293 assertThat(modelA.isPreferredTo(modelB)).isTrue();
294 }
295
296 @Test
297 public void modelFile_isPreferredTo_version() {
298 ModelFileManager.ModelFile modelA =
299 new ModelFileManager.ModelFile(
300 new File("/path/a"), 2,
Tony Mak20fe1872019-03-22 15:35:15 +0000301 Collections.singletonList(Locale.forLanguageTag("ja")), "ja", false);
Tony Makba228422018-10-25 21:30:40 +0100302
303 ModelFileManager.ModelFile modelB =
304 new ModelFileManager.ModelFile(
305 new File("/path/b"), 1,
Tony Mak20fe1872019-03-22 15:35:15 +0000306 Collections.emptyList(), "", false);
Tony Makba228422018-10-25 21:30:40 +0100307
308 assertThat(modelA.isPreferredTo(modelB)).isTrue();
309 }
310
311 @Test
312 public void testFileSupplierImpl_updatedFileOnly() throws IOException {
313 mUpdatedModelFile.createNewFile();
314 File model1 = new File(mFactoryModelDir, "test1.model");
315 model1.createNewFile();
316 File model2 = new File(mFactoryModelDir, "test2.model");
317 model2.createNewFile();
318 new File(mFactoryModelDir, "not_match_regex.model").createNewFile();
319
320 List<ModelFileManager.ModelFile> modelFiles = mModelFileSupplierImpl.get();
321 List<String> modelFilePaths =
322 modelFiles
323 .stream()
324 .map(modelFile -> modelFile.getPath())
325 .collect(Collectors.toList());
326
327 assertThat(modelFiles).hasSize(3);
328 assertThat(modelFilePaths).containsExactly(
329 mUpdatedModelFile.getAbsolutePath(),
330 model1.getAbsolutePath(),
331 model2.getAbsolutePath());
332 }
333
334 @Test
335 public void testFileSupplierImpl_empty() {
336 mFactoryModelDir.delete();
337 List<ModelFileManager.ModelFile> modelFiles = mModelFileSupplierImpl.get();
338
339 assertThat(modelFiles).hasSize(0);
340 }
341
342 private static void recursiveDelete(File f) {
343 if (f.isDirectory()) {
344 for (File innerFile : f.listFiles()) {
345 recursiveDelete(innerFile);
346 }
347 }
348 f.delete();
349 }
350}