/* * 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()); sideband.drainMessages(); assertEquals("message\n", 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()); sideband.drainMessages(); assertEquals("message 0%\rmessage 100%\n", messages.toString()); } @Test public void progressPartialLF() throws IOException { init(packet("message 0%\nmessage 100%")); assertTrue(sideband.read() < 0); assertEquals("message 0%\n", messages.toString()); sideband.drainMessages(); assertEquals("message 0%\nmessage 100%\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()); sideband.drainMessages(); assertEquals("message 0%\r\nmessage 100%\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()); sideband.drainMessages(); assertEquals("message 0%\rmessage 100%\n", 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()); sideband.drainMessages(); assertEquals("message 0%\nmessage 100%\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()); sideband.drainMessages(); assertEquals("message 0%\r\nmessage 100%\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()); sideband.drainMessages(); assertEquals("message 0%\rmessage 10%\rmessage 100%\n", 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); } }