blob: 13aa6a9f71c8c120d4d470f861b97581bdb855fa [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.gemfire.cache.hdfs.internal.hoplog;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import org.junit.experimental.categories.Category;
import com.gemstone.gemfire.cache.hdfs.internal.PersistedEventImpl;
import com.gemstone.gemfire.cache.hdfs.internal.SortedHoplogPersistedEvent;
import com.gemstone.gemfire.internal.cache.persistence.soplog.TrackedReference;
import com.gemstone.gemfire.internal.util.BlobHelper;
import com.gemstone.gemfire.test.junit.categories.HoplogTest;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest
;
@Category({IntegrationTest.class, HoplogTest.class})
public class SortedOplogListIterJUnitTest extends BaseHoplogTestCase {
public void testOneIterOneKey() throws Exception {
HdfsSortedOplogOrganizer organizer = new HdfsSortedOplogOrganizer(regionManager, 0);
ArrayList<TestEvent> items = new ArrayList<TestEvent>();
items.add(new TestEvent(("0"), ("0")));
organizer.flush(items.iterator(), items.size());
List<TrackedReference<Hoplog>> oplogs = organizer.getSortedOplogs();
HoplogSetIterator iter = new HoplogSetIterator(oplogs);
assertTrue(iter.hasNext());
int count = 0;
for (ByteBuffer keyBB = null; iter.hasNext();) {
keyBB = iter.next();
byte[] key = HFileSortedOplog.byteBufferToArray(keyBB);
assertEquals(String.valueOf(count), BlobHelper.deserializeBlob(key));
count++;
}
assertEquals(1, count);
organizer.close();
}
public void testOneIterDuplicateKey() throws Exception {
HdfsSortedOplogOrganizer organizer = new HdfsSortedOplogOrganizer(regionManager, 0);
ArrayList<TestEvent> items = new ArrayList<TestEvent>();
items.add(new TestEvent(("0"), ("V2")));
items.add(new TestEvent(("0"), ("V1")));
items.add(new TestEvent(("1"), ("V2")));
items.add(new TestEvent(("1"), ("V1")));
organizer.flush(items.iterator(), items.size());
List<TrackedReference<Hoplog>> oplogs = organizer.getSortedOplogs();
HoplogSetIterator iter = new HoplogSetIterator(oplogs);
assertTrue(iter.hasNext());
int count = 0;
for (ByteBuffer keyBB = null; iter.hasNext();) {
keyBB = iter.next();
byte[] key = HFileSortedOplog.byteBufferToArray(keyBB);
byte[] value = HFileSortedOplog.byteBufferToArray(iter.getValue());
assertEquals(String.valueOf(count), BlobHelper.deserializeBlob(key));
assertEquals("V2", ((PersistedEventImpl) SortedHoplogPersistedEvent.fromBytes(value)).getValue());
count++;
}
assertEquals(2, count);
organizer.close();
}
public void testTwoIterSameKey() throws Exception {
HdfsSortedOplogOrganizer organizer = new HdfsSortedOplogOrganizer(regionManager, 0);
ArrayList<TestEvent> items = new ArrayList<TestEvent>();
items.add(new TestEvent(("0"), ("V1")));
organizer.flush(items.iterator(), items.size());
items.clear();
items.add(new TestEvent(("0"), ("V2")));
organizer.flush(items.iterator(), items.size());
List<TrackedReference<Hoplog>> oplogs = organizer.getSortedOplogs();
HoplogSetIterator iter = new HoplogSetIterator(oplogs);
assertTrue(iter.hasNext());
int count = 0;
for (ByteBuffer keyBB = null; iter.hasNext();) {
keyBB = iter.next();
byte[] key = HFileSortedOplog.byteBufferToArray(keyBB);
byte[] value = HFileSortedOplog.byteBufferToArray(iter.getValue());
assertEquals(String.valueOf(count), BlobHelper.deserializeBlob(key));
assertEquals("V2", ((PersistedEventImpl) SortedHoplogPersistedEvent.fromBytes(value)).getValue());
count++;
}
assertEquals(1, count);
organizer.close();
}
public void testTwoIterDiffKey() throws Exception {
HdfsSortedOplogOrganizer organizer = new HdfsSortedOplogOrganizer(regionManager, 0);
ArrayList<TestEvent> items = new ArrayList<TestEvent>();
items.add(new TestEvent(("0"), ("V1")));
organizer.flush(items.iterator(), items.size());
items.clear();
items.add(new TestEvent(("1"), ("V1")));
organizer.flush(items.iterator(), items.size());
List<TrackedReference<Hoplog>> oplogs = organizer.getSortedOplogs();
HoplogSetIterator iter = new HoplogSetIterator(oplogs);
assertTrue(iter.hasNext());
int count = 0;
for (ByteBuffer keyBB = null; iter.hasNext();) {
keyBB = iter.next();
byte[] key = HFileSortedOplog.byteBufferToArray(keyBB);
byte[] value = HFileSortedOplog.byteBufferToArray(iter.getValue());
assertEquals(String.valueOf(count), BlobHelper.deserializeBlob(key));
assertEquals("V1", ((PersistedEventImpl) SortedHoplogPersistedEvent.fromBytes(value)).getValue());
count++;
}
assertEquals(2, count);
organizer.close();
}
public void testMergedIterator() throws Exception {
HdfsSortedOplogOrganizer organizer = new HdfsSortedOplogOrganizer(regionManager, 0);
// #1
ArrayList<TestEvent> items = new ArrayList<TestEvent>();
items.add(new TestEvent(("1"), ("1")));
items.add(new TestEvent(("2"), ("1")));
items.add(new TestEvent(("3"), ("1")));
items.add(new TestEvent(("4"), ("1")));
organizer.flush(items.iterator(), items.size());
// #2
items.clear();
items.add(new TestEvent(("2"), ("1")));
items.add(new TestEvent(("4"), ("1")));
items.add(new TestEvent(("6"), ("1")));
items.add(new TestEvent(("8"), ("1")));
organizer.flush(items.iterator(), items.size());
// #3
items.clear();
items.add(new TestEvent(("1"), ("1")));
items.add(new TestEvent(("3"), ("1")));
items.add(new TestEvent(("5"), ("1")));
items.add(new TestEvent(("7"), ("1")));
items.add(new TestEvent(("9"), ("1")));
organizer.flush(items.iterator(), items.size());
// #4
items.clear();
items.add(new TestEvent(("0"), ("1")));
items.add(new TestEvent(("1"), ("1")));
items.add(new TestEvent(("4"), ("1")));
items.add(new TestEvent(("5"), ("1")));
organizer.flush(items.iterator(), items.size());
List<TrackedReference<Hoplog>> oplogs = organizer.getSortedOplogs();
HoplogSetIterator iter = new HoplogSetIterator(oplogs);
// the iteration pattern for this test should be 0-9:
// 0 1 4 5 oplog #4
// 1 3 5 7 9 oplog #3
// 2 4 6 8 oplog #2
// 1 2 3 4 oplog #1
int count = 0;
for (ByteBuffer keyBB = null; iter.hasNext();) {
keyBB = iter.next();
byte[] key = HFileSortedOplog.byteBufferToArray(keyBB);
assertEquals(String.valueOf(count), BlobHelper.deserializeBlob(key));
count++;
}
assertEquals(10, count);
organizer.close();
}
}