1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.luni.tests.java.io;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.BufferedReader;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.File;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStreamReader;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Please note that this case can only be passed on Linux due to some file
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * system dependent reason.
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class UnixFileTest extends TestCase {
338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private boolean root = false;
348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private File testFile;
368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private File testDir;
388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private static final int TOTAL_SPACE_NUM = 0;
408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private static final int FREE_SPACE_NUM = 1;
428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private static final int USABLE_SPACE_NUM = 2;
448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private static class ConsoleResulter extends Thread {
468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        Process proc;
478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        InputStream is;
498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String resStr;
518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        ConsoleResulter(Process p, InputStream in) {
538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            proc = p;
548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            is = in;
558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        @Override
588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        public void run() {
598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            StringBuffer result = new StringBuffer();
608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            synchronized (result) {
618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                try {
628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    BufferedReader br = new BufferedReader(
638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            new InputStreamReader(is));
648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    String line;
658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    while ((line = br.readLine()) != null) {
668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        result.append(line);
678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    if (result.length() != 0) {
698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        resStr = result.toString();
708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    br.close();
738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ioe) {
748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    result = null;
758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                synchronized (proc) {
778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    proc.notifyAll();
788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private static long getLinuxSpace(int index, File file) throws Exception {
848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        long[] result = new long[3];
858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String par = file.getAbsolutePath();
868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String osName = System.getProperty("os.name");
878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // in case the test case will run under other OS.
888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (osName.toLowerCase().indexOf("linux") != -1) {
898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            String[] cmd = new String[2];
908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            cmd[0] = "df";
918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            cmd[1] = par; // get the total space of file
928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            Runtime rt = Runtime.getRuntime();
938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            Process proc = rt.exec(cmd);
958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            // get output from the command
968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            ConsoleResulter outputResult = new ConsoleResulter(proc, proc
978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    .getInputStream());
988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            synchronized (proc) {
1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                outputResult.start();
1018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                proc.wait();
1028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            // If there is no error, obtain the result
1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            if (outputResult.resStr != null) {
1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                // exit the subprocess safely
1068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                proc.waitFor();
1078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                // filter unnecessary information
1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                String[] txtResult = outputResult.resStr
1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        .split("\\D|\\p{javaLowerCase}|\\p{javaUpperCase}");
1118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int i = 0, j = 0; i < txtResult.length; i++) {
1128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    if (txtResult[i].length() > 3) {
1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        result[j++] = Long.parseLong(txtResult[i]) * 1024L;
1148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
1158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
1178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // calculate free spaces according to df command
1208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        result[1] = result[0] - result[1];
1218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        return result[index];
1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
1238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
1258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.io.File#canExecute()
1268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @since 1.6
1278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
1288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_canExecute() {
1298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertFalse(testFile.canExecute());
1308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(true, false));
1318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canExecute());
1328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(true, true));
1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canExecute());
1348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(false, false));
1368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertFalse(testFile.canExecute());
1378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(false, true));
1388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertFalse(testFile.canExecute());
1398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(true, false));
1418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canExecute());
1428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // tests directory
1448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canExecute());
1458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setExecutable(false, true));
1468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
1478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testDir.canExecute());
1488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testDir.canExecute());
1508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setExecutable(true, false));
1528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canExecute());
1538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
1548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.io.File#getFreeSpace()
1578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @since 1.6
1588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_getFreeSpace() throws Exception {
1608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        long fileSpace = getLinuxSpace(FREE_SPACE_NUM, testFile);
1618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        long dirSpace = getLinuxSpace(FREE_SPACE_NUM, testDir);
1628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // in case we cannot fetch the value from command line
1638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (fileSpace > 0) {
1648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertEquals(fileSpace, testFile.getFreeSpace());
1658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (dirSpace > 0) {
1688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertEquals(dirSpace, testDir.getFreeSpace());
1698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
1718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
1738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.io.File#getTotalSpace()
1748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @since 1.6
1758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
1768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_getTotalSpace() throws Exception {
1778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        long fileSpace = getLinuxSpace(TOTAL_SPACE_NUM, testFile);
1788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        long dirSpace = getLinuxSpace(TOTAL_SPACE_NUM, testDir);
1798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (fileSpace > 0) {
1808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertEquals(fileSpace, testFile.getTotalSpace());
1818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (dirSpace > 0) {
1838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertEquals(dirSpace, testDir.getTotalSpace());
1848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
1868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
1888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.io.File#getUsableSpace()
1898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @since 1.6
1908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
1918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_getUsableSpace() throws Exception {
1928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        long fileSpace = getLinuxSpace(USABLE_SPACE_NUM, testFile);
1938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        long dirSpace = getLinuxSpace(USABLE_SPACE_NUM, testDir);
1948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (fileSpace > 0) {
1958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertEquals(fileSpace, testFile.getUsableSpace());
1968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (dirSpace > 0) {
1988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertEquals(dirSpace, testDir.getUsableSpace());
1998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
2008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
2018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
2038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.io.File#setExecutable(boolean, boolean)
2048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @since 1.6
2058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
2068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_setExecutableZZ() {
2078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // setExecutable(true, true/false)
2088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertFalse(testFile.canExecute());
2098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(true, false));
2108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canExecute());
2118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(true, true));
2128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canExecute());
2138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // setExecutable(false, true/false)
2158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(false, true));
2168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
2178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testFile.canExecute());
2188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
2198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testFile.canExecute());
2208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
2218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(false, false));
2228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertFalse(testFile.canExecute());
2238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // tests directory
2258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canExecute());
2268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setExecutable(false, true));
2278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
2288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testDir.canExecute());
2298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
2308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testDir.canExecute());
2318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
2328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setExecutable(false, false));
2338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
2348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testDir.canExecute());
2358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
2368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testDir.canExecute());
2378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
2388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setExecutable(true, true));
2408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canExecute());
2418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setExecutable(true, false));
2428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canExecute());
2438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
2448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
2468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.io.File#setExecutable(boolean)
2478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @since 1.6
2488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
2498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_setExecutableZ() {
2508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // So far this method only deals with the situation that the user is the
2518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // owner of the file
2528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(true));
2538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canExecute());
2548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(false));
2558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertFalse(testFile.canExecute());
2568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setExecutable(true));
2578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // tests directory
2598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canExecute());
2608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setExecutable(false));
2618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
2628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testDir.canExecute());
2638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
2648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testDir.canExecute());
2658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
2668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setExecutable(true));
2678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canExecute());
2688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
2698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
2718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.io.File#setReadable(boolean, boolean)
2728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @since 1.6
2738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
2748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_setReadableZZ() throws Exception {
2758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // setReadable(false, false/true) succeeds on Linux
2768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // However, canRead() always returns true when the user is 'root'.
2778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canRead());
2788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setReadable(false, false));
2798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
2808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testFile.canRead());
2818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
2828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testFile.canRead());
2838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
2848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setReadable(false, true));
2858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
2868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testFile.canRead());
2878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
2888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testFile.canRead());
2898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
2908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // tests directory, setReadable(false, true/false)
2928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canRead());
2938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setReadable(false, true));
2948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
2958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testDir.canRead());
2968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
2978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testDir.canRead());
2988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
2998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setReadable(false, false));
3008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
3018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testDir.canRead());
3028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
3038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testDir.canRead());
3048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
3058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // setReadable(true, false/true) and set them in turn
3078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setReadable(true, false));
3088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canRead());
3098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setReadable(false, true));
3108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
3118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testFile.canRead());
3128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
3138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testFile.canRead());
3148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
3158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setReadable(true, true));
3168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canRead());
3178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setReadable(false, true));
3188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
3198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testFile.canRead());
3208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
3218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testFile.canRead());
3228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
3238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // tests directory, setReadable(true, true/false)
3258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setReadable(true, false));
3268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canRead());
3278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setReadable(true, true));
3288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canRead());
3298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
3308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
3328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.io.File#setReadable(boolean)
3338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @since 1.6
3348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
3358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_setReadableZ() {
3368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // So far this method only deals with the situation that the user is the
3378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // owner of the file. setReadable(false) succeeds on Linux
3388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // However, canRead() always returns true when the user is 'root'.
3398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canRead());
3408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setReadable(false));
3418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
3428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testFile.canRead());
3438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
3448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testFile.canRead());
3458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
3468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.setReadable(true));
3478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testFile.canRead());
3488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.canRead());
3508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue(testDir.setReadable(false));
3518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (root) {
3528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertTrue(testDir.canRead());
3538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } else {
3548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            assertFalse(testDir.canRead());
3558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
3568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
3578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    @Override
3598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    protected void setUp() throws Exception {
3608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        super.setUp();
3618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        testFile = File.createTempFile("testfile", null);
3628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        testDir = new File(System.getProperty("java.io.tmpdir") + "/temp");
3638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (!testDir.exists()) {
3648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            testDir.mkdir();
3658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
3668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        root = System.getProperty("user.name").equals("root");
3678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
3688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    @Override
3708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    protected void tearDown() throws Exception {
3718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        testFile.delete();
3728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        testDir.delete();
3738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        testFile = null;
3748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        testDir = null;
3758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        root = false;
3768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        super.tearDown();
3778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getCanonicalPath() throws IOException,
3808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            InterruptedException {
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File tmpFolder1 = new File("folder1");
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        tmpFolder1.mkdirs();
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        tmpFolder1.deleteOnExit();
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File tmpFolder2 = new File(tmpFolder1.toString() + "/folder2");
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        tmpFolder2.mkdirs();
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        tmpFolder2.deleteOnExit();
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File tmpFolder3 = new File(tmpFolder2.toString() + "/folder3");
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        tmpFolder3.mkdirs();
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        tmpFolder3.deleteOnExit();
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File tmpFolder4 = new File(tmpFolder3.toString() + "/folder4");
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        tmpFolder4.mkdirs();
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        tmpFolder4.deleteOnExit();
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make a link to folder1/folder2
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Process ln = Runtime.getRuntime().exec("ln -s folder1/folder2 folder2");
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ln.waitFor();
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File linkFile = new File("folder2");
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        linkFile.deleteOnExit();
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File file = new File("folder2");
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(tmpFolder2.getCanonicalPath(), file.getCanonicalPath());
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        file = new File("folder1/folder2");
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(tmpFolder2.getCanonicalPath(), file.getCanonicalPath());
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        file = new File("folder2/folder3");
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(tmpFolder3.getCanonicalPath(), file.getCanonicalPath());
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        file = new File("folder2/folder3/folder4");
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(tmpFolder4.getCanonicalPath(), file.getCanonicalPath());
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        file = new File("folder1/folder2/folder3");
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(tmpFolder3.getCanonicalPath(), file.getCanonicalPath());
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        file = new File("folder1/folder2/folder3/folder4");
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(tmpFolder4.getCanonicalPath(), file.getCanonicalPath());
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
422