/* * Copyright (C) 2021 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.util.io; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Arrays; import org.junit.Test; /** * Tests for {@link BinaryHunkInputStream} and {@link BinaryHunkOutputStream}. */ public class BinaryHunkStreamTest { @Test public void testRoundtripWholeBuffer() throws IOException { for (int length = 1; length < 520 + 52; length++) { byte[] data = new byte[length]; for (int i = 0; i < data.length; i++) { data[i] = (byte) (255 - (i % 256)); } try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); BinaryHunkOutputStream out = new BinaryHunkOutputStream( bos)) { out.write(data); out.flush(); byte[] encoded = bos.toByteArray(); assertFalse(Arrays.equals(data, encoded)); try (BinaryHunkInputStream in = new BinaryHunkInputStream( new ByteArrayInputStream(encoded))) { byte[] decoded = new byte[data.length]; int newLength = in.read(decoded); assertEquals(newLength, decoded.length); assertEquals(-1, in.read()); assertArrayEquals(data, decoded); } } } } @Test public void testRoundtripChunks() throws IOException { for (int length = 1; length < 520 + 52; length++) { byte[] data = new byte[length]; for (int i = 0; i < data.length; i++) { data[i] = (byte) (255 - (i % 256)); } try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); BinaryHunkOutputStream out = new BinaryHunkOutputStream( bos)) { out.write(data, 0, data.length / 2); out.write(data, data.length / 2, data.length - data.length / 2); out.flush(); byte[] encoded = bos.toByteArray(); assertFalse(Arrays.equals(data, encoded)); try (BinaryHunkInputStream in = new BinaryHunkInputStream( new ByteArrayInputStream(encoded))) { byte[] decoded = new byte[data.length]; int p = 0; int n; while ((n = in.read(decoded, p, Math.min(decoded.length - p, 57))) >= 0) { p += n; if (p == decoded.length) { break; } } assertEquals(p, decoded.length); assertEquals(-1, in.read()); assertArrayEquals(data, decoded); } } } } @Test public void testRoundtripBytes() throws IOException { for (int length = 1; length < 520 + 52; length++) { byte[] data = new byte[length]; for (int i = 0; i < data.length; i++) { data[i] = (byte) (255 - (i % 256)); } try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); BinaryHunkOutputStream out = new BinaryHunkOutputStream( bos)) { for (int i = 0; i < data.length; i++) { out.write(data[i]); } out.flush(); byte[] encoded = bos.toByteArray(); assertFalse(Arrays.equals(data, encoded)); try (BinaryHunkInputStream in = new BinaryHunkInputStream( new ByteArrayInputStream(encoded))) { byte[] decoded = new byte[data.length]; for (int i = 0; i < decoded.length; i++) { int val = in.read(); assertTrue(0 <= val && val <= 255); decoded[i] = (byte) val; } assertEquals(-1, in.read()); assertArrayEquals(data, decoded); } } } } @Test public void testRoundtripWithClose() throws IOException { for (int length = 1; length < 520 + 52; length++) { byte[] data = new byte[length]; for (int i = 0; i < data.length; i++) { data[i] = (byte) (255 - (i % 256)); } try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { try (BinaryHunkOutputStream out = new BinaryHunkOutputStream( bos)) { out.write(data); } byte[] encoded = bos.toByteArray(); assertFalse(Arrays.equals(data, encoded)); try (BinaryHunkInputStream in = new BinaryHunkInputStream( new ByteArrayInputStream(encoded))) { byte[] decoded = new byte[data.length]; int newLength = in.read(decoded); assertEquals(newLength, decoded.length); assertEquals(-1, in.read()); assertArrayEquals(data, decoded); } } } } }