package com.liveramp.hank.storage.cueball; import com.liveramp.hank.compression.cueball.NoCueballCompressionCodec; import com.liveramp.hank.test.BaseTestCase; import org.junit.Test; import java.io.FileOutputStream; import java.nio.ByteBuffer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class TestCueballStreamBuffer extends BaseTestCase { private static final byte[] CONTIG_DATA = new byte[]{ 0x00, 1, 0x40, 2, (byte) 0x80, 3, (byte) 0xc0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, }; private final String CONTIG_PATH = localTmpDir + "/contiguous_file.cueball"; private static final byte[] DISCONTIG_DATA_INTERNAL_HOLE = new byte[]{ 0x00, 1, (byte) 0x80, 3, (byte) 0xc0, 4, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, }; private final String DISCONTIG_INTERNAL_HOLE_PATH = localTmpDir + "/discontiguous_internal_file.cueball"; private static final byte[] DISCONTIG_DATA_END = new byte[]{ 0x00, 1, 0x40, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 0, 0, 0, 2, 0, 0, 0, }; private final String DISCONTIG_END_PATH = localTmpDir + "/discontiguous_end_file.cueball"; @Test public void testContiguousBlocks() throws Exception { final FileOutputStream stream = new FileOutputStream(CONTIG_PATH); stream.write(CONTIG_DATA); stream.flush(); stream.close(); final CueballStreamBuffer sb = new CueballStreamBuffer(CONTIG_PATH, 0, 1, 1, 2, new NoCueballCompressionCodec()); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(CONTIG_DATA, 0, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(CONTIG_DATA, 2, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(CONTIG_DATA, 4, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(CONTIG_DATA, 6, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertFalse(sb.anyRemaining()); } @Test public void testDiscontiguousInternalBlocks() throws Exception { final FileOutputStream stream = new FileOutputStream(DISCONTIG_INTERNAL_HOLE_PATH); stream.write(DISCONTIG_DATA_INTERNAL_HOLE); stream.flush(); stream.close(); final CueballStreamBuffer sb = new CueballStreamBuffer(DISCONTIG_INTERNAL_HOLE_PATH, 0, 1, 1, 2, new NoCueballCompressionCodec()); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(DISCONTIG_DATA_INTERNAL_HOLE, 0, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(DISCONTIG_DATA_INTERNAL_HOLE, 2, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(DISCONTIG_DATA_INTERNAL_HOLE, 4, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertFalse(sb.anyRemaining()); } @Test public void testDiscontiguousEndBlocks() throws Exception { final FileOutputStream stream = new FileOutputStream(DISCONTIG_END_PATH); stream.write(DISCONTIG_DATA_END); stream.flush(); stream.close(); final CueballStreamBuffer sb = new CueballStreamBuffer(DISCONTIG_END_PATH, 0, 1, 1, 2, new NoCueballCompressionCodec()); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(DISCONTIG_DATA_END, 0, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertTrue(sb.anyRemaining()); assertEquals(0, sb.getCurrentOffset()); assertEquals(ByteBuffer.wrap(DISCONTIG_DATA_END, 2, 2), ByteBuffer.wrap(sb.getBuffer(), 0, 2)); sb.consume(); assertFalse(sb.anyRemaining()); } }