Lines 17-38
Link Here
|
17 |
|
17 |
|
18 |
package org.apache.poi.poifs.filesystem; |
18 |
package org.apache.poi.poifs.filesystem; |
19 |
|
19 |
|
|
|
20 |
import static org.junit.Assert.assertEquals; |
21 |
import static org.junit.Assert.assertTrue; |
22 |
import static org.junit.Assert.fail; |
23 |
|
20 |
import java.io.ByteArrayInputStream; |
24 |
import java.io.ByteArrayInputStream; |
21 |
import java.io.File; |
25 |
import java.io.File; |
22 |
import java.io.FileInputStream; |
26 |
import java.io.FileInputStream; |
23 |
import java.io.IOException; |
27 |
import java.io.IOException; |
|
|
28 |
import java.io.InputStream; |
24 |
import java.util.Arrays; |
29 |
import java.util.Arrays; |
25 |
|
30 |
|
26 |
import junit.framework.TestCase; |
|
|
27 |
|
28 |
import org.apache.poi.POIDataSamples; |
31 |
import org.apache.poi.POIDataSamples; |
29 |
import org.apache.poi.poifs.property.DirectoryProperty; |
32 |
import org.apache.poi.poifs.property.DirectoryProperty; |
30 |
import org.apache.poi.poifs.storage.RawDataBlock; |
33 |
import org.apache.poi.poifs.storage.RawDataBlock; |
|
|
34 |
import org.apache.poi.util.SuppressForbidden; |
35 |
import org.junit.Before; |
36 |
import org.junit.Test; |
31 |
|
37 |
|
32 |
/** |
38 |
/** |
33 |
* Class to test DocumentInputStream functionality |
39 |
* Class to test DocumentInputStream functionality |
34 |
*/ |
40 |
*/ |
35 |
public final class TestDocumentInputStream extends TestCase { |
41 |
public final class TestDocumentInputStream { |
36 |
private DocumentNode _workbook_n; |
42 |
private DocumentNode _workbook_n; |
37 |
private DocumentNode _workbook_o; |
43 |
private DocumentNode _workbook_o; |
38 |
private byte[] _workbook_data; |
44 |
private byte[] _workbook_data; |
Lines 42-48
Link Here
|
42 |
// any block size |
48 |
// any block size |
43 |
private static final int _buffer_size = 6; |
49 |
private static final int _buffer_size = 6; |
44 |
|
50 |
|
45 |
protected void setUp() throws Exception { |
51 |
@Before |
|
|
52 |
public void setUp() throws Exception { |
46 |
int blocks = (_workbook_size + 511) / 512; |
53 |
int blocks = (_workbook_size + 511) / 512; |
47 |
|
54 |
|
48 |
_workbook_data = new byte[ 512 * blocks ]; |
55 |
_workbook_data = new byte[ 512 * blocks ]; |
Lines 91-96
Link Here
|
91 |
/** |
98 |
/** |
92 |
* test constructor |
99 |
* test constructor |
93 |
*/ |
100 |
*/ |
|
|
101 |
@Test |
94 |
public void testConstructor() throws IOException { |
102 |
public void testConstructor() throws IOException { |
95 |
DocumentInputStream ostream = new ODocumentInputStream(_workbook_o); |
103 |
DocumentInputStream ostream = new ODocumentInputStream(_workbook_o); |
96 |
DocumentInputStream nstream = new NDocumentInputStream(_workbook_n); |
104 |
DocumentInputStream nstream = new NDocumentInputStream(_workbook_n); |
Lines 98-105
Link Here
|
98 |
assertEquals(_workbook_size, _workbook_o.getSize()); |
106 |
assertEquals(_workbook_size, _workbook_o.getSize()); |
99 |
assertEquals(_workbook_size, _workbook_n.getSize()); |
107 |
assertEquals(_workbook_size, _workbook_n.getSize()); |
100 |
|
108 |
|
101 |
assertEquals(_workbook_size, ostream.available()); |
109 |
assertEquals(_workbook_size, available(ostream)); |
102 |
assertEquals(_workbook_size, nstream.available()); |
110 |
assertEquals(_workbook_size, available(nstream)); |
103 |
|
111 |
|
104 |
ostream.close(); |
112 |
ostream.close(); |
105 |
nstream.close(); |
113 |
nstream.close(); |
Lines 108-130
Link Here
|
108 |
/** |
116 |
/** |
109 |
* test available() behavior |
117 |
* test available() behavior |
110 |
*/ |
118 |
*/ |
|
|
119 |
@Test |
111 |
public void testAvailable() throws IOException { |
120 |
public void testAvailable() throws IOException { |
112 |
DocumentInputStream ostream = new DocumentInputStream(_workbook_o); |
121 |
DocumentInputStream ostream = new DocumentInputStream(_workbook_o); |
113 |
DocumentInputStream nstream = new NDocumentInputStream(_workbook_n); |
122 |
DocumentInputStream nstream = new NDocumentInputStream(_workbook_n); |
114 |
|
123 |
|
115 |
assertEquals(_workbook_size, ostream.available()); |
124 |
assertEquals(_workbook_size, available(ostream)); |
116 |
assertEquals(_workbook_size, nstream.available()); |
125 |
assertEquals(_workbook_size, available(nstream)); |
117 |
ostream.close(); |
126 |
ostream.close(); |
118 |
nstream.close(); |
127 |
nstream.close(); |
119 |
|
128 |
|
120 |
try { |
129 |
try { |
121 |
ostream.available(); |
130 |
available(ostream); |
122 |
fail("Should have caught IOException"); |
131 |
fail("Should have caught IOException"); |
123 |
} catch (IllegalStateException ignored) { |
132 |
} catch (IllegalStateException ignored) { |
124 |
// as expected |
133 |
// as expected |
125 |
} |
134 |
} |
126 |
try { |
135 |
try { |
127 |
nstream.available(); |
136 |
available(nstream); |
128 |
fail("Should have caught IOException"); |
137 |
fail("Should have caught IOException"); |
129 |
} catch (IllegalStateException ignored) { |
138 |
} catch (IllegalStateException ignored) { |
130 |
// as expected |
139 |
// as expected |
Lines 134-139
Link Here
|
134 |
/** |
143 |
/** |
135 |
* test mark/reset/markSupported. |
144 |
* test mark/reset/markSupported. |
136 |
*/ |
145 |
*/ |
|
|
146 |
@Test |
137 |
public void testMarkFunctions() throws IOException { |
147 |
public void testMarkFunctions() throws IOException { |
138 |
byte[] buffer = new byte[ _workbook_size / 5 ]; |
148 |
byte[] buffer = new byte[ _workbook_size / 5 ]; |
139 |
byte[] small_buffer = new byte[212]; |
149 |
byte[] small_buffer = new byte[212]; |
Lines 151-162
Link Here
|
151 |
_workbook_data[ j ], buffer[ j ] |
161 |
_workbook_data[ j ], buffer[ j ] |
152 |
); |
162 |
); |
153 |
} |
163 |
} |
154 |
assertEquals(_workbook_size - buffer.length, stream.available()); |
164 |
assertEquals(_workbook_size - buffer.length, available(stream)); |
155 |
|
165 |
|
156 |
// Reset, and check the available goes back to being the |
166 |
// Reset, and check the available goes back to being the |
157 |
// whole of the stream |
167 |
// whole of the stream |
158 |
stream.reset(); |
168 |
stream.reset(); |
159 |
assertEquals(_workbook_size, stream.available()); |
169 |
assertEquals(_workbook_size, available(stream)); |
160 |
|
170 |
|
161 |
|
171 |
|
162 |
// Read part of a block |
172 |
// Read part of a block |
Lines 167-173
Link Here
|
167 |
_workbook_data[ j ], small_buffer[ j ] |
177 |
_workbook_data[ j ], small_buffer[ j ] |
168 |
); |
178 |
); |
169 |
} |
179 |
} |
170 |
assertEquals(_workbook_size - small_buffer.length, stream.available()); |
180 |
assertEquals(_workbook_size - small_buffer.length, available(stream)); |
171 |
stream.mark(0); |
181 |
stream.mark(0); |
172 |
|
182 |
|
173 |
// Read the next part |
183 |
// Read the next part |
Lines 178-188
Link Here
|
178 |
_workbook_data[ j+small_buffer.length ], small_buffer[ j ] |
188 |
_workbook_data[ j+small_buffer.length ], small_buffer[ j ] |
179 |
); |
189 |
); |
180 |
} |
190 |
} |
181 |
assertEquals(_workbook_size - 2*small_buffer.length, stream.available()); |
191 |
assertEquals(_workbook_size - 2*small_buffer.length, available(stream)); |
182 |
|
192 |
|
183 |
// Reset, check it goes back to where it was |
193 |
// Reset, check it goes back to where it was |
184 |
stream.reset(); |
194 |
stream.reset(); |
185 |
assertEquals(_workbook_size - small_buffer.length, stream.available()); |
195 |
assertEquals(_workbook_size - small_buffer.length, available(stream)); |
186 |
|
196 |
|
187 |
// Read |
197 |
// Read |
188 |
stream.read(small_buffer); |
198 |
stream.read(small_buffer); |
Lines 192-198
Link Here
|
192 |
_workbook_data[ j+small_buffer.length ], small_buffer[ j ] |
202 |
_workbook_data[ j+small_buffer.length ], small_buffer[ j ] |
193 |
); |
203 |
); |
194 |
} |
204 |
} |
195 |
assertEquals(_workbook_size - 2*small_buffer.length, stream.available()); |
205 |
assertEquals(_workbook_size - 2*small_buffer.length, available(stream)); |
196 |
|
206 |
|
197 |
|
207 |
|
198 |
// Now read at various points |
208 |
// Now read at various points |
Lines 235-245
Link Here
|
235 |
_workbook_data[ j ], buffer[ j ] |
245 |
_workbook_data[ j ], buffer[ j ] |
236 |
); |
246 |
); |
237 |
} |
247 |
} |
238 |
assertEquals(_workbook_size - buffer.length, stream.available()); |
248 |
assertEquals(_workbook_size - buffer.length, available(stream)); |
239 |
|
249 |
|
240 |
// Read all of it again, check it began at the start again |
250 |
// Read all of it again, check it began at the start again |
241 |
stream.reset(); |
251 |
stream.reset(); |
242 |
assertEquals(_workbook_size, stream.available()); |
252 |
assertEquals(_workbook_size, available(stream)); |
243 |
|
253 |
|
244 |
stream.read(buffer); |
254 |
stream.read(buffer); |
245 |
for (int j = 0; j < buffer.length; j++) { |
255 |
for (int j = 0; j < buffer.length; j++) { |
Lines 253-259
Link Here
|
253 |
stream.mark(12); |
263 |
stream.mark(12); |
254 |
stream.read(buffer); |
264 |
stream.read(buffer); |
255 |
assertEquals(_workbook_size - (2 * buffer.length), |
265 |
assertEquals(_workbook_size - (2 * buffer.length), |
256 |
stream.available()); |
266 |
available(stream)); |
257 |
for (int j = buffer.length; j < (2 * buffer.length); j++) |
267 |
for (int j = buffer.length; j < (2 * buffer.length); j++) |
258 |
{ |
268 |
{ |
259 |
assertEquals("checking byte " + j, _workbook_data[ j ], |
269 |
assertEquals("checking byte " + j, _workbook_data[ j ], |
Lines 262-273
Link Here
|
262 |
|
272 |
|
263 |
// Reset, should go back to only one buffer full read |
273 |
// Reset, should go back to only one buffer full read |
264 |
stream.reset(); |
274 |
stream.reset(); |
265 |
assertEquals(_workbook_size - buffer.length, stream.available()); |
275 |
assertEquals(_workbook_size - buffer.length, available(stream)); |
266 |
|
276 |
|
267 |
// Read the buffer again |
277 |
// Read the buffer again |
268 |
stream.read(buffer); |
278 |
stream.read(buffer); |
269 |
assertEquals(_workbook_size - (2 * buffer.length), |
279 |
assertEquals(_workbook_size - (2 * buffer.length), |
270 |
stream.available()); |
280 |
available(stream)); |
271 |
for (int j = buffer.length; j < (2 * buffer.length); j++) |
281 |
for (int j = buffer.length; j < (2 * buffer.length); j++) |
272 |
{ |
282 |
{ |
273 |
assertEquals("checking byte " + j, _workbook_data[ j ], |
283 |
assertEquals("checking byte " + j, _workbook_data[ j ], |
Lines 280-285
Link Here
|
280 |
/** |
290 |
/** |
281 |
* test simple read method |
291 |
* test simple read method |
282 |
*/ |
292 |
*/ |
|
|
293 |
@Test |
283 |
public void testReadSingleByte() throws IOException { |
294 |
public void testReadSingleByte() throws IOException { |
284 |
DocumentInputStream[] streams = new DocumentInputStream[] { |
295 |
DocumentInputStream[] streams = new DocumentInputStream[] { |
285 |
new DocumentInputStream(_workbook_o), |
296 |
new DocumentInputStream(_workbook_o), |
Lines 296-302
Link Here
|
296 |
( byte ) b); |
307 |
( byte ) b); |
297 |
remaining--; |
308 |
remaining--; |
298 |
assertEquals("checking remaining after reading byte " + j, |
309 |
assertEquals("checking remaining after reading byte " + j, |
299 |
remaining, stream.available()); |
310 |
remaining, available(stream)); |
300 |
} |
311 |
} |
301 |
|
312 |
|
302 |
// Ensure we fell off the end |
313 |
// Ensure we fell off the end |
Lines 316-321
Link Here
|
316 |
/** |
327 |
/** |
317 |
* Test buffered read |
328 |
* Test buffered read |
318 |
*/ |
329 |
*/ |
|
|
330 |
@Test |
319 |
public void testBufferRead() throws IOException { |
331 |
public void testBufferRead() throws IOException { |
320 |
DocumentInputStream[] streams = new DocumentInputStream[] { |
332 |
DocumentInputStream[] streams = new DocumentInputStream[] { |
321 |
new DocumentInputStream(_workbook_o), |
333 |
new DocumentInputStream(_workbook_o), |
Lines 332-354
Link Here
|
332 |
|
344 |
|
333 |
// test reading zero length buffer |
345 |
// test reading zero length buffer |
334 |
assertEquals(0, stream.read(new byte[ 0 ])); |
346 |
assertEquals(0, stream.read(new byte[ 0 ])); |
335 |
assertEquals(_workbook_size, stream.available()); |
347 |
assertEquals(_workbook_size, available(stream)); |
336 |
byte[] buffer = new byte[ _buffer_size ]; |
348 |
byte[] buffer = new byte[ _buffer_size ]; |
337 |
int offset = 0; |
349 |
int offset = 0; |
338 |
|
350 |
|
339 |
while (stream.available() >= buffer.length) |
351 |
while (available(stream) >= buffer.length) |
340 |
{ |
352 |
{ |
341 |
assertEquals(_buffer_size, stream.read(buffer)); |
353 |
assertEquals(_buffer_size, stream.read(buffer)); |
342 |
for (int j = 0; j < buffer.length; j++) |
354 |
for (byte element : buffer) { |
343 |
{ |
|
|
344 |
assertEquals("in main loop, byte " + offset, |
355 |
assertEquals("in main loop, byte " + offset, |
345 |
_workbook_data[ offset ], buffer[ j ]); |
356 |
_workbook_data[ offset ], element); |
346 |
offset++; |
357 |
offset++; |
347 |
} |
358 |
} |
348 |
assertEquals("offset " + offset, _workbook_size - offset, |
359 |
assertEquals("offset " + offset, _workbook_size - offset, |
349 |
stream.available()); |
360 |
available(stream)); |
350 |
} |
361 |
} |
351 |
assertEquals(_workbook_size % _buffer_size, stream.available()); |
362 |
assertEquals(_workbook_size % _buffer_size, available(stream)); |
352 |
Arrays.fill(buffer, ( byte ) 0); |
363 |
Arrays.fill(buffer, ( byte ) 0); |
353 |
int count = stream.read(buffer); |
364 |
int count = stream.read(buffer); |
354 |
|
365 |
|
Lines 378-383
Link Here
|
378 |
/** |
389 |
/** |
379 |
* Test complex buffered read |
390 |
* Test complex buffered read |
380 |
*/ |
391 |
*/ |
|
|
392 |
@Test |
381 |
public void testComplexBufferRead() throws IOException { |
393 |
public void testComplexBufferRead() throws IOException { |
382 |
DocumentInputStream[] streams = new DocumentInputStream[] { |
394 |
DocumentInputStream[] streams = new DocumentInputStream[] { |
383 |
new DocumentInputStream(_workbook_o), |
395 |
new DocumentInputStream(_workbook_o), |
Lines 413-423
Link Here
|
413 |
|
425 |
|
414 |
// test reading zero |
426 |
// test reading zero |
415 |
assertEquals(0, stream.read(new byte[ 5 ], 0, 0)); |
427 |
assertEquals(0, stream.read(new byte[ 5 ], 0, 0)); |
416 |
assertEquals(_workbook_size, stream.available()); |
428 |
assertEquals(_workbook_size, available(stream)); |
417 |
byte[] buffer = new byte[ _workbook_size ]; |
429 |
byte[] buffer = new byte[ _workbook_size ]; |
418 |
int offset = 0; |
430 |
int offset = 0; |
419 |
|
431 |
|
420 |
while (stream.available() >= _buffer_size) |
432 |
while (available(stream) >= _buffer_size) |
421 |
{ |
433 |
{ |
422 |
Arrays.fill(buffer, ( byte ) 0); |
434 |
Arrays.fill(buffer, ( byte ) 0); |
423 |
assertEquals(_buffer_size, |
435 |
assertEquals(_buffer_size, |
Lines 437-445
Link Here
|
437 |
} |
449 |
} |
438 |
offset += _buffer_size; |
450 |
offset += _buffer_size; |
439 |
assertEquals("offset " + offset, _workbook_size - offset, |
451 |
assertEquals("offset " + offset, _workbook_size - offset, |
440 |
stream.available()); |
452 |
available(stream)); |
441 |
} |
453 |
} |
442 |
assertEquals(_workbook_size % _buffer_size, stream.available()); |
454 |
assertEquals(_workbook_size % _buffer_size, available(stream)); |
443 |
Arrays.fill(buffer, ( byte ) 0); |
455 |
Arrays.fill(buffer, ( byte ) 0); |
444 |
int count = stream.read(buffer, offset, |
456 |
int count = stream.read(buffer, offset, |
445 |
_workbook_size % _buffer_size); |
457 |
_workbook_size % _buffer_size); |
Lines 474-511
Link Here
|
474 |
/** |
486 |
/** |
475 |
* Tests that we can skip within the stream |
487 |
* Tests that we can skip within the stream |
476 |
*/ |
488 |
*/ |
|
|
489 |
@Test |
477 |
public void testSkip() throws IOException { |
490 |
public void testSkip() throws IOException { |
478 |
DocumentInputStream[] streams = new DocumentInputStream[] { |
491 |
DocumentInputStream[] streams = new DocumentInputStream[] { |
479 |
new DocumentInputStream(_workbook_o), |
492 |
new DocumentInputStream(_workbook_o), |
480 |
new NDocumentInputStream(_workbook_n) |
493 |
new NDocumentInputStream(_workbook_n) |
481 |
}; |
494 |
}; |
482 |
for(DocumentInputStream stream : streams) { |
495 |
for(DocumentInputStream stream : streams) { |
483 |
assertEquals(_workbook_size, stream.available()); |
496 |
assertEquals(_workbook_size, available(stream)); |
484 |
int count = stream.available(); |
497 |
int count = available(stream); |
485 |
|
498 |
|
486 |
while (stream.available() >= _buffer_size) { |
499 |
while (available(stream) >= _buffer_size) { |
487 |
assertEquals(_buffer_size, stream.skip(_buffer_size)); |
500 |
assertEquals(_buffer_size, stream.skip(_buffer_size)); |
488 |
count -= _buffer_size; |
501 |
count -= _buffer_size; |
489 |
assertEquals(count, stream.available()); |
502 |
assertEquals(count, available(stream)); |
490 |
} |
503 |
} |
491 |
assertEquals(_workbook_size % _buffer_size, |
504 |
assertEquals(_workbook_size % _buffer_size, |
492 |
stream.skip(_buffer_size)); |
505 |
stream.skip(_buffer_size)); |
493 |
assertEquals(0, stream.available()); |
506 |
assertEquals(0, available(stream)); |
494 |
stream.reset(); |
507 |
stream.reset(); |
495 |
assertEquals(_workbook_size, stream.available()); |
508 |
assertEquals(_workbook_size, available(stream)); |
496 |
assertEquals(_workbook_size, stream.skip(_workbook_size * 2)); |
509 |
assertEquals(_workbook_size, stream.skip(_workbook_size * 2)); |
497 |
assertEquals(0, stream.available()); |
510 |
assertEquals(0, available(stream)); |
498 |
stream.reset(); |
511 |
stream.reset(); |
499 |
assertEquals(_workbook_size, stream.available()); |
512 |
assertEquals(_workbook_size, available(stream)); |
500 |
assertEquals(_workbook_size, |
513 |
assertEquals(_workbook_size, |
501 |
stream.skip(2 + ( long ) Integer.MAX_VALUE)); |
514 |
stream.skip(2 + ( long ) Integer.MAX_VALUE)); |
502 |
assertEquals(0, stream.available()); |
515 |
assertEquals(0, available(stream)); |
503 |
} |
516 |
} |
504 |
} |
517 |
} |
505 |
|
518 |
|
506 |
/** |
519 |
/** |
507 |
* Test that we can read files at multiple levels down the tree |
520 |
* Test that we can read files at multiple levels down the tree |
508 |
*/ |
521 |
*/ |
|
|
522 |
@Test |
509 |
public void testReadMultipleTreeLevels() throws Exception { |
523 |
public void testReadMultipleTreeLevels() throws Exception { |
510 |
final POIDataSamples _samples = POIDataSamples.getPublisherInstance(); |
524 |
final POIDataSamples _samples = POIDataSamples.getPublisherInstance(); |
511 |
File sample = _samples.getFile("Sample.pub"); |
525 |
File sample = _samples.getFile("Sample.pub"); |
Lines 551-554
Link Here
|
551 |
npoifs.close(); |
565 |
npoifs.close(); |
552 |
} |
566 |
} |
553 |
} |
567 |
} |
|
|
568 |
|
569 |
@SuppressForbidden("just for testing") |
570 |
private static int available(InputStream is) throws IOException { |
571 |
return is.available(); |
572 |
} |
554 |
} |
573 |
} |