/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.github.geophile.erdo.map.diskmap;
import com.github.geophile.erdo.util.Transferrable;
import org.junit.Test;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.fail;
public class DiskPageSectionFixedLengthRecordTest
{
@Test
public void testEmpty()
{
DiskPageSection s = new DiskPageSectionFixedLengthRecords(0, newDiskPageSectionBuffer());
s.recordSize(4);
s.metadataClose();
try {
s.metadataAppendUInt(0);
fail();
} catch (AssertionError e) {
}
assertEquals(0, s.count());
assertEquals(8, s.size());
s.close();
assertEquals(0, s.count());
assertEquals(8, s.size());
try {
s.append(new TestValue(0));
fail();
} catch (AssertionError e) {
}
}
@Test
public void testMetadataOnly()
{
DiskPageSection s = new DiskPageSectionFixedLengthRecords(6, newDiskPageSectionBuffer());
s.recordSize(4);
s.metadataAppendUInt(123);
s.metadataAppendUShort(456);
assertEquals(0, s.count());
assertEquals(14, s.size());
try {
s.metadataUInt(0);
fail();
} catch (AssertionError e) {
}
s.metadataClose();
assertEquals(0, s.count());
assertEquals(14, s.size());
try {
s.metadataUInt(0);
fail();
} catch (AssertionError e) {
}
s.close();
assertEquals(123, s.metadataUInt(0));
assertEquals(456, s.metadataUShort(4));
assertEquals(0, s.count());
assertEquals(14, s.size());
}
@Test
public void testUnsignedMetadata()
{
DiskPageSection s = new DiskPageSectionFixedLengthRecords(6, newDiskPageSectionBuffer());
s.recordSize(4);
s.metadataAppendUInt(0xffffffffL);
s.metadataAppendUShort(0xffff);
s.metadataClose();
s.close();
assertEquals(0xffffffffL, s.metadataUInt(0));
assertEquals(0xffff, s.metadataUShort(4));
}
@Test
public void testMetadataOverflow()
{
DiskPageSection s = new DiskPageSectionFixedLengthRecords(6, newDiskPageSectionBuffer());
s.recordSize(4);
s.metadataAppendUInt(123);
try {
s.metadataAppendUInt(456);
fail();
} catch (AssertionError e) {
}
}
@Test
public void testData()
{
// Section size is 8 + 4 * #records. Buffer size is 4k, so #records <= 1022.
final int N = 1022;
DiskPageSection s = new DiskPageSectionFixedLengthRecords(0, newDiskPageSectionBuffer());
s.recordSize(4);
assertEquals(0, s.count());
assertEquals(8, s.size());
for (int i = 0; i < N; i++) {
s.append(new TestValue(i));
assertEquals(i + 1, s.count());
assertEquals(8 + (i + 1) * 4, s.size());
}
try {
s.append(new TestValue(N + 1));
fail();
} catch (BufferOverflowException e) {
}
assertEquals(N, s.count());
assertEquals(8 + N * 4, s.size());
s.close();
assertEquals(N, s.count());
assertEquals(8 + N * 4, s.size());
ByteBuffer buffer = s.accessBuffer();
for (int i = 0; i < N; i++) {
s.setBoundariesInBuffer(i, buffer);
new TestValue(i).readFrom(buffer);
}
try {
s.setBoundariesInBuffer(-1, buffer);
fail();
} catch (AssertionError e) {
}
}
@Test
public void testEmptyRecords()
{
// Write 3 0-length records
DiskPageSection s = new DiskPageSectionFixedLengthRecords(0, newDiskPageSectionBuffer());
s.recordSize(4);
TestValue v123 = new TestValue(123);
TestValue v456 = new TestValue(456);
TestValue v789 = new TestValue(789);
s.append(v123);
s.append(v456);
s.append(v789);
s.close();
assertEquals(3, s.count());
assertEquals(8 + 4 * 3, s.size());
ByteBuffer buffer = s.accessBuffer();
s.setBoundariesInBuffer(0, buffer);
v123.readFrom(buffer);
s.setBoundariesInBuffer(1, buffer);
v456.readFrom(buffer);
s.setBoundariesInBuffer(2, buffer);
v789.readFrom(buffer);
}
@Test
public void testMarkReset()
{
DiskPageSection s = new DiskPageSectionFixedLengthRecords(0, newDiskPageSectionBuffer());
s.recordSize(4);
s.append(new TestValue(1));
s.append(new TestValue(2));
assertEquals(2, s.count());
assertEquals(8 + 2 * 4, s.size());
s.mark();
s.append(new TestValue(3));
s.append(new TestValue(4));
assertEquals(4, s.count());
assertEquals(8 + 4 * 4, s.size());
s.resetToMark();
assertEquals(2, s.count());
assertEquals(8 + 2 * 4, s.size());
s.append(new TestValue(5));
s.append(new TestValue(6));
assertEquals(4, s.count());
assertEquals(8 + 4 * 4, s.size());
s.close();
assertEquals(4, s.count());
assertEquals(8 + 4 * 4, s.size());
ByteBuffer buffer = s.accessBuffer();
s.setBoundariesInBuffer(0, buffer);
new TestValue(1).readFrom(buffer);
s.setBoundariesInBuffer(1, buffer);
new TestValue(2).readFrom(buffer);
s.setBoundariesInBuffer(2, buffer);
new TestValue(5).readFrom(buffer);
s.setBoundariesInBuffer(3, buffer);
new TestValue(6).readFrom(buffer);
}
private ByteBuffer newDiskPageSectionBuffer()
{
return ByteBuffer.allocate(BUFFER_SIZE);
}
private static final int BUFFER_SIZE = 4096;
private static class TestValue implements Transferrable
{
public void writeTo(ByteBuffer buffer) throws BufferOverflowException
{
buffer.putInt(value);
}
public void readFrom(ByteBuffer buffer)
{
assertEquals(value, buffer.getInt());
}
public int recordCount()
{
return 1;
}
public TestValue(int value)
{
this.value = value;
}
private final int value;
}
}