/* (c) 2014 LinkedIn Corp. All rights reserved.
*
* 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.
*/
package com.linkedin.cubert.memory;
import com.linkedin.cubert.utils.MemoryStats;
import org.junit.Test;
import org.testng.Assert;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
/**
*
* Created by spyne on 7/29/14.
*/
public class TestPagedByteArray
{
final long seed = 12345L;
@Test
public void testReadWrite() throws Exception
{
PagedByteArray pba = new PagedByteArray(100);
final byte[] b ={ 56, 67, 78, 89 };
final int someOffset = 72;
pba.write(b[0], someOffset);
pba.write(b[1], someOffset + 1);
pba.write(b[2], someOffset + 2);
pba.write(b[3], someOffset);
Assert.assertEquals(b[3], pba.read(someOffset));
Assert.assertEquals(b[1], pba.read(someOffset + 1));
Assert.assertEquals(b[2], pba.read(someOffset + 2));
}
@Test
public void testReadWriteArray() throws Exception
{
final int n = 100;
byte[] bytes = new byte[n];
final Random rand = new Random(seed);
rand.nextBytes(bytes);
PagedByteArray pba = new PagedByteArray(100);
final int someOffset = 172;
pba.write(bytes, 0, bytes.length, someOffset);
byte[] result = new byte[n];
pba.read(result, 0, bytes.length, someOffset);
Assert.assertEquals(result, bytes);
}
@Test
public void testInputOutputStream() throws Exception
{
/* running with chunk size less than array size */
streamTest(1000, 243, 100);
/* running with chunk size greater than array size */
streamTest(1200, 223, 300);
}
private void streamTest(int nEntries, int arraySize, int chunkSize) throws IOException
{
PagedByteArrayOutputStream pbaos = new PagedByteArrayOutputStream(chunkSize);
PagedByteArrayInputStream pbais = new PagedByteArrayInputStream(pbaos.getPagedByteArray());
byte[][] bytesMat = new byte[nEntries][arraySize];
byte[] bytes = new byte[nEntries];
final Random rand = new Random(seed);
for (int i = 0; i < nEntries; ++i)
{
rand.nextBytes(bytesMat[i]);
}
rand.nextBytes(bytes);
/* Write all values. */
for (int i = 0; i < nEntries; ++i)
{
pbaos.write(bytesMat[i]);
pbaos.write(bytes[i]);
}
/* read and match */
byte[] readBytes = new byte[arraySize];
for (int i = 0; i < nEntries; ++i)
{
int l = pbais.read(readBytes);
byte b = (byte) pbais.read();
Assert.assertEquals(l, bytesMat[i].length);
Assert.assertEquals(readBytes, bytesMat[i]);
Assert.assertEquals(b, bytes[i]);
}
}
/**
* Benchmark between PagedByteArrayOutputStream and ByteArrayOutputStream
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
// PagedByteArrayOutputStream os = new PagedByteArrayOutputStream(1 << 20);
ByteArrayOutputStream os = new ByteArrayOutputStream();
final long start = System.nanoTime();
for (long i = 0; i < (1L << 29); i++)
{
os.write((int) i % 128);
if (i % (1<<24) == 0)
{
System.out.println((i / (1 << 20)) + " MB Written");
MemoryStats.print("");
// System.gc();
}
}
System.out.println("TestPagedByteArray.main: " + ((System.nanoTime() - start)/ 1E6));
}
}