package org.infinispan.container.offheap;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
import org.infinispan.commons.marshall.WrappedByteArray;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.container.DataContainer;
import org.infinispan.configuration.cache.StorageType;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "commands.OffHeapMultiNodeTest")
public class OffHeapMultiNodeTest extends MultipleCacheManagersTest {
protected int numberOfKeys = 10;
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder dcc = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true);
dcc.memory().storageType(StorageType.OFF_HEAP);
createCluster(dcc, 4);
waitForClusterToForm();
}
public void testPutMapCommand() {
Map<String, String> map = new HashMap<>();
for (int i = 0; i < numberOfKeys; ++i) {
map.put("key" + i, "value" + i);
}
cache(0).putAll(map);
for (int i = 0; i < numberOfKeys; ++i) {
assertEquals("value" + i, cache(0).get("key" + i));
}
}
public void testPutRemovePut() {
Map<byte[], byte[]> map = cache(0);
byte[] key = randomBytes(KEY_SIZE);
byte[] value = randomBytes(VALUE_SIZE);
byte[] value2 = randomBytes(VALUE_SIZE);
assertNull(map.put(key, value));
for (int i = 0; i < 50; ++i) {
map.put(randomBytes(KEY_SIZE), value);
}
assertEquals(value, map.remove(key));
assertNull(map.put(key, value));
assertEquals(value, map.remove(key));
assertNull(map.put(key, value2));
}
public void testOverwriteSameKey() {
Map<byte[], byte[]> map = cache(0);
byte[] key = randomBytes(KEY_SIZE);
byte[] value = randomBytes(VALUE_SIZE);
byte[] value2 = randomBytes(VALUE_SIZE);
byte[] value3 = randomBytes(VALUE_SIZE);
assertNull(map.put(key, value));
byte[] prev = map.put(key, value2);
assertTrue(Arrays.equals(prev, value));
assertTrue(Arrays.equals(value2, map.put(key, value3)));
assertTrue(Arrays.equals(value3, map.get(key)));
}
public void testClear() {
Map<String, String> map = cache(0);
int size = 10;
for (int i = 0; i < 10; ++i) {
map.put("key-" + i, "value-" + i);
}
assertEquals(size, map.size());
for (int i = 0; i < 10; ++i) {
assertEquals("value-" + i, map.get("key-" + i));
}
map.clear();
assertEquals(0, map.size());
for (int i = 0; i < 10; ++i) {
map.put("key-" + i, "value-" + i);
}
assertEquals(size, map.size());
}
public void testIterate() {
int cacheSize = 50;
Map<byte[], byte[]> original = new HashMap<>();
for (int i = 0; i < cacheSize; ++i) {
byte[] key = randomBytes(KEY_SIZE);
original.put(key, randomBytes(VALUE_SIZE));
}
Map<byte[], byte[]> map = cache(0);
map.putAll(original);
Iterator<Map.Entry<byte[], byte[]>> iterator = map.entrySet().iterator();
iterator.forEachRemaining(e -> assertEquals(e.getValue(), map.get(e.getKey())));
}
static DataContainer<WrappedByteArray, WrappedByteArray> castDC(Object obj) {
return (DataContainer<WrappedByteArray, WrappedByteArray>) obj;
}
final static int KEY_SIZE = 20;
final static int VALUE_SIZE = 1024;
byte[] randomBytes(int size) {
byte[] bytes = new byte[size];
ThreadLocalRandom.current().nextBytes(bytes);
return bytes;
}
}