package rocks.inspectit.server.cache.impl;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.mockito.Mockito.mock;
import org.slf4j.Logger;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import rocks.inspectit.server.test.AbstractTestNGLogSupport;
/**
* Testing the calculations inside of {@link BufferProperties} class.
*
* @author Ivan Senic
*
*/
@SuppressWarnings("PMD")
public class BufferPropertiesTest extends AbstractTestNGLogSupport {
/**
* Buffer properties to test.
*/
private BufferProperties bufferProperties;
/**
* Initialization of the buffer properties.
*
* @throws Exception
* if an exception is thrown while executing the post construct method in the buffer
* properties.
*/
@BeforeClass
public void init() throws Exception {
bufferProperties = new BufferProperties();
bufferProperties.log = mock(Logger.class);
bufferProperties.bytesMaintenancePercentage = 0.2f;
bufferProperties.evictionFragmentSizePercentage = 0.1f;
bufferProperties.evictionOccupancyPercentage = 0.8f;
bufferProperties.indexingTreeCleaningThreads = 1;
bufferProperties.indexingWaitTime = 500l;
bufferProperties.maxObjectExpansionRate = 0.05f;
bufferProperties.maxObjectExpansionRateActiveTillBufferSize = 10;
bufferProperties.maxObjectExpansionRateActiveFromOccupancy = 0.75f;
bufferProperties.maxOldSpaceOccupancy = 0.9f;
bufferProperties.maxOldSpaceOccupancyActiveFromOldGenSize = 1024 * 1024 * 100;
bufferProperties.minObjectExpansionRate = 0.02f;
bufferProperties.minObjectExpansionRateActiveFromBufferSize = 100;
bufferProperties.minObjectExpansionRateActiveTillOccupancy = 0.35f;
bufferProperties.minOldSpaceOccupancy = 0.2f;
bufferProperties.minOldSpaceOccupancyActiveTillOldGenSize = 1024 * 1024 * 200;
bufferProperties.postConstruct();
}
/**
* General Parameterized test to assure that no matter how big buffer size is, expansion rate
* will be between min and max related.
*
* @param bufferSize
* Buffer size.
*/
@Test(dataProvider = "Buffer-Size-Provider")
public void parametrizedExpansionRateTest(long bufferSize) {
float expansionRate = bufferProperties.getObjectSecurityExpansionRate(bufferSize);
assertThat(expansionRate, is(lessThanOrEqualTo(bufferProperties.getMaxObjectExpansionRate())));
assertThat(expansionRate, is(greaterThanOrEqualTo(bufferProperties.getMinObjectExpansionRate())));
float relatedToSize = bufferProperties.getObjectSecurityExpansionRateBufferSize(bufferSize);
float relatedToOccupancy = bufferProperties.getObjectSecurityExpansionRateBufferOccupancy(bufferSize, bufferProperties.getOldGenMax());
assertThat(expansionRate, is(equalTo((relatedToSize + relatedToOccupancy) / 2)));
}
/**
* Parameterized test to assure that no matter how big buffer size is, expansion rate will be
* between min and max related to buffers size.
*
* @param bufferSize
* Buffer size.
*/
@Test(dataProvider = "Buffer-Size-Provider")
public void parametrizedExpansionRateTestBufferSize(long bufferSize) {
float expansionRate = bufferProperties.getObjectSecurityExpansionRateBufferSize(bufferSize);
assertThat(expansionRate, is(lessThanOrEqualTo(bufferProperties.getMaxObjectExpansionRate())));
assertThat(expansionRate, is(greaterThanOrEqualTo(bufferProperties.getMinObjectExpansionRate())));
if ((bufferSize > bufferProperties.getMaxObjectExpansionRateActiveTillBufferSize()) && (bufferSize < bufferProperties.getMinObjectExpansionRateActiveFromBufferSize())) {
assertThat(expansionRate, is(lessThan(bufferProperties.getMaxObjectExpansionRate())));
assertThat(expansionRate, is(greaterThan(bufferProperties.getMinObjectExpansionRate())));
}
}
/**
* Parameterized test to assure that no matter how big buffer size is, expansion rate will be
* between min and max related to buffer occupancy.
*
* @param bufferSize
* Buffer size.
*/
@Test(dataProvider = "Buffer-Size-Provider")
public void parametrizedExpansionRateTestBufferOccupancy(long bufferSize) {
float expansionRate = bufferProperties.getObjectSecurityExpansionRateBufferOccupancy(bufferSize, bufferProperties.getOldGenMax());
assertThat(expansionRate, is(lessThanOrEqualTo(bufferProperties.getMaxObjectExpansionRate())));
assertThat(expansionRate, is(greaterThanOrEqualTo(bufferProperties.getMinObjectExpansionRate())));
long maxOldGen = bufferProperties.getOldGenMax();
float occupancy = bufferSize / maxOldGen;
if ((occupancy > bufferProperties.getMinObjectExpansionRateActiveTillOccupancy()) && (occupancy < bufferProperties.getMaxObjectExpansionRateActiveFromOccupancy())) {
assertThat(expansionRate, is(lessThan(bufferProperties.getMaxObjectExpansionRate())));
assertThat(expansionRate, is(greaterThan(bufferProperties.getMinObjectExpansionRate())));
}
}
/**
* Single expansion rate test for buffer size.
*/
@Test
public void singleExpansionRateTestBufferSize() {
long bufferSize = bufferProperties.getMaxObjectExpansionRateActiveTillBufferSize()
+ ((bufferProperties.getMinObjectExpansionRateActiveFromBufferSize() - bufferProperties.getMaxObjectExpansionRateActiveTillBufferSize()) / 2);
float expansionRate = bufferProperties.getObjectSecurityExpansionRateBufferSize(bufferSize);
float expectedRate = bufferProperties.getMinObjectExpansionRate() + ((bufferProperties.getMaxObjectExpansionRate() - bufferProperties.getMinObjectExpansionRate()) / 2);
assertThat(expansionRate, is(equalTo(expectedRate)));
}
/**
* Single expansion rate test for buffer occupancy.
*/
@Test
public void singleExpansionRateTestBufferOccupancy() {
long oldGenMax = 100;
long bufferSize = (long) (oldGenMax * (bufferProperties.maxObjectExpansionRateActiveFromOccupancy
- ((bufferProperties.getMaxObjectExpansionRateActiveFromOccupancy() - bufferProperties.getMinObjectExpansionRateActiveTillOccupancy()) / 2)));
float expansionRate = bufferProperties.getObjectSecurityExpansionRateBufferOccupancy(bufferSize, oldGenMax);
float expectedRate = bufferProperties.getMinObjectExpansionRate() + ((bufferProperties.getMaxObjectExpansionRate() - bufferProperties.getMinObjectExpansionRate()) / 2);
assertThat(expansionRate, is(equalTo(expectedRate)));
}
/**
* Parameters generation for {@link #parametrizedExpansionRateTest(long)}.
*
* @return Buffer size.
*/
@DataProvider(name = "Buffer-Size-Provider")
public Object[][] bufferSizeParameterProvider() {
int size = 50;
Object[][] parameters = new Object[size][1];
for (int i = 0; i < size; i++) {
parameters[i][0] = getRandomLong(2000000000L);
}
return parameters;
}
/**
* Returns random positive long number smaller than given max value.
*
* @param max
* Max value.
* @return Long.
*/
private long getRandomLong(long max) {
long value = (long) (Math.random() * max);
return (value - (value % 10)) + 10;
}
}