package com.bigdata.rwstore.sector; import java.io.DataOutputStream; import java.io.EOFException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.PrintStream; import java.nio.ByteBuffer; import java.util.Random; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import com.bigdata.io.DirectBufferPool; import com.bigdata.rawstore.IPSOutputStream; import com.bigdata.rwstore.PSInputStream; import com.bigdata.rwstore.PSOutputStream; import junit.framework.TestCase; public class TestMemoryManagerStreams extends TestCase { private MemoryManager manager; private Random r; protected void setUp() throws Exception { r = new Random(); manager = new MemoryManager(DirectBufferPool.INSTANCE, 30); // 30 * 1M buffers } protected void tearDown() throws Exception { manager.clear(); r = null; manager = null; super.tearDown(); } private String genTestData() { String src = "The quick brown fox jumped over the lazy dog"; StringBuffer buf = new StringBuffer(); while (buf.length() < (20 * 1024)) buf.append(src); return buf.toString(); } public void testSimpleAllocations() { String helloWorld = "Hello World"; final long saddr = allocate(manager, helloWorld); String retstr = getString(saddr); assertTrue(helloWorld.equals(retstr)); // confirm that the stream address can be freed manager.free(saddr); assert manager.getSlotBytes() == 0; } private long allocate(final IMemoryManager mm, String val) { final ByteBuffer bb = ByteBuffer.wrap(val.getBytes()); return mm.allocate(bb, false/* blocks */); } private String getString(final long saddr) { final StringBuffer sb = new StringBuffer(); final ByteBuffer[] bufs = manager.get(saddr); for (int i = 0; i < bufs.length; i++) { final byte[] data; if (bufs[i].isDirect()) { final ByteBuffer indbuf = ByteBuffer.allocate(bufs[i].remaining()); data = indbuf.array(); indbuf.put(bufs[i]); indbuf.flip(); } else { data = bufs[i].array(); } sb.append(new String(data)); } return sb.toString(); } public void testSimpleStreams() throws IOException, ClassNotFoundException { IPSOutputStream out = manager.getOutputStream(); ObjectOutputStream outdat = new ObjectOutputStream(out); final String hw = "Hello World"; outdat.writeObject(hw); outdat.flush(); long addr = out.getAddr(); InputStream instr = manager.getInputStream(addr); ObjectInputStream inobj = new ObjectInputStream(instr); final String tst = (String) inobj.readObject(); assertTrue(hw.equals(tst)); // confirm that the stream address can be freed manager.free(addr); assert manager.getSlotBytes() == 0; } public void testBlobStreams() throws IOException, ClassNotFoundException { IPSOutputStream out = manager.getOutputStream(); ObjectOutputStream outdat = new ObjectOutputStream(out); final String blobBit = "A bit of a blob..."; for (int i = 0; i < 40000; i++) outdat.writeObject(blobBit); outdat.close(); long addr = out.getAddr(); // save and retrieve the address InputStream instr = manager.getInputStream(addr); ObjectInputStream inobj = new ObjectInputStream(instr); for (int i = 0; i < 40000; i++) { try { final String tst = (String) inobj.readObject(); assertTrue(blobBit.equals(tst)); } catch (IOException ioe) { System.err.println("Problem at " + i); throw ioe; } } try { inobj.readObject(); fail("Expected EOFException"); } catch (EOFException eof) { // expected } catch (Exception ue) { fail("Expected EOFException not " + ue.getMessage()); } // confirm that the stream address can be freed manager.free(addr); assert manager.getSlotBytes() == 0; } public void testBlobStreamScale() throws IOException, ClassNotFoundException { final int largeBlob = 25 * 1024 * 1024; // requires blob of blobs final byte[] data = new byte[largeBlob]; r.nextBytes(data); { final IPSOutputStream out = manager.getOutputStream(); out.write(data); out.close(); long addr1 = out.getAddr(); InputStream instr = manager.getInputStream(addr1); instr.read(data); instr.close(); manager.free(addr1); } assert manager.getSlotBytes() == 0; } public void testBlobStreamBoundaries() throws IOException, ClassNotFoundException { int start = SectorAllocator.BLOB_SIZE-1; int end = SectorAllocator.BLOB_SIZE*4 + 1; final byte[] data = new byte[end]; r.nextBytes(data); for (int n = start; n < end; n++) { final IPSOutputStream out = manager.getOutputStream(); out.write(data, 0, n); out.close(); long addr1 = out.getAddr(); InputStream instr = manager.getInputStream(addr1); final byte[] indat = new byte[n]; instr.read(indat); instr.close(); manager.free(addr1); } assert manager.getSlotBytes() == 0; } public void testZipStreams() throws IOException, ClassNotFoundException { IPSOutputStream out = manager.getOutputStream(); ObjectOutputStream outdat = new ObjectOutputStream(new GZIPOutputStream(out)); final String blobBit = "A bit of a blob..."; for (int i = 0; i < 40000; i++) outdat.writeObject(blobBit); outdat.close(); long addr = out.getAddr(); // save and retrieve the address InputStream instr = manager.getInputStream(addr); ObjectInputStream inobj = new ObjectInputStream(new GZIPInputStream(instr)); for (int i = 0; i < 40000; i++) { try { final String tst = (String) inobj.readObject(); assertTrue(blobBit.equals(tst)); } catch (IOException ioe) { System.err.println("Problem at " + i); throw ioe; } } manager.free(addr); assert manager.getSlotBytes() == 0; } }