1
2
3
4
5
6
7
8
9
10 package org.eclipse.jgit.transport;
11
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertTrue;
14
15 import java.io.ByteArrayInputStream;
16 import java.io.IOException;
17 import java.io.InputStream;
18 import java.io.StringWriter;
19 import java.nio.charset.StandardCharsets;
20
21 import org.junit.Before;
22 import org.junit.Test;
23
24 public class SideBandInputStreamTest {
25
26 private StringWriter messages;
27
28 private SideBandInputStream sideband;
29
30 @Before
31 public void setup() {
32 messages = new StringWriter();
33 }
34
35 @Test
36 public void progressSingleCR() throws IOException {
37 init(packet("message\r"));
38 assertTrue(sideband.read() < 0);
39 assertEquals("message\r", messages.toString());
40 }
41
42 @Test
43 public void progressSingleLF() throws IOException {
44 init(packet("message\n"));
45 assertTrue(sideband.read() < 0);
46 assertEquals("message\n", messages.toString());
47 }
48
49 @Test
50 public void progressSingleCRLF() throws IOException {
51 init(packet("message\r\n"));
52 assertTrue(sideband.read() < 0);
53 assertEquals("message\r\n", messages.toString());
54 }
55
56 @Test
57 public void progressMultiCR() throws IOException {
58 init(packet("message 0%\rmessage 100%\r"));
59 assertTrue(sideband.read() < 0);
60 assertEquals("message 0%\rmessage 100%\r", messages.toString());
61 }
62
63 @Test
64 public void progressMultiLF() throws IOException {
65 init(packet("message 0%\nmessage 100%\n"));
66 assertTrue(sideband.read() < 0);
67 assertEquals("message 0%\nmessage 100%\n", messages.toString());
68 }
69
70 @Test
71 public void progressMultiCRLF() throws IOException {
72 init(packet("message 0%\r\nmessage 100%\r\n"));
73 assertTrue(sideband.read() < 0);
74 assertEquals("message 0%\r\nmessage 100%\r\n", messages.toString());
75 }
76
77 @Test
78 public void progressPartial() throws IOException {
79 init(packet("message"));
80 assertTrue(sideband.read() < 0);
81 assertEquals("", messages.toString());
82 sideband.drainMessages();
83 assertEquals("message\n", messages.toString());
84 }
85
86 @Test
87 public void progressPartialTwoCR() throws IOException {
88 init(packet("message") + packet("message\r"));
89 assertTrue(sideband.read() < 0);
90 assertEquals("messagemessage\r", messages.toString());
91 }
92
93 @Test
94 public void progressPartialTwoLF() throws IOException {
95 init(packet("message") + packet("message\n"));
96 assertTrue(sideband.read() < 0);
97 assertEquals("messagemessage\n", messages.toString());
98 }
99
100 @Test
101 public void progressPartialTwoCRLF() throws IOException {
102 init(packet("message") + packet("message\r\n"));
103 assertTrue(sideband.read() < 0);
104 assertEquals("messagemessage\r\n", messages.toString());
105 }
106
107 @Test
108 public void progressPartialThreeCR() throws IOException {
109 init(packet("message") + packet("message") + packet("message\r"));
110 assertTrue(sideband.read() < 0);
111 assertEquals("messagemessagemessage\r", messages.toString());
112 }
113
114 @Test
115 public void progressPartialThreeLF() throws IOException {
116 init(packet("message") + packet("message") + packet("message\n"));
117 assertTrue(sideband.read() < 0);
118 assertEquals("messagemessagemessage\n", messages.toString());
119 }
120
121 @Test
122 public void progressPartialThreeCRLF() throws IOException {
123 init(packet("message") + packet("message") + packet("message\r\n"));
124 assertTrue(sideband.read() < 0);
125 assertEquals("messagemessagemessage\r\n", messages.toString());
126 }
127
128 @Test
129 public void progressPartialCR() throws IOException {
130 init(packet("message 0%\rmessage 100%"));
131 assertTrue(sideband.read() < 0);
132 assertEquals("message 0%\r", messages.toString());
133 sideband.drainMessages();
134 assertEquals("message 0%\rmessage 100%\n", messages.toString());
135 }
136
137 @Test
138 public void progressPartialLF() throws IOException {
139 init(packet("message 0%\nmessage 100%"));
140 assertTrue(sideband.read() < 0);
141 assertEquals("message 0%\n", messages.toString());
142 sideband.drainMessages();
143 assertEquals("message 0%\nmessage 100%\n", messages.toString());
144 }
145
146 @Test
147 public void progressPartialCRLF() throws IOException {
148 init(packet("message 0%\r\nmessage 100%"));
149 assertTrue(sideband.read() < 0);
150 assertEquals("message 0%\r\n", messages.toString());
151 sideband.drainMessages();
152 assertEquals("message 0%\r\nmessage 100%\n", messages.toString());
153 }
154
155 @Test
156 public void progressPartialSplitCR() throws IOException {
157 init(packet("message") + "0006\001a" + packet(" 0%\rmessa")
158 + packet("ge 100%"));
159 assertEquals('a', sideband.read());
160 assertEquals("", messages.toString());
161 assertTrue(sideband.read() < 0);
162 assertEquals("message 0%\r", messages.toString());
163 sideband.drainMessages();
164 assertEquals("message 0%\rmessage 100%\n", messages.toString());
165 }
166
167 @Test
168 public void progressPartialSplitLF() throws IOException {
169 init(packet("message") + "0006\001a" + packet(" 0%\nmessa")
170 + packet("ge 100%"));
171 assertEquals('a', sideband.read());
172 assertEquals("", messages.toString());
173 assertTrue(sideband.read() < 0);
174 assertEquals("message 0%\n", messages.toString());
175 sideband.drainMessages();
176 assertEquals("message 0%\nmessage 100%\n", messages.toString());
177 }
178
179 @Test
180 public void progressPartialSplitCRLF() throws IOException {
181 init(packet("message") + "0006\001a" + packet(" 0%\r\nmessa")
182 + packet("ge 100%"));
183 assertEquals('a', sideband.read());
184 assertEquals("", messages.toString());
185 assertTrue(sideband.read() < 0);
186 assertEquals("message 0%\r\n", messages.toString());
187 sideband.drainMessages();
188 assertEquals("message 0%\r\nmessage 100%\n", messages.toString());
189 }
190
191 @Test
192 public void progressInterleaved() throws IOException {
193 init(packet("message 0%\r") + "0006\001a" + packet("message 10%")
194 + "0006\001b" + packet("\rmessage 100%\n"));
195 assertEquals('a', sideband.read());
196 assertEquals("message 0%\r", messages.toString());
197 assertEquals('b', sideband.read());
198 assertEquals("message 0%\r", messages.toString());
199 assertTrue(sideband.read() < 0);
200 assertEquals("message 0%\rmessage 10%\rmessage 100%\n",
201 messages.toString());
202 }
203
204 @Test
205 public void progressInterleavedPartial() throws IOException {
206 init(packet("message 0%\r") + "0006\001a" + packet("message 10%")
207 + "0006\001b" + packet("\rmessage 100%"));
208 assertEquals('a', sideband.read());
209 assertEquals("message 0%\r", messages.toString());
210 assertEquals('b', sideband.read());
211 assertEquals("message 0%\r", messages.toString());
212 assertTrue(sideband.read() < 0);
213 assertEquals("message 0%\rmessage 10%\r", messages.toString());
214 sideband.drainMessages();
215 assertEquals("message 0%\rmessage 10%\rmessage 100%\n",
216 messages.toString());
217 }
218
219 private String packet(String data) {
220 return String.format("%04x\002%s", Integer.valueOf(data.length() + 5),
221 data);
222 }
223
224 private void init(String packets) {
225 InputStream rawIn = new ByteArrayInputStream(
226 (packets + "0000").getBytes(StandardCharsets.UTF_8));
227 sideband = new SideBandInputStream(rawIn, null, messages, null);
228 }
229 }