1935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson/*
2935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  Licensed to the Apache Software Foundation (ASF) under one or more
3935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  contributor license agreements.  See the NOTICE file distributed with
4935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  this work for additional information regarding copyright ownership.
5935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  The ASF licenses this file to You under the Apache License, Version 2.0
6935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  (the "License"); you may not use this file except in compliance with
7935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  the License.  You may obtain a copy of the License at
8935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *
9935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
10935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *
11935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  Unless required by applicable law or agreed to in writing, software
12935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  distributed under the License is distributed on an "AS IS" BASIS,
13935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  See the License for the specific language governing permissions and
15935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  limitations under the License.
16935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson */
17935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
18935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonpackage libcore.java.io;
19935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
20935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.BufferedWriter;
21935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.File;
22935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.FileInputStream;
23935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.FileReader;
24935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.FileWriter;
25935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.IOException;
26935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.InputStreamReader;
27935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport junit.framework.TestCase;
28935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
29935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonpublic class OldFileWriterTest extends TestCase {
30935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
31935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    FileWriter fw;
32935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
33935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    FileInputStream fis;
34935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
35935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    BufferedWriter bw;
36935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
37935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    File f;
38935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
39935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_ConstructorLjava_io_File_IOException() {
40935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        File dir = new File(System.getProperty("java.io.tmpdir"));
41935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
42935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
43935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fw = new FileWriter(dir);
44935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 1: IOException expected.");
45935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
46935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
47935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
48935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
49935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
50935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_ConstructorLjava_io_FileZ_IOException() {
51935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        File dir = new File(System.getProperty("java.io.tmpdir"));
52935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
53935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
54935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fw = new FileWriter(dir, true);
55935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 1: IOException expected.");
56935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
57935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
58935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
59935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
60935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
61935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_ConstructorLjava_lang_String_IOException() {
62935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
63935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fw = new FileWriter(System.getProperty("java.io.tmpdir"));
64935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 1: IOException expected.");
65935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
66935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
67935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
68935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
69935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
70935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
71935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_ConstructorLjava_lang_StringZ_IOException() {
72935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
73935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fw = new FileWriter(System.getProperty("java.io.tmpdir"), false);
74935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 1: IOException expected.");
75935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
76935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
77935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
78935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
79935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
80935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_handleEarlyEOFChar_1() {
81935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        String str = "All work and no play makes Jack a dull boy\n";
82935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int NUMBER = 2048;
83935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int j = 0;
84935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int len = str.length() * NUMBER;
85935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        /* == 88064 *//* NUMBER compulsively written copies of the same string */
86935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        char[] strChars = new char[len];
87935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        for (int i = 0; i < NUMBER; ++i) {
88935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            for (int k = 0; k < str.length(); ++k) {
89935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                strChars[j++] = str.charAt(k);
90935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            }
91935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
92935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        File f = null;
93935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        FileWriter fw = null;
94935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
95935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            f = File.createTempFile("ony", "by_one");
96935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fw = new FileWriter(f);
97935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fw.write(strChars);
98935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fw.close();
99935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            InputStreamReader in = null;
100935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            FileInputStream fis = new FileInputStream(f);
101935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            in = new InputStreamReader(fis);
102935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            int b;
103935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            int errors = 0;
104935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            for (int offset = 0; offset < strChars.length; ++offset) {
105935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                b = in.read();
106935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                if (b == -1) {
107935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                    fail("Early EOF at offset " + offset + "\n");
108935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                    return;
109935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                }
110935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            }
111935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            assertEquals(0, errors);
112935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
113935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            e.printStackTrace();
114935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
115935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
116935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
117935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_handleEarlyEOFChar_2() throws IOException {
118935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int capacity = 65536;
119935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        byte[] bytes = new byte[capacity];
120935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        byte[] bs = {
121935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'
122935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        };
123935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        for (int i = 0; i < bytes.length; i++) {
124935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            bytes[i] = bs[i / 8192];
125935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
126935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        String inputStr = new String(bytes);
127935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int len = inputStr.length();
128935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        File f = File.createTempFile("FileWriterBugTest ", null);
129935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        FileWriter writer = new FileWriter(f);
130935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        writer.write(inputStr);
131935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        writer.close();
132935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        long flen = f.length();
133935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
134935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        FileReader reader = new FileReader(f);
135935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        char[] outChars = new char[capacity];
136935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int outCount = reader.read(outChars);
137935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        String outStr = new String(outChars, 0, outCount);
138935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
139935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        f.deleteOnExit();
140935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertEquals(len, flen);
141935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertEquals(inputStr, outStr);
142935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
143935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
144935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected void setUp() throws Exception {
145935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        f = File.createTempFile("writer", ".tst");
146935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
147935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        if (f.exists())
148935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            if (!f.delete()) {
149935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                fail("Unable to delete test file");
150935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            }
151935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
152935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
153935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected void tearDown() {
154935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
155935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            bw.close();
156935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (Exception e) {
157935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
158935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
159935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fis.close();
160935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (Exception e) {
161935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
162935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        f.delete();
163935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
164935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson}
165