Skip to content

Commit 251731a

Browse files
committed
add tests for errors on IO.Writable
1 parent e76619c commit 251731a

File tree

10 files changed

+206
-64
lines changed

10 files changed

+206
-64
lines changed

net.lecousin.core/src/test/java/net/lecousin/framework/core/test/io/TestIOError.java

Lines changed: 106 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,71 @@ public AsyncSupplier<Long, IOException> getSizeAsync() {
190190

191191
}
192192

193+
public static class WritableAlwaysError extends ConcurrentCloseable<IOException> implements IO.Writable, IO.WritableByteStream {
194+
195+
protected IOException error = new IOException("It's normal");
196+
197+
@Override
198+
public String getSourceDescription() {
199+
return getClass().getName();
200+
}
201+
202+
@Override
203+
public IO getWrappedIO() {
204+
return null;
205+
}
206+
207+
@Override
208+
public void setPriority(byte priority) {
209+
}
210+
211+
@Override
212+
public TaskManager getTaskManager() {
213+
return Threading.getCPUTaskManager();
214+
}
215+
216+
@Override
217+
public void write(byte b) throws IOException {
218+
throw error;
219+
}
220+
221+
@Override
222+
public void write(byte[] buffer, int offset, int length) throws IOException {
223+
throw error;
224+
}
225+
226+
@Override
227+
public IAsync<IOException> canStartWriting() {
228+
return new Async<>(true);
229+
}
230+
231+
@Override
232+
public int writeSync(ByteBuffer buffer) throws IOException {
233+
throw error;
234+
}
235+
236+
@Override
237+
public AsyncSupplier<Integer, IOException> writeAsync(ByteBuffer buffer, Consumer<Pair<Integer, IOException>> ondone) {
238+
return IOUtil.error(error, ondone);
239+
}
240+
241+
@Override
242+
public byte getPriority() {
243+
return Task.PRIORITY_NORMAL;
244+
}
245+
246+
@Override
247+
protected IAsync<IOException> closeUnderlyingResources() {
248+
return new Async<>(true);
249+
}
250+
251+
@Override
252+
protected void closeResources(Async<IOException> ondone) {
253+
ondone.unblock();
254+
}
255+
256+
}
257+
193258
/** Return an IOException after first bytes. */
194259
public static class ReadableErrorAfterBeginning extends ConcurrentCloseable<IOException> implements IO.Readable, IO.Readable.Buffered {
195260

@@ -339,14 +404,16 @@ protected void closeResources(Async<IOException> ondone) {
339404

340405
}
341406

342-
protected abstract IO.Readable getReadable(ReadableAlwaysError io) throws Exception;
407+
protected abstract IO.Readable getReadable(IO.Readable io) throws Exception;
343408

344-
protected abstract IO.Readable.Buffered getReadableBuffered(ReadableAlwaysError io) throws Exception;
409+
protected abstract IO.Readable.Buffered getReadableBuffered(IO.Readable io) throws Exception;
345410

346-
protected abstract IO.Readable.Seekable getReadableSeekable(ReadableAlwaysError io) throws Exception;
411+
protected abstract IO.Readable.Seekable getReadableSeekable(IO.Readable.Seekable io) throws Exception;
412+
413+
protected abstract IO.Writable getWritable(IO.Writable io) throws Exception;
347414

348415
@Test
349-
public void testsReadable() throws Exception {
416+
public void testsReadableAlwaysError() throws Exception {
350417
IO.Readable io = getReadable(new ReadableAlwaysError());
351418
Assume.assumeNotNull(io);
352419
io.close();
@@ -424,7 +491,7 @@ public void testsReadable() throws Exception {
424491
}
425492

426493
@Test
427-
public void testsReadableSeekable() throws Exception {
494+
public void testsReadableSeekableAlwaysError() throws Exception {
428495
IO.Readable.Seekable io = getReadableSeekable(new ReadableAlwaysError());
429496
Assume.assumeNotNull(io);
430497
io.close();
@@ -478,7 +545,7 @@ public void testsReadableSeekable() throws Exception {
478545
}
479546

480547
@Test
481-
public void testsReadableBuffered() throws Exception {
548+
public void testsReadableBufferedAlwaysError() throws Exception {
482549
IO.Readable.Buffered io = getReadableBuffered(new ReadableAlwaysError());
483550
Assume.assumeNotNull(io);
484551
io.close();
@@ -535,4 +602,37 @@ public void testsReadableBuffered() throws Exception {
535602
io.close();
536603
}
537604

605+
@Test
606+
public void testWritableAlwaysError() throws Exception {
607+
IO.Writable io = getWritable(new WritableAlwaysError());
608+
Assume.assumeNotNull(io);
609+
io.close();
610+
611+
MutableBoolean called = new MutableBoolean(false);
612+
Consumer<Pair<Integer, IOException>> ondone = p -> called.set(p.getValue2() != null);
613+
614+
io = getWritable(new WritableAlwaysError());
615+
try {
616+
io.writeSync(ByteBuffer.allocate(100));
617+
throw new AssertionError();
618+
} catch (IOException e) { /* ok */ }
619+
io.close();
620+
621+
io = getWritable(new WritableAlwaysError());
622+
try {
623+
io.writeAsync(ByteBuffer.allocate(100)).blockResult(0);
624+
throw new AssertionError();
625+
} catch (IOException e) { /* ok */ }
626+
io.close();
627+
628+
io = getWritable(new WritableAlwaysError());
629+
try {
630+
io.writeAsync(ByteBuffer.allocate(100), ondone).blockResult(0);
631+
throw new AssertionError();
632+
} catch (IOException e) { /* ok */ }
633+
Assert.assertTrue(called.get());
634+
called.set(false);
635+
io.close();
636+
}
637+
538638
}
Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,33 @@
11
package net.lecousin.framework.core.tests.io;
22

33
import net.lecousin.framework.core.test.io.TestIOError;
4-
import net.lecousin.framework.io.IO.Readable;
5-
import net.lecousin.framework.io.IO.Readable.Buffered;
6-
import net.lecousin.framework.io.IO.Readable.Seekable;
4+
import net.lecousin.framework.io.IO;
75
import net.lecousin.framework.io.LinkedIO;
86

97
public class TestLinkedIOError extends TestIOError {
108

119
@Override
12-
protected Readable getReadable(ReadableAlwaysError io) throws Exception {
10+
protected IO.Readable getReadable(IO.Readable io) throws Exception {
1311
return new LinkedIO.Readable("test error", io);
1412
}
1513

1614
@Override
17-
protected Buffered getReadableBuffered(ReadableAlwaysError io) throws Exception {
18-
return new LinkedIO.Readable.Buffered("test error", io);
15+
protected IO.Readable.Buffered getReadableBuffered(IO.Readable io) throws Exception {
16+
if (!(io instanceof IO.Readable.Buffered))
17+
return null;
18+
return new LinkedIO.Readable.Buffered("test error", (IO.Readable.Buffered)io);
1919
}
2020

2121
@Override
22-
protected Seekable getReadableSeekable(ReadableAlwaysError io) throws Exception {
22+
protected IO.Readable.Seekable getReadableSeekable(IO.Readable.Seekable io) throws Exception {
2323
return new LinkedIO.Readable.Seekable("test error", io);
2424
}
25+
26+
@Override
27+
protected IO.Writable getWritable(IO.Writable io) throws Exception {
28+
if ((io instanceof IO.Readable.Seekable) && (io instanceof IO.Writable.Seekable))
29+
return new LinkedIO.ReadWrite("test error", (IO.Readable.Seekable & IO.Writable.Seekable)io);
30+
return null;
31+
}
2532

2633
}

net.lecousin.core/src/test/java/net/lecousin/framework/core/tests/io/TestPositionKnownWrapperError.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
package net.lecousin.framework.core.tests.io;
22

33
import net.lecousin.framework.core.test.io.TestIOError;
4+
import net.lecousin.framework.io.IO;
45
import net.lecousin.framework.io.PositionKnownWrapper;
5-
import net.lecousin.framework.io.IO.Readable;
6-
import net.lecousin.framework.io.IO.Readable.Buffered;
7-
import net.lecousin.framework.io.IO.Readable.Seekable;
86

97
public class TestPositionKnownWrapperError extends TestIOError {
108

119
@Override
12-
protected Readable getReadable(ReadableAlwaysError io) throws Exception {
10+
protected IO.Readable getReadable(IO.Readable io) throws Exception {
1311
return new PositionKnownWrapper.Readable(io);
1412
}
1513

1614
@Override
17-
protected Buffered getReadableBuffered(ReadableAlwaysError io) throws Exception {
18-
return new PositionKnownWrapper.Readable.Buffered(io);
15+
protected IO.Readable.Buffered getReadableBuffered(IO.Readable io) throws Exception {
16+
if (io instanceof IO.Readable.Buffered)
17+
return new PositionKnownWrapper.Readable.Buffered((IO.Readable.Buffered)io);
18+
return null;
1919
}
2020

2121
@Override
22-
protected Seekable getReadableSeekable(ReadableAlwaysError io) throws Exception {
22+
protected IO.Readable.Seekable getReadableSeekable(IO.Readable.Seekable io) throws Exception {
23+
return null;
24+
}
25+
26+
@Override
27+
protected IO.Writable getWritable(IO.Writable io) throws Exception {
2328
return null;
2429
}
2530

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
package net.lecousin.framework.core.tests.io;
22

33
import net.lecousin.framework.core.test.io.TestIOError;
4-
import net.lecousin.framework.io.IO.Readable;
5-
import net.lecousin.framework.io.IO.Readable.Buffered;
6-
import net.lecousin.framework.io.IO.Readable.Seekable;
4+
import net.lecousin.framework.io.IO;
75
import net.lecousin.framework.io.buffering.ReadableToSeekable;
86

97
public class TestReadableToSeekableError extends TestIOError {
108

119
@Override
12-
protected Readable getReadable(ReadableAlwaysError io) throws Exception {
10+
protected IO.Readable getReadable(IO.Readable io) throws Exception {
1311
return new ReadableToSeekable(io, 512);
1412
}
1513

1614
@Override
17-
protected Buffered getReadableBuffered(ReadableAlwaysError io) throws Exception {
15+
protected IO.Readable.Buffered getReadableBuffered(IO.Readable io) throws Exception {
1816
return new ReadableToSeekable(io, 512);
1917
}
2018

2119
@Override
22-
protected Seekable getReadableSeekable(ReadableAlwaysError io) throws Exception {
20+
protected IO.Readable.Seekable getReadableSeekable(IO.Readable.Seekable io) throws Exception {
2321
return new ReadableToSeekable(io, 512);
2422
}
23+
24+
@Override
25+
protected IO.Writable getWritable(IO.Writable io) throws Exception {
26+
return null;
27+
}
2528

2629
}
Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,32 @@
11
package net.lecousin.framework.core.tests.io;
22

33
import net.lecousin.framework.core.test.io.TestIOError;
4+
import net.lecousin.framework.io.IO;
45
import net.lecousin.framework.io.IO.Readable;
5-
import net.lecousin.framework.io.IO.Readable.Buffered;
6-
import net.lecousin.framework.io.IO.Readable.Seekable;
76
import net.lecousin.framework.io.SubIO;
87

98
public class TestSubIOError extends TestIOError {
109

1110
@Override
12-
protected Readable getReadable(ReadableAlwaysError io) {
11+
protected Readable getReadable(IO.Readable io) {
1312
return new SubIO.Readable(io, 4096, "test error", true);
1413
}
1514

1615
@Override
17-
protected Buffered getReadableBuffered(ReadableAlwaysError io) {
18-
return new SubIO.Readable.Seekable.Buffered(io, 10, 4096, "test error", true);
16+
protected IO.Readable.Buffered getReadableBuffered(IO.Readable io) {
17+
if ((io instanceof IO.Readable.Seekable) && (io instanceof IO.Readable.Buffered))
18+
return new SubIO.Readable.Seekable.Buffered((IO.Readable.Seekable & IO.Readable.Buffered)io, 10, 4096, "test error", true);
19+
return null;
1920
}
2021

2122
@Override
22-
protected Seekable getReadableSeekable(ReadableAlwaysError io) {
23+
protected IO.Readable.Seekable getReadableSeekable(IO.Readable.Seekable io) {
2324
return new SubIO.Readable.Seekable(io, 10, 4096, "test error", true);
2425
}
26+
27+
@Override
28+
protected IO.Writable getWritable(IO.Writable io) throws Exception {
29+
return new SubIO.Writable(io, 0, 4096, "test error", true);
30+
}
2531

2632
}
Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,35 @@
11
package net.lecousin.framework.core.tests.io.buffered;
22

33
import net.lecousin.framework.core.test.io.TestIOError;
4-
import net.lecousin.framework.io.IO.Readable;
5-
import net.lecousin.framework.io.IO.Readable.Buffered;
6-
import net.lecousin.framework.io.IO.Readable.Seekable;
4+
import net.lecousin.framework.io.IO;
75
import net.lecousin.framework.io.buffering.BufferedIO;
86

97
public class TestBufferedIOError extends TestIOError {
108

119
@Override
12-
protected Readable getReadable(ReadableAlwaysError io) throws Exception {
13-
return new BufferedIO(io, 2048, 512, 512, true);
10+
protected IO.Readable getReadable(IO.Readable io) throws Exception {
11+
if (!(io instanceof IO.Readable.Seekable))
12+
return null;
13+
return new BufferedIO((IO.Readable.Seekable)io, 2048, 512, 512, true);
1414
}
1515

1616
@Override
17-
protected Buffered getReadableBuffered(ReadableAlwaysError io) throws Exception {
18-
return new BufferedIO(io, 2048, 512, 512, true);
17+
protected IO.Readable.Buffered getReadableBuffered(IO.Readable io) throws Exception {
18+
if (!(io instanceof IO.Readable.Seekable))
19+
return null;
20+
return new BufferedIO((IO.Readable.Seekable)io, 2048, 512, 512, true);
1921
}
2022

2123
@Override
22-
protected Seekable getReadableSeekable(ReadableAlwaysError io) throws Exception {
24+
protected IO.Readable.Seekable getReadableSeekable(IO.Readable.Seekable io) throws Exception {
2325
return new BufferedIO(io, 2048, 512, 512, true);
2426
}
27+
28+
@Override
29+
protected IO.Writable getWritable(IO.Writable io) throws Exception {
30+
if ((io instanceof IO.Readable.Seekable) && (io instanceof IO.Writable.Seekable) && (io instanceof IO.Resizable))
31+
return new BufferedIO.ReadWrite((IO.Readable.Seekable & IO.Writable.Seekable & IO.Resizable)io, 2048, 512, true);
32+
return null;
33+
}
2534

2635
}

net.lecousin.core/src/test/java/net/lecousin/framework/core/tests/io/buffered/TestPreBufferedReadableError.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,28 @@
22

33
import net.lecousin.framework.concurrent.Task;
44
import net.lecousin.framework.core.test.io.TestIOError;
5-
import net.lecousin.framework.io.IO.Readable;
6-
import net.lecousin.framework.io.IO.Readable.Buffered;
7-
import net.lecousin.framework.io.IO.Readable.Seekable;
5+
import net.lecousin.framework.io.IO;
86
import net.lecousin.framework.io.buffering.PreBufferedReadable;
97

108
public class TestPreBufferedReadableError extends TestIOError {
119

1210
@Override
13-
protected Readable getReadable(ReadableAlwaysError io) throws Exception {
11+
protected IO.Readable getReadable(IO.Readable io) throws Exception {
1412
return new PreBufferedReadable(io, 512, Task.PRIORITY_NORMAL, 512, Task.PRIORITY_NORMAL, 10);
1513
}
1614

1715
@Override
18-
protected Buffered getReadableBuffered(ReadableAlwaysError io) throws Exception {
16+
protected IO.Readable.Buffered getReadableBuffered(IO.Readable io) throws Exception {
1917
return new PreBufferedReadable(io, 512, Task.PRIORITY_NORMAL, 512, Task.PRIORITY_NORMAL, 10);
2018
}
2119

2220
@Override
23-
protected Seekable getReadableSeekable(ReadableAlwaysError io) throws Exception {
21+
protected IO.Readable.Seekable getReadableSeekable(IO.Readable.Seekable io) throws Exception {
2422
return null;
2523
}
2624

25+
@Override
26+
protected IO.Writable getWritable(IO.Writable io) throws Exception {
27+
return null;
28+
}
2729
}

0 commit comments

Comments
 (0)