/** * Copyright 2013 Benjamin Lerer * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.horizondb.db.btree; import io.horizondb.db.btree.BlockOrganizedFileDataOutput; import io.horizondb.io.files.FileDataOutput; import java.io.IOException; import org.easymock.EasyMock; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.easymock.EasyMock.aryEq; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; /** * @author Benjamin * */ public class BlockOrganizedFileDataOutputTest { /** * The decorated output. */ private FileDataOutput mockOutput; @Before public void setUp() { this.mockOutput = EasyMock.createMock(FileDataOutput.class); } @After public void tearDown() { this.mockOutput = null; } @SuppressWarnings("boxing") @Test public void testWriteByte() throws IOException { expect(this.mockOutput.getPosition()).andReturn(0L).times(3); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeByte(1)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(2L).times(2); expect(this.mockOutput.writeByte(2)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(3L).times(2); expect(this.mockOutput.writeByte(3)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(4L).times(2); expect(this.mockOutput.writeByte(4)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(5L).times(2); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeByte(5)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(7L).times(2); expect(this.mockOutput.writeByte(6)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(8L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeByte(1); assertEquals(1, output.getPosition()); output.writeByte(2); assertEquals(2, output.getPosition()); output.writeByte(3); assertEquals(3, output.getPosition()); output.writeByte(4); assertEquals(4, output.getPosition()); output.writeByte(5); assertEquals(5, output.getPosition()); output.writeByte(6); assertEquals(6, output.getPosition()); } EasyMock.verify(this.mockOutput); } @SuppressWarnings("boxing") @Test public void testWriteByteWithExistingBlocks() throws IOException { expect(this.mockOutput.getPosition()).andReturn(10L).times(3); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeByte(1)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(12L).times(2); expect(this.mockOutput.writeByte(2)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(13L).times(2); expect(this.mockOutput.writeByte(3)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(14L).times(2); expect(this.mockOutput.writeByte(4)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(15L).times(2); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeByte(5)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(17L).times(2); expect(this.mockOutput.writeByte(6)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(18L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeByte(1); assertEquals(9, output.getPosition()); output.writeByte(2); assertEquals(10, output.getPosition()); output.writeByte(3); assertEquals(11, output.getPosition()); output.writeByte(4); assertEquals(12, output.getPosition()); output.writeByte(5); assertEquals(13, output.getPosition()); output.writeByte(6); assertEquals(14, output.getPosition()); } EasyMock.verify(this.mockOutput); } @SuppressWarnings("boxing") @Test public void testWriteByteWithAnExistingPartialBlock() throws IOException { expect(this.mockOutput.getPosition()).andReturn(7L).times(2); expect(this.mockOutput.writeZeroBytes(3)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(10L); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeByte(1)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(12L).times(2); expect(this.mockOutput.writeByte(2)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(13L).times(2); expect(this.mockOutput.writeByte(3)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(14L).times(2); expect(this.mockOutput.writeByte(4)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(15L).times(2); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeByte(5)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(17L).times(2); expect(this.mockOutput.writeByte(6)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(18L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeByte(1); assertEquals(9, output.getPosition()); output.writeByte(2); assertEquals(10, output.getPosition()); output.writeByte(3); assertEquals(11, output.getPosition()); output.writeByte(4); assertEquals(12, output.getPosition()); output.writeByte(5); assertEquals(13, output.getPosition()); output.writeByte(6); assertEquals(14, output.getPosition()); } EasyMock.verify(this.mockOutput); } @SuppressWarnings("boxing") @Test public void testSwitchBlock() throws IOException { expect(this.mockOutput.getPosition()).andReturn(0L).times(3); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeByte(1)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(2L).times(2); expect(this.mockOutput.writeByte(2)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(3L).times(2); expect(this.mockOutput.writeByte(3)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(4L).times(2); expect(this.mockOutput.writeZeroBytes(1)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(5L).times(2); expect(this.mockOutput.writeByte(1)).andReturn(this.mockOutput); expect(this.mockOutput.writeByte(4)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(7L).times(2); expect(this.mockOutput.writeByte(5)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(8L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeByte(1); assertEquals(1, output.getPosition()); output.writeByte(2); assertEquals(2, output.getPosition()); output.writeByte(3); assertEquals(3, output.getPosition()); output.switchBlockType(); assertEquals(4, output.getPosition()); output.writeByte(4); assertEquals(5, output.getPosition()); output.writeByte(5); assertEquals(6, output.getPosition()); } EasyMock.verify(this.mockOutput); } @SuppressWarnings("boxing") @Test public void testWriteBytes() throws IOException { expect(this.mockOutput.getPosition()).andReturn(0L).times(3); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 1, 2, 3 }), eq(0), eq(3))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(4L).times(2); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 4, 5, 6, 7 }), eq(0), eq(1))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(5L); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 4, 5, 6, 7 }), eq(1), eq(3))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(9L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeBytes(new byte[] { 1, 2, 3 }); assertEquals(3, output.getPosition()); output.writeBytes(new byte[] { 4, 5, 6, 7 }); assertEquals(7, output.getPosition()); } EasyMock.verify(this.mockOutput); } @SuppressWarnings("boxing") @Test public void testWriteBytesWithMultipleBlocks() throws IOException { expect(this.mockOutput.getPosition()).andReturn(0L).times(3); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 1, 2, 3 }), eq(0), eq(3))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(4L).times(2); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 4, 5, 6, 7, 8, 9 }), eq(0), eq(1))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(5L); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 4, 5, 6, 7, 8, 9 }), eq(1), eq(4))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(10L); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 4, 5, 6, 7, 8, 9 }), eq(5), eq(1))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(12L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeBytes(new byte[] { 1, 2, 3 }); assertEquals(3, output.getPosition()); output.writeBytes(new byte[] { 4, 5, 6, 7, 8, 9 }); assertEquals(9, output.getPosition()); } EasyMock.verify(this.mockOutput); } @SuppressWarnings("boxing") @Test public void testWriteBytesWithOffsetAndLength() throws IOException { expect(this.mockOutput.getPosition()).andReturn(0L).times(3); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 1, 2, 3 }), eq(0), eq(2))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(3L).times(2); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 4, 5, 6, 7 }), eq(1), eq(2))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(5L); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 4, 5, 6, 7 }), eq(3), eq(1))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(7L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeBytes(new byte[] { 1, 2, 3 }, 0, 2); assertEquals(2, output.getPosition()); output.writeBytes(new byte[] { 4, 5, 6, 7 }, 1, 3); assertEquals(5, output.getPosition()); } EasyMock.verify(this.mockOutput); } @SuppressWarnings("boxing") @Test public void testWriteBytesWithSameNumberOfBytes() throws IOException { expect(this.mockOutput.getPosition()).andReturn(0L).times(3); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 1, 2, 3, 4 }), eq(0), eq(4))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(5L).times(2); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeBytes(aryEq(new byte[] { 5, 6, 7 }), eq(0), eq(3))).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(9L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeBytes(new byte[] { 1, 2, 3, 4 }); assertEquals(4, output.getPosition()); output.writeBytes(new byte[] { 5, 6, 7 }); assertEquals(7, output.getPosition()); } EasyMock.verify(this.mockOutput); } @SuppressWarnings("boxing") @Test public void testWriteZero() throws IOException { expect(this.mockOutput.getPosition()).andReturn(0L).times(3); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeZeroBytes(3)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(4L).times(2); expect(this.mockOutput.writeZeroBytes(1)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(5L); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeZeroBytes(4)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(10L); expect(this.mockOutput.writeByte(0)).andReturn(this.mockOutput); expect(this.mockOutput.writeZeroBytes(2)).andReturn(this.mockOutput); expect(this.mockOutput.getPosition()).andReturn(13L); this.mockOutput.close(); EasyMock.replay(this.mockOutput); try (BlockOrganizedFileDataOutput output = new BlockOrganizedFileDataOutput(5, this.mockOutput)) { output.writeZeroBytes(3); assertEquals(3, output.getPosition()); output.writeZeroBytes(7); assertEquals(10, output.getPosition()); } EasyMock.verify(this.mockOutput); } }