Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f772075 authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Use currentTimeMillis for updated timestamp

Bug: 179215598
Test: atest UpdatableFontDirTest
Change-Id: Ib3a17a3616d087c2862127a301b341c52296d22f
parent 19d042f7
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -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) {
+37 −30
Original line number Diff line number Diff line
@@ -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);