11bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera/* 21bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * Copyright (C) 2016 The Android Open Source Project 31bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * 41bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * Licensed under the Apache License, Version 2.0 (the "License"); 51bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * you may not use this file except in compliance with the License. 61bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * You may obtain a copy of the License at 71bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * 81bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * http://www.apache.org/licenses/LICENSE-2.0 91bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * 101bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * Unless required by applicable law or agreed to in writing, software 111bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * distributed under the License is distributed on an "AS IS" BASIS, 121bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * See the License for the specific language governing permissions and 141bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * limitations under the License 151bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera */ 161bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 171bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmerapackage libcore.java.nio.file; 181bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 191bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport org.junit.rules.TestRule; 201bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport org.junit.runner.Description; 211bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport org.junit.runners.model.Statement; 221bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 231bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.io.BufferedWriter; 241bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.io.File; 251bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.io.FileWriter; 261bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.io.IOException; 271bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.io.InputStream; 281bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.io.OutputStream; 291bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.nio.file.CopyOption; 301bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.nio.file.DirectoryStream; 311bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.nio.file.Files; 321bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.nio.file.LinkOption; 331bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.nio.file.OpenOption; 341bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.nio.file.Path; 351bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.nio.file.Paths; 361bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmeraimport java.nio.file.attribute.BasicFileAttributes; 371bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 38959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmeraclass FilesSetup implements TestRule { 391bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 401bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera final static String DATA_FILE = "dataFile"; 411bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 421bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera final static String NON_EXISTENT_FILE = "nonExistentFile"; 431bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 441bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera final static String TEST_FILE_DATA = "hello"; 451bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 461bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera final static String TEST_FILE_DATA_2 = "test"; 471bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 48045e5227741aed0984c3cd0c17f9a76508ccb711Shubham Ajmera /** 49045e5227741aed0984c3cd0c17f9a76508ccb711Shubham Ajmera * Data that includes characters code above the US-ASCII range and will be more obviously 50045e5227741aed0984c3cd0c17f9a76508ccb711Shubham Ajmera * corrupted if encoded / decoded incorrectly than 51045e5227741aed0984c3cd0c17f9a76508ccb711Shubham Ajmera * {@link #TEST_FILE_DATA} / {@link #TEST_FILE_DATA_2}. 52045e5227741aed0984c3cd0c17f9a76508ccb711Shubham Ajmera */ 53045e5227741aed0984c3cd0c17f9a76508ccb711Shubham Ajmera final static String UTF_16_DATA = "परीक्षण"; 54045e5227741aed0984c3cd0c17f9a76508ccb711Shubham Ajmera 55959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera private String testDir; 56959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera 57959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera private Path dataFilePath; 581bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 59959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera private Path testPath; 601bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 611a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera private Path testDirPath; 621a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera 63959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera private boolean filesInitialized = false; 641bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 65959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera void setUp() throws Exception { 661bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera initializeFiles(); 671bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 681bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 69959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera void tearDown() throws Exception { 70959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera filesInitialized = false; 71959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera clearAll(); 72959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera } 73959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera 74959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera private void initializeFiles() throws IOException { 751a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera testDirPath = Files.createTempDirectory("testDir"); 761a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera testDir = testDirPath.toString(); 77959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera dataFilePath = Paths.get(testDir, DATA_FILE); 78959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera testPath = Paths.get(testDir, NON_EXISTENT_FILE); 79959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera File testInputFile = new File(testDir, DATA_FILE); 801bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera if (!testInputFile.exists()) { 811bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera testInputFile.createNewFile(); 821bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 831bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera FileWriter fw = new FileWriter(testInputFile.getAbsoluteFile()); 841bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera BufferedWriter bw = new BufferedWriter(fw); 851bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera bw.write(TEST_FILE_DATA); 861bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera bw.close(); 87959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera filesInitialized = true; 881bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 891bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 90959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera Path getTestPath() { 91959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera checkState(); 92959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera return testPath; 93959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera } 94959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera 95959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera Path getDataFilePath() { 96959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera checkState(); 97959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera return dataFilePath; 98959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera } 99959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera 1001a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera Path getTestDirPath() { 1011a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera checkState(); 1021a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera return testDirPath; 1031a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera } 1041a75c10f777eed2433bc1dee9f44aec577404ca0Shubham Ajmera 105959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera String getTestDir() { 106959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera checkState(); 107959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera return testDir; 108959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera } 109959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera 110959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera private void checkState() { 111959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera if (!filesInitialized) { 112959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera throw new IllegalStateException("Files are not setup."); 113959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera } 1141bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1151bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 116959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera void clearAll() throws IOException { 117959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera Path root = Paths.get(testDir); 1181bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera delete(root); 1191bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1201bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 121959fcd7b9e6cec8f5d4884ee9cb9fe52cf949c53Shubham Ajmera void reset() throws IOException { 1221bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera clearAll(); 1231bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera initializeFiles(); 1241bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1251bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 1261bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera private static void delete(Path path) throws IOException { 1271bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera if (Files.isDirectory(path)) { 1281bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera DirectoryStream<Path> dirStream = Files.newDirectoryStream(path); 1291bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera dirStream.forEach( 1301bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera p -> { 1311bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera try { 1321bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera delete(p); 1331bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } catch (IOException e) { 1341bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera throw new RuntimeException(e); 1351bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1361bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1371bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera ); 1381bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera dirStream.close(); 1391bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1401bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera try { 1411bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera Files.deleteIfExists(path); 1421bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } catch (Exception e) { 1431bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera // Do nothing 1441bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1451bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1461bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 1471bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera static void writeToFile(Path file, String data, OpenOption... option) throws IOException { 1481bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera OutputStream os = Files.newOutputStream(file, option); 1491bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera os.write(data.getBytes()); 1501bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera os.close(); 1511bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1521bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 1531bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera static String readFromFile(Path file) throws IOException { 1541bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera InputStream is = Files.newInputStream(file); 1551bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera return readFromInputStream(is); 1561bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1571bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 1581bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera static String readFromInputStream(InputStream is) throws IOException { 1591bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera byte[] input = new byte[10000]; 1601bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera is.read(input); 1611bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera return new String(input, "UTF-8").trim(); 1621bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1631bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 1641bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera static Process execCmdAndWaitForTermination(String... cmdList) 1651bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera throws InterruptedException, IOException { 1661bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera Process process = Runtime.getRuntime().exec(cmdList); 1671bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera // Wait for the process to terminate. 1681bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera process.waitFor(); 1691bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera return process; 1701bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1711bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 1721bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera @Override 1731bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera public Statement apply(Statement statement, Description description) { 1741bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera return new Statement() { 1751bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera @Override 1761bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera public void evaluate() throws Throwable { 1771bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera try { 1781bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera setUp(); 1791bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera statement.evaluate(); 1801bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } finally { 1811bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera tearDown(); 1821bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1831bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1841bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera }; 1851bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1861bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 18763c1e9c4b3865ebb9a69b6255e18c73303705a63Shubham Ajmera Path getPathInTestDir(String path) { 18863c1e9c4b3865ebb9a69b6255e18c73303705a63Shubham Ajmera return Paths.get(getTestDir(), path); 18963c1e9c4b3865ebb9a69b6255e18c73303705a63Shubham Ajmera } 19063c1e9c4b3865ebb9a69b6255e18c73303705a63Shubham Ajmera 1911bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera /** 1921bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera * Non Standard CopyOptions. 1931bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera */ 1941bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera enum NonStandardOption implements CopyOption, OpenOption { 1951bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera OPTION1, 1961bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera } 1971bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera 1981bb59e506f74fdcb6a08c71d82fd8ea942f56eeaShubham Ajmera} 199