View Javadoc
1   /*
2    * Copyright (C) 2022 Thomas Wolf <thomas.wolf@paranor.ch> and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
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 }