package com.orientechnologies.orient.core.storage.impl.local.paginated.wal; import com.orientechnologies.common.directmemory.OByteBufferPool; import org.testng.Assert; import org.testng.annotations.Test; import java.nio.ByteBuffer; import java.util.Random; @Test public class WALChangesTreeTest { public void testOneAdd() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 10, 20, 30 }, 10); byte[] result = new byte[] { 0 }; tree.applyChanges(result, 12); Assert.assertEquals(new byte[] { 30 }, result); result = new byte[] { 0, 0 }; tree.applyChanges(result, 9); Assert.assertEquals(new byte[] { 0, 10 }, result); result = new byte[] { 0, 0, 0, 0, 0 }; tree.applyChanges(result, 9); Assert.assertEquals(result, new byte[] { 0, 10, 20, 30, 0 }); } public void testOneAddDM() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 10, 20, 30 }, 10); OByteBufferPool bufferPool = new OByteBufferPool(20); ByteBuffer buffer = bufferPool.acquireDirect(true); tree.applyChanges(buffer); Assert.assertEquals(getByteArray(buffer, 10, 3), new byte[] { 10, 20, 30 }); } public void testAddOverlappedVersions() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 35, 30 }, 11); tree.add(new byte[] { 10, 20 }, 10); byte[] result = new byte[] { 0, 0, 0 }; tree.applyChanges(result, 10); Assert.assertEquals(result, new byte[] { 10, 20, 30 }); } public void testAddOverlappedVersionsDM() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 35, 30 }, 11); tree.add(new byte[] { 10, 20 }, 10); OByteBufferPool bufferPool = new OByteBufferPool(20); ByteBuffer buffer = bufferPool.acquireDirect(true); tree.applyChanges(buffer); Assert.assertEquals(getByteArray(buffer, 10, 3), new byte[] { 10, 20, 30 }); } public void testAddOverlappedVersionsTwo() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 11, 12, 13 }, 1); tree.add(new byte[] { 33, 34, 35, }, 3); tree.add(new byte[] { 22, 23, 24, 25, 26 }, 2); byte[] result = new byte[] { 0, 0, 0, 0 }; tree.applyChanges(result, 2); Assert.assertEquals(result, new byte[] { 22, 23, 24, 25 }); } public void testAddOverlappedVersionsTwoDM() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 11, 12, 13 }, 1); tree.add(new byte[] { 33, 34, 35, }, 3); tree.add(new byte[] { 22, 23, 24, 25, 26 }, 2); OByteBufferPool bufferPool = new OByteBufferPool(20); ByteBuffer buffer = bufferPool.acquireDirect(true); tree.applyChanges(buffer); Assert.assertEquals(getByteArray(buffer, 1, 6), new byte[] { 11, 22, 23, 24, 25, 26 }); } public void testInsertCaseThree() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 10 }, 10); tree.add(new byte[] { 5 }, 5); tree.add(new byte[] { 15 }, 15); tree.add(new byte[] { 2 }, 2); byte[] result = new byte[] { 0 }; tree.applyChanges(result, 10); Assert.assertEquals(result, new byte[] { 10 }); tree.applyChanges(result, 5); Assert.assertEquals(result, new byte[] { 5 }); tree.applyChanges(result, 15); Assert.assertEquals(result, new byte[] { 15 }); tree.applyChanges(result, 2); Assert.assertEquals(result, new byte[] { 2 }); } public void testInsertCaseThreeDM() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 10 }, 10); tree.add(new byte[] { 5 }, 5); tree.add(new byte[] { 15 }, 15); tree.add(new byte[] { 2 }, 2); OByteBufferPool bufferPool = new OByteBufferPool(20); ByteBuffer buffer = bufferPool.acquireDirect(true); tree.applyChanges(buffer); Assert.assertEquals(getByteArray(buffer, 10, 1), new byte[] { 10 }); Assert.assertEquals(getByteArray(buffer, 5, 1), new byte[] { 5 }); Assert.assertEquals(getByteArray(buffer, 15, 1), new byte[] { 15 }); Assert.assertEquals(getByteArray(buffer, 2, 1), new byte[] { 2 }); } public void testInsertCase4and5() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 50 }, 50); tree.add(new byte[] { 60 }, 60); tree.add(new byte[] { 40 }, 40); tree.add(new byte[] { 30 }, 30); tree.add(new byte[] { 35 }, 35); byte[] result = new byte[] { 0 }; tree.applyChanges(result, 50); Assert.assertEquals(result, new byte[] { 50 }); tree.applyChanges(result, 60); Assert.assertEquals(result, new byte[] { 60 }); tree.applyChanges(result, 40); Assert.assertEquals(result, new byte[] { 40 }); tree.applyChanges(result, 30); Assert.assertEquals(result, new byte[] { 30 }); tree.applyChanges(result, 35); Assert.assertEquals(result, new byte[] { 35 }); } public void testInsertCase4and5DM() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); tree.add(new byte[] { 50 }, 50); tree.add(new byte[] { 60 }, 60); tree.add(new byte[] { 40 }, 40); tree.add(new byte[] { 30 }, 30); tree.add(new byte[] { 35 }, 35); OByteBufferPool bufferPool = new OByteBufferPool(80); ByteBuffer buffer = bufferPool.acquireDirect(true); tree.applyChanges(buffer); Assert.assertEquals(getByteArray(buffer, 50, 1), new byte[] { 50 }); Assert.assertEquals(getByteArray(buffer, 60, 1), new byte[] { 60 }); Assert.assertEquals(getByteArray(buffer, 40, 1), new byte[] { 40 }); Assert.assertEquals(getByteArray(buffer, 30, 1), new byte[] { 30 }); Assert.assertEquals(getByteArray(buffer, 35, 1), new byte[] { 35 }); } public void testInsertRandom() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); final byte[] data = new byte[30]; final long ts = System.currentTimeMillis(); System.out.println("TestInsertRandom seed : " + ts); final Random rnd = new Random(ts); for (int i = 0; i < 100; i++) { final int start = rnd.nextInt(data.length) - 3; final int length = rnd.nextInt(3) + 4; int cend = start + length; if (cend > data.length) cend = data.length; int cstart = start; if (cstart < 0) cstart = 0; byte[] value = new byte[cend - cstart]; rnd.nextBytes(value); System.arraycopy(value, 0, data, cstart, cend - cstart); tree.add(value, cstart); } byte[] result = new byte[30]; tree.applyChanges(result, 0); Assert.assertEquals(result, data); for (int i = -5; i < result.length; i++) { int start = i; int end = start + 5; if (start < 0) start = 0; if (end > data.length) end = data.length; result = new byte[end - start]; System.arraycopy(data, start, result, 0, end - start); byte[] cresult = new byte[result.length]; tree.applyChanges(cresult, start); Assert.assertEquals(cresult, result); } } public void testInsertRandomDM() { final OWALChangesTree tree = new OWALChangesTree(); tree.setDebug(true); final byte[] data = new byte[30]; final long ts = System.currentTimeMillis(); System.out.println("TestInsertRandomDM seed : " + ts); final Random rnd = new Random(ts); for (int i = 0; i < 100; i++) { final int start = rnd.nextInt(data.length) - 3; final int length = rnd.nextInt(3) + 4; int cend = start + length; if (cend > data.length) cend = data.length; int cstart = start; if (cstart < 0) cstart = 0; byte[] value = new byte[cend - cstart]; rnd.nextBytes(value); System.arraycopy(value, 0, data, cstart, cend - cstart); tree.add(value, cstart); } OByteBufferPool bufferPool = new OByteBufferPool(30); ByteBuffer buffer = bufferPool.acquireDirect(true); tree.applyChanges(buffer); Assert.assertEquals(getByteArray(buffer, 0, 30), data); } private byte[] getByteArray(ByteBuffer buffer, int position, int len) { final byte[] result = new byte[len]; buffer.position(position); buffer.get(result); return result; } }