package org.redisson;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Test;
import org.redisson.api.RMapCacheReactive;
import org.redisson.api.RMapReactive;
import org.redisson.codec.MsgPackJacksonCodec;
public class RedissonMapCacheReactiveTest extends BaseReactiveTest {
public static class SimpleKey implements Serializable {
private String key;
public SimpleKey() {
}
public SimpleKey(String field) {
this.key = field;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
@Override
public String toString() {
return "key: " + key;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SimpleKey other = (SimpleKey) obj;
if (key == null) {
if (other.key != null)
return false;
} else if (!key.equals(other.key))
return false;
return true;
}
}
public static class SimpleValue implements Serializable {
private String value;
public SimpleValue() {
}
public SimpleValue(String field) {
this.value = field;
}
public void setValue(String field) {
this.value = field;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return "value: " + value;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SimpleValue other = (SimpleValue) obj;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
}
@Test
public void testGetAll() throws InterruptedException {
RMapCacheReactive<Integer, Integer> map = redisson.getMapCache("getAll");
sync(map.put(1, 100));
sync(map.put(2, 200, 1, TimeUnit.SECONDS));
sync(map.put(3, 300, 1, TimeUnit.SECONDS));
sync(map.put(4, 400));
Map<Integer, Integer> filtered = sync(map.getAll(new HashSet<Integer>(Arrays.asList(2, 3, 5))));
Map<Integer, Integer> expectedMap = new HashMap<Integer, Integer>();
expectedMap.put(2, 200);
expectedMap.put(3, 300);
Assert.assertEquals(expectedMap, filtered);
Thread.sleep(1000);
Map<Integer, Integer> filteredAgain = sync(map.getAll(new HashSet<Integer>(Arrays.asList(2, 3, 5))));
Assert.assertTrue(filteredAgain.isEmpty());
}
@Test
public void testGetAllWithStringKeys() {
RMapCacheReactive<String, Integer> map = redisson.getMapCache("getAllStrings");
sync(map.put("A", 100));
sync(map.put("B", 200));
sync(map.put("C", 300));
sync(map.put("D", 400));
Map<String, Integer> filtered = sync(map.getAll(new HashSet<String>(Arrays.asList("B", "C", "E"))));
Map<String, Integer> expectedMap = new HashMap<String, Integer>();
expectedMap.put("B", 200);
expectedMap.put("C", 300);
Assert.assertEquals(expectedMap, filtered);
}
@Test
public void testExpiredIterator() throws InterruptedException {
RMapCacheReactive<String, String> cache = redisson.getMapCache("simple");
sync(cache.put("0", "8"));
sync(cache.put("1", "6", 1, TimeUnit.SECONDS));
sync(cache.put("2", "4", 3, TimeUnit.SECONDS));
sync(cache.put("3", "2", 4, TimeUnit.SECONDS));
sync(cache.put("4", "4", 1, TimeUnit.SECONDS));
Thread.sleep(1000);
assertThat(toIterator(cache.keyIterator())).containsOnly("0", "2", "3");
}
@Test
public void testExpire() throws InterruptedException {
RMapCacheReactive<String, String> cache = redisson.getMapCache("simple");
sync(cache.put("0", "8", 1, TimeUnit.SECONDS));
sync(cache.expire(100, TimeUnit.MILLISECONDS));
Thread.sleep(500);
Assert.assertEquals(0, sync(cache.size()).intValue());
}
@Test
public void testExpireAt() throws InterruptedException {
RMapCacheReactive<String, String> cache = redisson.getMapCache("simple");
sync(cache.put("0", "8", 1, TimeUnit.SECONDS));
sync(cache.expireAt(System.currentTimeMillis() + 100));
Thread.sleep(500);
Assert.assertEquals(0, sync(cache.size()).intValue());
}
@Test
public void testClearExpire() throws InterruptedException {
RMapCacheReactive<String, String> cache = redisson.getMapCache("simple");
sync(cache.put("0", "8", 1, TimeUnit.SECONDS));
sync(cache.expireAt(System.currentTimeMillis() + 100));
sync(cache.clearExpire());
Thread.sleep(500);
Assert.assertEquals(1, sync(cache.size()).intValue());
}
@Test
public void testRemove() {
RMapCacheReactive<SimpleKey, SimpleValue> map = redisson.getMapCache("simple");
sync(map.put(new SimpleKey("1"), new SimpleValue("2")));
sync(map.put(new SimpleKey("33"), new SimpleValue("44")));
sync(map.put(new SimpleKey("5"), new SimpleValue("6")));
sync(map.remove(new SimpleKey("33")));
sync(map.remove(new SimpleKey("5")));
Assert.assertEquals(1, sync(map.size()).intValue());
}
@Test
public void testPutAll() {
RMapCacheReactive<Integer, String> map = redisson.getMapCache("simple");
sync(map.put(1, "1"));
sync(map.put(2, "2"));
sync(map.put(3, "3"));
Map<Integer, String> joinMap = new HashMap<Integer, String>();
joinMap.put(4, "4");
joinMap.put(5, "5");
joinMap.put(6, "6");
sync(map.putAll(joinMap));
assertThat(toIterable(map.keyIterator())).containsOnly(1, 2, 3, 4, 5, 6);
}
@Test
public void testContainsValue() throws InterruptedException {
RMapCacheReactive<SimpleKey, SimpleValue> map = redisson.getMapCache("simple31", new MsgPackJacksonCodec());
Assert.assertFalse(sync(map.containsValue(new SimpleValue("34"))));
sync(map.put(new SimpleKey("33"), new SimpleValue("44"), 1, TimeUnit.SECONDS));
Assert.assertTrue(sync(map.containsValue(new SimpleValue("44"))));
Assert.assertFalse(sync(map.containsValue(new SimpleValue("34"))));
Thread.sleep(1000);
Assert.assertFalse(sync(map.containsValue(new SimpleValue("44"))));
}
@Test
public void testContainsKey() throws InterruptedException {
RMapCacheReactive<SimpleKey, SimpleValue> map = redisson.getMapCache("simple");
sync(map.put(new SimpleKey("33"), new SimpleValue("44"), 1, TimeUnit.SECONDS));
Assert.assertTrue(sync(map.containsKey(new SimpleKey("33"))));
Assert.assertFalse(sync(map.containsKey(new SimpleKey("34"))));
Thread.sleep(1000);
Assert.assertFalse(sync(map.containsKey(new SimpleKey("33"))));
}
@Test
public void testRemoveValue() {
RMapCacheReactive<SimpleKey, SimpleValue> map = redisson.getMapCache("simple");
sync(map.put(new SimpleKey("1"), new SimpleValue("2"), 1, TimeUnit.SECONDS));
boolean res = sync(map.remove(new SimpleKey("1"), new SimpleValue("2")));
Assert.assertTrue(res);
SimpleValue val1 = sync(map.get(new SimpleKey("1")));
Assert.assertNull(val1);
Assert.assertEquals(0, sync(map.size()).intValue());
}
@Test
public void testScheduler() throws InterruptedException {
RMapCacheReactive<SimpleKey, SimpleValue> map = redisson.getMapCache("simple", new MsgPackJacksonCodec());
Assert.assertNull(sync(map.get(new SimpleKey("33"))));
sync(map.put(new SimpleKey("33"), new SimpleValue("44"), 5, TimeUnit.SECONDS));
Thread.sleep(11000);
Assert.assertEquals(0, sync(map.size()).intValue());
}
@Test
public void testPutGet() throws InterruptedException {
RMapCacheReactive<SimpleKey, SimpleValue> map = redisson.getMapCache("simple01", new MsgPackJacksonCodec());
Assert.assertNull(sync(map.get(new SimpleKey("33"))));
sync(map.put(new SimpleKey("33"), new SimpleValue("44"), 2, TimeUnit.SECONDS));
SimpleValue val1 = sync(map.get(new SimpleKey("33")));
Assert.assertEquals("44", val1.getValue());
Thread.sleep(1000);
Assert.assertEquals(1, sync(map.size()).intValue());
SimpleValue val2 = sync(map.get(new SimpleKey("33")));
Assert.assertEquals("44", val2.getValue());
Assert.assertEquals(1, sync(map.size()).intValue());
Thread.sleep(1000);
Assert.assertNull(sync(map.get(new SimpleKey("33"))));
}
@Test
public void testPutIfAbsent() throws Exception {
RMapCacheReactive<SimpleKey, SimpleValue> map = redisson.getMapCache("simple");
SimpleKey key = new SimpleKey("1");
SimpleValue value = new SimpleValue("2");
sync(map.put(key, value));
Assert.assertEquals(value, sync(map.putIfAbsent(key, new SimpleValue("3"), 1, TimeUnit.SECONDS)));
Assert.assertEquals(value, sync(map.get(key)));
sync(map.putIfAbsent(new SimpleKey("4"), new SimpleValue("4"), 1, TimeUnit.SECONDS));
Assert.assertEquals(new SimpleValue("4"), sync(map.get(new SimpleKey("4"))));
Thread.sleep(1000);
Assert.assertNull(sync(map.get(new SimpleKey("4"))));
SimpleKey key1 = new SimpleKey("2");
SimpleValue value1 = new SimpleValue("4");
Assert.assertNull(sync(map.putIfAbsent(key1, value1, 2, TimeUnit.SECONDS)));
Assert.assertEquals(value1, sync(map.get(key1)));
}
@Test
public void testSize() {
RMapCacheReactive<SimpleKey, SimpleValue> map = redisson.getMapCache("simple");
sync(map.put(new SimpleKey("1"), new SimpleValue("2")));
sync(map.put(new SimpleKey("3"), new SimpleValue("4")));
sync(map.put(new SimpleKey("5"), new SimpleValue("6")));
Assert.assertEquals(3, sync(map.size()).intValue());
sync(map.put(new SimpleKey("1"), new SimpleValue("2")));
sync(map.put(new SimpleKey("3"), new SimpleValue("4")));
Assert.assertEquals(3, sync(map.size()).intValue());
sync(map.put(new SimpleKey("1"), new SimpleValue("21")));
sync(map.put(new SimpleKey("3"), new SimpleValue("41")));
Assert.assertEquals(3, sync(map.size()).intValue());
sync(map.put(new SimpleKey("51"), new SimpleValue("6")));
Assert.assertEquals(4, sync(map.size()).intValue());
sync(map.remove(new SimpleKey("3")));
Assert.assertEquals(3, sync(map.size()).intValue());
}
@Test
public void testEmptyRemove() {
RMapCacheReactive<Integer, Integer> map = redisson.getMapCache("simple");
assertThat(sync(map.remove(1, 3))).isEqualTo(Boolean.FALSE);
sync(map.put(4, 5));
assertThat(sync(map.remove(4, 5))).isEqualTo(Boolean.TRUE);
}
@Test
public void testKeyIterator() {
RMapReactive<Integer, Integer> map = redisson.getMapCache("simple");
sync(map.put(1, 0));
sync(map.put(3, 5));
sync(map.put(4, 6));
sync(map.put(7, 8));
List<Integer> keys = new ArrayList<Integer>(Arrays.asList(1, 3, 4, 7));
for (Iterator<Integer> iterator = toIterator(map.keyIterator()); iterator.hasNext();) {
Integer value = iterator.next();
if (!keys.remove(value)) {
Assert.fail();
}
}
Assert.assertEquals(0, keys.size());
}
@Test
public void testValueIterator() {
RMapReactive<Integer, Integer> map = redisson.getMapCache("simple");
sync(map.put(1, 0));
sync(map.put(3, 5));
sync(map.put(4, 6));
sync(map.put(7, 8));
List<Integer> values = new ArrayList<Integer>(Arrays.asList(0, 5, 6, 8));
for (Iterator<Integer> iterator = toIterator(map.valueIterator()); iterator.hasNext();) {
Integer value = iterator.next();
if (!values.remove(value)) {
Assert.fail();
}
}
Assert.assertEquals(0, values.size());
}
@Test
public void testEquals() {
RMapCacheReactive<String, String> map = redisson.getMapCache("simple");
sync(map.put("1", "7"));
sync(map.put("2", "4"));
sync(map.put("3", "5"));
Map<String, String> testMap = new HashMap<String, String>();
testMap.put("1", "7");
testMap.put("2", "4");
testMap.put("3", "5");
Assert.assertEquals(map, testMap);
Assert.assertEquals(testMap.hashCode(), map.hashCode());
}
}