Home | History | Annotate | Download | only in io
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 package org.apache.harmony.tests.java.io;
     19 
     20 import java.io.File;
     21 import java.io.FileFilter;
     22 import java.io.FileOutputStream;
     23 import java.io.FilenameFilter;
     24 import java.io.IOException;
     25 import java.io.ObjectStreamClass;
     26 import java.io.ObjectStreamField;
     27 import java.io.RandomAccessFile;
     28 import java.net.MalformedURLException;
     29 import java.net.URI;
     30 import java.net.URISyntaxException;
     31 import java.net.URL;
     32 import junit.framework.TestCase;
     33 import libcore.io.Libcore;
     34 import org.apache.harmony.testframework.serialization.SerializationTest;
     35 
     36 public class FileTest extends TestCase {
     37 
     38     private static String platformId = "JDK"
     39             + System.getProperty("java.vm.version").replace('.', '-');
     40 
     41     private static void deleteTempFolder(File dir) {
     42         String files[] = dir.list();
     43         if (files != null) {
     44             for (int i = 0; i < files.length; i++) {
     45                 File f = new File(dir, files[i]);
     46                 if (f.isDirectory()) {
     47                     deleteTempFolder(f);
     48                 } else {
     49                     f.delete();
     50                 }
     51             }
     52         }
     53         dir.delete();
     54     }
     55 
     56     private static String addTrailingSlash(String path) {
     57         if (File.separatorChar == path.charAt(path.length() - 1)) {
     58             return path;
     59         }
     60         return path + File.separator;
     61     }
     62 
     63     /**
     64      * Location to store tests in
     65      */
     66     private File tempDirectory;
     67 
     68     public String fileString = "Test_All_Tests\nTest_java_io_BufferedInputStream\nTest_java_io_BufferedOutputStream\nTest_java_io_ByteArrayInputStream\nTest_java_io_ByteArrayOutputStream\nTest_java_io_DataInputStream\nTest_File\nTest_FileDescriptor\nTest_FileInputStream\nTest_FileNotFoundException\nTest_FileOutputStream\nTest_java_io_FilterInputStream\nTest_java_io_FilterOutputStream\nTest_java_io_InputStream\nTest_java_io_IOException\nTest_java_io_OutputStream\nTest_java_io_PrintStream\nTest_java_io_RandomAccessFile\nTest_java_io_SyncFailedException\nTest_java_lang_AbstractMethodError\nTest_java_lang_ArithmeticException\nTest_java_lang_ArrayIndexOutOfBoundsException\nTest_java_lang_ArrayStoreException\nTest_java_lang_Boolean\nTest_java_lang_Byte\nTest_java_lang_Character\nTest_java_lang_Class\nTest_java_lang_ClassCastException\nTest_java_lang_ClassCircularityError\nTest_java_lang_ClassFormatError\nTest_java_lang_ClassLoader\nTest_java_lang_ClassNotFoundException\nTest_java_lang_CloneNotSupportedException\nTest_java_lang_Double\nTest_java_lang_Error\nTest_java_lang_Exception\nTest_java_lang_ExceptionInInitializerError\nTest_java_lang_Float\nTest_java_lang_IllegalAccessError\nTest_java_lang_IllegalAccessException\nTest_java_lang_IllegalArgumentException\nTest_java_lang_IllegalMonitorStateException\nTest_java_lang_IllegalThreadStateException\nTest_java_lang_IncompatibleClassChangeError\nTest_java_lang_IndexOutOfBoundsException\nTest_java_lang_InstantiationError\nTest_java_lang_InstantiationException\nTest_java_lang_Integer\nTest_java_lang_InternalError\nTest_java_lang_InterruptedException\nTest_java_lang_LinkageError\nTest_java_lang_Long\nTest_java_lang_Math\nTest_java_lang_NegativeArraySizeException\nTest_java_lang_NoClassDefFoundError\nTest_java_lang_NoSuchFieldError\nTest_java_lang_NoSuchMethodError\nTest_java_lang_NullPointerException\nTest_java_lang_Number\nTest_java_lang_NumberFormatException\nTest_java_lang_Object\nTest_java_lang_OutOfMemoryError\nTest_java_lang_RuntimeException\nTest_java_lang_SecurityManager\nTest_java_lang_Short\nTest_java_lang_StackOverflowError\nTest_java_lang_String\nTest_java_lang_StringBuffer\nTest_java_lang_StringIndexOutOfBoundsException\nTest_java_lang_System\nTest_java_lang_Thread\nTest_java_lang_ThreadDeath\nTest_java_lang_ThreadGroup\nTest_java_lang_Throwable\nTest_java_lang_UnknownError\nTest_java_lang_UnsatisfiedLinkError\nTest_java_lang_VerifyError\nTest_java_lang_VirtualMachineError\nTest_java_lang_vm_Image\nTest_java_lang_vm_MemorySegment\nTest_java_lang_vm_ROMStoreException\nTest_java_lang_vm_VM\nTest_java_lang_Void\nTest_java_net_BindException\nTest_java_net_ConnectException\nTest_java_net_DatagramPacket\nTest_java_net_DatagramSocket\nTest_java_net_DatagramSocketImpl\nTest_java_net_InetAddress\nTest_java_net_NoRouteToHostException\nTest_java_net_PlainDatagramSocketImpl\nTest_java_net_PlainSocketImpl\nTest_java_net_Socket\nTest_java_net_SocketException\nTest_java_net_SocketImpl\nTest_java_net_SocketInputStream\nTest_java_net_SocketOutputStream\nTest_java_net_UnknownHostException\nTest_java_util_ArrayEnumerator\nTest_java_util_Date\nTest_java_util_EventObject\nTest_java_util_HashEnumerator\nTest_java_util_Hashtable\nTest_java_util_Properties\nTest_java_util_ResourceBundle\nTest_java_util_tm\nTest_java_util_Vector\n";
     69 
     70     protected void setUp() throws IOException {
     71         /** Setup the temporary directory */
     72         tempDirectory = new File(addTrailingSlash(System.getProperty("java.io.tmpdir")) + "harmony-test-" + getClass().getSimpleName() + File.separator);
     73         tempDirectory.mkdirs();
     74     }
     75 
     76     protected void tearDown() {
     77         if (tempDirectory != null) {
     78             deleteTempFolder(tempDirectory);
     79             tempDirectory = null;
     80         }
     81     }
     82 
     83     /**
     84      * java.io.File#File(java.io.File, java.lang.String)
     85      */
     86     public void test_ConstructorLjava_io_FileLjava_lang_String0() {
     87         File f = new File(tempDirectory.getPath(), "input.tst");
     88         assertEquals("Created Incorrect File ", addTrailingSlash(tempDirectory.getPath()) + "input.tst", f.getPath());
     89     }
     90 
     91     public void test_ConstructorLjava_io_FileLjava_lang_String1() {
     92         try {
     93             new File(tempDirectory, null);
     94             fail("NullPointerException Not Thrown.");
     95         } catch (NullPointerException e) {
     96         }
     97     }
     98 
     99     public void test_ConstructorLjava_io_FileLjava_lang_String2() throws IOException {
    100         File f = new File((File) null, "input.tst");
    101         assertEquals("Created Incorrect File",
    102                 new File("input.tst").getAbsolutePath(),
    103                 f.getAbsolutePath());
    104     }
    105 
    106     public void test_ConstructorLjava_io_FileLjava_lang_String3() {
    107         // Regression test for HARMONY-382
    108         File f = new File("/abc");
    109         File d = new File((File) null, "/abc");
    110         assertEquals("Test3: Created Incorrect File",
    111                 d.getAbsolutePath(), f.getAbsolutePath());
    112     }
    113 
    114     public void test_ConstructorLjava_io_FileLjava_lang_String4() {
    115         // Regression test for HARMONY-21
    116         File path = new File("/dir/file");
    117         File root = new File("/");
    118         File file = new File(root, "/dir/file");
    119         assertEquals("Assert 1: wrong path result ", path.getPath(), file
    120                 .getPath());
    121         if (File.separatorChar == '\\') {
    122             assertTrue("Assert 1.1: path not absolute ", new File("\\\\\\a\b")
    123                     .isAbsolute());
    124         } else {
    125             assertFalse("Assert 1.1: path absolute ", new File("\\\\\\a\b")
    126                     .isAbsolute());
    127         }
    128     }
    129 
    130     public void test_ConstructorLjava_io_FileLjava_lang_String5() {
    131         // Test data used in a few places below
    132         String dirName = tempDirectory.getPath();
    133         String fileName = "input.tst";
    134 
    135         // Check filename is preserved correctly
    136         File d = new File(dirName);
    137         File f = new File(d, fileName);
    138         dirName = addTrailingSlash(dirName);
    139         dirName += fileName;
    140         assertEquals("Assert 1: Created incorrect file ",
    141                 dirName, f.getPath());
    142 
    143         // Check null argument is handled
    144         try {
    145             f = new File(d, null);
    146             fail("Assert 2: NullPointerException not thrown.");
    147         } catch (NullPointerException e) {
    148             // Expected.
    149         }
    150     }
    151 
    152     public void test_ConstructorLjava_io_FileLjava_lang_String6() {
    153         // Regression for HARMONY-46
    154         File f1 = new File("a");
    155         File f2 = new File("a/");
    156         assertEquals("Trailing slash file name is incorrect", f1, f2);
    157     }
    158 
    159     /**
    160      * java.io.File#File(java.lang.String)
    161      */
    162     public void test_ConstructorLjava_lang_String() {
    163         String fileName = null;
    164         try {
    165             new File(fileName);
    166             fail("NullPointerException Not Thrown.");
    167         } catch (NullPointerException e) {
    168             // Expected
    169         }
    170 
    171         fileName = addTrailingSlash(tempDirectory.getPath());
    172         fileName += "input.tst";
    173 
    174         File f = new File(fileName);
    175         assertEquals("Created incorrect File", fileName, f.getPath());
    176     }
    177 
    178     /**
    179      * java.io.File#File(java.lang.String, java.lang.String)
    180      */
    181     public void test_ConstructorLjava_lang_StringLjava_lang_String() throws IOException {
    182         String dirName = null;
    183         String fileName = "input.tst";
    184         File f = new File(dirName, fileName);
    185         assertEquals("Test 1: Created Incorrect File",
    186                 new File("input.tst").getAbsolutePath(),
    187                 f.getAbsolutePath());
    188 
    189         dirName = tempDirectory.getPath();
    190         fileName = null;
    191         try {
    192             f = new File(dirName, fileName);
    193             fail("NullPointerException Not Thrown.");
    194         } catch (NullPointerException e) {
    195             // Expected
    196         }
    197 
    198         fileName = "input.tst";
    199         f = new File(dirName, fileName);
    200         assertEquals("Test 2: Created Incorrect File",
    201                 addTrailingSlash(tempDirectory.getPath()) + "input.tst",
    202                 f.getPath());
    203 
    204         // Regression test for HARMONY-382
    205         String s = null;
    206         f = new File("/abc");
    207         File d = new File(s, "/abc");
    208         assertEquals("Test3: Created Incorrect File", d.getAbsolutePath(), f
    209                 .getAbsolutePath());
    210     }
    211 
    212     /**
    213      * java.io.File#File(java.lang.String, java.lang.String)
    214      */
    215     public void test_Constructor_String_String_112270() {
    216         File ref1 = new File("/dir1/file1");
    217 
    218         File file1 = new File("/", "/dir1/file1");
    219         assertEquals("wrong result 1", ref1.getPath(), file1.getPath());
    220         File file2 = new File("/", "//dir1/file1");
    221         assertEquals("wrong result 2", ref1.getPath(), file2.getPath());
    222 
    223         if (File.separatorChar == '\\') {
    224             File file3 = new File("\\", "\\dir1\\file1");
    225             assertEquals("wrong result 3", ref1.getPath(), file3.getPath());
    226             File file4 = new File("\\", "\\\\dir1\\file1");
    227             assertEquals("wrong result 4", ref1.getPath(), file4.getPath());
    228         }
    229 
    230         File ref2 = new File("/lib/test_112270.properties");
    231         File file5 = new File("/", "lib/test_112270.properties");
    232         assertEquals("wrong result 5", ref2.getPath(), file5.getPath());
    233     }
    234 
    235     /**
    236      * java.io.File#File(java.io.File, java.lang.String)
    237      */
    238     public void test_Constructor_File_String_112270() {
    239         File ref1 = new File("/dir1/file1");
    240 
    241         File root = new File("/");
    242         File file1 = new File(root, "/dir1/file1");
    243         assertEquals("wrong result 1", ref1.getPath(), file1.getPath());
    244         File file2 = new File(root, "//dir1/file1");
    245         assertEquals("wrong result 2", ref1.getPath(), file2.getPath());
    246 
    247         if (File.separatorChar == '\\') {
    248             File file3 = new File(root, "\\dir1\\file1");
    249             assertEquals("wrong result 3", ref1.getPath(), file3.getPath());
    250             File file4 = new File(root, "\\\\dir1\\file1");
    251             assertEquals("wrong result 4", ref1.getPath(), file4.getPath());
    252         }
    253 
    254         File ref2 = new File("/lib/content-types.properties");
    255         File file5 = new File(root, "lib/content-types.properties");
    256         assertEquals("wrong result 5", ref2.getPath(), file5.getPath());
    257     }
    258 
    259     /**
    260      * java.io.File#File(java.net.URI)
    261      */
    262     public void test_ConstructorLjava_net_URI() throws URISyntaxException {
    263         URI uri = null;
    264         try {
    265             new File(uri);
    266             fail("NullPointerException Not Thrown.");
    267         } catch (NullPointerException e) {
    268             // Expected
    269         }
    270 
    271         // invalid file URIs
    272         String[] uris = new String[] { "mailto:user (at) domain.com", // not
    273                 // hierarchical
    274                 "ftp:///path", // not file scheme
    275                 "//host/path/", // not absolute
    276                 "file://host/path", // non empty authority
    277                 "file:///path?query", // non empty query
    278                 "file:///path#fragment", // non empty fragment
    279                 "file:///path?", "file:///path#" };
    280 
    281         for (int i = 0; i < uris.length; i++) {
    282             uri = new URI(uris[i]);
    283             try {
    284                 new File(uri);
    285                 fail("Expected IllegalArgumentException for new File(" + uri
    286                         + ")");
    287             } catch (IllegalArgumentException e) {
    288                 // Expected
    289             }
    290         }
    291 
    292         // a valid File URI
    293         File f = new File(new URI("file:///pa%20th/another\u20ac/pa%25th"));
    294         assertTrue("Created incorrect File " + f.getPath(), f.getPath().equals(
    295                 File.separator + "pa th" + File.separator + "another\u20ac" + File.separator + "pa%th"));
    296     }
    297 
    298     /**
    299      * java.io.File#canRead()
    300      */
    301     public void test_canRead() throws IOException {
    302         // canRead only returns if the file exists so cannot be fully tested.
    303         File f = new File(tempDirectory, platformId + "canRead.tst");
    304         try {
    305             FileOutputStream fos = new FileOutputStream(f);
    306             fos.close();
    307             assertTrue("canRead returned false", f.canRead());
    308         } finally {
    309             f.delete();
    310         }
    311     }
    312 
    313     /**
    314      * java.io.File#canWrite()
    315      */
    316     public void test_canWrite() throws IOException {
    317         // canWrite only returns if the file exists so cannot be fully tested.
    318         File f = new File(tempDirectory, platformId + "canWrite.tst");
    319         try {
    320             FileOutputStream fos = new FileOutputStream(f);
    321             fos.close();
    322             assertTrue("canWrite returned false", f.canWrite());
    323         } finally {
    324             f.delete();
    325         }
    326     }
    327 
    328     /**
    329      * java.io.File#compareTo(java.io.File)
    330      */
    331     public void test_compareToLjava_io_File() {
    332         File f1 = new File("thisFile.file");
    333         File f2 = new File("thisFile.file");
    334         File f3 = new File("thatFile.file");
    335         assertEquals("Equal files did not answer zero for compareTo", 0, f1
    336                 .compareTo(f2));
    337         assertTrue("f3.compareTo(f1) did not result in value < 0", f3
    338                 .compareTo(f1) < 0);
    339         assertTrue("f1.compareTo(f3) did not result in value > 0", f1
    340                 .compareTo(f3) > 0);
    341     }
    342 
    343     /**
    344      * java.io.File#createNewFile()
    345      */
    346     public void test_createNewFile_EmptyString() {
    347         File f = new File("");
    348         try {
    349             f.createNewFile();
    350             fail("should throw IOException");
    351         } catch (IOException e) {
    352             // expected
    353         }
    354     }
    355 
    356     /**
    357      * java.io.File#createNewFile()
    358      */
    359     public void test_createNewFile() throws IOException {
    360         String base = tempDirectory.getPath();
    361         boolean dirExists = true;
    362         int numDir = 1;
    363         File dir = new File(base, String.valueOf(numDir));
    364         // Making sure that the directory does not exist.
    365         while (dirExists) {
    366             // If the directory exists, add one to the directory number
    367             // (making it a new directory name.)
    368             if (dir.exists()) {
    369                 numDir++;
    370                 dir = new File(base, String.valueOf(numDir));
    371             } else {
    372                 dirExists = false;
    373             }
    374         }
    375 
    376         // Test for trying to create a file in a directory that does not
    377         // exist.
    378         try {
    379             // Try to create a file in a directory that does not exist
    380             File f1 = new File(dir, "tempfile.tst");
    381             f1.createNewFile();
    382             fail("IOException not thrown");
    383         } catch (IOException e) {
    384             // Expected
    385         }
    386 
    387         dir.mkdir();
    388 
    389         File f1 = new File(dir, "tempfile.tst");
    390         File f2 = new File(dir, "tempfile.tst");
    391         f1.deleteOnExit();
    392         f2.deleteOnExit();
    393         dir.deleteOnExit();
    394         assertFalse("File Should Not Exist", f1.isFile());
    395         f1.createNewFile();
    396         assertTrue("File Should Exist.", f1.isFile());
    397         assertTrue("File Should Exist.", f2.isFile());
    398         String dirName = f1.getParent();
    399         if (!dirName.endsWith(File.separator)) {
    400             dirName += File.separator;
    401         }
    402         assertEquals("File Saved To Wrong Directory.",
    403                 dir.getPath() + File.separator, dirName);
    404         assertEquals("File Saved With Incorrect Name.", "tempfile.tst",
    405                 f1.getName());
    406 
    407         // Test for creating a file that already exists.
    408         assertFalse("File Already Exists, createNewFile Should Return False.",
    409                 f2.createNewFile());
    410 
    411         // Test create an illegal file
    412         String sep = File.separator;
    413         f1 = new File(sep + "..");
    414         try {
    415             f1.createNewFile();
    416             fail("should throw IOE");
    417         } catch (IOException e) {
    418             // expected;
    419         }
    420         f1 = new File(sep + "a" + sep + ".." + sep + ".." + sep);
    421         try {
    422             f1.createNewFile();
    423             fail("should throw IOE");
    424         } catch (IOException e) {
    425             // expected;
    426         }
    427 
    428         // This test is invalid. createNewFile should return false
    429         // not IOE when the file exists (in this case it exists and is
    430         // a directory). TODO: We should probably replace this test
    431         // with some that cover this behaviour. It might even be
    432         // different on unix and windows since it directly reflects
    433         // the open syscall behaviour.
    434         //
    435         // // Test create an exist path
    436         // f1 = new File(base);
    437         // try {
    438         // assertFalse(f1.createNewFile());
    439         // fail("should throw IOE");
    440         // } catch (IOException e) {
    441         // // expected;
    442         // }
    443     }
    444 
    445     /**
    446      * java.io.File#createTempFile(java.lang.String, java.lang.String)
    447      */
    448     public void test_createTempFileLjava_lang_StringLjava_lang_String()
    449             throws IOException {
    450         // Error protection against using a suffix without a "."?
    451         File f1 = null;
    452         File f2 = null;
    453         try {
    454             f1 = File.createTempFile("harmony-test-FileTest_tempFile_abc", ".tmp");
    455             f2 = File.createTempFile("harmony-test-FileTest_tempFile_tf", null);
    456 
    457             String fileLocation = addTrailingSlash(f1.getParent());
    458 
    459             String tempDir = addTrailingSlash(System.getProperty("java.io.tmpdir"));
    460 
    461             assertEquals(
    462                     "File did not save to the default temporary-file location.",
    463                     tempDir, fileLocation);
    464 
    465             // Test to see if correct suffix was used to create the tempfile.
    466             File currentFile;
    467             String fileName;
    468             // Testing two files, one with suffix ".tmp" and one with null
    469             for (int i = 0; i < 2; i++) {
    470                 currentFile = i == 0 ? f1 : f2;
    471                 fileName = currentFile.getPath();
    472                 assertTrue("File Created With Incorrect Suffix.", fileName
    473                         .endsWith(".tmp"));
    474             }
    475 
    476             // Tests to see if the correct prefix was used to create the
    477             // tempfiles.
    478             fileName = f1.getName();
    479             assertTrue("Test 1: File Created With Incorrect Prefix.", fileName
    480                     .startsWith("harmony-test-FileTest_tempFile_abc"));
    481             fileName = f2.getName();
    482             assertTrue("Test 2: File Created With Incorrect Prefix.", fileName
    483                     .startsWith("harmony-test-FileTest_tempFile_tf"));
    484 
    485             // Tests for creating a tempfile with a filename shorter than 3
    486             // characters.
    487             try {
    488                 File f3 = File.createTempFile("ab", ".tst");
    489                 f3.delete();
    490                 fail("IllegalArgumentException Not Thrown.");
    491             } catch (IllegalArgumentException e) {
    492                 // Expected
    493             }
    494             try {
    495                 File f3 = File.createTempFile("a", ".tst");
    496                 f3.delete();
    497                 fail("IllegalArgumentException Not Thrown.");
    498             } catch (IllegalArgumentException e) {
    499                 // Expected
    500             }
    501             try {
    502                 File f3 = File.createTempFile("", ".tst");
    503                 f3.delete();
    504                 fail("IllegalArgumentException Not Thrown.");
    505             } catch (IllegalArgumentException e) {
    506                 // Expected
    507             }
    508         } finally {
    509             if (f1 != null) {
    510                 f1.delete();
    511             }
    512             if (f2 != null) {
    513                 f2.delete();
    514             }
    515         }
    516     }
    517 
    518     /**
    519      * java.io.File#createTempFile(java.lang.String, java.lang.String,
    520      *java.io.File)
    521      */
    522     public void test_createTempFileLjava_lang_StringLjava_lang_StringLjava_io_File()
    523             throws IOException {
    524         File f1 = null;
    525         File f2 = null;
    526         String base = System.getProperty("java.io.tmpdir");
    527         try {
    528             // Test to make sure that the tempfile was saved in the correct
    529             // location and with the correct prefix/suffix.
    530             f1 = File.createTempFile("harmony-test-FileTest_tempFile2_tf", null, null);
    531             File dir = new File(base);
    532             f2 = File.createTempFile("harmony-test-FileTest_tempFile2_tf", ".tmp", dir);
    533             File currentFile;
    534             String fileLocation;
    535             String fileName;
    536             for (int i = 0; i < 2; i++) {
    537                 currentFile = i == 0 ? f1 : f2;
    538                 fileLocation = addTrailingSlash(currentFile.getParent());
    539                 base = addTrailingSlash(base);
    540                 assertEquals(
    541                         "File not created in the default temporary-file location.",
    542                         base, fileLocation);
    543                 fileName = currentFile.getName();
    544                 assertTrue("File created with incorrect suffix.", fileName
    545                         .endsWith(".tmp"));
    546                 assertTrue("File created with incorrect prefix.", fileName
    547                         .startsWith("harmony-test-FileTest_tempFile2_tf"));
    548                 currentFile.delete();
    549             }
    550 
    551             // Test for creating a tempfile in a directory that does not exist.
    552             int dirNumber = 1;
    553             boolean dirExists = true;
    554             // Set dir to a non-existent directory inside the temporary
    555             // directory
    556             dir = new File(base, String.valueOf(dirNumber));
    557             // Making sure that the directory does not exist.
    558             while (dirExists) {
    559                 // If the directory exists, add one to the directory number
    560                 // (making it
    561                 // a new directory name.)
    562                 if (dir.exists()) {
    563                     dirNumber++;
    564                     dir = new File(base, String.valueOf(dirNumber));
    565                 } else {
    566                     dirExists = false;
    567                 }
    568             }
    569             try {
    570                 // Try to create a file in a directory that does not exist
    571                 File f3 = File.createTempFile("harmony-test-FileTest_tempFile2_tf", null, dir);
    572                 f3.delete();
    573                 fail("IOException not thrown");
    574             } catch (IOException e) {
    575                 // Expected
    576             }
    577             dir.delete();
    578 
    579             // Tests for creating a tempfile with a filename shorter than 3
    580             // characters.
    581             try {
    582                 File f4 = File.createTempFile("ab", null, null);
    583                 f4.delete();
    584                 fail("IllegalArgumentException not thrown.");
    585             } catch (IllegalArgumentException e) {
    586                 // Expected
    587             }
    588             try {
    589                 File f4 = File.createTempFile("a", null, null);
    590                 f4.delete();
    591                 fail("IllegalArgumentException not thrown.");
    592             } catch (IllegalArgumentException e) {
    593                 // Expected
    594             }
    595             try {
    596                 File f4 = File.createTempFile("", null, null);
    597                 f4.delete();
    598                 fail("IllegalArgumentException not thrown.");
    599             } catch (IllegalArgumentException e) {
    600                 // Expected
    601             }
    602         } finally {
    603             if (f1 != null) {
    604                 f1.delete();
    605             }
    606             if (f2 != null) {
    607                 f1.delete();
    608             }
    609         }
    610     }
    611 
    612     /**
    613      * java.io.File#delete()
    614      */
    615     public void test_delete() throws IOException {
    616         File dir = new File(tempDirectory, platformId
    617                 + "filechk");
    618         dir.mkdir();
    619         assertTrue("Directory does not exist", dir.exists());
    620         assertTrue("Directory is not directory", dir.isDirectory());
    621         File f = new File(dir, "filechk.tst");
    622         FileOutputStream fos = new FileOutputStream(f);
    623         fos.close();
    624         assertTrue("Error Creating File For Delete Test", f.exists());
    625         dir.delete();
    626         assertTrue("Directory Should Not Have Been Deleted.", dir.exists());
    627         f.delete();
    628         assertTrue("File Was Not Deleted", !f.exists());
    629         dir.delete();
    630         assertTrue("Directory Was Not Deleted", !dir.exists());
    631     }
    632 
    633     // GCH
    634     // TODO : This test passes on Windows but fails on Linux with a
    635     // java.lang.NoClassDefFoundError. Temporarily removing from the test
    636     // suite while I investigate the cause.
    637     // /**
    638     // * java.io.File#deleteOnExit()
    639     // */
    640     // public void test_deleteOnExit() {
    641     // File f1 = new File(System.getProperty("java.io.tmpdir"), platformId
    642     // + "deleteOnExit.tst");
    643     // try {
    644     // FileOutputStream fos = new FileOutputStream(f1);
    645     // fos.close();
    646     // } catch (IOException e) {
    647     // fail("Unexpected IOException During Test : " + e.getMessage());
    648     // }
    649     // assertTrue("File Should Exist.", f1.exists());
    650     //
    651     // try {
    652     // Support_Exec.execJava(new String[] {
    653     // "tests.support.Support_DeleteOnExitTest", f1.getPath() },
    654     // null, true);
    655     // } catch (IOException e) {
    656     // fail("Unexpected IOException During Test + " + e.getMessage());
    657     // } catch (InterruptedException e) {
    658     // fail("Unexpected InterruptedException During Test: " + e);
    659     // }
    660     //
    661     // boolean gone = !f1.exists();
    662     // f1.delete();
    663     // assertTrue("File Should Already Be Deleted.", gone);
    664     // }
    665 
    666     /**
    667      * java.io.File#equals(java.lang.Object)
    668      */
    669     public void test_equalsLjava_lang_Object() throws IOException {
    670         File f1 = new File("filechk.tst");
    671         File f2 = new File("filechk.tst");
    672         File f3 = new File("xxxx");
    673 
    674         assertTrue("Equality test failed", f1.equals(f2));
    675         assertTrue("Files Should Not Return Equal.", !f1.equals(f3));
    676 
    677         f1 = new File(tempDirectory, "casetest.tmp");
    678         f2 = new File(tempDirectory, "CaseTest.tmp");
    679         assertFalse(f1.equals(f2));
    680         assertTrue(f1.createNewFile());
    681         f1.delete();
    682     }
    683 
    684     /**
    685      * java.io.File#exists()
    686      */
    687     public void test_exists() throws IOException {
    688         File f = new File(tempDirectory, platformId
    689                 + "exists.tst");
    690         assertTrue("Exists returned true for non-existent file", !f.exists());
    691         FileOutputStream fos = new FileOutputStream(f);
    692         fos.close();
    693         assertTrue("Exists returned false file", f.exists());
    694         f.delete();
    695     }
    696 
    697     /**
    698      * java.io.File#getAbsoluteFile()
    699      */
    700     public void test_getAbsoluteFile() {
    701         String base = addTrailingSlash(tempDirectory.getPath());
    702         File f = new File(base, "temp.tst");
    703         File f2 = f.getAbsoluteFile();
    704         assertEquals("Test 1: Incorrect File Returned.", 0, f2.compareTo(f
    705                 .getAbsoluteFile()));
    706         f = new File(base + "Temp" + File.separator + File.separator + "temp.tst");
    707         f2 = f.getAbsoluteFile();
    708         assertEquals("Test 2: Incorrect File Returned.", 0, f2.compareTo(f
    709                 .getAbsoluteFile()));
    710         f = new File(base + File.separator + ".." + File.separator + "temp.tst");
    711         f2 = f.getAbsoluteFile();
    712         assertEquals("Test 3: Incorrect File Returned.", 0, f2.compareTo(f
    713                 .getAbsoluteFile()));
    714         f.delete();
    715         f2.delete();
    716     }
    717 
    718     /**
    719      * java.io.File#getAbsolutePath()
    720      */
    721     public void test_getAbsolutePath() {
    722         String base = addTrailingSlash(tempDirectory.getPath());
    723         File f = new File(base, "temp.tst");
    724         assertEquals("Test 1: Incorrect Path Returned.",
    725                 base + "temp.tst", f.getAbsolutePath());
    726 
    727         f = new File(base + "Temp" + File.separator + File.separator + File.separator + "Testing" + File.separator
    728                 + "temp.tst");
    729         assertEquals("Test 2: Incorrect Path Returned.",
    730                 base + "Temp" + File.separator + "Testing" + File.separator + "temp.tst",
    731                 f.getAbsolutePath());
    732 
    733         f = new File(base + "a" + File.separator + File.separator + ".." + File.separator + "temp.tst");
    734         assertEquals("Test 3: Incorrect Path Returned.",
    735                 base + "a" + File.separator + ".." + File.separator + "temp.tst",
    736                 f.getAbsolutePath());
    737         f.delete();
    738     }
    739 
    740     /**
    741      * java.io.File#getCanonicalFile()
    742      */
    743     public void test_getCanonicalFile() throws IOException {
    744         String base = addTrailingSlash(tempDirectory.getPath());
    745         File f = new File(base, "temp.tst");
    746         File f2 = f.getCanonicalFile();
    747         assertEquals("Test 1: Incorrect File Returned.", 0, f2
    748                 .getCanonicalFile().compareTo(f.getCanonicalFile()));
    749         f = new File(base + "Temp" + File.separator + File.separator + "temp.tst");
    750         f2 = f.getCanonicalFile();
    751         assertEquals("Test 2: Incorrect File Returned.", 0, f2
    752                 .getCanonicalFile().compareTo(f.getCanonicalFile()));
    753         f = new File(base + "Temp" + File.separator + File.separator + ".." + File.separator + "temp.tst");
    754         f2 = f.getCanonicalFile();
    755         assertEquals("Test 3: Incorrect File Returned.", 0, f2
    756                 .getCanonicalFile().compareTo(f.getCanonicalFile()));
    757 
    758         // Test for when long directory/file names in Windows
    759         boolean onWindows = File.separatorChar == '\\';
    760         if (onWindows) {
    761             File testdir = new File(base, "long-" + platformId);
    762             testdir.mkdir();
    763             File dir = new File(testdir, "longdirectory" + platformId);
    764             try {
    765                 dir.mkdir();
    766                 f = new File(dir, "longfilename.tst");
    767                 f2 = f.getCanonicalFile();
    768                 assertEquals("Test 4: Incorrect File Returned.", 0, f2
    769                         .getCanonicalFile().compareTo(f.getCanonicalFile()));
    770                 FileOutputStream fos = new FileOutputStream(f);
    771                 fos.close();
    772                 f2 = new File(testdir + File.separator + "longdi~1" + File.separator
    773                         + "longfi~1.tst");
    774                 File canonicalf2 = f2.getCanonicalFile();
    775                 /*
    776                  * If the "short file name" doesn't exist, then assume that the
    777                  * 8.3 file name compatibility is disabled.
    778                  */
    779                 if (canonicalf2.exists()) {
    780                     assertTrue("Test 5: Incorrect File Returned: "
    781                             + canonicalf2, canonicalf2.compareTo(f
    782                             .getCanonicalFile()) == 0);
    783                 }
    784             } finally {
    785                 f.delete();
    786                 f2.delete();
    787                 dir.delete();
    788                 testdir.delete();
    789             }
    790         }
    791     }
    792 
    793     /**
    794      * java.io.File#getCanonicalPath()
    795      */
    796     public void test_getCanonicalPath() throws IOException {
    797         // Should work for Unix/Windows.
    798         String dots = "..";
    799         String base = tempDirectory.getCanonicalPath();
    800         base = addTrailingSlash(base);
    801         File f = new File(base, "temp.tst");
    802         assertEquals("Test 1: Incorrect Path Returned.", base + "temp.tst", f
    803                 .getCanonicalPath());
    804         f = new File(base + "Temp" + File.separator + dots + File.separator + "temp.tst");
    805         assertEquals("Test 2: Incorrect Path Returned.", base + "temp.tst", f
    806                 .getCanonicalPath());
    807 
    808         // Finding a non-existent directory for tests 3 and 4
    809         // This is necessary because getCanonicalPath is case sensitive and
    810         // could cause a failure in the test if the directory exists but with
    811         // different case letters (e.g "Temp" and "temp")
    812         int dirNumber = 1;
    813         boolean dirExists = true;
    814         File dir1 = new File(base, String.valueOf(dirNumber));
    815         while (dirExists) {
    816             if (dir1.exists()) {
    817                 dirNumber++;
    818                 dir1 = new File(base, String.valueOf(dirNumber));
    819             } else {
    820                 dirExists = false;
    821             }
    822         }
    823         f = new File(base + dirNumber + File.separator + dots + File.separator + dirNumber
    824                 + File.separator + "temp.tst");
    825         assertEquals("Test 3: Incorrect Path Returned.", base + dirNumber
    826                 + File.separator + "temp.tst", f.getCanonicalPath());
    827         f = new File(base + dirNumber + File.separator + "Temp" + File.separator + dots + File.separator
    828                 + "Test" + File.separator + "temp.tst");
    829         assertEquals("Test 4: Incorrect Path Returned.", base + dirNumber
    830                 + File.separator + "Test" + File.separator + "temp.tst", f.getCanonicalPath());
    831 
    832         f = new File(base + "1234.567");
    833         assertEquals("Test 5: Incorrect Path Returned.", base + "1234.567", f
    834                 .getCanonicalPath());
    835 
    836         // Test for long file names on Windows
    837         boolean onWindows = (File.separatorChar == '\\');
    838         if (onWindows) {
    839             File testdir = new File(base, "long-" + platformId);
    840             testdir.mkdir();
    841             File f1 = new File(testdir, "longfilename" + platformId + ".tst");
    842             FileOutputStream fos = new FileOutputStream(f1);
    843             File f2 = null, f3 = null, dir2 = null;
    844             try {
    845                 fos.close();
    846                 String dirName1 = f1.getCanonicalPath();
    847                 File f4 = new File(testdir, "longfi~1.tst");
    848                 /*
    849                  * If the "short file name" doesn't exist, then assume that the
    850                  * 8.3 file name compatibility is disabled.
    851                  */
    852                 if (f4.exists()) {
    853                     String dirName2 = f4.getCanonicalPath();
    854                     assertEquals("Test 6: Incorrect Path Returned.", dirName1,
    855                             dirName2);
    856                     dir2 = new File(testdir, "longdirectory" + platformId);
    857                     if (!dir2.exists()) {
    858                         assertTrue("Could not create dir: " + dir2, dir2
    859                                 .mkdir());
    860                     }
    861                     f2 = new File(testdir.getPath() + File.separator + "longdirectory"
    862                             + platformId + File.separator + "Test" + File.separator + dots
    863                             + File.separator + "longfilename.tst");
    864                     FileOutputStream fos2 = new FileOutputStream(f2);
    865                     fos2.close();
    866                     dirName1 = f2.getCanonicalPath();
    867                     f3 = new File(testdir.getPath() + File.separator + "longdi~1"
    868                             + File.separator + "Test" + File.separator + dots + File.separator
    869                             + "longfi~1.tst");
    870                     dirName2 = f3.getCanonicalPath();
    871                     assertEquals("Test 7: Incorrect Path Returned.", dirName1,
    872                             dirName2);
    873                 }
    874             } finally {
    875                 f1.delete();
    876                 if (f2 != null) {
    877                     f2.delete();
    878                 }
    879                 if (dir2 != null) {
    880                     dir2.delete();
    881                 }
    882                 testdir.delete();
    883             }
    884         }
    885     }
    886 
    887     /**
    888      * java.io.File#getName()
    889      */
    890     public void test_getName() {
    891         File f = new File("name.tst");
    892         assertEquals("Test 1: Returned incorrect name", "name.tst", f.getName());
    893 
    894         f = new File("");
    895         assertEquals("Test 2: Returned incorrect name", "", f.getName());
    896 
    897         f.delete();
    898     }
    899 
    900     /**
    901      * java.io.File#getParent()
    902      */
    903     public void test_getParent() {
    904         File f = new File("p.tst");
    905         assertNull("Incorrect path returned", f.getParent());
    906         f = new File("/user/home/p.tst");
    907         assertEquals("Incorrect path returned",
    908                 "/user/home", f.getParent());
    909 
    910         File f1 = new File("/directory");
    911         assertEquals("Wrong parent test 1", File.separator, f1.getParent());
    912         f1 = new File("/directory/file");
    913         assertEquals("Wrong parent test 2",
    914                 File.separator + "directory", f1.getParent());
    915         f1 = new File("directory/file");
    916         assertEquals("Wrong parent test 3", "directory", f1.getParent());
    917         f1 = new File("/");
    918         assertNull("Wrong parent test 4", f1.getParent());
    919         f1 = new File("directory");
    920         assertNull("Wrong parent test 5", f1.getParent());
    921 
    922         if (File.separatorChar == '\\' && new File("d:/").isAbsolute()) {
    923             f1 = new File("d:/directory");
    924             assertEquals("Wrong parent test 1a", "d:" + File.separator, f1.getParent());
    925             f1 = new File("d:/directory/file");
    926             assertEquals("Wrong parent test 2a",
    927                     "d:" + File.separator + "directory", f1.getParent());
    928             f1 = new File("d:directory/file");
    929             assertEquals("Wrong parent test 3a", "d:directory", f1.getParent());
    930             f1 = new File("d:/");
    931             assertNull("Wrong parent test 4a", f1.getParent());
    932             f1 = new File("d:directory");
    933             assertEquals("Wrong parent test 5a", "d:", f1.getParent());
    934         }
    935     }
    936 
    937     /**
    938      * java.io.File#getParentFile()
    939      */
    940     public void test_getParentFile() {
    941         File f = new File("tempfile.tst");
    942         assertNull("Incorrect path returned", f.getParentFile());
    943         f = new File(tempDirectory, "tempfile1.tmp");
    944         File f2 = new File(tempDirectory, "tempfile2.tmp");
    945         File f3 = new File(tempDirectory, "/a/tempfile.tmp");
    946         assertEquals("Incorrect File Returned", 0, f.getParentFile().compareTo(
    947                 f2.getParentFile()));
    948         assertTrue("Incorrect File Returned", f.getParentFile().compareTo(
    949                 f3.getParentFile()) != 0);
    950         f.delete();
    951         f2.delete();
    952         f3.delete();
    953     }
    954 
    955     /**
    956      * java.io.File#getPath()
    957      */
    958     public void test_getPath() {
    959         String base = System.getProperty("user.home");
    960         String fname;
    961         File f1;
    962         if (!base.regionMatches((base.length() - 1), File.separator, 0, 1)) {
    963             base += File.separator;
    964         }
    965         fname = base + "filechk.tst";
    966         f1 = new File(base, "filechk.tst");
    967         File f2 = new File("filechk.tst");
    968         File f3 = new File("c:");
    969         File f4 = new File(base + "a" + File.separator + File.separator + ".." + File.separator
    970                 + "filechk.tst");
    971         assertEquals("getPath returned incorrect path(f1)",
    972                 fname, f1.getPath());
    973         assertEquals("getPath returned incorrect path(f2)",
    974                 "filechk.tst", f2.getPath());
    975         assertEquals("getPath returned incorrect path(f3)", "c:", f3.getPath());
    976         assertEquals("getPath returned incorrect path(f4)",
    977                 base + "a" + File.separator + ".." + File.separator + "filechk.tst",
    978                 f4.getPath());
    979         f1.delete();
    980         f2.delete();
    981         f3.delete();
    982         f4.delete();
    983 
    984         // Regression for HARMONY-444
    985         File file;
    986         String separator = File.separator;
    987 
    988         file = new File((File) null, "x/y/z");
    989         assertEquals("x" + separator + "y" + separator + "z", file.getPath());
    990 
    991         file = new File((String) null, "x/y/z");
    992         assertEquals("x" + separator + "y" + separator + "z", file.getPath());
    993 
    994         // Regression for HARMONY-829
    995         String f1ParentName = "01";
    996         f1 = new File(f1ParentName, "");
    997         assertEquals(f1ParentName, f1.getPath());
    998 
    999         String f2ParentName = "0";
   1000         f2 = new File(f2ParentName, "");
   1001 
   1002         assertEquals(-1, f2.compareTo(f1));
   1003         assertEquals(1, f1.compareTo(f2));
   1004 
   1005         File parent = tempDirectory;
   1006         f3 = new File(parent, "");
   1007 
   1008         assertEquals(parent.getPath(), f3.getPath());
   1009 
   1010         File file0 = new File("");
   1011         assertEquals("", file0.getPath());
   1012 
   1013         // Regression for HARMONY-3869
   1014         // Behavior here is system-dependent according to the RI javadoc.
   1015         String path1 = new File("", "").getPath();
   1016         assertTrue(path1.equals(File.separator) || path1.isEmpty());
   1017         String path2 = new File(new File(""), "").getPath();
   1018         assertTrue(path2.equals(File.separator) || path2.isEmpty());
   1019     }
   1020 
   1021     /**
   1022      * java.io.File#hashCode()
   1023      */
   1024     public void test_hashCode() {
   1025         // Regression for HARMONY-53
   1026         File mfile = new File("SoMe FiLeNaMe"); // Mixed case
   1027         File lfile = new File("some filename"); // Lower case
   1028 
   1029         if (mfile.equals(lfile)) {
   1030             assertTrue("Assert 0: wrong hashcode", mfile.hashCode() == lfile
   1031                     .hashCode());
   1032         } else {
   1033             assertFalse("Assert 1: wrong hashcode", mfile.hashCode() == lfile
   1034                     .hashCode());
   1035         }
   1036     }
   1037 
   1038     /**
   1039      * java.io.File#isAbsolute()
   1040      */
   1041     public void test_isAbsolute() {
   1042         if (File.separatorChar == '\\') {
   1043             File f = new File("c:\\test");
   1044             File f1 = new File("\\test");
   1045             // One or the other should be absolute on Windows or CE
   1046             assertTrue("Absolute returned false", (f.isAbsolute() && !f1
   1047                     .isAbsolute())
   1048                     || (!f.isAbsolute() && f1.isAbsolute()));
   1049 
   1050             assertTrue(new File("C:/").isAbsolute());
   1051             assertTrue(new File("f:/").isAbsolute());
   1052             assertTrue(new File("f:\\").isAbsolute());
   1053             assertFalse(new File("f:").isAbsolute());
   1054             assertFalse(new File("K:").isAbsolute());
   1055             assertTrue(new File("\\\\").isAbsolute());
   1056             assertTrue(new File("\\\\\\").isAbsolute());
   1057             assertTrue(new File("\\\\hello").isAbsolute());
   1058             assertFalse(new File("\\").isAbsolute());
   1059             assertFalse(new File("/").isAbsolute());
   1060         } else {
   1061             File f = new File("/test");
   1062             File f1 = new File("\\test");
   1063             assertTrue("Absolute returned false", f.isAbsolute());
   1064             assertFalse("Absolute returned true", f1.isAbsolute());
   1065             assertTrue(new File("//test").isAbsolute());
   1066             assertFalse(new File("test").isAbsolute());
   1067             assertFalse(new File("c:/").isAbsolute());
   1068             assertFalse(new File("c:\\").isAbsolute());
   1069             assertFalse(new File("c:").isAbsolute());
   1070             assertFalse(new File("\\").isAbsolute());
   1071             assertFalse(new File("\\\\").isAbsolute());
   1072         }
   1073         assertTrue("Non-Absolute returned true", !new File("../test")
   1074                 .isAbsolute());
   1075     }
   1076 
   1077     /**
   1078      * java.io.File#isDirectory()
   1079      */
   1080     public void test_isDirectory() {
   1081         String base = addTrailingSlash(tempDirectory.getPath());
   1082         File f = new File(base);
   1083         assertTrue("Test 1: Directory Returned False", f.isDirectory());
   1084         f = new File(base + "zxzxzxz" + platformId);
   1085         assertTrue("Test 2: (Not Created) Directory Returned True.", !f
   1086                 .isDirectory());
   1087         f.mkdir();
   1088         try {
   1089             assertTrue("Test 3: Directory Returned False.", f.isDirectory());
   1090         } finally {
   1091             f.delete();
   1092         }
   1093     }
   1094 
   1095     /**
   1096      * java.io.File#isFile()
   1097      */
   1098     public void test_isFile() throws IOException {
   1099         String base = tempDirectory.getPath();
   1100         File f = new File(base);
   1101         assertFalse("Directory Returned True As Being A File.", f.isFile());
   1102 
   1103         base = addTrailingSlash(base);
   1104         f = new File(base, platformId + "amiafile");
   1105         assertTrue("Non-existent File Returned True", !f.isFile());
   1106         FileOutputStream fos = new FileOutputStream(f);
   1107         fos.close();
   1108         assertTrue("File returned false", f.isFile());
   1109         f.delete();
   1110     }
   1111 
   1112     public void test_isHidden() throws IOException, InterruptedException {
   1113         boolean onUnix = File.separatorChar == '/';
   1114         assertTrue(onUnix);
   1115 
   1116         // On Unix hidden files are marked with a "." at the beginning
   1117         // of the file name.
   1118         File f1 = File.createTempFile("harmony-test-FileTest_notHidden_", ".tmp");
   1119         File f2 = File.createTempFile(".harmony-test-FileTest_isHidden_", ".tmp");
   1120         assertFalse(f1.isHidden());
   1121         assertTrue(f2.isHidden());
   1122         // We can still delete hidden files.
   1123         assertTrue(f2.delete());
   1124         f1.delete();
   1125     }
   1126 
   1127     /**
   1128      * java.io.File#lastModified()
   1129      */
   1130     public void test_lastModified() throws IOException {
   1131         File f = new File(System.getProperty("java.io.tmpdir"), platformId
   1132                 + "lModTest.tst");
   1133         f.delete();
   1134         long lastModifiedTime = f.lastModified();
   1135         assertEquals("LastModified Time Should Have Returned 0.", 0,
   1136                 lastModifiedTime);
   1137         FileOutputStream fos = new FileOutputStream(f);
   1138         fos.close();
   1139         f.setLastModified(315550800000L);
   1140         lastModifiedTime = f.lastModified();
   1141         assertEquals("LastModified Time Incorrect",
   1142                 315550800000L, lastModifiedTime);
   1143         f.delete();
   1144     }
   1145 
   1146     /**
   1147      * java.io.File#length()
   1148      */
   1149     public void test_length() throws IOException {
   1150         File f = new File(tempDirectory, platformId
   1151                 + "input.tst");
   1152         assertEquals("File Length Should Have Returned 0.", 0, f.length());
   1153         FileOutputStream fos = new FileOutputStream(f);
   1154         fos.write(fileString.getBytes());
   1155         fos.close();
   1156         assertEquals("Incorrect file length returned",
   1157                 fileString.length(), f.length());
   1158         f.delete();
   1159 
   1160         // regression test for HARMONY-1497
   1161         f = File.createTempFile("test", "tmp");
   1162         f.deleteOnExit();
   1163         RandomAccessFile raf = new RandomAccessFile(f, "rwd");
   1164         raf.write(0x41);
   1165         assertEquals(1, f.length());
   1166     }
   1167 
   1168     /**
   1169      * java.io.File#list()
   1170      */
   1171     public void test_list() throws IOException {
   1172         String base = tempDirectory.getPath();
   1173         // Old test left behind "garbage files" so this time it creates a
   1174         // directory that is guaranteed not to already exist (and deletes it
   1175         // afterward.)
   1176         int dirNumber = 1;
   1177         boolean dirExists = true;
   1178         File dir = null;
   1179         dir = new File(base, platformId + String.valueOf(dirNumber));
   1180         while (dirExists) {
   1181             if (dir.exists()) {
   1182                 dirNumber++;
   1183                 dir = new File(base, String.valueOf(dirNumber));
   1184             } else {
   1185                 dirExists = false;
   1186             }
   1187         }
   1188 
   1189         String[] flist = dir.list();
   1190 
   1191         assertNull("Method list() Should Have Returned null.", flist);
   1192 
   1193         assertTrue("Could not create parent directory for list test", dir
   1194                 .mkdir());
   1195 
   1196         String[] files = { "mtzz1.xx", "mtzz2.xx", "mtzz3.yy", "mtzz4.yy" };
   1197         try {
   1198             assertEquals(
   1199                     "Method list() Should Have Returned An Array Of Length 0.",
   1200                     0, dir.list().length);
   1201 
   1202             File file = new File(dir, "notADir.tst");
   1203             try {
   1204                 FileOutputStream fos = new FileOutputStream(file);
   1205                 fos.close();
   1206                 assertNull(
   1207                         "listFiles Should Have Returned Null When Used On A File Instead Of A Directory.",
   1208                         file.list());
   1209             } finally {
   1210                 file.delete();
   1211             }
   1212 
   1213             for (int i = 0; i < files.length; i++) {
   1214                 File f = new File(dir, files[i]);
   1215                 FileOutputStream fos = new FileOutputStream(f);
   1216                 fos.close();
   1217             }
   1218 
   1219             flist = dir.list();
   1220             if (flist.length != files.length) {
   1221                 fail("Incorrect list returned");
   1222             }
   1223 
   1224             // Checking to make sure the correct files were are listed in the
   1225             // array.
   1226             boolean[] check = new boolean[flist.length];
   1227             for (int i = 0; i < check.length; i++) {
   1228                 check[i] = false;
   1229             }
   1230             for (int i = 0; i < files.length; i++) {
   1231                 for (int j = 0; j < flist.length; j++) {
   1232                     if (flist[j].equals(files[i])) {
   1233                         check[i] = true;
   1234                         break;
   1235                     }
   1236                 }
   1237             }
   1238             int checkCount = 0;
   1239             for (int i = 0; i < check.length; i++) {
   1240                 if (check[i] == false) {
   1241                     checkCount++;
   1242                 }
   1243             }
   1244             assertEquals("Invalid file returned in listing", 0, checkCount);
   1245 
   1246             for (int i = 0; i < files.length; i++) {
   1247                 File f = new File(dir, files[i]);
   1248                 f.delete();
   1249             }
   1250 
   1251             assertTrue("Could not delete parent directory for list test.", dir
   1252                     .delete());
   1253         } finally {
   1254             for (int i = 0; i < files.length; i++) {
   1255                 File f = new File(dir, files[i]);
   1256                 f.delete();
   1257             }
   1258             dir.delete();
   1259         }
   1260     }
   1261 
   1262     /**
   1263      * java.io.File#listFiles()
   1264      */
   1265     public void test_listFiles() throws IOException, InterruptedException {
   1266         String base = tempDirectory.getPath();
   1267         // Finding a non-existent directory to create.
   1268         int dirNumber = 1;
   1269         boolean dirExists = true;
   1270         File dir = new File(base, platformId + String.valueOf(dirNumber));
   1271         // Making sure that the directory does not exist.
   1272         while (dirExists) {
   1273             // If the directory exists, add one to the directory number
   1274             // (making it a new directory name.)
   1275             if (dir.exists()) {
   1276                 dirNumber++;
   1277                 dir = new File(base, String.valueOf(dirNumber));
   1278             } else {
   1279                 dirExists = false;
   1280             }
   1281         }
   1282         // Test for attempting to call listFiles on a non-existent directory.
   1283         assertNull("listFiles Should Return Null.", dir.listFiles());
   1284 
   1285         assertTrue("Failed To Create Parent Directory.", dir.mkdir());
   1286 
   1287         String[] files = { "1.tst", "2.tst", "3.tst", "" };
   1288         try {
   1289             assertEquals("listFiles Should Return An Array Of Length 0.", 0,
   1290                     dir.listFiles().length);
   1291 
   1292             File file = new File(dir, "notADir.tst");
   1293             try {
   1294                 FileOutputStream fos = new FileOutputStream(file);
   1295                 fos.close();
   1296                 assertNull(
   1297                         "listFiles Should Have Returned Null When Used On A File Instead Of A Directory.",
   1298                         file.listFiles());
   1299             } finally {
   1300                 file.delete();
   1301             }
   1302 
   1303             for (int i = 0; i < (files.length - 1); i++) {
   1304                 File f = new File(dir, files[i]);
   1305                 FileOutputStream fos = new FileOutputStream(f);
   1306                 fos.close();
   1307             }
   1308 
   1309             new File(dir, "doesNotExist.tst");
   1310             File[] flist = dir.listFiles();
   1311 
   1312             // Test to make sure that only the 3 files that were created are
   1313             // listed.
   1314             assertEquals("Incorrect Number Of Files Returned.", 3, flist.length);
   1315 
   1316             // Test to make sure that listFiles can read hidden files.
   1317             boolean onUnix = File.separatorChar == '/';
   1318             boolean onWindows = File.separatorChar == '\\';
   1319             if (onWindows) {
   1320                 files[3] = "4.tst";
   1321                 File f = new File(dir, "4.tst");
   1322                 FileOutputStream fos = new FileOutputStream(f);
   1323                 fos.close();
   1324                 Runtime r = Runtime.getRuntime();
   1325                 Process p = r.exec("attrib +h \"" + f.getPath() + "\"");
   1326                 p.waitFor();
   1327             }
   1328             if (onUnix) {
   1329                 files[3] = ".4.tst";
   1330                 File f = new File(dir, ".4.tst");
   1331                 FileOutputStream fos = new FileOutputStream(f);
   1332                 fos.close();
   1333             }
   1334             flist = dir.listFiles();
   1335             assertEquals("Incorrect Number Of Files Returned.", 4, flist.length);
   1336 
   1337             // Checking to make sure the correct files were are listed in
   1338             // the array.
   1339             boolean[] check = new boolean[flist.length];
   1340             for (int i = 0; i < check.length; i++) {
   1341                 check[i] = false;
   1342             }
   1343             for (int i = 0; i < files.length; i++) {
   1344                 for (int j = 0; j < flist.length; j++) {
   1345                     if (flist[j].getName().equals(files[i])) {
   1346                         check[i] = true;
   1347                         break;
   1348                     }
   1349                 }
   1350             }
   1351             int checkCount = 0;
   1352             for (int i = 0; i < check.length; i++) {
   1353                 if (check[i] == false) {
   1354                     checkCount++;
   1355                 }
   1356             }
   1357             assertEquals("Invalid file returned in listing", 0, checkCount);
   1358 
   1359             if (onWindows) {
   1360                 Runtime r = Runtime.getRuntime();
   1361                 Process p = r.exec("attrib -h \""
   1362                         + new File(dir, files[3]).getPath() + "\"");
   1363                 p.waitFor();
   1364             }
   1365 
   1366             for (int i = 0; i < files.length; i++) {
   1367                 File f = new File(dir, files[i]);
   1368                 f.delete();
   1369             }
   1370             assertTrue("Parent Directory Not Deleted.", dir.delete());
   1371         } finally {
   1372             for (int i = 0; i < files.length; i++) {
   1373                 File f = new File(dir, files[i]);
   1374                 f.delete();
   1375             }
   1376             dir.delete();
   1377         }
   1378     }
   1379 
   1380     /**
   1381      * java.io.File#listFiles(java.io.FileFilter)
   1382      */
   1383     public void test_listFilesLjava_io_FileFilter() throws IOException {
   1384         String base = System.getProperty("java.io.tmpdir");
   1385         // Finding a non-existent directory to create.
   1386         int dirNumber = 1;
   1387         boolean dirExists = true;
   1388         File baseDir = new File(base, platformId + String.valueOf(dirNumber));
   1389         // Making sure that the directory does not exist.
   1390         while (dirExists) {
   1391             // If the directory exists, add one to the directory number (making
   1392             // it a new directory name.)
   1393             if (baseDir.exists()) {
   1394                 dirNumber++;
   1395                 baseDir = new File(base, String.valueOf(dirNumber));
   1396             } else {
   1397                 dirExists = false;
   1398             }
   1399         }
   1400 
   1401         // Creating a filter that catches directories.
   1402         FileFilter dirFilter = new FileFilter() {
   1403             public boolean accept(File f) {
   1404                 return f.isDirectory();
   1405             }
   1406         };
   1407 
   1408         assertNull("listFiles Should Return Null.", baseDir
   1409                 .listFiles(dirFilter));
   1410 
   1411         assertTrue("Failed To Create Parent Directory.", baseDir.mkdir());
   1412 
   1413         File dir1 = null;
   1414         String[] files = { "1.tst", "2.tst", "3.tst" };
   1415         try {
   1416             assertEquals("listFiles Should Return An Array Of Length 0.", 0,
   1417                     baseDir.listFiles(dirFilter).length);
   1418 
   1419             File file = new File(baseDir, "notADir.tst");
   1420             try {
   1421                 FileOutputStream fos = new FileOutputStream(file);
   1422                 fos.close();
   1423                 assertNull(
   1424                         "listFiles Should Have Returned Null When Used On A File Instead Of A Directory.",
   1425                         file.listFiles(dirFilter));
   1426             } finally {
   1427                 file.delete();
   1428             }
   1429 
   1430             for (int i = 0; i < files.length; i++) {
   1431                 File f = new File(baseDir, files[i]);
   1432                 FileOutputStream fos = new FileOutputStream(f);
   1433                 fos.close();
   1434             }
   1435             dir1 = new File(baseDir, "Temp1");
   1436             dir1.mkdir();
   1437 
   1438             // Creating a filter that catches files.
   1439             FileFilter fileFilter = new FileFilter() {
   1440                 public boolean accept(File f) {
   1441                     return f.isFile();
   1442                 }
   1443             };
   1444 
   1445             // Test to see if the correct number of directories are returned.
   1446             File[] directories = baseDir.listFiles(dirFilter);
   1447             assertEquals("Incorrect Number Of Directories Returned.", 1,
   1448                     directories.length);
   1449 
   1450             // Test to see if the directory was saved with the correct name.
   1451             assertEquals("Incorrect Directory Returned.", 0, directories[0]
   1452                     .compareTo(dir1));
   1453 
   1454             // Test to see if the correct number of files are returned.
   1455             File[] flist = baseDir.listFiles(fileFilter);
   1456             assertEquals("Incorrect Number Of Files Returned.",
   1457                     files.length, flist.length);
   1458 
   1459             // Checking to make sure the correct files were are listed in the
   1460             // array.
   1461             boolean[] check = new boolean[flist.length];
   1462             for (int i = 0; i < check.length; i++) {
   1463                 check[i] = false;
   1464             }
   1465             for (int i = 0; i < files.length; i++) {
   1466                 for (int j = 0; j < flist.length; j++) {
   1467                     if (flist[j].getName().equals(files[i])) {
   1468                         check[i] = true;
   1469                         break;
   1470                     }
   1471                 }
   1472             }
   1473             int checkCount = 0;
   1474             for (int i = 0; i < check.length; i++) {
   1475                 if (check[i] == false) {
   1476                     checkCount++;
   1477                 }
   1478             }
   1479             assertEquals("Invalid file returned in listing", 0, checkCount);
   1480 
   1481             for (int i = 0; i < files.length; i++) {
   1482                 File f = new File(baseDir, files[i]);
   1483                 f.delete();
   1484             }
   1485             dir1.delete();
   1486             assertTrue("Parent Directory Not Deleted.", baseDir.delete());
   1487         } finally {
   1488             for (int i = 0; i < files.length; i++) {
   1489                 File f = new File(baseDir, files[i]);
   1490                 f.delete();
   1491             }
   1492             if (dir1 != null) {
   1493                 dir1.delete();
   1494             }
   1495             baseDir.delete();
   1496         }
   1497     }
   1498 
   1499     /**
   1500      * java.io.File#listFiles(java.io.FilenameFilter)
   1501      */
   1502     public void test_listFilesLjava_io_FilenameFilter() throws IOException {
   1503         String base = System.getProperty("java.io.tmpdir");
   1504         // Finding a non-existent directory to create.
   1505         int dirNumber = 1;
   1506         boolean dirExists = true;
   1507         File dir = new File(base, platformId + String.valueOf(dirNumber));
   1508         // Making sure that the directory does not exist.
   1509         while (dirExists) {
   1510             // If the directory exists, add one to the directory number (making
   1511             // it a new directory name.)
   1512             if (dir.exists()) {
   1513                 dirNumber++;
   1514                 dir = new File(base, platformId + String.valueOf(dirNumber));
   1515             } else {
   1516                 dirExists = false;
   1517             }
   1518         }
   1519 
   1520         // Creating a filter that catches "*.tst" files.
   1521         FilenameFilter tstFilter = new FilenameFilter() {
   1522             public boolean accept(File f, String fileName) {
   1523                 return fileName.endsWith(".tst");
   1524             }
   1525         };
   1526 
   1527         assertNull("listFiles Should Return Null.", dir.listFiles(tstFilter));
   1528 
   1529         assertTrue("Failed To Create Parent Directory.", dir.mkdir());
   1530 
   1531         String[] files = { "1.tst", "2.tst", "3.tmp" };
   1532         try {
   1533             assertEquals("listFiles Should Return An Array Of Length 0.", 0,
   1534                     dir.listFiles(tstFilter).length);
   1535 
   1536             File file = new File(dir, "notADir.tst");
   1537             try {
   1538                 FileOutputStream fos = new FileOutputStream(file);
   1539                 fos.close();
   1540                 assertNull(
   1541                         "listFiles Should Have Returned Null When Used On A File Instead Of A Directory.",
   1542                         file.listFiles(tstFilter));
   1543             } finally {
   1544                 file.delete();
   1545             }
   1546 
   1547             for (int i = 0; i < files.length; i++) {
   1548                 File f = new File(dir, files[i]);
   1549                 FileOutputStream fos = new FileOutputStream(f);
   1550                 fos.close();
   1551             }
   1552 
   1553             // Creating a filter that catches "*.tmp" files.
   1554             FilenameFilter tmpFilter = new FilenameFilter() {
   1555                 public boolean accept(File f, String fileName) {
   1556                     // If the suffix is ".tmp" then send it to the array
   1557                     if (fileName.endsWith(".tmp")) {
   1558                         return true;
   1559                     } else {
   1560                         return false;
   1561                     }
   1562                 }
   1563             };
   1564 
   1565             // Tests to see if the correct number of files were returned.
   1566             File[] flist = dir.listFiles(tstFilter);
   1567             assertEquals("Incorrect Number Of Files Passed Through tstFilter.",
   1568                     2, flist.length);
   1569             for (int i = 0; i < flist.length; i++) {
   1570                 assertTrue("File Should Not Have Passed The tstFilter.",
   1571                         flist[i].getPath().endsWith(".tst"));
   1572             }
   1573 
   1574             flist = dir.listFiles(tmpFilter);
   1575             assertEquals("Incorrect Number Of Files Passed Through tmpFilter.",
   1576                     1, flist.length);
   1577             assertTrue("File Should Not Have Passed The tmpFilter.", flist[0]
   1578                     .getPath().endsWith(".tmp"));
   1579 
   1580             for (int i = 0; i < files.length; i++) {
   1581                 File f = new File(dir, files[i]);
   1582                 f.delete();
   1583             }
   1584             assertTrue("Parent Directory Not Deleted.", dir.delete());
   1585         } finally {
   1586             for (int i = 0; i < files.length; i++) {
   1587                 File f = new File(dir, files[i]);
   1588                 f.delete();
   1589             }
   1590             dir.delete();
   1591         }
   1592     }
   1593 
   1594     /**
   1595      * java.io.File#list(java.io.FilenameFilter)
   1596      */
   1597     public void test_listLjava_io_FilenameFilter() throws IOException {
   1598         String base = tempDirectory.getPath();
   1599         // Old test left behind "garbage files" so this time it creates a
   1600         // directory that is guaranteed not to already exist (and deletes it
   1601         // afterward.)
   1602         int dirNumber = 1;
   1603         boolean dirExists = true;
   1604         File dir = new File(base, platformId + String.valueOf(dirNumber));
   1605         while (dirExists) {
   1606             if (dir.exists()) {
   1607                 dirNumber++;
   1608                 dir = new File(base, String.valueOf(dirNumber));
   1609             } else {
   1610                 dirExists = false;
   1611             }
   1612         }
   1613 
   1614         FilenameFilter filter = new FilenameFilter() {
   1615             public boolean accept(File dir, String name) {
   1616                 return !name.equals("mtzz1.xx");
   1617             }
   1618         };
   1619 
   1620         String[] flist = dir.list(filter);
   1621         assertNull("Method list(FilenameFilter) Should Have Returned Null.",
   1622                 flist);
   1623 
   1624         assertTrue("Could not create parent directory for test", dir.mkdir());
   1625 
   1626         String[] files = { "mtzz1.xx", "mtzz2.xx", "mtzz3.yy", "mtzz4.yy" };
   1627         try {
   1628             /*
   1629              * Do not return null when trying to use list(Filename Filter) on a
   1630              * file rather than a directory. All other "list" methods return
   1631              * null for this test case.
   1632              */
   1633             /*
   1634              * File file = new File(dir, "notADir.tst"); try { FileOutputStream
   1635              * fos = new FileOutputStream(file); fos.close(); } catch
   1636              * (IOException e) { fail("Unexpected IOException During Test."); }
   1637              * flist = dir.list(filter); assertNull("listFiles Should Have
   1638              * Returned Null When Used On A File Instead Of A Directory.",
   1639              * flist); file.delete();
   1640              */
   1641 
   1642             flist = dir.list(filter);
   1643             assertEquals("Array Of Length 0 Should Have Returned.", 0,
   1644                     flist.length);
   1645 
   1646             for (int i = 0; i < files.length; i++) {
   1647                 File f = new File(dir, files[i]);
   1648                 FileOutputStream fos = new FileOutputStream(f);
   1649                 fos.close();
   1650             }
   1651 
   1652             flist = dir.list(filter);
   1653 
   1654             assertEquals("Incorrect list returned", flist.length,
   1655                     files.length - 1);
   1656 
   1657             // Checking to make sure the correct files were are listed in the
   1658             // array.
   1659             boolean[] check = new boolean[flist.length];
   1660             for (int i = 0; i < check.length; i++) {
   1661                 check[i] = false;
   1662             }
   1663             String[] wantedFiles = { "mtzz2.xx", "mtzz3.yy", "mtzz4.yy" };
   1664             for (int i = 0; i < wantedFiles.length; i++) {
   1665                 for (int j = 0; j < flist.length; j++) {
   1666                     if (flist[j].equals(wantedFiles[i])) {
   1667                         check[i] = true;
   1668                         break;
   1669                     }
   1670                 }
   1671             }
   1672             int checkCount = 0;
   1673             for (int i = 0; i < check.length; i++) {
   1674                 if (check[i] == false) {
   1675                     checkCount++;
   1676                 }
   1677             }
   1678             assertEquals("Invalid file returned in listing", 0, checkCount);
   1679 
   1680             for (int i = 0; i < files.length; i++) {
   1681                 File f = new File(dir, files[i]);
   1682                 f.delete();
   1683             }
   1684             assertTrue("Could not delete parent directory for test.", dir
   1685                     .delete());
   1686         } finally {
   1687             for (int i = 0; i < files.length; i++) {
   1688                 File f = new File(dir, files[i]);
   1689                 f.delete();
   1690             }
   1691             dir.delete();
   1692         }
   1693     }
   1694 
   1695     /**
   1696      * java.io.File#listRoots()
   1697      */
   1698     public void test_listRoots() {
   1699         File[] roots = File.listRoots();
   1700         boolean onUnix = File.separatorChar == '/';
   1701         boolean onWindows = File.separatorChar == '\\';
   1702         if (onUnix) {
   1703             assertEquals("Incorrect Number Of Root Directories.", 1,
   1704                     roots.length);
   1705             String fileLoc = roots[0].getPath();
   1706             assertTrue("Incorrect Root Directory Returned.", fileLoc
   1707                     .startsWith(File.separator));
   1708         } else if (onWindows) {
   1709             // Need better test for Windows
   1710             assertTrue("Incorrect Number Of Root Directories.",
   1711                     roots.length > 0);
   1712         }
   1713     }
   1714 
   1715     /**
   1716      * java.io.File#mkdir()
   1717      */
   1718     public void test_mkdir() throws IOException {
   1719         String base = tempDirectory.getPath();
   1720         // Old test left behind "garbage files" so this time it creates a
   1721         // directory that is guaranteed not to already exist (and deletes it
   1722         // afterward.)
   1723         int dirNumber = 1;
   1724         boolean dirExists = true;
   1725         File dir = new File(base, String.valueOf(dirNumber));
   1726         while (dirExists) {
   1727             if (dir.exists()) {
   1728                 dirNumber++;
   1729                 dir = new File(base, String.valueOf(dirNumber));
   1730             } else {
   1731                 dirExists = false;
   1732             }
   1733         }
   1734 
   1735         assertTrue("mkdir failed", dir.mkdir());
   1736         assertTrue("mkdir worked but exists check failed", dir.exists());
   1737         dir.deleteOnExit();
   1738 
   1739         String longDirName = "abcdefghijklmnopqrstuvwx";// 24 chars
   1740         String newbase = new String(dir + File.separator);
   1741         StringBuilder sb = new StringBuilder(dir + File.separator);
   1742         StringBuilder sb2 = new StringBuilder(dir + File.separator);
   1743 
   1744         // Test make a long path
   1745         while (dir.getCanonicalPath().length() < 256 - longDirName.length()) {
   1746             sb.append(longDirName + File.separator);
   1747             dir = new File(sb.toString());
   1748             assertTrue("mkdir failed", dir.mkdir());
   1749             assertTrue("mkdir worked but exists check failed", dir.exists());
   1750             dir.deleteOnExit();
   1751         }
   1752 
   1753         while (dir.getCanonicalPath().length() < 256) {
   1754             sb.append(0);
   1755             dir = new File(sb.toString());
   1756             assertTrue("mkdir " + dir.getCanonicalPath().length() + " failed",
   1757                     dir.mkdir());
   1758             assertTrue("mkdir " + dir.getCanonicalPath().length()
   1759                     + " worked but exists check failed", dir.exists());
   1760             dir.deleteOnExit();
   1761         }
   1762         dir = new File(sb2.toString());
   1763         // Test make many paths
   1764         while (dir.getCanonicalPath().length() < 256) {
   1765             sb2.append(0);
   1766             dir = new File(sb2.toString());
   1767             assertTrue("mkdir " + dir.getCanonicalPath().length() + " failed",
   1768                     dir.mkdir());
   1769             assertTrue("mkdir " + dir.getCanonicalPath().length()
   1770                     + " worked but exists check failed", dir.exists());
   1771             dir.deleteOnExit();
   1772         }
   1773 
   1774         // Regression test for HARMONY-3656
   1775         String[] ss = { "dir\u3400", "abc", "abc@123", "!@#$%^&",
   1776                 "~\u4E00!\u4E8C@\u4E09$", "\u56DB\u4E94\u516D",
   1777                 "\u4E03\u516B\u4E5D" };
   1778         for (int i = 0; i < ss.length; i++) {
   1779             dir = new File(newbase, ss[i]);
   1780             assertTrue("mkdir " + dir.getCanonicalPath() + " failed",
   1781                     dir.mkdir());
   1782             assertTrue("mkdir " + dir.getCanonicalPath()
   1783                     + " worked but exists check failed",
   1784                     dir.exists());
   1785             dir.deleteOnExit();
   1786         }
   1787     }
   1788 
   1789     /**
   1790      * java.io.File#mkdir()
   1791      * <p/>
   1792      * HARMONY-6041
   1793      */
   1794     public void test_mkdir_special_unicode() throws IOException {
   1795         File specialDir = new File(this.tempDirectory, "\u5C73");
   1796         int i = 0;
   1797         while (specialDir.exists()) {
   1798             specialDir = new File("\u5C73" + i);
   1799             ++i;
   1800         }
   1801         assertFalse(specialDir.exists());
   1802         assertTrue(specialDir.mkdir());
   1803         assertTrue(specialDir.exists());
   1804     }
   1805 
   1806     /**
   1807      * java.io.File#mkdirs()
   1808      */
   1809     public void test_mkdirs() {
   1810         String userHome = addTrailingSlash(tempDirectory.getPath());
   1811         File f = new File(userHome + "mdtest" + platformId + File.separator + "mdtest2",
   1812                 "p.tst");
   1813         File g = new File(userHome + "mdtest" + platformId + File.separator + "mdtest2");
   1814         File h = new File(userHome + "mdtest" + platformId);
   1815         f.mkdirs();
   1816         try {
   1817             assertTrue("Base Directory not created", h.exists());
   1818             assertTrue("Directories not created", g.exists());
   1819             assertTrue("File not created", f.exists());
   1820         } finally {
   1821             f.delete();
   1822             g.delete();
   1823             h.delete();
   1824         }
   1825     }
   1826 
   1827     /**
   1828      * java.io.File#renameTo(java.io.File)
   1829      */
   1830     public void test_renameToLjava_io_File() throws IOException {
   1831         String base = tempDirectory.getPath();
   1832         File dir = new File(base, platformId);
   1833         dir.mkdir();
   1834         File f = new File(dir, "xxx.xxx");
   1835         File rfile = new File(dir, "yyy.yyy");
   1836         File f2 = new File(dir, "zzz.zzz");
   1837         try {
   1838             FileOutputStream fos = new FileOutputStream(f);
   1839             fos.write(fileString.getBytes());
   1840             fos.close();
   1841             long lengthOfFile = f.length();
   1842 
   1843             rfile.delete(); // in case it already exists
   1844 
   1845             assertTrue("Test 1: File Rename Failed", f.renameTo(rfile));
   1846             assertTrue("Test 2: File Rename Failed.", rfile.exists());
   1847             assertEquals("Test 3: Size Of File Changed.",
   1848                     lengthOfFile, rfile.length());
   1849 
   1850             fos = new FileOutputStream(rfile);
   1851             fos.close();
   1852 
   1853             f2.delete(); // in case it already exists
   1854             assertTrue("Test 4: File Rename Failed", rfile.renameTo(f2));
   1855             assertTrue("Test 5: File Rename Failed.", f2.exists());
   1856         } finally {
   1857             f.delete();
   1858             rfile.delete();
   1859             f2.delete();
   1860             dir.delete();
   1861         }
   1862     }
   1863 
   1864     /**
   1865      * java.io.File#setLastModified(long)
   1866      */
   1867     public void test_setLastModifiedJ() throws IOException {
   1868         File f1 = null;
   1869         try {
   1870             f1 = File.createTempFile("harmony-test-FileTest_setLastModified", ".tmp");
   1871             long orgTime = f1.lastModified();
   1872             // Subtracting 100 000 milliseconds from the orgTime of File f1
   1873             f1.setLastModified(orgTime - 100000);
   1874             long lastModified = f1.lastModified();
   1875             assertEquals("Test 1: LastModifed time incorrect",
   1876                     orgTime - 100000, lastModified);
   1877             // Subtracting 10 000 000 milliseconds from the orgTime of File f1
   1878             f1.setLastModified(orgTime - 10000000);
   1879             lastModified = f1.lastModified();
   1880             assertEquals("Test 2: LastModifed time incorrect",
   1881                     orgTime - 10000000, lastModified);
   1882             // Adding 100 000 milliseconds to the orgTime of File f1
   1883             f1.setLastModified(orgTime + 100000);
   1884             lastModified = f1.lastModified();
   1885             assertEquals("Test 3: LastModifed time incorrect",
   1886                     orgTime + 100000, lastModified);
   1887             // Adding 10 000 000 milliseconds from the orgTime of File f1
   1888             f1.setLastModified(orgTime + 10000000);
   1889             lastModified = f1.lastModified();
   1890             assertEquals("Test 4: LastModifed time incorrect",
   1891                     orgTime + 10000000, lastModified);
   1892             // Trying to set time to an exact number
   1893             f1.setLastModified(315550800000L);
   1894             lastModified = f1.lastModified();
   1895             assertEquals("Test 5: LastModified time incorrect",
   1896                     315550800000L, lastModified);
   1897             String osName = System.getProperty("os.name", "unknown");
   1898             if (osName.equals("Windows 2000") || osName.equals("Windows NT")) {
   1899                 // Trying to set time to a large exact number
   1900                 boolean result = f1.setLastModified(4354837199000L);
   1901                 long next = f1.lastModified();
   1902                 // Dec 31 23:59:59 EST 2107 is overflow on FAT file systems, and
   1903                 // the call fails
   1904                 if (result) {
   1905                     assertEquals("Test 6: LastModified time incorrect",
   1906                             4354837199000L, next);
   1907                 }
   1908             }
   1909             // Trying to set time to a negative number
   1910             try {
   1911                 f1.setLastModified(-25);
   1912                 fail("IllegalArgumentException Not Thrown.");
   1913             } catch (IllegalArgumentException e) {
   1914             }
   1915         } finally {
   1916             if (f1 != null) {
   1917                 f1.delete();
   1918             }
   1919         }
   1920     }
   1921 
   1922     /**
   1923      * java.io.File#setReadOnly()
   1924      */
   1925     public void test_setReadOnly() throws Exception {
   1926         File f1 = null;
   1927         File f2 = null;
   1928         if (Libcore.os.getuid() == 0) {
   1929             System.err.println("Skipping #test_setReadOnly: test runner is root");
   1930             return;
   1931         }
   1932 
   1933         try {
   1934             f1 = File.createTempFile("harmony-test-FileTest_setReadOnly", ".tmp");
   1935             f2 = File.createTempFile("harmony-test-FileTest_setReadOnly", ".tmp");
   1936             // Assert is flawed because canWrite does not work.
   1937             // assertTrue("File f1 Is Set To ReadOnly." , f1.canWrite());
   1938             assertTrue(f1.setReadOnly());
   1939             assertFalse(f1.canWrite());
   1940             // Assert is flawed because canWrite does not work.
   1941             // assertTrue("File f1 Is Not Set To ReadOnly." , !f1.canWrite());
   1942             try {
   1943                 // Attempt to write to a file that is setReadOnly.
   1944                 new FileOutputStream(f1);
   1945                 fail("IOException not thrown.");
   1946             } catch (IOException e) {
   1947                 // Expected
   1948             }
   1949 
   1950             Libcore.os.chmod(f1.getAbsolutePath(), 666);
   1951 
   1952             // Assert is flawed because canWrite does not work.
   1953             // assertTrue("File f1 Is Set To ReadOnly." , f1.canWrite());
   1954             FileOutputStream fos = new FileOutputStream(f1);
   1955             fos.write(fileString.getBytes());
   1956             fos.close();
   1957             assertEquals(fileString.length(), f1.length());
   1958             assertTrue(f1.delete());
   1959 
   1960             // Assert is flawed because canWrite does not work.
   1961             // assertTrue("File f2 Is Set To ReadOnly." , f2.canWrite());
   1962             fos = new FileOutputStream(f2);
   1963             // Write to a file.
   1964             fos.write(fileString.getBytes());
   1965             fos.close();
   1966             f2.setReadOnly();
   1967             // Assert is flawed because canWrite does not work.
   1968             // assertTrue("File f2 Is Not Set To ReadOnly." , !f2.canWrite());
   1969             try {
   1970                 // Attempt to write to a file that has previously been written
   1971                 // to.
   1972                 // and is now set to read only.
   1973                 fos = new FileOutputStream(f2);
   1974                 fail("IOException not thrown.");
   1975             } catch (IOException e) {
   1976                 // Expected
   1977             }
   1978 
   1979             Libcore.os.chmod(f2.getAbsolutePath(), 666);
   1980             assertTrue(f2.canWrite());
   1981             fos = new FileOutputStream(f2);
   1982             fos.write(fileString.getBytes());
   1983             fos.close();
   1984             f2.setReadOnly();
   1985             assertTrue(f2.delete());
   1986 
   1987             // Similarly, trying to delete a read-only directory should succeed
   1988             f2 = new File(tempDirectory, "deltestdir");
   1989             f2.mkdir();
   1990             f2.setReadOnly();
   1991             assertTrue("Directory f2 Did Not Delete", f2.delete());
   1992             assertTrue("Directory f2 Did Not Delete", !f2.exists());
   1993         } finally {
   1994             if (f1 != null) {
   1995                 f1.delete();
   1996             }
   1997             if (f2 != null) {
   1998                 f2.delete();
   1999             }
   2000         }
   2001     }
   2002 
   2003     /**
   2004      * java.io.File#toString()
   2005      */
   2006     public void test_toString() {
   2007         String fileName = System.getProperty("user.home");
   2008         if (!fileName.endsWith(File.separator)) {
   2009             fileName += File.separator;
   2010         }
   2011         fileName += "input.tst";
   2012         File f = new File(fileName);
   2013         assertEquals("Incorrect string returned", fileName, f.toString());
   2014 
   2015         if (File.separatorChar == '\\') {
   2016             String result = new File("c:\\").toString();
   2017             assertEquals("Removed backslash", "c:\\", result);
   2018         }
   2019     }
   2020 
   2021     /**
   2022      * java.io.File#toURI()
   2023      */
   2024     public void test_toURI() throws URISyntaxException {
   2025         // Need a directory that exists
   2026         File dir = tempDirectory;
   2027 
   2028         // Test for toURI when the file is a directory.
   2029         String newURIPath = dir.getAbsolutePath();
   2030         newURIPath = newURIPath.replace(File.separatorChar, '/');
   2031         if (!newURIPath.startsWith("/")) {
   2032             newURIPath = "/" + newURIPath;
   2033         }
   2034         if (!newURIPath.endsWith("/")) {
   2035             newURIPath += '/';
   2036         }
   2037 
   2038         URI uri = dir.toURI();
   2039         assertEquals("Test 1A: Incorrect URI Returned.", dir.getAbsoluteFile(), new File(uri));
   2040         assertEquals("Test 1B: Incorrect URI Returned.",
   2041                 new URI("file", null, newURIPath, null, null), uri);
   2042 
   2043         // Test for toURI with a file name with illegal chars.
   2044         File f = new File(dir, "te% \u20ac st.tst");
   2045         newURIPath = f.getAbsolutePath();
   2046         newURIPath = newURIPath.replace(File.separatorChar, '/');
   2047         if (!newURIPath.startsWith("/")) {
   2048             newURIPath = "/" + newURIPath;
   2049         }
   2050 
   2051         uri = f.toURI();
   2052         assertEquals("Test 2A: Incorrect URI Returned.",
   2053                 f.getAbsoluteFile(), new File(uri));
   2054         assertEquals("Test 2B: Incorrect URI Returned.",
   2055                 new URI("file", null, newURIPath, null, null), uri);
   2056 
   2057         // Regression test for HARMONY-3207
   2058         dir = new File(""); // current directory
   2059         uri = dir.toURI();
   2060         assertTrue("Test current dir: URI does not end with slash.", uri
   2061                 .toString().endsWith("/"));
   2062     }
   2063 
   2064     /**
   2065      * java.io.File#toURL()
   2066      */
   2067     public void test_toURL() throws MalformedURLException {
   2068         // Need a directory that exists
   2069         File dir = tempDirectory;
   2070 
   2071         // Test for toURL when the file is a directory.
   2072         String newDirURL = dir.getAbsolutePath();
   2073         newDirURL = newDirURL.replace(File.separatorChar, '/');
   2074         if (newDirURL.startsWith("/")) {
   2075             newDirURL = "file://" + newDirURL;
   2076         } else {
   2077             newDirURL = "file:///" + newDirURL;
   2078         }
   2079         if (!newDirURL.endsWith("/")) {
   2080             newDirURL += '/';
   2081         }
   2082         assertEquals("Test 1: Incorrect URL Returned.",
   2083                 dir.toURL().toString(), newDirURL);
   2084 
   2085         // Test for toURL with a file.
   2086         File f = new File(dir, "test.tst");
   2087         String newURL = f.getAbsolutePath();
   2088         newURL = newURL.replace(File.separatorChar, '/');
   2089         if (newURL.startsWith("/")) {
   2090             newURL = "file://" + newURL;
   2091         } else {
   2092             newURL = "file:///" + newURL;
   2093         }
   2094         assertEquals("Test 2: Incorrect URL Returned.",
   2095                 f.toURL().toString(), newURL);
   2096 
   2097         // Regression test for HARMONY-3207
   2098         dir = new File(""); // current directory
   2099         newDirURL = dir.toURL().toString();
   2100         assertTrue("Test current dir: URL does not end with slash.", newDirURL
   2101                 .endsWith("/"));
   2102     }
   2103 
   2104     /**
   2105      * java.io.File#toURI()
   2106      */
   2107     public void test_toURI2() throws URISyntaxException {
   2108         File f = new File(tempDirectory, "a/b/c/../d/e/./f");
   2109 
   2110         String path = f.getAbsolutePath();
   2111         path = path.replace(File.separatorChar, '/');
   2112         if (!path.startsWith("/")) {
   2113             path = "/" + path;
   2114         }
   2115 
   2116         URI uri1 = new URI("file", null, path, null);
   2117         URI uri2 = f.toURI();
   2118         assertEquals("uris not equal", uri1, uri2);
   2119     }
   2120 
   2121     /**
   2122      * java.io.File#toURL()
   2123      */
   2124     public void test_toURL2() throws MalformedURLException {
   2125         File f = new File(tempDirectory, "a/b/c/../d/e/./f");
   2126 
   2127         String path = f.getAbsolutePath();
   2128         path = path.replace(File.separatorChar, '/');
   2129         if (!path.startsWith("/")) {
   2130             path = "/" + path;
   2131         }
   2132 
   2133         URL url1 = new URL("file", "", path);
   2134         URL url2 = f.toURL();
   2135         assertEquals("urls not equal", url1, url2);
   2136     }
   2137 
   2138     /**
   2139      * serialization
   2140      */
   2141     public void test_objectStreamClass_getFields() throws Exception {
   2142         // Regression for HARMONY-2674
   2143         ObjectStreamClass objectStreamClass = ObjectStreamClass
   2144                 .lookup(File.class);
   2145         ObjectStreamField[] objectStreamFields = objectStreamClass.getFields();
   2146         assertEquals(1, objectStreamFields.length);
   2147         ObjectStreamField objectStreamField = objectStreamFields[0];
   2148         assertEquals("path", objectStreamField.getName());
   2149         assertEquals(String.class, objectStreamField.getType());
   2150     }
   2151 
   2152     // Regression test for HARMONY-4493
   2153     public void test_list_withUnicodeFileName() throws Exception {
   2154         File rootDir = new File(System.getProperty("java.io.tmpdir")).getAbsoluteFile();
   2155         String dirName = new String("src\u3400");
   2156         File dir = new File(rootDir, dirName);
   2157         if (!dir.exists()) {
   2158             dir.mkdir();
   2159             dir.deleteOnExit();
   2160         }
   2161         boolean exist = false;
   2162         String[] fileNames = rootDir.list();
   2163         for (String fileName : fileNames) {
   2164             if (dirName.equals(fileName)) {
   2165                 exist = true;
   2166                 break;
   2167             }
   2168         }
   2169         assertTrue(exist);
   2170     }
   2171 
   2172     /**
   2173      * serialization/deserialization.
   2174      */
   2175     public void test_serialization_self() throws Exception {
   2176         File testFile = new File("test.ser");
   2177         SerializationTest.verifySelf(testFile);
   2178     }
   2179 
   2180     /**
   2181      * serialization/deserialization compatibility with RI.
   2182      */
   2183     public void test_serialization_compatibility() throws Exception {
   2184         File file = new File("FileTest.golden.ser");
   2185         SerializationTest.verifyGolden(this, file);
   2186     }
   2187 }
   2188