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