18ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak/*
28ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
38ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
48ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak *
58ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * This code is free software; you can redistribute it and/or modify it
68ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * under the terms of the GNU General Public License version 2 only, as
78ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * published by the Free Software Foundation.
88ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak *
98ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * This code is distributed in the hope that it will be useful, but WITHOUT
108ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
118ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
128ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * version 2 for more details (a copy is included in the LICENSE file that
138ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * accompanied this code).
148ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak *
158ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * You should have received a copy of the GNU General Public License version
168ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * 2 along with this work; if not, write to the Free Software Foundation,
178ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
188ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak *
198ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
208ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * or visit www.oracle.com if you need additional information or have any
218ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * questions.
228ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak */
238ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
248ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak/* @test
258ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * @bug 8011536
268ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * @summary Basic test for creationTime attribute on platforms/file systems
278ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak *     that support it.
288ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak * @library ../..
298ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak */
308ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak// Android-changed: Adapted from
318ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak// jdk/test/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java
328ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak// Android-changed: Added package & Test import
338ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakpackage test.java.nio.file.attribute;
348ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakimport org.testng.annotations.Test;
358ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakimport test.java.nio.file.TestUtil;
368ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
378ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakimport java.nio.file.Path;
388ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakimport java.nio.file.Files;
398ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakimport java.nio.file.attribute.*;
408ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakimport java.time.Instant;
418ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakimport java.io.IOException;
428ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
438ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak// Android-changed: Renamed from "CreationTime"
448ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniakpublic class BasicFileAttributeViewCreationTimeTest {
458ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
468ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    private static final java.io.PrintStream err = System.err;
478ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
488ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    /**
498ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak     * Reads the creationTime attribute
508ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak     */
518ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    private static FileTime creationTime(Path file) throws IOException {
528ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        return Files.readAttributes(file, BasicFileAttributes.class).creationTime();
538ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    }
548ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
558ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    /**
568ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak     * Sets the creationTime attribute
578ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak     */
588ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    private static void setCreationTime(Path file, FileTime time) throws IOException {
598ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        BasicFileAttributeView view =
608ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            Files.getFileAttributeView(file, BasicFileAttributeView.class);
618ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        view.setTimes(null, null, time);
628ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    }
638ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
648ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    static void test(Path top) throws IOException {
658ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        Path file = Files.createFile(top.resolve("foo"));
668ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
678ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        /**
688ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         * Check that creationTime reported
698ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         */
708ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        FileTime creationTime = creationTime(file);
718ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        Instant now = Instant.now();
728ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        if (Math.abs(creationTime.toMillis()-now.toEpochMilli()) > 10000L) {
738ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            err.println("File creation time reported as: " + creationTime);
748ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            throw new RuntimeException("Expected to be close to: " + now);
758ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        }
768ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
778ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        /**
788ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         * Is the creationTime attribute supported here?
798ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         */
808ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        boolean supportsCreationTimeRead = false;
818ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        boolean supportsCreationTimeWrite = false;
828ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        String os = System.getProperty("os.name");
8321e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        // Android-changed: This test is never run on Mac OS or windows hosts.
8421e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        //
8521e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        // if (os.contains("OS X") && Files.getFileStore(file).type().equals("hfs")) {
8621e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        //     supportsCreationTimeRead = true;
8721e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        // } else if (os.startsWith("Windows")) {
8821e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        //     String type = Files.getFileStore(file).type();
8921e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        //     if (type.equals("NTFS") || type.equals("FAT")) {
9021e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        //         supportsCreationTimeRead = true;
9121e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        //         supportsCreationTimeWrite = true;
9221e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        //     }
9321e6175e256d360d8f87d4bf24c9da9501a1550dNarayan Kamath        // }
948ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
958ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        /**
968ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         * If the creation-time attribute is supported then change the file's
978ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         * last modified and check that it doesn't change the creation-time.
988ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         */
998ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        if (supportsCreationTimeRead) {
1008ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            // change modified time by +1 hour
1018ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            Instant plusHour = Instant.now().plusSeconds(60L * 60L);
1028ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            Files.setLastModifiedTime(file, FileTime.from(plusHour));
1038ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            FileTime current = creationTime(file);
1048ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            if (!current.equals(creationTime))
1058ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak                throw new RuntimeException("Creation time should not have changed");
1068ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        }
1078ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
1088ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        /**
1098ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         * If the creation-time attribute is supported and can be changed then
1108ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         * check that the change is effective.
1118ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak         */
1128ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        if (supportsCreationTimeWrite) {
1138ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            // change creation time by -1 hour
1148ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            Instant minusHour = Instant.now().minusSeconds(60L * 60L);
1158ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            creationTime = FileTime.from(minusHour);
1168ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            setCreationTime(file, creationTime);
1178ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            FileTime current = creationTime(file);
1188ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            if (Math.abs(creationTime.toMillis()-current.toMillis()) > 1000L)
1198ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak                throw new RuntimeException("Creation time not changed");
1208ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        }
1218ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    }
1228ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak
1238ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    // Android-changed: Removed args & added @Test
1248ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    @Test
1258ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    public static void main() throws IOException {
1268ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        // create temporary directory to run tests
1278ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        Path dir = TestUtil.createTemporaryDirectory();
1288ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        try {
1298ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            test(dir);
1308ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        } finally {
1318ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak            TestUtil.removeAll(dir);
1328ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak        }
1338ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak    }
1348ae76d13c225542b10de8388e3e2006aef5a58a8Przemyslaw Szczepaniak}
135