• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.io;
18 
19 import com.google.common.testing.GcFinalization;
20 
21 import java.io.File;
22 import java.io.IOException;
23 import java.io.OutputStream;
24 import java.util.Arrays;
25 
26 /**
27  * Unit tests for {@link FileBackedOutputStream}.
28  *
29  * @author Chris Nokleberg
30  */
31 public class FileBackedOutputStreamTest extends IoTestCase {
32 
testThreshold()33   public void testThreshold() throws Exception {
34     testThreshold(0, 100, true, false);
35     testThreshold(10, 100, true, false);
36     testThreshold(100, 100, true, false);
37     testThreshold(1000, 100, true, false);
38     testThreshold(0, 100, false, false);
39     testThreshold(10, 100, false, false);
40     testThreshold(100, 100, false, false);
41     testThreshold(1000, 100, false, false);
42   }
43 
testFinalizeDeletesFile()44   public void testFinalizeDeletesFile() throws Exception {
45     byte[] data = newPreFilledByteArray(100);
46     FileBackedOutputStream out = new FileBackedOutputStream(0, true);
47 
48     write(out, data, 0, 100, true);
49     final File file = out.getFile();
50     assertEquals(100, file.length());
51     assertTrue(file.exists());
52     out.close();
53 
54     // Make sure that finalize deletes the file
55     out = null;
56 
57     // times out and throws RuntimeException on failure
58     GcFinalization.awaitDone(new GcFinalization.FinalizationPredicate() {
59       @Override
60       public boolean isDone() {
61         return !file.exists();
62       }
63     });
64   }
65 
testThreshold_resetOnFinalize()66   public void testThreshold_resetOnFinalize() throws Exception {
67     testThreshold(0, 100, true, true);
68     testThreshold(10, 100, true, true);
69     testThreshold(100, 100, true, true);
70     testThreshold(1000, 100, true, true);
71     testThreshold(0, 100, false, true);
72     testThreshold(10, 100, false, true);
73     testThreshold(100, 100, false, true);
74     testThreshold(1000, 100, false, true);
75   }
76 
testThreshold(int fileThreshold, int dataSize, boolean singleByte, boolean resetOnFinalize)77   private void testThreshold(int fileThreshold, int dataSize, boolean singleByte,
78       boolean resetOnFinalize) throws IOException {
79     byte[] data = newPreFilledByteArray(dataSize);
80     FileBackedOutputStream out = new FileBackedOutputStream(fileThreshold, resetOnFinalize);
81     ByteSource source = out.asByteSource();
82     int chunk1 = Math.min(dataSize, fileThreshold);
83     int chunk2 = dataSize - chunk1;
84 
85     // Write just enough to not trip the threshold
86     if (chunk1 > 0) {
87       write(out, data, 0, chunk1, singleByte);
88       assertTrue(ByteSource.wrap(data).slice(0, chunk1).contentEquals(source));
89     }
90     File file = out.getFile();
91     assertNull(file);
92 
93     // Write data to go over the threshold
94     if (chunk2 > 0) {
95       write(out, data, chunk1, chunk2, singleByte);
96       file = out.getFile();
97       assertEquals(dataSize, file.length());
98       assertTrue(file.exists());
99     }
100     out.close();
101 
102     // Check that source returns the right data
103     assertTrue(Arrays.equals(data, source.read()));
104 
105     // Make sure that reset deleted the file
106     out.reset();
107     if (file != null) {
108       assertFalse(file.exists());
109     }
110   }
111 
write( OutputStream out, byte[] b, int off, int len, boolean singleByte)112   private static void write(
113       OutputStream out, byte[] b, int off, int len, boolean singleByte)
114       throws IOException {
115     if (singleByte) {
116       for (int i = off; i < off + len; i++) {
117         out.write(b[i]);
118       }
119     } else {
120       out.write(b, off, len);
121     }
122     out.flush(); // for coverage
123   }
124 
125   // TODO(chrisn): only works if we ensure we have crossed file threshold
126 
testWriteErrorAfterClose()127   public void testWriteErrorAfterClose() throws Exception {
128     byte[] data = newPreFilledByteArray(100);
129     FileBackedOutputStream out = new FileBackedOutputStream(50);
130     ByteSource source = out.asByteSource();
131 
132     out.write(data);
133     assertTrue(Arrays.equals(data, source.read()));
134 
135     out.close();
136     try {
137       out.write(42);
138       fail("expected exception");
139     } catch (IOException expected) {
140       // expected
141     }
142 
143     // Verify that write had no effect
144     assertTrue(Arrays.equals(data, source.read()));
145     out.reset();
146   }
147 
testReset()148   public void testReset() throws Exception {
149     byte[] data = newPreFilledByteArray(100);
150     FileBackedOutputStream out = new FileBackedOutputStream(Integer.MAX_VALUE);
151     ByteSource source = out.asByteSource();
152 
153     out.write(data);
154     assertTrue(Arrays.equals(data, source.read()));
155 
156     out.reset();
157     assertTrue(Arrays.equals(new byte[0], source.read()));
158 
159     out.write(data);
160     assertTrue(Arrays.equals(data, source.read()));
161 
162     out.close();
163   }
164 }
165