/* * Copyright 2015-2017 the original author or authors. * * 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.springframework.data.redis.connection.jedis; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.collection.IsCollectionWithSize.*; import static org.hamcrest.collection.IsIterableContainingInOrder.*; import static org.hamcrest.core.Is.is; import static org.hamcrest.number.IsCloseTo.*; import static org.junit.Assert.*; import static org.springframework.data.redis.connection.ClusterTestVariables.*; import static org.springframework.data.redis.connection.RedisGeoCommands.DistanceUnit.*; import static org.springframework.data.redis.connection.RedisGeoCommands.GeoRadiusCommandArgs.*; import static org.springframework.data.redis.core.ScanOptions.*; import java.io.IOException; import java.nio.charset.Charset; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.springframework.dao.DataAccessException; import org.springframework.data.geo.Circle; import org.springframework.data.geo.Distance; import org.springframework.data.geo.GeoResults; import org.springframework.data.geo.Point; import org.springframework.data.redis.connection.ClusterConnectionTests; import org.springframework.data.redis.connection.ClusterSlotHashUtil; import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.connection.DefaultSortParameters; import org.springframework.data.redis.connection.DefaultTuple; import org.springframework.data.redis.connection.RedisClusterNode; import org.springframework.data.redis.connection.RedisGeoCommands.GeoLocation; import org.springframework.data.redis.connection.RedisListCommands.Position; import org.springframework.data.redis.connection.RedisNode; import org.springframework.data.redis.connection.RedisStringCommands.BitOperation; import org.springframework.data.redis.connection.RedisStringCommands.SetOption; import org.springframework.data.redis.connection.RedisZSetCommands.Range; import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.types.Expiration; import org.springframework.data.redis.test.util.MinimumRedisVersionRule; import org.springframework.data.redis.test.util.RedisClusterRule; import org.springframework.test.annotation.IfProfileValue; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; /** * @author Christoph Strobl * @author Mark Paluch */ public class JedisClusterConnectionTests implements ClusterConnectionTests { static final List<HostAndPort> CLUSTER_NODES = Arrays.asList(new HostAndPort(CLUSTER_HOST, MASTER_NODE_1_PORT), new HostAndPort(CLUSTER_HOST, MASTER_NODE_2_PORT), new HostAndPort(CLUSTER_HOST, MASTER_NODE_3_PORT)); static final byte[] KEY_1_BYTES = JedisConverters.toBytes(KEY_1); static final byte[] KEY_2_BYTES = JedisConverters.toBytes(KEY_2); static final byte[] KEY_3_BYTES = JedisConverters.toBytes(KEY_3); static final byte[] SAME_SLOT_KEY_1_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_1); static final byte[] SAME_SLOT_KEY_2_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_2); static final byte[] SAME_SLOT_KEY_3_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_3); static final byte[] VALUE_1_BYTES = JedisConverters.toBytes(VALUE_1); static final byte[] VALUE_2_BYTES = JedisConverters.toBytes(VALUE_2); static final byte[] VALUE_3_BYTES = JedisConverters.toBytes(VALUE_3); static final GeoLocation<byte[]> ARIGENTO = new GeoLocation<byte[]>("arigento".getBytes(Charset.forName("UTF-8")), POINT_ARIGENTO); static final GeoLocation<byte[]> CATANIA = new GeoLocation<byte[]>("catania".getBytes(Charset.forName("UTF-8")), POINT_CATANIA); static final GeoLocation<byte[]> PALERMO = new GeoLocation<byte[]>("palermo".getBytes(Charset.forName("UTF-8")), POINT_PALERMO); JedisCluster nativeConnection; JedisClusterConnection clusterConnection; /** * ONLY RUN WHEN CLUSTER AVAILABLE */ public static @ClassRule RedisClusterRule clusterRule = new RedisClusterRule(); /** * Check for specific Redis Versions */ public @Rule MinimumRedisVersionRule version = new MinimumRedisVersionRule(); @Before public void setUp() throws IOException { nativeConnection = new JedisCluster(new HashSet<HostAndPort>(CLUSTER_NODES)); clusterConnection = new JedisClusterConnection(this.nativeConnection); } @After public void tearDown() throws IOException { for (JedisPool pool : nativeConnection.getClusterNodes().values()) { try { pool.getResource().flushDB(); } catch (Exception e) { // ignore this one since we cannot remove data from slaves } } nativeConnection.close(); } @Test // DATAREDIS-315 public void shouldAllowSettingAndGettingValues() { clusterConnection.set(KEY_1_BYTES, VALUE_1_BYTES); assertThat(clusterConnection.get(KEY_1_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void delShouldRemoveSingleKeyCorrectly() { nativeConnection.set(KEY_1, VALUE_1); clusterConnection.del(KEY_1_BYTES); assertThat(nativeConnection.get(KEY_1), nullValue()); } @Test // DATAREDIS-315 public void delShouldRemoveMultipleKeysCorrectly() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); clusterConnection.del(KEY_1_BYTES, KEY_2_BYTES); assertThat(nativeConnection.get(KEY_1), nullValue()); assertThat(nativeConnection.get(KEY_2), nullValue()); } @Test // DATAREDIS-315 public void delShouldRemoveMultipleKeysOnSameSlotCorrectly() { nativeConnection.set(SAME_SLOT_KEY_1, VALUE_1); nativeConnection.set(SAME_SLOT_KEY_2, VALUE_2); clusterConnection.del(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.get(SAME_SLOT_KEY_1), nullValue()); assertThat(nativeConnection.get(SAME_SLOT_KEY_2), nullValue()); } @Test // DATAREDIS-315 public void typeShouldReadKeyTypeCorrectly() { nativeConnection.sadd(KEY_1_BYTES, VALUE_1_BYTES); nativeConnection.set(KEY_2_BYTES, VALUE_2_BYTES); nativeConnection.hmset(KEY_3_BYTES, Collections.singletonMap(KEY_1_BYTES, VALUE_1_BYTES)); assertThat(clusterConnection.type(KEY_1_BYTES), is(DataType.SET)); assertThat(clusterConnection.type(KEY_2_BYTES), is(DataType.STRING)); assertThat(clusterConnection.type(KEY_3_BYTES), is(DataType.HASH)); } @Test // DATAREDIS-315 public void keysShouldReturnAllKeys() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); assertThat(clusterConnection.keys(JedisConverters.toBytes("*")), hasItems(KEY_1_BYTES, KEY_2_BYTES)); } @Test // DATAREDIS-315 public void keysShouldReturnAllKeysForSpecificNode() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); Set<byte[]> keysOnNode = clusterConnection.keys(new RedisClusterNode("127.0.0.1", 7379, null), JedisConverters.toBytes("*")); assertThat(keysOnNode, hasItems(KEY_2_BYTES)); assertThat(keysOnNode, not(hasItems(KEY_1_BYTES))); } @Test // DATAREDIS-315 public void randomKeyShouldReturnCorrectlyWhenKeysAvailable() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); assertThat(clusterConnection.randomKey(), notNullValue()); } @Test // DATAREDIS-315 public void randomKeyShouldReturnNullWhenNoKeysAvailable() { assertThat(clusterConnection.randomKey(), nullValue()); } @Test // DATAREDIS-315 public void rename() { nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); clusterConnection.rename(KEY_1_BYTES, KEY_2_BYTES); assertThat(nativeConnection.exists(KEY_1_BYTES), is(false)); assertThat(nativeConnection.get(KEY_2_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void renameSameKeysOnSameSlot() { nativeConnection.set(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES); clusterConnection.rename(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.exists(SAME_SLOT_KEY_1_BYTES), is(false)); assertThat(nativeConnection.get(SAME_SLOT_KEY_2_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void renameNXWhenTargetKeyDoesNotExist() { nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); assertThat(clusterConnection.renameNX(KEY_1_BYTES, KEY_2_BYTES), is(Boolean.TRUE)); assertThat(nativeConnection.exists(KEY_1_BYTES), is(false)); assertThat(nativeConnection.get(KEY_2_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void renameNXWhenTargetKeyDoesExist() { nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); nativeConnection.set(KEY_2_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.renameNX(KEY_1_BYTES, KEY_2_BYTES), is(Boolean.FALSE)); assertThat(nativeConnection.get(KEY_1_BYTES), is(VALUE_1_BYTES)); assertThat(nativeConnection.get(KEY_2_BYTES), is(VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void renameNXWhenOnSameSlot() { nativeConnection.set(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES); assertThat(clusterConnection.renameNX(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES), is(Boolean.TRUE)); assertThat(nativeConnection.exists(SAME_SLOT_KEY_1_BYTES), is(false)); assertThat(nativeConnection.get(SAME_SLOT_KEY_2_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void expireShouldBeSetCorreclty() { nativeConnection.set(KEY_1, VALUE_1); clusterConnection.expire(KEY_1_BYTES, 5); assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES)) > 1, is(true)); } @Test // DATAREDIS-315 public void pExpireShouldBeSetCorreclty() { nativeConnection.set(KEY_1, VALUE_1); clusterConnection.pExpire(KEY_1_BYTES, 5000); assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES)) > 1, is(true)); } @Test // DATAREDIS-315 public void expireAtShouldBeSetCorrectly() { nativeConnection.set(KEY_1, VALUE_1); clusterConnection.expireAt(KEY_1_BYTES, System.currentTimeMillis() / 1000 + 5000); assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES)) > 1, is(true)); } @Test // DATAREDIS-315 public void pExpireAtShouldBeSetCorrectly() { nativeConnection.set(KEY_1, VALUE_1); clusterConnection.pExpireAt(KEY_1_BYTES, System.currentTimeMillis() + 5000); assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES)) > 1, is(true)); } @Test // DATAREDIS-315 public void persistShouldRemoveTTL() { nativeConnection.setex(KEY_1_BYTES, 10, VALUE_1_BYTES); assertThat(clusterConnection.persist(KEY_1_BYTES), is(Boolean.TRUE)); assertThat(nativeConnection.ttl(KEY_1_BYTES), is(-1L)); } @Test(expected = UnsupportedOperationException.class) // DATAREDIS-315 public void moveShouldNotBeSupported() { clusterConnection.move(KEY_1_BYTES, 3); } @Test // DATAREDIS-315 public void dbSizeShouldReturnCummulatedDbSize() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); assertThat(clusterConnection.dbSize(), is(2L)); } @Test // DATAREDIS-315 public void dbSizeForSpecificNodeShouldGetNodeDbSize() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); assertThat(clusterConnection.dbSize(new RedisClusterNode("127.0.0.1", 7379, null)), is(1L)); assertThat(clusterConnection.dbSize(new RedisClusterNode("127.0.0.1", 7380, null)), is(1L)); assertThat(clusterConnection.dbSize(new RedisClusterNode("127.0.0.1", 7381, null)), is(0L)); } @Test // DATAREDIS-315 public void ttlShouldReturnMinusTwoWhenKeyDoesNotExist() { assertThat(clusterConnection.ttl(KEY_1_BYTES), is(-2L)); } @Test // DATAREDIS-526 public void ttlWithTimeUnitShouldReturnMinusTwoWhenKeyDoesNotExist() { assertThat(clusterConnection.ttl(KEY_1_BYTES, TimeUnit.HOURS), is(-2L)); } @Test // DATAREDIS-315 public void ttlShouldReturnMinusOneWhenKeyDoesNotHaveExpirationSet() { nativeConnection.set(KEY_1, VALUE_1); assertThat(clusterConnection.ttl(KEY_1_BYTES), is(-1L)); } @Test // DATAREDIS-315 public void ttlShouldReturnValueCorrectly() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.expire(KEY_1, 5); assertThat(clusterConnection.ttl(KEY_1_BYTES) > 1, is(true)); } @Test // DATAREDIS-315 public void pTtlShouldReturnMinusTwoWhenKeyDoesNotExist() { assertThat(clusterConnection.pTtl(KEY_1_BYTES), is(-2L)); } @Test // DATAREDIS-526 public void pTtlWithTimeUnitShouldReturnMinusTwoWhenKeyDoesNotExist() { assertThat(clusterConnection.pTtl(KEY_1_BYTES, TimeUnit.HOURS), is(-2L)); } @Test // DATAREDIS-315 public void pTtlShouldReturnMinusOneWhenKeyDoesNotHaveExpirationSet() { nativeConnection.set(KEY_1, VALUE_1); assertThat(clusterConnection.pTtl(KEY_1_BYTES), is(-1L)); } @Test // DATAREDIS-315 public void pTtlShouldReturValueCorrectly() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.expire(KEY_1, 5); assertThat(clusterConnection.pTtl(KEY_1_BYTES) > 1, is(true)); } @Test // DATAREDIS-315 public void sortShouldReturnValuesCorrectly() { nativeConnection.lpush(KEY_1, VALUE_2, VALUE_1); assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha()), hasItems(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void sortAndStoreShouldAddSortedValuesValuesCorrectly() { nativeConnection.lpush(KEY_1, VALUE_2, VALUE_1); assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES), is(1L)); assertThat(nativeConnection.exists(KEY_2_BYTES), is(true)); } @Test // DATAREDIS-315 public void sortAndStoreShouldReturnZeroWhenListDoesNotExist() { assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES), is(0L)); } @Test // DATAREDIS-315 public void dumpAndRestoreShouldWorkCorrectly() { nativeConnection.set(KEY_1, VALUE_1); byte[] dumpedValue = clusterConnection.dump(KEY_1_BYTES); clusterConnection.restore(KEY_2_BYTES, 0, dumpedValue); assertThat(nativeConnection.get(KEY_2), is(VALUE_1)); } @Test // DATAREDIS-315 public void getShouldReturnValueCorrectly() { nativeConnection.set(KEY_1, VALUE_1); assertThat(clusterConnection.get(KEY_1_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void getSetShouldWorkCorrectly() { nativeConnection.set(KEY_1, VALUE_1); byte[] valueBeforeSet = clusterConnection.getSet(KEY_1_BYTES, VALUE_2_BYTES); assertThat(valueBeforeSet, is(VALUE_1_BYTES)); assertThat(nativeConnection.get(KEY_1), is(VALUE_2)); } @Test // DATAREDIS-315 public void mGetShouldReturnCorrectlyWhenKeysMapToSameSlot() { nativeConnection.set(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES); nativeConnection.set(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.mGet(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES), contains(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void mGetShouldReturnCorrectlyWhenKeysDoNotMapToSameSlot() { nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); nativeConnection.set(KEY_2_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.mGet(KEY_1_BYTES, KEY_2_BYTES), contains(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void setShouldSetValueCorrectly() { clusterConnection.set(KEY_1_BYTES, VALUE_1_BYTES); assertThat(nativeConnection.get(KEY_1), is(VALUE_1)); } @Test // DATAREDIS-315 public void setNxShouldSetValueCorrectly() { clusterConnection.setNX(KEY_1_BYTES, VALUE_1_BYTES); assertThat(nativeConnection.get(KEY_1), is(VALUE_1)); } @Test // DATAREDIS-315 public void setNxShouldNotSetValueWhenAlreadyExistsInDBCorrectly() { nativeConnection.set(KEY_1, VALUE_1); clusterConnection.setNX(KEY_1_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.get(KEY_1), is(VALUE_1)); } @Test // DATAREDIS-315 public void setExShouldSetValueCorrectly() { clusterConnection.setEx(KEY_1_BYTES, 5, VALUE_1_BYTES); assertThat(nativeConnection.get(KEY_1), is(VALUE_1)); assertThat(nativeConnection.ttl(KEY_1) > 1, is(true)); } @Test // DATAREDIS-315 public void pSetExShouldSetValueCorrectly() { clusterConnection.pSetEx(KEY_1_BYTES, 5000, VALUE_1_BYTES); assertThat(nativeConnection.get(KEY_1), is(VALUE_1)); assertThat(nativeConnection.ttl(KEY_1) > 1, is(true)); } @Test // DATAREDIS-315 public void mSetShouldWorkWhenKeysMapToSameSlot() { Map<byte[], byte[]> map = new LinkedHashMap<byte[], byte[]>(); map.put(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES); map.put(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES); clusterConnection.mSet(map); assertThat(nativeConnection.get(SAME_SLOT_KEY_1), is(VALUE_1)); assertThat(nativeConnection.get(SAME_SLOT_KEY_2), is(VALUE_2)); } @Test // DATAREDIS-315 public void mSetShouldWorkWhenKeysDoNotMapToSameSlot() { Map<byte[], byte[]> map = new LinkedHashMap<byte[], byte[]>(); map.put(KEY_1_BYTES, VALUE_1_BYTES); map.put(KEY_2_BYTES, VALUE_2_BYTES); clusterConnection.mSet(map); assertThat(nativeConnection.get(KEY_1), is(VALUE_1)); assertThat(nativeConnection.get(KEY_2), is(VALUE_2)); } @Test // DATAREDIS-315 public void mSetNXShouldReturnTrueIfAllKeysSet() { Map<byte[], byte[]> map = new LinkedHashMap<byte[], byte[]>(); map.put(KEY_1_BYTES, VALUE_1_BYTES); map.put(KEY_2_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.mSetNX(map), is(true)); assertThat(nativeConnection.get(KEY_1), is(VALUE_1)); assertThat(nativeConnection.get(KEY_2), is(VALUE_2)); } @Test // DATAREDIS-315 public void mSetNXShouldReturnFalseIfNotAllKeysSet() { nativeConnection.set(KEY_2_BYTES, VALUE_3_BYTES); Map<byte[], byte[]> map = new LinkedHashMap<byte[], byte[]>(); map.put(KEY_1_BYTES, VALUE_1_BYTES); map.put(KEY_2_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.mSetNX(map), is(false)); assertThat(nativeConnection.get(KEY_1), is(VALUE_1)); assertThat(nativeConnection.get(KEY_2), is(VALUE_3)); } @Test // DATAREDIS-315 public void mSetNXShouldWorkForOnSameSlotKeys() { Map<byte[], byte[]> map = new LinkedHashMap<byte[], byte[]>(); map.put(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES); map.put(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.mSetNX(map), is(true)); assertThat(nativeConnection.get(SAME_SLOT_KEY_1), is(VALUE_1)); assertThat(nativeConnection.get(SAME_SLOT_KEY_2), is(VALUE_2)); } @Test // DATAREDIS-315 public void incrShouldIncreaseValueCorrectly() { nativeConnection.set(KEY_1, "1"); assertThat(clusterConnection.incr(KEY_1_BYTES), is(2L)); } @Test // DATAREDIS-315 public void incrByShouldIncreaseValueCorrectly() { nativeConnection.set(KEY_1, "1"); assertThat(clusterConnection.incrBy(KEY_1_BYTES, 5), is(6L)); } @Test // DATAREDIS-315 public void incrByFloatShouldIncreaseValueCorrectly() { nativeConnection.set(KEY_1, "1"); assertThat(clusterConnection.incrBy(KEY_1_BYTES, 5.5D), is(6.5D)); } @Test // DATAREDIS-315 public void decrShouldDecreaseValueCorrectly() { nativeConnection.set(KEY_1, "5"); assertThat(clusterConnection.decr(KEY_1_BYTES), is(4L)); } @Test // DATAREDIS-315 public void decrByShouldDecreaseValueCorrectly() { nativeConnection.set(KEY_1, "5"); assertThat(clusterConnection.decrBy(KEY_1_BYTES, 4), is(1L)); } @Test // DATAREDIS-315 public void appendShouldAddValueCorrectly() { clusterConnection.append(KEY_1_BYTES, VALUE_1_BYTES); clusterConnection.append(KEY_1_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.get(KEY_1), is(VALUE_1.concat(VALUE_2))); } @Test // DATAREDIS-315 public void getRangeShouldReturnValueCorrectly() { nativeConnection.set(KEY_1, VALUE_1); assertThat(clusterConnection.getRange(KEY_1_BYTES, 0, 2), is(JedisConverters.toBytes("val"))); } @Test // DATAREDIS-315 public void setRangeShouldWorkCorrectly() { nativeConnection.set(KEY_1, VALUE_1); clusterConnection.setRange(KEY_1_BYTES, JedisConverters.toBytes("UE"), 3); assertThat(nativeConnection.get(KEY_1), is("valUE1")); } @Test // DATAREDIS-315 public void getBitShouldWorkCorrectly() { nativeConnection.setbit(KEY_1, 0, true); nativeConnection.setbit(KEY_1, 1, false); assertThat(clusterConnection.getBit(KEY_1_BYTES, 0), is(true)); assertThat(clusterConnection.getBit(KEY_1_BYTES, 1), is(false)); } @Test // DATAREDIS-315 public void setBitShouldWorkCorrectly() { clusterConnection.setBit(KEY_1_BYTES, 0, true); clusterConnection.setBit(KEY_1_BYTES, 1, false); assertThat(nativeConnection.getbit(KEY_1, 0), is(true)); assertThat(nativeConnection.getbit(KEY_1, 1), is(false)); } @Test // DATAREDIS-315 public void bitCountShouldWorkCorrectly() { nativeConnection.setbit(KEY_1, 0, true); nativeConnection.setbit(KEY_1, 1, false); assertThat(clusterConnection.bitCount(KEY_1_BYTES), is(1L)); } @Test // DATAREDIS-315 public void bitCountWithRangeShouldWorkCorrectly() { nativeConnection.setbit(KEY_1, 0, true); nativeConnection.setbit(KEY_1, 1, false); nativeConnection.setbit(KEY_1, 2, true); nativeConnection.setbit(KEY_1, 3, false); nativeConnection.setbit(KEY_1, 4, true); assertThat(clusterConnection.bitCount(KEY_1_BYTES, 0, 3), is(3L)); } @Test // DATAREDIS-315 public void bitOpShouldWorkCorrectly() { nativeConnection.set(SAME_SLOT_KEY_1, "foo"); nativeConnection.set(SAME_SLOT_KEY_2, "bar"); clusterConnection.bitOp(BitOperation.AND, SAME_SLOT_KEY_3_BYTES, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.get(SAME_SLOT_KEY_3), is("bab")); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void bitOpShouldThrowExceptionWhenKeysDoNotMapToSameSlot() { clusterConnection.bitOp(BitOperation.AND, KEY_1_BYTES, KEY_2_BYTES, KEY_3_BYTES); } @Test // DATAREDIS-315 public void strLenShouldWorkCorrectly() { nativeConnection.set(KEY_1, VALUE_1); assertThat(clusterConnection.strLen(KEY_1_BYTES), is(6L)); } @Test // DATAREDIS-315 public void rPushShoultAddValuesCorrectly() { clusterConnection.rPush(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.lrange(KEY_1, 0, -1), hasItems(VALUE_1, VALUE_2)); } @Test // DATAREDIS-315 public void lPushShoultAddValuesCorrectly() { clusterConnection.lPush(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.lrange(KEY_1, 0, -1), hasItems(VALUE_1, VALUE_2)); } @Test // DATAREDIS-315 public void rPushNXShoultNotAddValuesWhenKeyDoesNotExist() { clusterConnection.rPushX(KEY_1_BYTES, VALUE_1_BYTES); assertThat(nativeConnection.exists(KEY_1), is(false)); } @Test // DATAREDIS-315 public void lPushNXShoultNotAddValuesWhenKeyDoesNotExist() { clusterConnection.lPushX(KEY_1_BYTES, VALUE_1_BYTES); assertThat(nativeConnection.exists(KEY_1), is(false)); } @Test // DATAREDIS-315 public void lLenShouldCountValuesCorrectly() { nativeConnection.lpush(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.lLen(KEY_1_BYTES), is(2L)); } @Test // DATAREDIS-315 public void lRangeShouldGetValuesCorrectly() { nativeConnection.lpush(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.lRange(KEY_1_BYTES, 0L, -1L), hasItems(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void lTrimShouldTrimListCorrectly() { nativeConnection.lpush(KEY_1, VALUE_1, VALUE_2, "foo", "bar"); clusterConnection.lTrim(KEY_1_BYTES, 2, 3); assertThat(nativeConnection.lrange(KEY_1, 0, -1), hasItems(VALUE_1, VALUE_2)); } @Test // DATAREDIS-315 public void lIndexShouldGetElementAtIndexCorrectly() { nativeConnection.rpush(KEY_1, VALUE_1, VALUE_2, "foo", "bar"); assertThat(clusterConnection.lIndex(KEY_1_BYTES, 1), is(VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void lInsertShouldAddElementAtPositionCorrectly() { nativeConnection.rpush(KEY_1, VALUE_1, VALUE_2, "foo", "bar"); clusterConnection.lInsert(KEY_1_BYTES, Position.AFTER, VALUE_2_BYTES, JedisConverters.toBytes("booh!")); assertThat(nativeConnection.lrange(KEY_1, 0, -1).get(2), is("booh!")); } @Test // DATAREDIS-315 public void lSetShouldSetElementAtPositionCorrectly() { nativeConnection.rpush(KEY_1, VALUE_1, VALUE_2, "foo", "bar"); clusterConnection.lSet(KEY_1_BYTES, 1L, VALUE_1_BYTES); assertThat(nativeConnection.lrange(KEY_1, 0, -1).get(1), is(VALUE_1)); } @Test // DATAREDIS-315 public void lRemShouldRemoveElementAtPositionCorrectly() { nativeConnection.rpush(KEY_1, VALUE_1, VALUE_2, "foo", "bar"); clusterConnection.lRem(KEY_1_BYTES, 1L, VALUE_1_BYTES); assertThat(nativeConnection.llen(KEY_1), is(3L)); } @Test // DATAREDIS-315 public void lPopShouldReturnElementCorrectly() { nativeConnection.rpush(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.lPop(KEY_1_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void rPopShouldReturnElementCorrectly() { nativeConnection.rpush(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.rPop(KEY_1_BYTES), is(VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void blPopShouldPopElementCorectly() { nativeConnection.lpush(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.lpush(KEY_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.bLPop(100, KEY_1_BYTES, KEY_2_BYTES).size(), is(2)); } @Test // DATAREDIS-315 public void blPopShouldPopElementCorectlyWhenKeyOnSameSlot() { nativeConnection.lpush(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.lpush(SAME_SLOT_KEY_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.bLPop(100, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES).size(), is(2)); } @Test // DATAREDIS-315 public void brPopShouldPopElementCorectly() { nativeConnection.lpush(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.lpush(KEY_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.bRPop(100, KEY_1_BYTES, KEY_2_BYTES).size(), is(2)); } @Test // DATAREDIS-315 public void brPopShouldPopElementCorectlyWhenKeyOnSameSlot() { nativeConnection.lpush(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.lpush(SAME_SLOT_KEY_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.bRPop(100, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES).size(), is(2)); } @Test // DATAREDIS-315 public void rPopLPushShouldWorkWhenDoNotMapToSameSlot() { nativeConnection.lpush(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.rPopLPush(KEY_1_BYTES, KEY_2_BYTES), is(VALUE_1_BYTES)); assertThat(nativeConnection.exists(KEY_2_BYTES), is(true)); } @Test // DATAREDIS-315 public void rPopLPushShouldWorkWhenKeysOnSameSlot() { nativeConnection.lpush(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.rPopLPush(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES), is(VALUE_1_BYTES)); assertThat(nativeConnection.exists(SAME_SLOT_KEY_2_BYTES), is(true)); } @Test // DATAREDIS-315 public void bRPopLPushShouldWork() { nativeConnection.lpush(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.bRPopLPush(0, KEY_1_BYTES, KEY_2_BYTES), is(VALUE_1_BYTES)); assertThat(nativeConnection.exists(KEY_2_BYTES), is(true)); } @Test // DATAREDIS-315 public void bRPopLPushShouldWorkOnSameSlotKeys() { nativeConnection.lpush(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.bRPopLPush(0, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES), is(VALUE_1_BYTES)); assertThat(nativeConnection.exists(SAME_SLOT_KEY_2_BYTES), is(true)); } @Test // DATAREDIS-315 public void sAddShouldAddValueToSetCorrectly() { clusterConnection.sAdd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.smembers(KEY_1), hasItems(VALUE_1, VALUE_2)); } @Test // DATAREDIS-315 public void sRemShouldRemoveValueFromSetCorrectly() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2); clusterConnection.sRem(KEY_1_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.smembers(KEY_1), hasItems(VALUE_1)); } @Test // DATAREDIS-315 public void sPopShouldPopValueFromSetCorrectly() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.sPop(KEY_1_BYTES), notNullValue()); } @Test // DATAREDIS-315 public void sMoveShouldWorkWhenKeysMapToSameSlot() { nativeConnection.sadd(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(SAME_SLOT_KEY_2_BYTES, VALUE_3_BYTES); clusterConnection.sMove(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.sismember(SAME_SLOT_KEY_1_BYTES, VALUE_2_BYTES), is(false)); assertThat(nativeConnection.sismember(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES), is(true)); } @Test // DATAREDIS-315 public void sMoveShouldWorkWhenKeysDoNotMapToSameSlot() { nativeConnection.sadd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(KEY_2_BYTES, VALUE_3_BYTES); clusterConnection.sMove(KEY_1_BYTES, KEY_2_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.sismember(KEY_1_BYTES, VALUE_2_BYTES), is(false)); assertThat(nativeConnection.sismember(KEY_2_BYTES, VALUE_2_BYTES), is(true)); } @Test // DATAREDIS-315 public void sCardShouldCountValuesInSetCorrectly() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.sCard(KEY_1_BYTES), is(2L)); } @Test // DATAREDIS-315 public void sIsMemberShouldReturnTrueIfValueIsMemberOfSet() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.sIsMember(KEY_1_BYTES, VALUE_1_BYTES), is(true)); } @Test // DATAREDIS-315 public void sIsMemberShouldReturnFalseIfValueIsMemberOfSet() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.sIsMember(KEY_1_BYTES, JedisConverters.toBytes("foo")), is(false)); } @Test // DATAREDIS-315 public void sInterShouldWorkForKeysMappingToSameSlot() { nativeConnection.sadd(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.sInter(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES), hasItem(VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void sInterShouldWorkForKeysNotMappingToSameSlot() { nativeConnection.sadd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.sInter(KEY_1_BYTES, KEY_2_BYTES), hasItem(VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void sInterStoreShouldWorkForKeysMappingToSameSlot() { nativeConnection.sadd(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); clusterConnection.sInterStore(SAME_SLOT_KEY_3_BYTES, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.smembers(SAME_SLOT_KEY_3_BYTES), hasItem(VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void sInterStoreShouldWorkForKeysNotMappingToSameSlot() { nativeConnection.sadd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); clusterConnection.sInterStore(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES); assertThat(nativeConnection.smembers(KEY_3_BYTES), hasItem(VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void sUnionShouldWorkForKeysMappingToSameSlot() { nativeConnection.sadd(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.sUnion(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES), hasItems(VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES)); } @Test // DATAREDIS-315 public void sUnionShouldWorkForKeysNotMappingToSameSlot() { nativeConnection.sadd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.sUnion(KEY_1_BYTES, KEY_2_BYTES), hasItems(VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES)); } @Test // DATAREDIS-315 public void sUnionStoreShouldWorkForKeysMappingToSameSlot() { nativeConnection.sadd(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); clusterConnection.sUnionStore(SAME_SLOT_KEY_3_BYTES, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.smembers(SAME_SLOT_KEY_3_BYTES), hasItems(VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES)); } @Test // DATAREDIS-315 public void sUnionStoreShouldWorkForKeysNotMappingToSameSlot() { nativeConnection.sadd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); clusterConnection.sUnionStore(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES); assertThat(nativeConnection.smembers(KEY_3_BYTES), hasItems(VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES)); } @Test // DATAREDIS-315 public void sDiffShouldWorkWhenKeysMapToSameSlot() { nativeConnection.sadd(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.sDiff(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES), hasItems(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void sDiffShouldWorkWhenKeysNotMapToSameSlot() { nativeConnection.sadd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); assertThat(clusterConnection.sDiff(KEY_1_BYTES, KEY_2_BYTES), hasItems(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void sDiffStoreShouldWorkWhenKeysMapToSameSlot() { nativeConnection.sadd(SAME_SLOT_KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(SAME_SLOT_KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); clusterConnection.sDiffStore(SAME_SLOT_KEY_3_BYTES, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.smembers(SAME_SLOT_KEY_3_BYTES), hasItems(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void sDiffStoreShouldWorkWhenKeysNotMapToSameSlot() { nativeConnection.sadd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES); nativeConnection.sadd(KEY_2_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); clusterConnection.sDiffStore(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES); assertThat(nativeConnection.smembers(KEY_3_BYTES), hasItems(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void sMembersShouldReturnValuesContainedInSetCorrectly() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.sMembers(KEY_1_BYTES), hasItems(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void sRandMamberShouldReturnValueCorrectly() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.sRandMember(KEY_1_BYTES), notNullValue()); } @Test // DATAREDIS-315 public void sRandMamberWithCountShouldReturnValueCorrectly() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2); assertThat(clusterConnection.sRandMember(KEY_1_BYTES, 3), notNullValue()); } @Test // DATAREDIS-315 public void sscanShouldRetrieveAllValuesInSetCorrectly() { for (int i = 0; i < 30; i++) { nativeConnection.sadd(KEY_1_BYTES, JedisConverters.toBytes(Integer.valueOf(i))); } int count = 0; Cursor<byte[]> cursor = clusterConnection.sScan(KEY_1_BYTES, ScanOptions.NONE); while (cursor.hasNext()) { count++; cursor.next(); } assertThat(count, is(30)); } @Test // DATAREDIS-315 public void zAddShouldAddValueWithScoreCorrectly() { clusterConnection.zAdd(KEY_1_BYTES, 10D, VALUE_1_BYTES); clusterConnection.zAdd(KEY_1_BYTES, 20D, VALUE_2_BYTES); assertThat(nativeConnection.zcard(KEY_1_BYTES), is(2L)); } @Test // DATAREDIS-315 public void zRemShouldRemoveValueWithScoreCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); clusterConnection.zRem(KEY_1_BYTES, VALUE_1_BYTES); assertThat(nativeConnection.zcard(KEY_1_BYTES), is(1L)); } @Test // DATAREDIS-315 public void zIncrByShouldIncScoreForValueCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); clusterConnection.zIncrBy(KEY_1_BYTES, 100D, VALUE_1_BYTES); assertThat(nativeConnection.zrank(KEY_1_BYTES, VALUE_1_BYTES), is(1L)); } @Test // DATAREDIS-315 public void zRankShouldReturnPositionForValueCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); assertThat(clusterConnection.zRank(KEY_1_BYTES, VALUE_2_BYTES), is(1L)); } @Test // DATAREDIS-315 public void zRankShouldReturnReversePositionForValueCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); assertThat(clusterConnection.zRevRank(KEY_1_BYTES, VALUE_2_BYTES), is(0L)); } @Test // DATAREDIS-315 public void zRangeShouldReturnValuesCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRange(KEY_1_BYTES, 1, 2), hasItems(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void zRangeWithScoresShouldReturnValuesAndScoreCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRangeWithScores(KEY_1_BYTES, 1, 2), hasItems((Tuple) new DefaultTuple(VALUE_1_BYTES, 10D), (Tuple) new DefaultTuple(VALUE_2_BYTES, 20D))); } @Test // DATAREDIS-315 public void zRangeByScoreShouldReturnValuesCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRangeByScore(KEY_1_BYTES, 10, 20), hasItems(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void zRangeByScoreWithScoresShouldReturnValuesAndScoreCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRangeByScoreWithScores(KEY_1_BYTES, 10, 20), hasItems((Tuple) new DefaultTuple(VALUE_1_BYTES, 10D), (Tuple) new DefaultTuple(VALUE_2_BYTES, 20D))); } @Test // DATAREDIS-315 public void zRangeByScoreShouldReturnValuesCorrectlyWhenGivenOffsetAndScore() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRangeByScore(KEY_1_BYTES, 10D, 20D, 0L, 1L), hasItems(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void zRangeByScoreWithScoresShouldReturnValuesCorrectlyWhenGivenOffsetAndScore() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRangeByScoreWithScores(KEY_1_BYTES, 10D, 20D, 0L, 1L), hasItems((Tuple) new DefaultTuple(VALUE_1_BYTES, 10D))); } @Test // DATAREDIS-315 public void zRevRangeShouldReturnValuesCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRevRange(KEY_1_BYTES, 1, 2), hasItems(VALUE_3_BYTES, VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void zRevRangeWithScoresShouldReturnValuesAndScoreCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRevRangeWithScores(KEY_1_BYTES, 1, 2), hasItems((Tuple) new DefaultTuple(VALUE_3_BYTES, 5D), (Tuple) new DefaultTuple(VALUE_1_BYTES, 10D))); } @Test // DATAREDIS-315 public void zRevRangeByScoreShouldReturnValuesCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRevRangeByScore(KEY_1_BYTES, 10D, 20D), hasItems(VALUE_2_BYTES, VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void zRevRangeByScoreWithScoresShouldReturnValuesAndScoreCorrectly() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRevRangeByScoreWithScores(KEY_1_BYTES, 10D, 20D), hasItems((Tuple) new DefaultTuple(VALUE_2_BYTES, 20D), (Tuple) new DefaultTuple(VALUE_1_BYTES, 10D))); } @Test // DATAREDIS-315 public void zRevRangeByScoreShouldReturnValuesCorrectlyWhenGivenOffsetAndScore() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRevRangeByScore(KEY_1_BYTES, 10D, 20D, 0L, 1L), hasItems(VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void zRevRangeByScoreWithScoresShouldReturnValuesCorrectlyWhenGivenOffsetAndScore() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zRevRangeByScoreWithScores(KEY_1_BYTES, 10D, 20D, 0L, 1L), hasItems((Tuple) new DefaultTuple(VALUE_2_BYTES, 20D))); } @Test // DATAREDIS-315 public void zCountShouldCountValuesInRange() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zCount(KEY_1_BYTES, 10, 20), is(2L)); } @Test // DATAREDIS-315 public void zCardShouldReturnTotalNumberOfValues() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 5D, VALUE_3_BYTES); assertThat(clusterConnection.zCard(KEY_1_BYTES), is(3L)); } @Test // DATAREDIS-315 public void zScoreShouldRetrieveScoreForValue() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); assertThat(clusterConnection.zScore(KEY_1_BYTES, VALUE_2_BYTES), is(20D)); } @Test // DATAREDIS-315 public void zRemRangeShouldRemoveValues() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 30D, VALUE_3_BYTES); clusterConnection.zRemRange(KEY_1_BYTES, 1, 2); assertThat(nativeConnection.zcard(KEY_1_BYTES), is(1L)); assertThat(nativeConnection.zrange(KEY_1_BYTES, 0, -1), hasItem(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void zRemRangeByScoreShouldRemoveValues() { nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 30D, VALUE_3_BYTES); clusterConnection.zRemRangeByScore(KEY_1_BYTES, 15D, 25D); assertThat(nativeConnection.zcard(KEY_1_BYTES), is(2L)); assertThat(nativeConnection.zrange(KEY_1_BYTES, 0, -1), hasItems(VALUE_1_BYTES, VALUE_3_BYTES)); } @Test // DATAREDIS-315 public void zUnionStoreShouldWorkForSameSlotKeys() { nativeConnection.zadd(SAME_SLOT_KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(SAME_SLOT_KEY_1_BYTES, 30D, VALUE_3_BYTES); nativeConnection.zadd(SAME_SLOT_KEY_2_BYTES, 20D, VALUE_2_BYTES); clusterConnection.zUnionStore(SAME_SLOT_KEY_3_BYTES, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.zrange(SAME_SLOT_KEY_3_BYTES, 0, -1), hasItems(VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES)); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void zUnionStoreShouldThrowExceptionWhenKeysDoNotMapToSameSlots() { clusterConnection.zUnionStore(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES); } @Test // DATAREDIS-315 public void zInterStoreShouldWorkForSameSlotKeys() { nativeConnection.zadd(SAME_SLOT_KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(SAME_SLOT_KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(SAME_SLOT_KEY_2_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(SAME_SLOT_KEY_2_BYTES, 30D, VALUE_3_BYTES); clusterConnection.zInterStore(SAME_SLOT_KEY_3_BYTES, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.zrange(SAME_SLOT_KEY_3_BYTES, 0, -1), hasItems(VALUE_2_BYTES)); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void zInterStoreShouldThrowExceptionWhenKeysDoNotMapToSameSlots() { clusterConnection.zInterStore(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES); } @Test // DATAREDIS-479 public void zScanShouldReadEntireValueRange() { int nrOfValues = 321; for (int i = 0; i < nrOfValues; i++) { nativeConnection.zadd(KEY_1_BYTES, i, JedisConverters.toBytes("value-" + i)); } Cursor<Tuple> tuples = clusterConnection.zScan(KEY_1_BYTES, ScanOptions.NONE); int count = 0; while (tuples.hasNext()) { tuples.next(); count++; } assertThat(count, equalTo(nrOfValues)); } @Test // DATAREDIS-315 public void hSetShouldSetValueCorrectly() { clusterConnection.hSet(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); assertThat(nativeConnection.hget(KEY_1_BYTES, KEY_2_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void hSetNXShouldSetValueCorrectly() { clusterConnection.hSetNX(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); assertThat(nativeConnection.hget(KEY_1_BYTES, KEY_2_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void hSetNXShouldNotSetValueWhenAlreadyExists() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); clusterConnection.hSetNX(KEY_1_BYTES, KEY_2_BYTES, VALUE_2_BYTES); assertThat(nativeConnection.hget(KEY_1_BYTES, KEY_2_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void hGetShouldRetrieveValueCorrectly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); assertThat(clusterConnection.hGet(KEY_1_BYTES, KEY_2_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void hMGetShouldRetrieveValueCorrectly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); nativeConnection.hset(KEY_1_BYTES, KEY_3_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.hMGet(KEY_1_BYTES, KEY_2_BYTES, KEY_3_BYTES), hasItems(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void hMSetShouldAddValuesCorrectly() { Map<byte[], byte[]> hashes = new HashMap<byte[], byte[]>(); hashes.put(KEY_2_BYTES, VALUE_1_BYTES); hashes.put(KEY_3_BYTES, VALUE_2_BYTES); clusterConnection.hMSet(KEY_1_BYTES, hashes); assertThat(nativeConnection.hmget(KEY_1_BYTES, KEY_2_BYTES, KEY_3_BYTES), hasItems(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void hIncrByShouldIncreaseFieldCorretly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, JedisConverters.toBytes(1L)); nativeConnection.hset(KEY_1_BYTES, KEY_3_BYTES, JedisConverters.toBytes(2L)); clusterConnection.hIncrBy(KEY_1_BYTES, KEY_3_BYTES, 3); assertThat(nativeConnection.hget(KEY_1_BYTES, KEY_3_BYTES), is(JedisConverters.toBytes(5L))); } @Test // DATAREDIS-315 public void hIncrByFloatShouldIncreaseFieldCorretly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, JedisConverters.toBytes(1L)); nativeConnection.hset(KEY_1_BYTES, KEY_3_BYTES, JedisConverters.toBytes(2L)); clusterConnection.hIncrBy(KEY_1_BYTES, KEY_3_BYTES, 3.5D); assertThat(nativeConnection.hget(KEY_1_BYTES, KEY_3_BYTES), is(JedisConverters.toBytes(5.5D))); } @Test // DATAREDIS-315 public void hExistsShouldReturnPresenceOfFieldCorrectly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); assertThat(clusterConnection.hExists(KEY_1_BYTES, KEY_2_BYTES), is(true)); assertThat(clusterConnection.hExists(KEY_1_BYTES, KEY_3_BYTES), is(false)); assertThat(clusterConnection.hExists(JedisConverters.toBytes("foo"), KEY_2_BYTES), is(false)); } @Test // DATAREDIS-315 public void hDelShouldRemoveFieldsCorrectly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); nativeConnection.hset(KEY_1_BYTES, KEY_3_BYTES, VALUE_2_BYTES); clusterConnection.hDel(KEY_1_BYTES, KEY_2_BYTES); assertThat(nativeConnection.hexists(KEY_1_BYTES, KEY_2_BYTES), is(false)); assertThat(nativeConnection.hexists(KEY_1_BYTES, KEY_3_BYTES), is(true)); } @Test // DATAREDIS-315 public void hLenShouldRetrieveSizeCorrectly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); nativeConnection.hset(KEY_1_BYTES, KEY_3_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.hLen(KEY_1_BYTES), is(2L)); } @Test // DATAREDIS-315 public void hKeysShouldRetrieveKeysCorrectly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); nativeConnection.hset(KEY_1_BYTES, KEY_3_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.hKeys(KEY_1_BYTES), hasItems(KEY_2_BYTES, KEY_3_BYTES)); } @Test // DATAREDIS-315 public void hValsShouldRetrieveValuesCorrectly() { nativeConnection.hset(KEY_1_BYTES, KEY_2_BYTES, VALUE_1_BYTES); nativeConnection.hset(KEY_1_BYTES, KEY_3_BYTES, VALUE_2_BYTES); assertThat(clusterConnection.hVals(KEY_1_BYTES), hasItems(VALUE_1_BYTES, VALUE_2_BYTES)); } @Test // DATAREDIS-315 public void hGetAllShouldRetrieveEntriesCorrectly() { Map<byte[], byte[]> hashes = new HashMap<byte[], byte[]>(); hashes.put(KEY_2_BYTES, VALUE_1_BYTES); hashes.put(KEY_3_BYTES, VALUE_2_BYTES); nativeConnection.hmset(KEY_1_BYTES, hashes); Map<byte[], byte[]> hGetAll = clusterConnection.hGetAll(KEY_1_BYTES); assertThat(hGetAll.containsKey(KEY_2_BYTES), is(true)); assertThat(hGetAll.containsKey(KEY_3_BYTES), is(true)); } @Test // DATAREDIS-479 public void hScanShouldReadEntireValueRange() { int nrOfValues = 321; for (int i = 0; i < nrOfValues; i++) { nativeConnection.hset(KEY_1_BYTES, JedisConverters.toBytes("key" + i), JedisConverters.toBytes("value-" + i)); } Cursor<Map.Entry<byte[], byte[]>> cursor = clusterConnection.hScan(KEY_1_BYTES, scanOptions().match("key*").build()); int i = 0; while (cursor.hasNext()) { cursor.next(); i++; } assertThat(i, is(nrOfValues)); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void multiShouldThrowException() { clusterConnection.multi(); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void execShouldThrowException() { clusterConnection.exec(); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void discardShouldThrowException() { clusterConnection.discard(); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void watchShouldThrowException() { clusterConnection.watch(); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void unwatchShouldThrowException() { clusterConnection.unwatch(); } @Test // DATAREDIS-315 public void selectShouldAllowSelectionOfDBIndexZero() { clusterConnection.select(0); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void selectShouldThrowExceptionWhenSelectingNonZeroDbIndex() { clusterConnection.select(1); } @Test // DATAREDIS-315 public void echoShouldReturnInputCorrectly() { assertThat(clusterConnection.echo(VALUE_1_BYTES), is(VALUE_1_BYTES)); } @Test // DATAREDIS-315 public void pingShouldRetrunPongForExistingNode() { assertThat(clusterConnection.ping(new RedisClusterNode("127.0.0.1", 7379, null)), is("PONG")); } @Test // DATAREDIS-315 public void pingShouldRetrunPong() { assertThat(clusterConnection.ping(), is("PONG")); } @Test(expected = IllegalArgumentException.class) // DATAREDIS-315 public void pingShouldThrowExceptionWhenNodeNotKnownToCluster() { clusterConnection.ping(new RedisClusterNode("127.0.0.1", 1234, null)); } @Test // DATAREDIS-315 public void flushDbShouldFlushAllClusterNodes() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); clusterConnection.flushDb(); assertThat(nativeConnection.get(KEY_1), nullValue()); assertThat(nativeConnection.get(KEY_2), nullValue()); } @Test // DATAREDIS-315 public void flushDbOnSingleNodeShouldFlushOnlyGivenNodesDb() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); clusterConnection.flushDb(new RedisClusterNode("127.0.0.1", 7379, null)); assertThat(nativeConnection.get(KEY_1), notNullValue()); assertThat(nativeConnection.get(KEY_2), nullValue()); } @Test // DATAREDIS-315 public void zRangeByLexShouldReturnResultCorrectly() { nativeConnection.zadd(KEY_1, 0, "a"); nativeConnection.zadd(KEY_1, 0, "b"); nativeConnection.zadd(KEY_1, 0, "c"); nativeConnection.zadd(KEY_1, 0, "d"); nativeConnection.zadd(KEY_1, 0, "e"); nativeConnection.zadd(KEY_1, 0, "f"); nativeConnection.zadd(KEY_1, 0, "g"); Set<byte[]> values = clusterConnection.zRangeByLex(KEY_1_BYTES, Range.range().lte("c")); assertThat(values, hasItems(JedisConverters.toBytes("a"), JedisConverters.toBytes("b"), JedisConverters.toBytes("c"))); assertThat(values, not(hasItems(JedisConverters.toBytes("d"), JedisConverters.toBytes("e"), JedisConverters.toBytes("f"), JedisConverters.toBytes("g")))); values = clusterConnection.zRangeByLex(KEY_1_BYTES, Range.range().lt("c")); assertThat(values, hasItems(JedisConverters.toBytes("a"), JedisConverters.toBytes("b"))); assertThat(values, not(hasItem(JedisConverters.toBytes("c")))); values = clusterConnection.zRangeByLex(KEY_1_BYTES, Range.range().gte("aaa").lt("g")); assertThat(values, hasItems(JedisConverters.toBytes("b"), JedisConverters.toBytes("c"), JedisConverters.toBytes("d"), JedisConverters.toBytes("e"), JedisConverters.toBytes("f"))); assertThat(values, not(hasItems(JedisConverters.toBytes("a"), JedisConverters.toBytes("g")))); values = clusterConnection.zRangeByLex(KEY_1_BYTES, Range.range().gte("e")); assertThat(values, hasItems(JedisConverters.toBytes("e"), JedisConverters.toBytes("f"), JedisConverters.toBytes("g"))); assertThat(values, not(hasItems(JedisConverters.toBytes("a"), JedisConverters.toBytes("b"), JedisConverters.toBytes("c"), JedisConverters.toBytes("d")))); } @Test // DATAREDIS-315 public void infoShouldCollectionInfoFromAllClusterNodes() { assertThat(Double.valueOf(clusterConnection.info().size()), closeTo(245d, 35d)); } @Test // DATAREDIS-315 public void clientListShouldGetInfosForAllClients() { assertThat(clusterConnection.getClientList().isEmpty(), is(false)); } @Test // DATAREDIS-315 public void getClusterNodeForKeyShouldReturnNodeCorrectly() { assertThat((RedisNode) clusterConnection.clusterGetNodeForKey(KEY_1_BYTES), is(new RedisNode("127.0.0.1", 7380))); } @Test // DATAREDIS-315 public void countKeysShouldReturnNumberOfKeysInSlot() { nativeConnection.set(SAME_SLOT_KEY_1, VALUE_1); nativeConnection.set(SAME_SLOT_KEY_2, VALUE_2); assertThat(clusterConnection.clusterCountKeysInSlot(ClusterSlotHashUtil.calculateSlot(SAME_SLOT_KEY_1)), is(2L)); } @Test // DATAREDIS-315 public void pfAddShouldAddValuesCorrectly() { clusterConnection.pfAdd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); assertThat(nativeConnection.pfcount(KEY_1_BYTES), is(3L)); } @Test // DATAREDIS-315 public void pfCountShouldAllowCountingOnSingleKey() { nativeConnection.pfadd(KEY_1, VALUE_1, VALUE_2, VALUE_3); assertThat(clusterConnection.pfCount(KEY_1_BYTES), is(3L)); } @Test // DATAREDIS-315 public void pfCountShouldAllowCountingOnSameSlotKeys() { nativeConnection.pfadd(SAME_SLOT_KEY_1, VALUE_1, VALUE_2); nativeConnection.pfadd(SAME_SLOT_KEY_2, VALUE_2, VALUE_3); assertThat(clusterConnection.pfCount(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES), is(3L)); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void pfCountShouldThrowErrorCountingOnDifferentSlotKeys() { nativeConnection.pfadd(KEY_1, VALUE_1, VALUE_2); nativeConnection.pfadd(KEY_2, VALUE_2, VALUE_3); clusterConnection.pfCount(KEY_1_BYTES, KEY_2_BYTES); } @Test // DATAREDIS-315 public void pfMergeShouldWorkWhenAllKeysMapToSameSlot() { nativeConnection.pfadd(SAME_SLOT_KEY_1, VALUE_1, VALUE_2); nativeConnection.pfadd(SAME_SLOT_KEY_2, VALUE_2, VALUE_3); clusterConnection.pfMerge(SAME_SLOT_KEY_3_BYTES, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES); assertThat(nativeConnection.pfcount(SAME_SLOT_KEY_3), is(3L)); } @Test(expected = DataAccessException.class) // DATAREDIS-315 public void pfMergeShouldThrowErrorOnDifferentSlotKeys() { clusterConnection.pfMerge(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES); } @Test // DATAREDIS-315 public void infoShouldCollectInfoForSpecificNode() { Properties properties = clusterConnection.info(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_2_PORT)); assertThat(properties.getProperty("tcp_port"), is(Integer.toString(MASTER_NODE_2_PORT))); } @Test // DATAREDIS-315 public void infoShouldCollectInfoForSpecificNodeAndSection() { Properties properties = clusterConnection.info(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_2_PORT), "server"); assertThat(properties.getProperty("tcp_port"), is(Integer.toString(MASTER_NODE_2_PORT))); assertThat(properties.getProperty("used_memory"), nullValue()); } @Test // DATAREDIS-315 public void getConfigShouldLoadCumulatedConfiguration() { List<String> result = clusterConnection.getConfig("*max-*-entries*"); // config get *max-*-entries on redis 3.0.7 returns 8 entries per node while on 3.2.0-rc3 returns 6. // @link https://github.com/spring-projects/spring-data-redis/pull/187 assertThat(result.size() % 6, is(0)); for (int i = 0; i < result.size(); i++) { if (i % 2 == 0) { assertThat(result.get(i), startsWith(CLUSTER_HOST)); } else { assertThat(result.get(i), not(startsWith(CLUSTER_HOST))); } } } @Test // DATAREDIS-315 public void getConfigShouldLoadConfigurationOfSpecificNode() { List<String> result = clusterConnection.getConfig(new RedisClusterNode(CLUSTER_HOST, SLAVEOF_NODE_1_PORT), "*"); ListIterator<String> it = result.listIterator(); Integer valueIndex = null; while (it.hasNext()) { String cur = it.next(); if (cur.equals("slaveof")) { valueIndex = it.nextIndex(); break; } } assertThat(valueIndex, notNullValue()); assertThat(result.get(valueIndex), endsWith("7379")); } @Test // DATAREDIS-315 public void clusterGetSlavesShouldReturnSlaveCorrectly() { Set<RedisClusterNode> slaves = clusterConnection .clusterGetSlaves(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_1_PORT)); assertThat(slaves.size(), is(1)); assertThat(slaves, hasItem(new RedisClusterNode(CLUSTER_HOST, SLAVEOF_NODE_1_PORT))); } @Test // DATAREDIS-315 public void clusterGetMasterSlaveMapShouldListMastersAndSlavesCorrectly() { Map<RedisClusterNode, Collection<RedisClusterNode>> masterSlaveMap = clusterConnection.clusterGetMasterSlaveMap(); assertThat(masterSlaveMap, notNullValue()); assertThat(masterSlaveMap.size(), is(3)); assertThat(masterSlaveMap.get(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_1_PORT)), hasItem(new RedisClusterNode(CLUSTER_HOST, SLAVEOF_NODE_1_PORT))); assertThat(masterSlaveMap.get(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_2_PORT)).isEmpty(), is(true)); assertThat(masterSlaveMap.get(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_3_PORT)).isEmpty(), is(true)); } @Test // DATAREDIS-316 public void setWithExpirationInSecondsShouldWorkCorrectly() { clusterConnection.set(KEY_1_BYTES, VALUE_1_BYTES, Expiration.seconds(1), SetOption.upsert()); assertThat(nativeConnection.exists(KEY_1_BYTES), is(true)); assertThat(nativeConnection.ttl(KEY_1_BYTES), is(1L)); } @Test // DATAREDIS-316 public void setWithExpirationInMillisecondsShouldWorkCorrectly() { clusterConnection.set(KEY_1_BYTES, VALUE_1_BYTES, Expiration.milliseconds(500), SetOption.upsert()); assertThat(nativeConnection.exists(KEY_1_BYTES), is(true)); assertThat(nativeConnection.pttl(KEY_1).doubleValue(), is(closeTo(500d, 499d))); } @Test(expected = UnsupportedOperationException.class) // DATAREDIS-316 public void setWithOptionIfPresentShouldWorkCorrectly() { nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); clusterConnection.set(KEY_1_BYTES, VALUE_2_BYTES, Expiration.persistent(), SetOption.ifPresent()); } @Test // DATAREDIS-316 public void setWithOptionIfAbsentShouldWorkCorrectly() { clusterConnection.set(KEY_1_BYTES, VALUE_1_BYTES, Expiration.persistent(), SetOption.ifAbsent()); assertThat(nativeConnection.exists(KEY_1_BYTES), is(true)); assertThat(nativeConnection.ttl(KEY_1_BYTES), is(-1L)); } @Test // DATAREDIS-316 public void setWithExpirationAndIfAbsentShouldWorkCorrectly() { clusterConnection.set(KEY_1_BYTES, VALUE_1_BYTES, Expiration.seconds(1), SetOption.ifAbsent()); assertThat(nativeConnection.exists(KEY_1_BYTES), is(true)); assertThat(nativeConnection.ttl(KEY_1_BYTES), is(1L)); } @Test // DATAREDIS-316 public void setWithExpirationAndIfAbsentShouldNotBeAppliedWhenKeyExists() { nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); clusterConnection.set(KEY_1_BYTES, VALUE_2_BYTES, Expiration.seconds(1), SetOption.ifAbsent()); assertThat(nativeConnection.exists(KEY_1_BYTES), is(true)); assertThat(nativeConnection.ttl(KEY_1_BYTES), is(-1L)); assertThat(nativeConnection.get(KEY_1_BYTES), is(equalTo(VALUE_1_BYTES))); } @Test // DATAREDIS-316 public void setWithExpirationAndIfPresentShouldWorkCorrectly() { nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); clusterConnection.set(KEY_1_BYTES, VALUE_2_BYTES, Expiration.seconds(1), SetOption.ifPresent()); assertThat(nativeConnection.exists(KEY_1_BYTES), is(true)); assertThat(nativeConnection.ttl(KEY_1_BYTES), is(1L)); assertThat(nativeConnection.get(KEY_1_BYTES), is(equalTo(VALUE_2_BYTES))); } @Test // DATAREDIS-316 public void setWithExpirationAndIfPresentShouldNotBeAppliedWhenKeyDoesNotExists() { clusterConnection.set(KEY_1_BYTES, VALUE_1_BYTES, Expiration.seconds(1), SetOption.ifPresent()); assertThat(nativeConnection.exists(KEY_1_BYTES), is(false)); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoAddSingleGeoLocation() { assertThat(clusterConnection.geoAdd(KEY_1_BYTES, PALERMO), is(1L)); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoAddMultipleGeoLocations() { assertThat(clusterConnection.geoAdd(KEY_1_BYTES, Arrays.asList(PALERMO, ARIGENTO, CATANIA, PALERMO)), is(3L)); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoDist() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); Distance distance = clusterConnection.geoDist(KEY_1_BYTES, PALERMO.getName(), CATANIA.getName()); assertThat(distance.getValue(), is(closeTo(166274.15156960033D, 0.005))); assertThat(distance.getUnit(), is("m")); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoDistWithMetric() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); Distance distance = clusterConnection.geoDist(KEY_1_BYTES, PALERMO.getName(), CATANIA.getName(), KILOMETERS); assertThat(distance.getValue(), is(closeTo(166.27415156960033D, 0.005))); assertThat(distance.getUnit(), is("km")); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoHash() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); List<String> result = clusterConnection.geoHash(KEY_1_BYTES, PALERMO.getName(), CATANIA.getName()); assertThat(result, contains("sqc8b49rny0", "sqdtr74hyu0")); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoHashNonExisting() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); List<String> result = clusterConnection.geoHash(KEY_1_BYTES, PALERMO.getName(), ARIGENTO.getName(), CATANIA.getName()); assertThat(result, contains("sqc8b49rny0", (String) null, "sqdtr74hyu0")); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoPosition() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); List<Point> positions = clusterConnection.geoPos(KEY_1_BYTES, PALERMO.getName(), CATANIA.getName()); assertThat(positions.get(0).getX(), is(closeTo(POINT_PALERMO.getX(), 0.005))); assertThat(positions.get(0).getY(), is(closeTo(POINT_PALERMO.getY(), 0.005))); assertThat(positions.get(1).getX(), is(closeTo(POINT_CATANIA.getX(), 0.005))); assertThat(positions.get(1).getY(), is(closeTo(POINT_CATANIA.getY(), 0.005))); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoPositionNonExisting() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); List<Point> positions = clusterConnection.geoPos(KEY_1_BYTES, PALERMO.getName(), ARIGENTO.getName(), CATANIA.getName()); assertThat(positions.get(0).getX(), is(closeTo(POINT_PALERMO.getX(), 0.005))); assertThat(positions.get(0).getY(), is(closeTo(POINT_PALERMO.getY(), 0.005))); assertThat(positions.get(1), is(nullValue())); assertThat(positions.get(2).getX(), is(closeTo(POINT_CATANIA.getX(), 0.005))); assertThat(positions.get(2).getY(), is(closeTo(POINT_CATANIA.getY(), 0.005))); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoRadiusShouldReturnMembersCorrectly() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); GeoResults<GeoLocation<byte[]>> result = clusterConnection.geoRadius(KEY_1_BYTES, new Circle(new Point(15D, 37D), new Distance(150D, KILOMETERS))); assertThat(result.getContent(), hasSize(2)); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoRadiusShouldReturnDistanceCorrectly() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); GeoResults<GeoLocation<byte[]>> result = clusterConnection.geoRadius(KEY_1_BYTES, new Circle(new Point(15D, 37D), new Distance(200D, KILOMETERS)), newGeoRadiusArgs().includeDistance()); assertThat(result.getContent(), hasSize(3)); assertThat(result.getContent().get(0).getDistance().getValue(), is(closeTo(130.423D, 0.005))); assertThat(result.getContent().get(0).getDistance().getUnit(), is("km")); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoRadiusShouldApplyLimit() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); GeoResults<GeoLocation<byte[]>> result = clusterConnection.geoRadius(KEY_1_BYTES, new Circle(new Point(15D, 37D), new Distance(200D, KILOMETERS)), newGeoRadiusArgs().limit(2)); assertThat(result.getContent(), hasSize(2)); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoRadiusByMemberShouldReturnMembersCorrectly() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); GeoResults<GeoLocation<byte[]>> result = clusterConnection.geoRadiusByMember(KEY_1_BYTES, PALERMO.getName(), new Distance(100, KILOMETERS), newGeoRadiusArgs().sortAscending()); assertThat(result.getContent().get(0).getContent().getName(), is(PALERMO.getName())); assertThat(result.getContent().get(1).getContent().getName(), is(ARIGENTO.getName())); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoRadiusByMemberShouldReturnDistanceCorrectly() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); GeoResults<GeoLocation<byte[]>> result = clusterConnection.geoRadiusByMember(KEY_1_BYTES, PALERMO.getName(), new Distance(100, KILOMETERS), newGeoRadiusArgs().includeDistance()); assertThat(result.getContent(), hasSize(2)); assertThat(result.getContent().get(0).getDistance().getValue(), is(closeTo(90.978D, 0.005))); assertThat(result.getContent().get(0).getDistance().getUnit(), is("km")); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoRadiusByMemberShouldApplyLimit() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); GeoResults<GeoLocation<byte[]>> result = clusterConnection.geoRadiusByMember(KEY_1_BYTES, PALERMO.getName(), new Distance(200, KILOMETERS), newGeoRadiusArgs().limit(2)); assertThat(result.getContent(), hasSize(2)); } @Test // DATAREDIS-438 @IfProfileValue(name = "redisVersion", value = "3.2+") public void geoRemoveDeletesMembers() { nativeConnection.geoadd(KEY_1_BYTES, PALERMO.getPoint().getX(), PALERMO.getPoint().getY(), PALERMO.getName()); nativeConnection.geoadd(KEY_1_BYTES, ARIGENTO.getPoint().getX(), ARIGENTO.getPoint().getY(), ARIGENTO.getName()); nativeConnection.geoadd(KEY_1_BYTES, CATANIA.getPoint().getX(), CATANIA.getPoint().getY(), CATANIA.getName()); assertThat(clusterConnection.geoRemove(KEY_1_BYTES, ARIGENTO.getName()), is(1L)); } }