package org.infinispan.metadata;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import java.util.concurrent.TimeUnit;
import org.infinispan.container.entries.AbstractInternalCacheEntry;
import org.infinispan.container.entries.InternalCacheValue;
import org.infinispan.container.versioning.EntryVersion;
import org.infinispan.metadata.impl.InternalMetadataImpl;
import org.testng.annotations.Test;
/**
* Tests the InternalMetadataImpl to check if it will not create a chain of InternalMetadataImpl
*
* @author Pedro Ruivo
* @since 6.0
*/
@Test(groups = "unit", testName = "metadata.InternalMetadataTest")
public class InternalMetadataTest {
public void testWithMetadata() {
TestMetadata metadata = new TestMetadata(1, 2);
InternalMetadataImpl internalMetadata = new InternalMetadataImpl(metadata, 3, 4);
assertInternalMetadataValues(internalMetadata, 1, 2, 3, 4);
assertInternalMetadataActual(internalMetadata);
InternalMetadataImpl internalMetadata2 = new InternalMetadataImpl(internalMetadata, 5, 6);
assertInternalMetadataValues(internalMetadata2, 1, 2, 5, 6);
assertInternalMetadataActual(internalMetadata2);
}
public void testWithInternalCacheEntry() {
TestMetadata metadata = new TestMetadata(1, 2);
InternalMetadataImpl internalMetadata = new InternalMetadataImpl(metadata, 3, 4);
assertInternalMetadataValues(internalMetadata, 1, 2, 3, 4);
assertInternalMetadataActual(internalMetadata);
TestInternalCacheEntry cacheEntry = new TestInternalCacheEntry(internalMetadata, 5, 6);
InternalMetadataImpl internalMetadata2 = new InternalMetadataImpl(cacheEntry);
assertInternalMetadataValues(internalMetadata2, 1, 2, 5, 6);
assertInternalMetadataActual(internalMetadata2);
}
public void testWithInternalCacheEntry2() {
TestMetadata metadata = new TestMetadata(1, 2);
TestInternalCacheEntry cacheEntry = new TestInternalCacheEntry(metadata, 3, 4);
InternalMetadataImpl internalMetadata = new InternalMetadataImpl(cacheEntry);
assertInternalMetadataValues(internalMetadata, 1, 2, 3, 4);
assertInternalMetadataActual(internalMetadata);
}
private void assertInternalMetadataActual(InternalMetadataImpl metadata) {
assertFalse("'actual' field must not be an InternalMetadataImpl", metadata.actual() instanceof InternalMetadataImpl);
}
private void assertInternalMetadataValues(InternalMetadata metadata, long lifespan, long maxIdle, long created,
long lastUsed) {
assertEquals("Wrong lifespan value.", lifespan, metadata.lifespan());
assertEquals("Wrong maxIdle value.", maxIdle, metadata.maxIdle());
assertEquals("Wrong created value.", created, metadata.created());
assertEquals("Wrong lastUsed value.", lastUsed, metadata.lastUsed());
}
private class TestMetadata implements Metadata, Metadata.Builder {
private final long lifespan;
private final long maxIdle;
private TestMetadata(long lifespan, long maxIdle) {
this.lifespan = lifespan;
this.maxIdle = maxIdle;
}
@Override
public long lifespan() {
return lifespan;
}
@Override
public long maxIdle() {
return maxIdle;
}
@Override
public EntryVersion version() {
return null; // ignore
}
@Override
public Builder builder() {
return this; // ignore
}
@Override
public Builder lifespan(long time, TimeUnit unit) {
return new TestMetadata(unit.toMillis(time), maxIdle);
}
@Override
public Builder lifespan(long time) {
return lifespan(time, TimeUnit.MILLISECONDS);
}
@Override
public Builder maxIdle(long time, TimeUnit unit) {
return new TestMetadata(lifespan, unit.toMillis(time));
}
@Override
public Builder maxIdle(long time) {
return maxIdle(time, TimeUnit.MILLISECONDS);
}
@Override
public Builder version(EntryVersion version) {
return this;
}
@Override
public Metadata build() {
return this;
}
@Override
public Builder merge(Metadata metadata) {
return this;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TestMetadata that = (TestMetadata) o;
return lifespan == that.lifespan && maxIdle == that.maxIdle;
}
@Override
public int hashCode() {
int result = (int) (lifespan ^ (lifespan >>> 32));
result = 31 * result + (int) (maxIdle ^ (maxIdle >>> 32));
return result;
}
@Override
public String toString() {
return "TestMetadata{" +
"lifespan=" + lifespan +
", maxIdle=" + maxIdle +
'}';
}
}
//Dummy class
private class TestInternalCacheEntry extends AbstractInternalCacheEntry {
private final Metadata metadata;
private final long created;
private final long lastUsed;
private TestInternalCacheEntry(Metadata metadata, long created, long lastUsed) {
super(null);
this.metadata = metadata;
this.created = created;
this.lastUsed = lastUsed;
}
@Override
public boolean isExpired(long now) {
return false;
}
@Override
public boolean isExpired() {
return false;
}
@Override
public boolean canExpire() {
return false;
}
@Override
public long getCreated() {
return created;
}
@Override
public long getLastUsed() {
return lastUsed;
}
@Override
public long getExpiryTime() {
return 0;
}
@Override
public void touch() {
}
@Override
public void touch(long currentTimeMillis) {
}
@Override
public void reincarnate() {
}
@Override
public void reincarnate(long now) {
}
@Override
public InternalCacheValue toInternalCacheValue() {
return null;
}
@Override
public Object getValue() {
return null;
}
@Override
public long getLifespan() {
return metadata.lifespan();
}
@Override
public long getMaxIdle() {
return metadata.maxIdle();
}
@Override
public Object setValue(Object value) {
return null;
}
@Override
public Metadata getMetadata() {
return metadata;
}
}
}