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