| /* | |
| * Copyright (C) 2022 Thomas Wolf <thomas.wolf@paranor.ch> 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); | |
| } | |
| } |