/*
* Copyright 2014-2016 CyberVision, Inc.
*
* 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.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kaaproject.kaa.client.logging;
import org.junit.Assert;
import org.junit.Test;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public abstract class AbstractLogStorageTest {
private void testAddHelper(int addedN, int bucketSize, int recordCount, int expectedN) {
LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount);
List<LogRecord> expectedList = new LinkedList<>();
LogRecord record = new LogRecord();
while (addedN-- > 0) {
storage.addLogRecord(record);
}
while (expectedN-- > 0) {
expectedList.add(record);
}
LogBucket group = storage.getNextBucket();
List<LogRecord> actualList = group.getRecords();
Assert.assertTrue("Expected: " + expectedList.size() + ", actual: " + actualList.size()
, expectedList.size() == actualList.size());
Iterator<LogRecord> expectedIt = expectedList.iterator();
Iterator<LogRecord> actualIt = actualList.iterator();
while (expectedIt.hasNext()) {
LogRecord expected = expectedIt.next();
LogRecord actual = actualIt.next();
Assert.assertTrue(expected.getSize() == actual.getSize());
Assert.assertArrayEquals(expected.getData(), actual.getData());
}
storage.close();
}
@Test
public void testEmptyLogRecord() {
long bucketSize = 3;
int recordCount = 3;
LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount);
LogBucket group = storage.getNextBucket();
Assert.assertTrue(group == null);
storage.close();
}
@Test
public void testRecordCountAndConsumedBytes() {
long bucketSize = 3;
int recordCount = 3;
LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount);
LogRecord record = new LogRecord();
int insertionCount = 3;
/*
* Size of each record is 3B
*/
int iter = insertionCount;
while (iter-- > 0) {
storage.addLogRecord(record);
}
Assert.assertTrue(storage.getStatus().getRecordCount() == insertionCount);
Assert.assertTrue(storage.getStatus().getConsumedVolume() == (insertionCount * record.getSize()));
storage.close();
}
@Test
public void testUniqueIdGeneration() {
long bucketSize = 3;
int recordCount = 3;
LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount);
LogRecord record = new LogRecord();
int insertionCount = 3;
/*
* Size of each record is 3B
*/
int iter = insertionCount;
while (iter-- > 0) {
storage.addLogRecord(record);
}
LogBucket group1 = storage.getNextBucket();
LogBucket group2 = storage.getNextBucket();
Assert.assertNotEquals(group1.getBucketId(), group2.getBucketId());
storage.close();
}
@Test
public void testLogRecordAdding() {
/*
* Size of each record is 3B
*/
testAddHelper(1, 3, 1, 1);
testAddHelper(4, 3, 2, 1);
testAddHelper(3, 9, 4, 3);
testAddHelper(5, 5, 2, 1);
}
@Test
public void testGetSameLogBlock() {
long bucketSize = 3;
int recordCount = 3;
LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount);
LogRecord record = new LogRecord();
int insertionCount = 3;
/*
* Size of each record is 3B
*/
int iter = insertionCount;
while (iter-- > 0) {
storage.addLogRecord(record);
}
LogBucket group1 = storage.getNextBucket();
storage.rollbackBucket(group1.getBucketId());
LogBucket group2 = storage.getNextBucket();
Assert.assertTrue("Expected: " + group1.getRecords().size() + ", actual: " + group2.getRecords().size()
, group1.getRecords().size() == group2.getRecords().size());
Iterator<LogRecord> expectedIt = group1.getRecords().iterator();
Iterator<LogRecord> actualIt = group2.getRecords().iterator();
while (expectedIt.hasNext()) {
LogRecord expected = expectedIt.next();
LogRecord actual = actualIt.next();
Assert.assertTrue(expected.getSize() == actual.getSize());
Assert.assertArrayEquals(expected.getData(), actual.getData());
}
storage.close();
}
@Test
public void testLogRecordRemoval() {
long bucketSize = 9;
int recordCount = 3;
LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount);
LogRecord record = new LogRecord();
int insertionCount = 7;
/*
* Size of each record is 3B
*/
int iter = insertionCount;
while (iter-- > 0) {
storage.addLogRecord(record);
}
LogBucket removingBlock = storage.getNextBucket();
insertionCount -= removingBlock.getRecords().size();
storage.removeBucket(removingBlock.getBucketId());
removingBlock = storage.getNextBucket();
insertionCount -= removingBlock.getRecords().size();
storage.removeBucket(removingBlock.getBucketId());
LogBucket leftBlock = storage.getNextBucket();
Assert.assertTrue(leftBlock.getRecords().size() == insertionCount);
storage.close();
}
@Test
public void testComplexLogRemoval() {
long bucketSize = 9;
int recordCount = 3;
LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount);
LogRecord record = new LogRecord();
int insertionCount = 8;
/*
* Size of each record is 3B
*/
int iter = insertionCount;
while (iter-- > 0) {
storage.addLogRecord(record);
}
LogBucket removingBlock1 = storage.getNextBucket();
insertionCount -= removingBlock1.getRecords().size();
LogBucket removingBlock2 = storage.getNextBucket();
insertionCount -= removingBlock2.getRecords().size();
LogBucket removingBlock3 = storage.getNextBucket();
insertionCount -= removingBlock3.getRecords().size();
storage.removeBucket(removingBlock2.getBucketId());
storage.rollbackBucket(removingBlock1.getBucketId());
insertionCount += removingBlock1.getRecords().size();
LogBucket leftBlock1 = storage.getNextBucket();
LogBucket leftBlock2 = storage.getNextBucket();
int leftSize = leftBlock1.getRecords().size();
if (leftBlock2 != null) {
leftSize += leftBlock2.getRecords().size();
}
Assert.assertTrue("Ac: " + leftSize + ", ex: " + insertionCount
, leftSize == insertionCount);
storage.close();
}
@Test
public void testLogStoreCountAndVolume() {
long bucketSize = 9;
int recordCount = 3;
LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount);
LogRecord record = new LogRecord();
int insertionCount = 9;
int receivedCount = 0;
/*
* Size of each record is 3B
*/
int iter = insertionCount;
while (iter-- > 0) {
storage.addLogRecord(record);
}
LogBucket logBlock = storage.getNextBucket();
receivedCount = addIfNotEmpty(receivedCount, logBlock);
Assert.assertEquals(insertionCount - receivedCount, storage.getStatus().getRecordCount());
Assert.assertEquals((insertionCount - receivedCount) * 3, storage.getStatus().getConsumedVolume());
logBlock = storage.getNextBucket();
receivedCount = addIfNotEmpty(receivedCount, logBlock);
Assert.assertEquals(insertionCount - receivedCount, storage.getStatus().getRecordCount());
Assert.assertEquals((insertionCount - receivedCount) * 3, storage.getStatus().getConsumedVolume());
logBlock = storage.getNextBucket();
receivedCount = addIfNotEmpty(receivedCount, logBlock);
Assert.assertEquals(insertionCount - receivedCount, storage.getStatus().getRecordCount());
Assert.assertEquals((insertionCount - receivedCount) * 3, storage.getStatus().getConsumedVolume());
storage.rollbackBucket(logBlock.getBucketId());
receivedCount -= logBlock.getRecords().size();
Assert.assertEquals(insertionCount - receivedCount, storage.getStatus().getRecordCount());
Assert.assertEquals((insertionCount - receivedCount) * 3, storage.getStatus().getConsumedVolume());
storage.close();
}
private int addIfNotEmpty(int count, LogBucket logBlock) {
if (logBlock != null && logBlock.getRecords().size() > 0) {
count += logBlock.getRecords().size();
}
return count;
}
protected abstract Object getStorage(long bucketSize, int recordCount);
}