diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/SideBandInputStreamTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/SideBandInputStreamTest.java new file mode 100644 index 000000000..497f584b5 --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/SideBandInputStreamTest.java @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2022 Thomas Wolf and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +package org.eclipse.jgit.transport; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; + +import org.junit.Before; +import org.junit.Test; + +public class SideBandInputStreamTest { + + private StringWriter messages; + + private SideBandInputStream sideband; + + @Before + public void setup() { + messages = new StringWriter(); + } + + @Test + public void progressSingleCR() throws IOException { + init(packet("message\r")); + assertTrue(sideband.read() < 0); + assertEquals("message\r", messages.toString()); + } + + @Test + public void progressSingleLF() throws IOException { + init(packet("message\n")); + assertTrue(sideband.read() < 0); + assertEquals("message\n", messages.toString()); + } + + @Test + public void progressSingleCRLF() throws IOException { + init(packet("message\r\n")); + assertTrue(sideband.read() < 0); + assertEquals("message\r\n", messages.toString()); + } + + @Test + public void progressMultiCR() throws IOException { + init(packet("message 0%\rmessage 100%\r")); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\rmessage 100%\r", messages.toString()); + } + + @Test + public void progressMultiLF() throws IOException { + init(packet("message 0%\nmessage 100%\n")); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\nmessage 100%\n", messages.toString()); + } + + @Test + public void progressMultiCRLF() throws IOException { + init(packet("message 0%\r\nmessage 100%\r\n")); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\r\nmessage 100%\r\n", messages.toString()); + } + + @Test + public void progressPartial() throws IOException { + init(packet("message")); + assertTrue(sideband.read() < 0); + assertEquals("", messages.toString()); + } + + @Test + public void progressPartialTwoCR() throws IOException { + init(packet("message") + packet("message\r")); + assertTrue(sideband.read() < 0); + assertEquals("messagemessage\r", messages.toString()); + } + + @Test + public void progressPartialTwoLF() throws IOException { + init(packet("message") + packet("message\n")); + assertTrue(sideband.read() < 0); + assertEquals("messagemessage\n", messages.toString()); + } + + @Test + public void progressPartialTwoCRLF() throws IOException { + init(packet("message") + packet("message\r\n")); + assertTrue(sideband.read() < 0); + assertEquals("messagemessage\r\n", messages.toString()); + } + + @Test + public void progressPartialThreeCR() throws IOException { + init(packet("message") + packet("message") + packet("message\r")); + assertTrue(sideband.read() < 0); + assertEquals("messagemessagemessage\r", messages.toString()); + } + + @Test + public void progressPartialThreeLF() throws IOException { + init(packet("message") + packet("message") + packet("message\n")); + assertTrue(sideband.read() < 0); + assertEquals("messagemessagemessage\n", messages.toString()); + } + + @Test + public void progressPartialThreeCRLF() throws IOException { + init(packet("message") + packet("message") + packet("message\r\n")); + assertTrue(sideband.read() < 0); + assertEquals("messagemessagemessage\r\n", messages.toString()); + } + + @Test + public void progressPartialCR() throws IOException { + init(packet("message 0%\rmessage 100%")); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\r", messages.toString()); + } + + @Test + public void progressPartialLF() throws IOException { + init(packet("message 0%\nmessage 100%")); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\n", messages.toString()); + } + + @Test + public void progressPartialCRLF() throws IOException { + init(packet("message 0%\r\nmessage 100%")); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\r\n", messages.toString()); + } + + @Test + public void progressPartialSplitCR() throws IOException { + init(packet("message") + "0006\001a" + packet(" 0%\rmessa") + + packet("ge 100%")); + assertEquals('a', sideband.read()); + assertEquals("", messages.toString()); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\r", messages.toString()); + } + + @Test + public void progressPartialSplitLF() throws IOException { + init(packet("message") + "0006\001a" + packet(" 0%\nmessa") + + packet("ge 100%")); + assertEquals('a', sideband.read()); + assertEquals("", messages.toString()); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\n", messages.toString()); + } + + @Test + public void progressPartialSplitCRLF() throws IOException { + init(packet("message") + "0006\001a" + packet(" 0%\r\nmessa") + + packet("ge 100%")); + assertEquals('a', sideband.read()); + assertEquals("", messages.toString()); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\r\n", messages.toString()); + } + + @Test + public void progressInterleaved() throws IOException { + init(packet("message 0%\r") + "0006\001a" + packet("message 10%") + + "0006\001b" + packet("\rmessage 100%\n")); + assertEquals('a', sideband.read()); + assertEquals("message 0%\r", messages.toString()); + assertEquals('b', sideband.read()); + assertEquals("message 0%\r", messages.toString()); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\rmessage 10%\rmessage 100%\n", + messages.toString()); + } + + @Test + public void progressInterleavedPartial() throws IOException { + init(packet("message 0%\r") + "0006\001a" + packet("message 10%") + + "0006\001b" + packet("\rmessage 100%")); + assertEquals('a', sideband.read()); + assertEquals("message 0%\r", messages.toString()); + assertEquals('b', sideband.read()); + assertEquals("message 0%\r", messages.toString()); + assertTrue(sideband.read() < 0); + assertEquals("message 0%\rmessage 10%\r", messages.toString()); + } + + private String packet(String data) { + return String.format("%04x\002%s", Integer.valueOf(data.length() + 5), + data); + } + + private void init(String packets) { + InputStream rawIn = new ByteArrayInputStream( + (packets + "0000").getBytes(StandardCharsets.UTF_8)); + sideband = new SideBandInputStream(rawIn, null, messages, null); + } +}