1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.http2;
29
30 import java.io.IOException;
31 import java.nio.ByteBuffer;
32 import java.nio.channels.ClosedChannelException;
33 import java.nio.channels.ReadableByteChannel;
34
35 public class ReadableByteChannelMock implements ReadableByteChannel {
36
37 private final byte[][] chunks;
38
39 private int chunkCount = 0;
40
41 private ByteBuffer currentChunk;
42 private boolean eof = false;
43 private boolean closed = false;
44
45 public ReadableByteChannelMock(final byte[]... chunks) {
46 super();
47 this.chunks = chunks;
48 }
49
50 private void prepareChunk() {
51 if (this.currentChunk == null || !this.currentChunk.hasRemaining()) {
52 if (this.chunkCount < this.chunks.length) {
53 final byte[] bytes = this.chunks[this.chunkCount];
54 this.chunkCount++;
55 this.currentChunk = ByteBuffer.wrap(bytes);
56 } else {
57 this.eof = true;
58 }
59 }
60 }
61
62 @Override
63 public int read(final ByteBuffer dst) throws IOException {
64 if (this.closed) {
65 throw new ClosedChannelException();
66 }
67 prepareChunk();
68 if (this.eof) {
69 return -1;
70 }
71 int i = 0;
72 while (dst.hasRemaining() && this.currentChunk.hasRemaining()) {
73 dst.put(this.currentChunk.get());
74 i++;
75 }
76 return i;
77 }
78
79 @Override
80 public void close() throws IOException {
81 this.closed = true;
82 }
83
84 @Override
85 public boolean isOpen() {
86 return !this.closed && !this.eof;
87 }
88
89 }