summaryrefslogtreecommitdiffstats
path: root/tzdata/update/src/test/libcore/tzdata/update/TzDataBundleInstallerTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'tzdata/update/src/test/libcore/tzdata/update/TzDataBundleInstallerTest.java')
-rw-r--r--tzdata/update/src/test/libcore/tzdata/update/TzDataBundleInstallerTest.java210
1 files changed, 210 insertions, 0 deletions
diff --git a/tzdata/update/src/test/libcore/tzdata/update/TzDataBundleInstallerTest.java b/tzdata/update/src/test/libcore/tzdata/update/TzDataBundleInstallerTest.java
new file mode 100644
index 0000000..1825bb3
--- /dev/null
+++ b/tzdata/update/src/test/libcore/tzdata/update/TzDataBundleInstallerTest.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package libcore.tzdata.update;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import libcore.tzdata.update.tools.TzDataBundleBuilder;
+
+/**
+ * Tests for {@link libcore.tzdata.update.TzDataBundleInstaller}.
+ */
+public class TzDataBundleInstallerTest extends TestCase {
+
+ private static final File SYSTEM_ZONE_INFO_FILE = new File("/system/usr/share/zoneinfo/tzdata");
+
+ private TzDataBundleInstaller installer;
+ private File tempDir;
+ private File testInstallDir;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ tempDir = createDirectory("tempDir");
+ testInstallDir = createDirectory("testInstall");
+ installer = new TzDataBundleInstaller("TzDataBundleInstallerTest", testInstallDir);
+ }
+
+ private static File createDirectory(String prefix) throws IOException {
+ File dir = File.createTempFile(prefix, "");
+ assertTrue(dir.delete());
+ assertTrue(dir.mkdir());
+ return dir;
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ if (testInstallDir.exists()) {
+ FileUtils.deleteRecursive(testInstallDir);
+ }
+ if (tempDir.exists()) {
+ FileUtils.deleteRecursive(tempDir);
+ }
+ super.tearDown();
+ }
+
+ /** Tests the first update on a device */
+ public void testSuccessfulFirstUpdate() throws Exception {
+ ConfigBundle tzData = createValidTzDataBundle("2030a");
+
+ assertTrue(install(tzData));
+ assertTzDataInstalled(tzData);
+ }
+
+ /**
+ * Tests an update on a device when there is a prior update already applied.
+ */
+ public void testSuccessfulFollowOnUpdate() throws Exception {
+ ConfigBundle tzData1 = createValidTzDataBundle("2030a");
+ assertTrue(install(tzData1));
+ assertTzDataInstalled(tzData1);
+
+ ConfigBundle tzData2 = createValidTzDataBundle("2030b");
+ assertTrue(install(tzData2));
+ assertTzDataInstalled(tzData2);
+ }
+
+
+ /** Tests that a bundle with a missing file will not update the content. */
+ public void testMissingRequiredBundleFile() throws Exception {
+ ConfigBundle installedConfigBundle = createValidTzDataBundle("2030a");
+ assertTrue(install(installedConfigBundle));
+ assertTzDataInstalled(installedConfigBundle);
+
+ ConfigBundle incompleteUpdate =
+ createValidTzDataBundleBuilder("2030b").clearBionicTzData().buildUnvalidated();
+ assertFalse(install(incompleteUpdate));
+ assertTzDataInstalled(installedConfigBundle);
+ }
+
+ /**
+ * Tests that an update will be unpacked even if there is a partial update from a previous run.
+ */
+ public void testInstallWithWorkingDir() throws Exception {
+ File workingDir = new File(testInstallDir, TzDataBundleInstaller.WORKING_DIR_NAME);
+ assertTrue(workingDir.mkdir());
+ createFile(new File(workingDir, "myFile"));
+
+ ConfigBundle tzData = createValidTzDataBundle("2030a");
+ assertTrue(install(tzData));
+ assertTzDataInstalled(tzData);
+ }
+
+ /**
+ * Tests that a bundle with a checksum entry that references a missing file will not update the
+ * content.
+ */
+ public void testChecksumBundleEntry_fileMissing() throws Exception {
+ ConfigBundle badUpdate =
+ createValidTzDataBundleBuilder("2030b")
+ .addChecksum("/fileDoesNotExist", 1234)
+ .build();
+ assertFalse(install(badUpdate));
+ assertNoContentInstalled();
+ }
+
+ /**
+ * Tests that a bundle with a checksum entry with a bad checksum will not update the
+ * content.
+ */
+ public void testChecksumBundleEntry_incorrectChecksum() throws Exception {
+ File fileToChecksum = SYSTEM_ZONE_INFO_FILE;
+ long badChecksum = FileUtils.calculateChecksum(fileToChecksum) + 1;
+ ConfigBundle badUpdate =
+ createValidTzDataBundleBuilder("2030b")
+ .clearChecksumEntries()
+ .addChecksum(fileToChecksum.getPath(), badChecksum)
+ .build();
+ assertFalse(install(badUpdate));
+ assertNoContentInstalled();
+ }
+
+ private boolean install(ConfigBundle configBundle) throws Exception {
+ return installer.install(configBundle.getBundleBytes());
+ }
+
+ private ConfigBundle createValidTzDataBundle(String tzDataVersion)
+ throws IOException {
+ return createValidTzDataBundleBuilder(tzDataVersion).build();
+ }
+
+ private TzDataBundleBuilder createValidTzDataBundleBuilder(String tzDataVersion)
+ throws IOException {
+
+ // The file to include in the installation-time checksum check.
+ File fileToChecksum = SYSTEM_ZONE_INFO_FILE;
+ long checksum = FileUtils.calculateChecksum(fileToChecksum);
+
+ File bionicTzData = new File(tempDir, "zoneinfo");
+ createFile(bionicTzData);
+
+ File icuData = new File(tempDir, "icudata");
+ createFile(icuData);
+
+ return new TzDataBundleBuilder()
+ .addChecksum(fileToChecksum.getPath(), checksum)
+ .setTzDataVersion(tzDataVersion)
+ .addBionicTzData(bionicTzData)
+ .addIcuTzData(icuData);
+ }
+
+ private void assertTzDataInstalled(ConfigBundle expectedTzData) throws Exception {
+ assertTrue(testInstallDir.exists());
+
+ File currentTzDataDir = new File(testInstallDir, TzDataBundleInstaller.CURRENT_TZ_DATA_DIR_NAME);
+ assertTrue(currentTzDataDir.exists());
+
+ File checksumFile = new File(currentTzDataDir, ConfigBundle.CHECKSUMS_FILE_NAME);
+ assertTrue(checksumFile.exists());
+
+ File versionFile = new File(currentTzDataDir,
+ ConfigBundle.TZ_DATA_VERSION_FILE_NAME);
+ assertTrue(versionFile.exists());
+
+ File bionicFile = new File(currentTzDataDir, ConfigBundle.ZONEINFO_FILE_NAME);
+ assertTrue(bionicFile.exists());
+
+ File icuFile = new File(currentTzDataDir, ConfigBundle.ICU_DATA_FILE_NAME);
+ assertTrue(icuFile.exists());
+
+ // Also check no working directory is left lying around.
+ File workingDir = new File(testInstallDir, TzDataBundleInstaller.WORKING_DIR_NAME);
+ assertFalse(workingDir.exists());
+ }
+
+ private void assertNoContentInstalled() {
+ File currentTzDataDir = new File(testInstallDir, TzDataBundleInstaller.CURRENT_TZ_DATA_DIR_NAME);
+ assertFalse(currentTzDataDir.exists());
+
+ // Also check no working directories are left lying around.
+ File workingDir = new File(testInstallDir, TzDataBundleInstaller.WORKING_DIR_NAME);
+ assertFalse(workingDir.exists());
+
+ File oldDataDir = new File(testInstallDir, TzDataBundleInstaller.OLD_TZ_DATA_DIR_NAME);
+ assertFalse(oldDataDir.exists());
+ }
+
+ private static void createFile(File file) {
+ try (FileOutputStream fos = new FileOutputStream(file)) {
+ fos.write('a');
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ }
+}