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.http;
29
30 import java.io.IOException;
31 import java.nio.ByteBuffer;
32 import java.nio.channels.ClosedChannelException;
33 import java.nio.channels.ReadableByteChannel;
34 import java.nio.charset.Charset;
35
36 public class ReadableByteChannelMock implements ReadableByteChannel {
37
38 private final byte[][] chunks;
39
40 private int chunkCount = 0;
41
42 private ByteBuffer currentChunk;
43 private boolean eof = false;
44 private boolean closed = false;
45
46 public ReadableByteChannelMock(final String[] strings, final Charset charset) {
47 super();
48 this.chunks = new byte[strings.length][];
49 for (int i = 0; i < strings.length; i++) {
50 this.chunks[i] = strings[i].getBytes(charset);
51 }
52 }
53
54 public ReadableByteChannelMock(final byte[]... chunks) {
55 super();
56 this.chunks = chunks;
57 }
58
59 private void prepareChunk() {
60 if (this.currentChunk == null || !this.currentChunk.hasRemaining()) {
61 if (this.chunkCount < this.chunks.length) {
62 final byte[] bytes = this.chunks[this.chunkCount];
63 this.chunkCount++;
64 this.currentChunk = ByteBuffer.wrap(bytes);
65 } else {
66 this.eof = true;
67 }
68 }
69 }
70
71 @Override
72 public int read(final ByteBuffer dst) throws IOException {
73 if (this.closed) {
74 throw new ClosedChannelException();
75 }
76 prepareChunk();
77 if (this.eof) {
78 return -1;
79 }
80 int i = 0;
81 while (dst.hasRemaining() && this.currentChunk.hasRemaining()) {
82 dst.put(this.currentChunk.get());
83 i++;
84 }
85 return i;
86 }
87
88 @Override
89 public void close() throws IOException {
90 this.closed = true;
91 }
92
93 @Override
94 public boolean isOpen() {
95 return !this.closed && !this.eof;
96 }
97
98 }