diff options
| -rw-r--r-- | services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java | 13 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java | 67 |
2 files changed, 45 insertions, 35 deletions
diff --git a/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java b/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java index 4f95d27a085e..75181307dc42 100644 --- a/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java +++ b/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java @@ -41,11 +41,11 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.security.SecureRandom; -import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * Manages set of updatable font files. @@ -109,6 +109,7 @@ final class UpdatableFontDir { private final FsverityUtil mFsverityUtil; private final File mConfigFile; private final File mTmpConfigFile; + private final Supplier<Long> mCurrentTimeSupplier; private long mLastModifiedMillis; private int mConfigVersion = 1; @@ -128,18 +129,20 @@ final class UpdatableFontDir { UpdatableFontDir(File filesDir, List<File> preinstalledFontDirs, FontFileParser parser, FsverityUtil fsverityUtil) { - this(filesDir, preinstalledFontDirs, parser, fsverityUtil, new File(CONFIG_XML_FILE)); + this(filesDir, preinstalledFontDirs, parser, fsverityUtil, new File(CONFIG_XML_FILE), + () -> System.currentTimeMillis()); } // For unit testing UpdatableFontDir(File filesDir, List<File> preinstalledFontDirs, FontFileParser parser, - FsverityUtil fsverityUtil, File configFile) { + FsverityUtil fsverityUtil, File configFile, Supplier<Long> currentTimeSupplier) { mFilesDir = filesDir; mPreinstalledFontDirs = preinstalledFontDirs; mParser = parser; mFsverityUtil = fsverityUtil; mConfigFile = configFile; mTmpConfigFile = new File(configFile.getAbsoluteFile() + ".tmp"); + mCurrentTimeSupplier = currentTimeSupplier; } /* package */ void loadFontFileMap() { @@ -209,7 +212,7 @@ final class UpdatableFontDir { FileUtils.deleteContents(mFilesDir); mFontFamilyMap.clear(); - mLastModifiedMillis = System.currentTimeMillis(); + mLastModifiedMillis = mCurrentTimeSupplier.get(); try (FileOutputStream fos = new FileOutputStream(mConfigFile)) { PersistentSystemFontConfig.writeToXml(fos, createPersistentConfig()); } catch (Exception e) { @@ -245,7 +248,7 @@ final class UpdatableFontDir { } // Write config file. - mLastModifiedMillis = Instant.now().getEpochSecond(); + mLastModifiedMillis = mCurrentTimeSupplier.get(); try (FileOutputStream fos = new FileOutputStream(mTmpConfigFile)) { PersistentSystemFontConfig.writeToXml(fos, createPersistentConfig()); } catch (Exception e) { diff --git a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java index dbb415c88a5f..e7ffea0a650d 100644 --- a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java +++ b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java @@ -54,6 +54,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Supplier; import java.util.stream.Collectors; @Presubmit @@ -117,10 +118,13 @@ public final class UpdatableFontDirTest { } } + private static final long CURRENT_TIME = 1234567890L; + private File mCacheDir; private File mUpdatableFontFilesDir; private File mConfigFile; private List<File> mPreinstalledFontDirs; + private Supplier<Long> mCurrentTimeSupplier = () -> CURRENT_TIME; @SuppressWarnings("ResultOfMethodCallIgnored") @Before @@ -147,7 +151,7 @@ public final class UpdatableFontDirTest { @Test public void construct() throws Exception { - long expectedModifiedDate = 1234567890; + long expectedModifiedDate = CURRENT_TIME / 2; FakeFontFileParser parser = new FakeFontFileParser(); FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); PersistentSystemFontConfig.Config config = new PersistentSystemFontConfig.Config(); @@ -155,7 +159,7 @@ public final class UpdatableFontDirTest { writeConfig(config, mConfigFile); UpdatableFontDir dirForPreparation = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dirForPreparation.loadFontFileMap(); assertThat(dirForPreparation.getSystemFontConfig().getLastModifiedTimeMillis()) .isEqualTo(expectedModifiedDate); @@ -168,6 +172,9 @@ public final class UpdatableFontDirTest { + " <font>foo.ttf</font>" + " <font>bar.ttf</font>" + "</family>"))); + // Verifies that getLastModifiedTimeMillis() returns the value of currentTimeMillis. + assertThat(dirForPreparation.getSystemFontConfig().getLastModifiedTimeMillis()) + .isEqualTo(CURRENT_TIME); // Four font dirs are created. assertThat(mUpdatableFontFilesDir.list()).hasLength(4); assertThat(dirForPreparation.getSystemFontConfig().getLastModifiedTimeMillis()) @@ -175,7 +182,7 @@ public final class UpdatableFontDirTest { UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); assertThat(dir.getFontFileMap()).containsKey("foo.ttf"); assertThat(parser.getRevision(dir.getFontFileMap().get("foo.ttf"))).isEqualTo(3); @@ -199,7 +206,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); assertThat(dir.getFontFileMap()).isEmpty(); assertThat(dir.getFontFamilyMap()).isEmpty(); @@ -211,7 +218,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dirForPreparation = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dirForPreparation.loadFontFileMap(); dirForPreparation.update(Arrays.asList( newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE), @@ -229,7 +236,7 @@ public final class UpdatableFontDirTest { dirForPreparation.getFontFileMap().get("foo.ttf").getAbsolutePath()); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); assertThat(dir.getFontFileMap()).isEmpty(); // All font dirs (including dir for "bar.ttf") should be deleted. @@ -243,7 +250,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dirForPreparation = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dirForPreparation.loadFontFileMap(); dirForPreparation.update(Arrays.asList( newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE), @@ -262,7 +269,7 @@ public final class UpdatableFontDirTest { UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); assertThat(dir.getFontFileMap()).isEmpty(); // All font dirs (including dir for "bar.ttf") should be deleted. @@ -276,7 +283,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dirForPreparation = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dirForPreparation.loadFontFileMap(); dirForPreparation.update(Arrays.asList( newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE), @@ -296,7 +303,7 @@ public final class UpdatableFontDirTest { FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(1), "bar.ttf"), "bar,2"); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); // For foo.ttf, preinstalled font (revision 5) should be used. assertThat(dir.getFontFileMap()).doesNotContainKey("foo.ttf"); @@ -317,7 +324,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - new File("/dev/null")); + new File("/dev/null"), mCurrentTimeSupplier); dir.loadFontFileMap(); assertThat(dir.getFontFileMap()).isEmpty(); assertThat(dir.getFontFamilyMap()).isEmpty(); @@ -329,7 +336,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dirForPreparation = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dirForPreparation.loadFontFileMap(); dirForPreparation.update(Arrays.asList( newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE), @@ -351,7 +358,7 @@ public final class UpdatableFontDirTest { UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); // The state should be rolled back as a whole if one of the update requests fail. assertThat(dir.getFontFileMap()).containsKey("foo.ttf"); @@ -369,7 +376,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE))); @@ -387,7 +394,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE))); @@ -406,7 +413,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,2", GOOD_SIGNATURE))); @@ -428,7 +435,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE))); @@ -445,7 +452,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); dir.update(Arrays.asList( @@ -463,7 +470,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); try { @@ -485,7 +492,7 @@ public final class UpdatableFontDirTest { FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"), "test.ttf,1"); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); try { @@ -517,7 +524,7 @@ public final class UpdatableFontDirTest { try { UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - readonlyFile); + readonlyFile, mCurrentTimeSupplier); dir.loadFontFileMap(); try { @@ -551,7 +558,7 @@ public final class UpdatableFontDirTest { public long getRevision(File file) throws IOException { return 0; } - }, fakeFsverityUtil, mConfigFile); + }, fakeFsverityUtil, mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); try { @@ -580,7 +587,7 @@ public final class UpdatableFontDirTest { public long getRevision(File file) throws IOException { return 0; } - }, fakeFsverityUtil, mConfigFile); + }, fakeFsverityUtil, mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); try { @@ -617,7 +624,7 @@ public final class UpdatableFontDirTest { FakeFontFileParser parser = new FakeFontFileParser(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); try { @@ -637,7 +644,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE))); @@ -660,7 +667,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); dir.update(Arrays.asList( @@ -682,7 +689,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); try { @@ -703,7 +710,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); try { @@ -723,7 +730,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); // We assume we have monospace. assertNamedFamilyExists(dir.getSystemFontConfig(), "monospace"); @@ -755,7 +762,7 @@ public final class UpdatableFontDirTest { FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil(); UpdatableFontDir dir = new UpdatableFontDir( mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil, - mConfigFile); + mConfigFile, mCurrentTimeSupplier); dir.loadFontFileMap(); assertThat(dir.getSystemFontConfig().getFontFamilies()).isNotEmpty(); FontConfig.FontFamily firstFontFamily = dir.getSystemFontConfig().getFontFamilies().get(0); |