/* This file is part of VoltDB. * Copyright (C) 2008-2017 VoltDB Inc. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ package org.voltcore.utils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.EOFException; import java.nio.ByteBuffer; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.voltdb.utils.Digester; import com.google_voltpatches.common.base.Charsets; public class TestByteBufferStreams { static byte [] hunkOfContent = new byte[1024*1024]; static final String thirtyTwoBytesPattern = "block %7d repeatable pattern"; // 1 << 5 static String digestOfHunkOfContent; @BeforeClass public static void setUpBeforeClass() throws Exception { for (int i = 0; i < hunkOfContent.length; i+=1<<5) { byte [] bytes = String.format(thirtyTwoBytesPattern, i).getBytes(Charsets.UTF_8); System.arraycopy(bytes, 0, hunkOfContent, i, bytes.length); } digestOfHunkOfContent = Digester.sha1AsBase64(hunkOfContent); } @AfterClass public static void tearDownAfterClass() throws Exception { } @Test public void testByteBufferInputStream() throws Exception { ByteBufferInputStream bbin = new ByteBufferInputStream(ByteBuffer.wrap(hunkOfContent)); byte [] bytes = new byte[1<<5]; for (int i = 0; i < hunkOfContent.length; i+=1<<5) { assertEquals(bytes.length, bbin.read(bytes)); assertEquals(String.format(thirtyTwoBytesPattern, i), new String(bytes,Charsets.UTF_8)); } assertEquals(-1, bbin.read(bytes)); try { bbin.read(bytes); fail("expected end of file exception"); } catch (EOFException expected) { } bbin.close(); } @Test public void testGreedyRead() throws Exception { byte [] inbytes = String.format(thirtyTwoBytesPattern, 111).getBytes(Charsets.UTF_8); ByteBufferInputStream bbis = new ByteBufferInputStream(ByteBuffer.wrap(inbytes)); byte [] outbytes = new byte [inbytes.length<<1]; assertEquals(inbytes.length, bbis.read(outbytes)); bbis.close(); } @Test public void testByteBufferOutputStream() throws Exception { ByteBufferOutputStream bbos = new ByteBufferOutputStream(); for (int i = 0; i < hunkOfContent.length; i+=1<<5) { bbos.write(String.format(thirtyTwoBytesPattern, i).getBytes(Charsets.UTF_8)); } assertEquals(digestOfHunkOfContent,Digester.sha1AsBase64(bbos.toByteArray())); bbos.close(); } }