Make Lettuce return converted tx results
DATAREDIS-208
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -71,7 +71,7 @@ public class LettuceConnectionFactory implements InitializingBean, DisposableBea
|
||||
/** Synchronization monitor for the shared Connection */
|
||||
private final Object connectionMonitor = new Object();
|
||||
private String password;
|
||||
private boolean convertPipelineResults = true;
|
||||
private boolean convertPipelineAndTxResults = true;
|
||||
|
||||
/**
|
||||
* Constructs a new <code>LettuceConnectionFactory</code> instance with
|
||||
@@ -108,7 +108,7 @@ public class LettuceConnectionFactory implements InitializingBean, DisposableBea
|
||||
|
||||
public RedisConnection getConnection() {
|
||||
LettuceConnection connection = new LettuceConnection(getSharedConnection(), timeout, client, pool);
|
||||
connection.setConvertPipelineResults(convertPipelineResults);
|
||||
connection.setConvertPipelineAndTxResults(convertPipelineAndTxResults);
|
||||
return connection;
|
||||
}
|
||||
|
||||
@@ -302,24 +302,24 @@ public class LettuceConnectionFactory implements InitializingBean, DisposableBea
|
||||
|
||||
/**
|
||||
* Specifies if pipelined results should be converted to the expected data
|
||||
* type. If false, results of {@link #closePipeline()} will be of the
|
||||
* type returned by the Jedis driver
|
||||
* type. If false, results of {@link LettuceConnection#closePipeline()} and {LettuceConnection#exec()}
|
||||
* will be of the type returned by the Lettuce driver
|
||||
*
|
||||
* @return Whether or not to convert pipeline results
|
||||
* @return Whether or not to convert pipeline and tx results
|
||||
*/
|
||||
public boolean getConvertPipelineResults() {
|
||||
return convertPipelineResults;
|
||||
public boolean getConvertPipelineAndTxResults() {
|
||||
return convertPipelineAndTxResults;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies if pipelined results should be converted to the expected data
|
||||
* type. If false, results of {@link #closePipeline()} will be of the
|
||||
* type returned by the Jedis driver
|
||||
* Specifies if pipelined and transaction results should be converted to the expected data
|
||||
* type. If false, results of {@link LettuceConnection#closePipeline()} and {LettuceConnection#exec()}
|
||||
* will be of the type returned by the Lettuce driver
|
||||
*
|
||||
* @param convertPipelineResults Whether or not to convert pipeline results
|
||||
* @param convertPipelineAndTxResults Whether or not to convert pipeline and tx results
|
||||
*/
|
||||
public void setConvertPipelineResults(boolean convertPipelineResults) {
|
||||
this.convertPipelineResults = convertPipelineResults;
|
||||
public void setConvertPipelineAndTxResults(boolean convertPipelineAndTxResults) {
|
||||
this.convertPipelineAndTxResults = convertPipelineAndTxResults;
|
||||
}
|
||||
|
||||
protected RedisAsyncConnection<byte[], byte[]> getSharedConnection() {
|
||||
|
||||
@@ -20,26 +20,19 @@ import java.util.Date;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.jboss.netty.channel.ChannelException;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.dao.QueryTimeoutException;
|
||||
import org.springframework.data.redis.RedisConnectionFailureException;
|
||||
import org.springframework.data.redis.RedisSystemException;
|
||||
import org.springframework.data.redis.connection.DefaultTuple;
|
||||
import org.springframework.data.redis.connection.ReturnType;
|
||||
import org.springframework.data.redis.connection.RedisListCommands.Position;
|
||||
import org.springframework.data.redis.connection.RedisZSetCommands.Tuple;
|
||||
import org.springframework.data.redis.connection.ReturnType;
|
||||
import org.springframework.data.redis.connection.SortParameters;
|
||||
import org.springframework.data.redis.connection.SortParameters.Order;
|
||||
import org.springframework.data.redis.connection.convert.Converters;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import com.lambdaworks.redis.KeyValue;
|
||||
import com.lambdaworks.redis.RedisCommandInterruptedException;
|
||||
import com.lambdaworks.redis.RedisException;
|
||||
import com.lambdaworks.redis.ScoredValue;
|
||||
import com.lambdaworks.redis.ScriptOutputType;
|
||||
import com.lambdaworks.redis.SortArgs;
|
||||
@@ -59,7 +52,7 @@ abstract public class LettuceConverters extends Converters {
|
||||
private static final Converter<KeyValue<byte[], byte[]>, List<byte[]>> KEY_VALUE_TO_BYTES_LIST;
|
||||
private static final Converter<List<ScoredValue<byte[]>>, Set<Tuple>> SCORED_VALUES_TO_TUPLE_SET;
|
||||
private static final Converter<ScoredValue<byte[]>, Tuple> SCORED_VALUE_TO_TUPLE;
|
||||
private static final Converter<List<Object>, List<Object>> EXEC_RESULTS_CONVERTER;
|
||||
private static final Converter<Exception, DataAccessException> EXCEPTION_CONVERTER = new LettuceExceptionConverter();
|
||||
|
||||
static {
|
||||
DATE_TO_LONG = new Converter<Date, Long>() {
|
||||
@@ -108,16 +101,6 @@ abstract public class LettuceConverters extends Converters {
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
EXEC_RESULTS_CONVERTER = new Converter<List<Object>, List<Object>>() {
|
||||
public List<Object> convert(List<Object> source) {
|
||||
// Lettuce Empty list means null (watched variable modified)
|
||||
if(source.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return source;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static Converter<Date, Long> dateToLong() {
|
||||
@@ -144,8 +127,8 @@ abstract public class LettuceConverters extends Converters {
|
||||
return SCORED_VALUE_TO_TUPLE;
|
||||
}
|
||||
|
||||
public static Converter<List<Object>, List<Object>> execResultsConverter() {
|
||||
return EXEC_RESULTS_CONVERTER;
|
||||
public static Converter<Exception, DataAccessException> exceptionConverter() {
|
||||
return EXCEPTION_CONVERTER;
|
||||
}
|
||||
|
||||
public static Long toLong(Date source) {
|
||||
@@ -173,19 +156,7 @@ abstract public class LettuceConverters extends Converters {
|
||||
}
|
||||
|
||||
public static DataAccessException toDataAccessException(Exception ex) {
|
||||
if (ex instanceof RedisCommandInterruptedException) {
|
||||
return new RedisSystemException("Redis command interrupted", ex);
|
||||
}
|
||||
if (ex instanceof RedisException) {
|
||||
return new RedisSystemException("Redis exception", ex);
|
||||
}
|
||||
if (ex instanceof ChannelException) {
|
||||
return new RedisConnectionFailureException("Redis connection failed", ex);
|
||||
}
|
||||
if (ex instanceof TimeoutException) {
|
||||
return new QueryTimeoutException("Redis command timed out", ex);
|
||||
}
|
||||
return new RedisSystemException("Unknown Lettuce exception", ex);
|
||||
return EXCEPTION_CONVERTER.convert(ex);
|
||||
}
|
||||
|
||||
public static ScriptOutputType toScriptOutputType(ReturnType returnType) {
|
||||
@@ -245,8 +216,4 @@ abstract public class LettuceConverters extends Converters {
|
||||
}
|
||||
return args;
|
||||
}
|
||||
|
||||
public static List<Object> toExecResults(List<Object> source) {
|
||||
return EXEC_RESULTS_CONVERTER.convert(source);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright 2013 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.lettuce;
|
||||
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.jboss.netty.channel.ChannelException;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.dao.QueryTimeoutException;
|
||||
import org.springframework.data.redis.RedisConnectionFailureException;
|
||||
import org.springframework.data.redis.RedisSystemException;
|
||||
|
||||
import com.lambdaworks.redis.RedisCommandInterruptedException;
|
||||
import com.lambdaworks.redis.RedisException;
|
||||
|
||||
/**
|
||||
* Converts Lettuce Exceptions to {@link DataAccessException}s
|
||||
*
|
||||
* @author Jennifer Hickey
|
||||
*
|
||||
*/
|
||||
public class LettuceExceptionConverter implements Converter<Exception, DataAccessException> {
|
||||
|
||||
public DataAccessException convert(Exception ex) {
|
||||
if (ex instanceof DataAccessException) {
|
||||
return (DataAccessException) ex;
|
||||
}
|
||||
if (ex instanceof RedisCommandInterruptedException) {
|
||||
return new RedisSystemException("Redis command interrupted", ex);
|
||||
}
|
||||
if (ex instanceof RedisException) {
|
||||
return new RedisSystemException("Redis exception", ex);
|
||||
}
|
||||
if (ex instanceof ChannelException) {
|
||||
return new RedisConnectionFailureException("Redis connection failed", ex);
|
||||
}
|
||||
if (ex instanceof TimeoutException) {
|
||||
return new QueryTimeoutException("Redis command timed out", ex);
|
||||
}
|
||||
return new RedisSystemException("Unknown Lettuce exception", ex);
|
||||
}
|
||||
}
|
||||
@@ -1,41 +1,17 @@
|
||||
package org.springframework.data.redis.connection;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.data.redis.RedisSystemException;
|
||||
import org.springframework.data.redis.connection.convert.Converters;
|
||||
import org.springframework.data.redis.serializer.SerializationUtils;
|
||||
import org.springframework.test.annotation.IfProfileValue;
|
||||
|
||||
abstract public class AbstractConnectionTransactionIntegrationTests extends
|
||||
AbstractConnectionIntegrationTests {
|
||||
|
||||
protected boolean convert = true;
|
||||
|
||||
protected boolean convertLongToBoolean = true;
|
||||
|
||||
protected boolean convertStringToProps = false;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
super.setUp();
|
||||
((DefaultStringRedisConnection)connection).setDeserializePipelineAndTxResults(false);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testMultiDiscard() {
|
||||
}
|
||||
@@ -116,325 +92,11 @@ abstract public class AbstractConnectionTransactionIntegrationTests extends
|
||||
public void testHashNullValue() throws Exception {
|
||||
}
|
||||
|
||||
@Test(expected=UnsupportedOperationException.class)
|
||||
@Test(expected = UnsupportedOperationException.class)
|
||||
public void testWatchWhileInTx() {
|
||||
connection.watch("foo".getBytes());
|
||||
}
|
||||
|
||||
// Type conversion overrides
|
||||
|
||||
@Test
|
||||
public void testExecute() {
|
||||
connection.set("foo", "bar");
|
||||
actual.add(connection.execute("GET", "foo"));
|
||||
assertEquals("bar", getResults().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExecuteNoArgs() {
|
||||
actual.add(connection.execute("PING"));
|
||||
assertEquals("PONG", getResults().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSort() {
|
||||
convertLongToBoolean = false;
|
||||
super.testSort();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSortStore() {
|
||||
convertLongToBoolean = false;
|
||||
super.testSortStore();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSortNullParams() {
|
||||
convertLongToBoolean = false;
|
||||
super.testSortNullParams();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDbSize() {
|
||||
convertLongToBoolean = false;
|
||||
super.testDbSize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFlushDb() {
|
||||
convertLongToBoolean = false;
|
||||
super.testFlushDb();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDel() {
|
||||
convertLongToBoolean = false;
|
||||
super.testDel();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIncDecrByLong() {
|
||||
convertLongToBoolean = false;
|
||||
super.testIncrDecrByLong();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDecrByIncrBy() {
|
||||
convertLongToBoolean = false;
|
||||
super.testDecrByIncrBy();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIncrDecr() {
|
||||
convertLongToBoolean = false;
|
||||
super.testIncDecr();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLInsert() {
|
||||
convertLongToBoolean = false;
|
||||
super.testLInsert();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLRem() {
|
||||
convertLongToBoolean = false;
|
||||
super.testLRem();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLPop() {
|
||||
convertLongToBoolean = false;
|
||||
super.testLPop();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLLen() {
|
||||
convertLongToBoolean = false;
|
||||
super.testLLen();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLSet() {
|
||||
convertLongToBoolean = false;
|
||||
super.testLSet();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLTrim() {
|
||||
convertLongToBoolean = false;
|
||||
super.testLTrim();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRPop() {
|
||||
convertLongToBoolean = false;
|
||||
super.testRPop();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRPopLPush() {
|
||||
convertLongToBoolean = false;
|
||||
super.testRPopLPush();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLPushX() {
|
||||
convertLongToBoolean = false;
|
||||
super.testLPushX();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRPushX() {
|
||||
convertLongToBoolean = false;
|
||||
super.testRPushX();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLIndex() {
|
||||
convertLongToBoolean = false;
|
||||
super.testLIndex();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLPush() throws Exception {
|
||||
convertLongToBoolean = false;
|
||||
super.testLPush();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSDiffStore() {
|
||||
convertLongToBoolean = false;
|
||||
actual.add(connection.sAdd("myset", "foo"));
|
||||
actual.add(connection.sAdd("myset", "bar"));
|
||||
actual.add(connection.sAdd("otherset", "bar"));
|
||||
actual.add(connection.sDiffStore("thirdset", "myset", "otherset"));
|
||||
actual.add(connection.sMembers("thirdset"));
|
||||
verifyResults(Arrays.asList(new Object[] { 1l, 1l, 1l, 1l,
|
||||
new HashSet<String>(Collections.singletonList("foo")) }));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSInterStore() {
|
||||
convertLongToBoolean = false;
|
||||
actual.add(connection.sAdd("myset", "foo"));
|
||||
actual.add(connection.sAdd("myset", "bar"));
|
||||
actual.add(connection.sAdd("otherset", "bar"));
|
||||
actual.add(connection.sInterStore("thirdset", "myset", "otherset"));
|
||||
actual.add(connection.sMembers("thirdset"));
|
||||
verifyResults(Arrays.asList(new Object[] { 1l, 1l, 1l, 1l,
|
||||
new HashSet<String>(Collections.singletonList("bar")) }));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRank() {
|
||||
convertLongToBoolean = false;
|
||||
actual.add(connection.zAdd("myset", 2, "Bob"));
|
||||
actual.add(connection.zAdd("myset", 1, "James"));
|
||||
actual.add(connection.zRank("myset", "James"));
|
||||
actual.add(connection.zRank("myset", "Bob"));
|
||||
verifyResults(Arrays.asList(new Object[] { 1l, 1l, 0l, 1l }));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRemRangeByScore() {
|
||||
convertLongToBoolean = false;
|
||||
actual.add(connection.zAdd("myset", 2, "Bob"));
|
||||
actual.add(connection.zAdd("myset", 1, "James"));
|
||||
actual.add(connection.zRemRangeByScore("myset", 0d, 1d));
|
||||
actual.add(connection.zRange("myset", 0l, -1l));
|
||||
verifyResults(Arrays.asList(new Object[] { 1l, 1l, 1l,
|
||||
new LinkedHashSet<String>(Arrays.asList(new String[] { "Bob" })) }));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRevRank() {
|
||||
convertLongToBoolean = false;
|
||||
actual.add(connection.zAdd("myset", 2, "Bob"));
|
||||
actual.add(connection.zAdd("myset", 1, "James"));
|
||||
actual.add(connection.zAdd("myset", 3, "Joe"));
|
||||
actual.add(connection.zRevRank("myset", "Joe"));
|
||||
verifyResults(Arrays.asList(new Object[] { 1l, 1l, 1l, 0l }));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIncrDecrByLong() {
|
||||
convertLongToBoolean = false;
|
||||
super.testIncrDecrByLong();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIncDecr() {
|
||||
convertLongToBoolean = false;
|
||||
super.testIncDecr();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testType() {
|
||||
connection.set("something", "yo");
|
||||
actual.add(connection.type("something"));
|
||||
verifyResults(Arrays.asList(new Object[] { "string" }));
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testBitCountNonExistentKey() {
|
||||
convertLongToBoolean = false;
|
||||
super.testBitCountNonExistentKey();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInfo() throws Exception {
|
||||
convertStringToProps = true;
|
||||
super.testInfo();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testInfoBySection() throws Exception {
|
||||
convertStringToProps = true;
|
||||
super.testInfoBySection();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testDumpAndRestore() {
|
||||
convert = false;
|
||||
connection.set("testing", "12");
|
||||
actual.add(connection.dump("testing".getBytes()));
|
||||
List<Object> results = getResults();
|
||||
initConnection();
|
||||
actual.add(connection.del("testing"));
|
||||
actual.add((connection.get("testing")));
|
||||
connection.restore("testing".getBytes(), 0, (byte[]) results.get(results.size() - 1));
|
||||
actual.add(connection.get("testing"));
|
||||
results = getResults();
|
||||
assertEquals(3,results.size());
|
||||
assertEquals(1l, results.get(0));
|
||||
assertNull(results.get(1));
|
||||
assertEquals("12", new String((byte[])results.get(2)));
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testScriptLoadEvalSha() {
|
||||
convert = false;
|
||||
super.testScriptLoadEvalSha();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testEvalShaArrayStrings() {
|
||||
convert = false;
|
||||
super.testEvalShaArrayStrings();
|
||||
}
|
||||
|
||||
@Test(expected = RedisSystemException.class)
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testRestoreExistingKey() {
|
||||
convert = false;
|
||||
super.testRestoreExistingKey();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testEvalReturnString() {
|
||||
convert = false;
|
||||
super.testEvalReturnString();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testEvalReturnArrayStrings() {
|
||||
convert = false;
|
||||
super.testEvalReturnArrayStrings();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testEvalReturnSingleOK() {
|
||||
actual.add(connection.eval("return redis.call('set','abc','ghk')", ReturnType.STATUS, 0));
|
||||
assertEquals(Arrays.asList(new Object[] { "OK" }), getResultsNoConversion());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testEvalReturnArrayOKs() {
|
||||
actual.add(connection.eval(
|
||||
"return { redis.call('set','abc','ghk'), redis.call('set','abc','lfdf')}",
|
||||
ReturnType.MULTI, 0));
|
||||
List<String> result = (List<String>) getResults().get(0);
|
||||
assertEquals(Arrays.asList(new Object[] { "OK", "OK" }), result);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testRestoreTtl() {
|
||||
convert = false;
|
||||
super.testRestoreTtl();
|
||||
}
|
||||
|
||||
@Test(expected = UnsupportedOperationException.class)
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testScriptKill() {
|
||||
@@ -443,99 +105,14 @@ abstract public class AbstractConnectionTransactionIntegrationTests extends
|
||||
connection.scriptKill();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testBitCount() {
|
||||
convertLongToBoolean = false;
|
||||
String key = "bitset-test";
|
||||
connection.setBit(key, 0, false);
|
||||
connection.setBit(key, 1, true);
|
||||
connection.setBit(key, 2, true);
|
||||
actual.add(connection.bitCount(key));
|
||||
// Lettuce setBit returns Long instead of void
|
||||
verifyResults(new ArrayList<Object>(Arrays.asList(0l, 0l, 0l, 2l)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetRangeSetRange() {
|
||||
connection.set("rangekey", "supercalifrag");
|
||||
actual.add(connection.getRange("rangekey", 0l, 2l));
|
||||
connection.setRange("rangekey", "ck", 2);
|
||||
actual.add(connection.get("rangekey"));
|
||||
// Lettuce returns a value for setRange
|
||||
verifyResults(Arrays.asList(new Object[] { "sup", 13l, "suckrcalifrag" }));
|
||||
}
|
||||
|
||||
protected void initConnection() {
|
||||
connection.multi();
|
||||
}
|
||||
|
||||
protected abstract DataAccessException convertException(Exception ex);
|
||||
|
||||
protected List<Object> getResults() {
|
||||
List<Object> actual = connection.exec();
|
||||
if (actual == null) {
|
||||
return null;
|
||||
}
|
||||
return convertResults(actual);
|
||||
}
|
||||
|
||||
protected List<Object> getResultsNoConversion() {
|
||||
return connection.exec();
|
||||
}
|
||||
|
||||
protected List<Object> convertResults(List<Object> results) {
|
||||
if(results == null) {
|
||||
return null;
|
||||
}
|
||||
List<Object> serializedResults = new ArrayList<Object>();
|
||||
for (Object result : results) {
|
||||
Object convertedResult = convertResult(result);
|
||||
if (convertedResult instanceof Exception) {
|
||||
throw convertException((Exception) convertedResult);
|
||||
}
|
||||
if (!"OK".equals(convertedResult) && !"QUEUED".equals(convertedResult)) {
|
||||
serializedResults.add(convertedResult);
|
||||
}
|
||||
}
|
||||
return serializedResults;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
protected Object convertResult(Object result) {
|
||||
if (!convert) {
|
||||
return result;
|
||||
}
|
||||
if (result instanceof List && !(((List) result).isEmpty())
|
||||
&& ((List) result).get(0) instanceof byte[]) {
|
||||
return (SerializationUtils.deserialize((List<byte[]>) result, stringSerializer));
|
||||
} else if (result instanceof byte[]) {
|
||||
if(convertStringToProps) {
|
||||
return Converters.toProperties(stringSerializer.deserialize((byte[]) result));
|
||||
}
|
||||
return (stringSerializer.deserialize((byte[]) result));
|
||||
} else if (result instanceof Map
|
||||
&& ((Map) result).keySet().iterator().next() instanceof byte[]) {
|
||||
return (SerializationUtils.deserialize((Map) result, stringSerializer));
|
||||
} else if (result instanceof Set && !(((Set) result).isEmpty())) {
|
||||
Object firstResult = ((Set) result).iterator().next();
|
||||
if (firstResult instanceof byte[]) {
|
||||
return (SerializationUtils.deserialize((Set) result, stringSerializer));
|
||||
}
|
||||
} else if (convertLongToBoolean && result instanceof Long) {
|
||||
if ((Long) result == 1l) {
|
||||
return true;
|
||||
} else if ((Long) result == 0l) {
|
||||
return false;
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} else if (convertStringToProps && result instanceof String) {
|
||||
return Converters.toProperties((String) result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
protected void verifyResults(List<Object> expected) {
|
||||
List<Object> expectedTx = new ArrayList<Object>();
|
||||
for (int i = 0; i < actual.size(); i++) {
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
package org.springframework.data.redis.connection;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.springframework.test.annotation.IfProfileValue;
|
||||
|
||||
public class ConvertingAbstractConnectionTransactionIntegrationTests extends
|
||||
AbstractConnectionIntegrationTests {
|
||||
|
||||
@Ignore
|
||||
public void testMultiDiscard() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testMultiExec() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testUnwatch() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testWatch() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testExecWithoutMulti() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testErrorInTx() {
|
||||
}
|
||||
|
||||
/*
|
||||
* Using blocking ops inside a tx does not make a lot of sense as it would require blocking the
|
||||
* entire server in order to execute the block atomically, which in turn does not allow other
|
||||
* clients to perform a push operation. *
|
||||
*/
|
||||
|
||||
@Ignore
|
||||
public void testBLPop() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testBRPop() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testBRPopLPush() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testBLPopTimeout() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testBRPopTimeout() {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testBRPopLPushTimeout() {
|
||||
}
|
||||
|
||||
@Ignore("Pub/Sub not supported with transactions")
|
||||
public void testPubSubWithNamedChannels() throws Exception {
|
||||
}
|
||||
|
||||
@Ignore("Pub/Sub not supported with transactions")
|
||||
public void testPubSubWithPatterns() throws Exception {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testNullKey() throws Exception {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testNullValue() throws Exception {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testHashNullKey() throws Exception {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public void testHashNullValue() throws Exception {
|
||||
}
|
||||
|
||||
@Test(expected = UnsupportedOperationException.class)
|
||||
public void testWatchWhileInTx() {
|
||||
connection.watch("foo".getBytes());
|
||||
}
|
||||
|
||||
@Test(expected = UnsupportedOperationException.class)
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testScriptKill() {
|
||||
// Impossible to call script kill in a tx because you can't issue the
|
||||
// exec command while Redis is running a script
|
||||
connection.scriptKill();
|
||||
}
|
||||
|
||||
protected void initConnection() {
|
||||
connection.multi();
|
||||
}
|
||||
|
||||
protected List<Object> getResults() {
|
||||
return connection.exec();
|
||||
}
|
||||
|
||||
protected void verifyResults(List<Object> expected) {
|
||||
List<Object> expectedTx = new ArrayList<Object>();
|
||||
for (int i = 0; i < actual.size(); i++) {
|
||||
expectedTx.add(null);
|
||||
}
|
||||
assertEquals(expectedTx, actual);
|
||||
List<Object> results = getResults();
|
||||
assertEquals(expected, results);
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,7 @@ import org.junit.After;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.data.redis.connection.ConvertingAbstractConnectionTransactionIntegrationTests;
|
||||
import org.springframework.data.redis.connection.AbstractConnectionTransactionIntegrationTests;
|
||||
import org.springframework.test.annotation.IfProfileValue;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
@@ -37,7 +37,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration("JedisConnectionIntegrationTests-context.xml")
|
||||
public class JedisConnectionTransactionIntegrationTests extends
|
||||
ConvertingAbstractConnectionTransactionIntegrationTests {
|
||||
AbstractConnectionTransactionIntegrationTests {
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
|
||||
@@ -23,7 +23,6 @@ import static org.junit.Assume.assumeTrue;
|
||||
import static org.springframework.data.redis.SpinBarrier.waitFor;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import org.junit.Test;
|
||||
@@ -44,7 +43,6 @@ import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
import com.lambdaworks.redis.RedisAsyncConnection;
|
||||
import com.lambdaworks.redis.RedisException;
|
||||
|
||||
/**
|
||||
* Integration test of {@link LettuceConnection}
|
||||
@@ -286,16 +284,4 @@ public class LettuceConnectionIntegrationTests extends AbstractConnectionIntegra
|
||||
conn2.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testErrorInTx() {
|
||||
connection.multi();
|
||||
connection.set("foo","bar");
|
||||
// Try to do a list op on a value
|
||||
connection.lPop("foo");
|
||||
List<Object> execResults = connection.exec();
|
||||
// Lettuce puts the Exception in the exec results instead of throwing an Exception on exec
|
||||
// This should be fixed in DATAREDIS-208 when we convert results of tx.exec()
|
||||
assertTrue(execResults.get(1) instanceof RedisException);
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,6 @@ import static org.junit.Assume.assumeTrue;
|
||||
import static org.springframework.data.redis.SpinBarrier.waitFor;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import org.junit.Test;
|
||||
@@ -39,8 +38,6 @@ import org.springframework.test.annotation.IfProfileValue;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
import com.lambdaworks.redis.RedisException;
|
||||
|
||||
/**
|
||||
* Integration test of {@link LettuceConnection} pipeline functionality
|
||||
*
|
||||
@@ -129,19 +126,4 @@ public class LettuceConnectionPipelineIntegrationTests extends
|
||||
conn2.close();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testErrorInTx() {
|
||||
connection.multi();
|
||||
connection.set("foo","bar");
|
||||
// Try to do a list op on a value
|
||||
connection.lPop("foo");
|
||||
connection.exec();
|
||||
List<Object> results = getResults();
|
||||
List<Object> execResults = (List<Object>)results.get(0);
|
||||
// Lettuce puts the Exception in the exec results instead of throwing an Exception on exec
|
||||
// This should be fixed in DATAREDIS-208 when we convert results of tx.exec()
|
||||
assertTrue(execResults.get(1) instanceof RedisException);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,10 @@ import static org.junit.Assert.assertNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.data.redis.connection.RedisPipelineException;
|
||||
import org.springframework.test.annotation.IfProfileValue;
|
||||
|
||||
/**
|
||||
* Integration test of {@link LettuceConnection} transactions within a pipeline
|
||||
*
|
||||
@@ -14,6 +18,30 @@ import java.util.List;
|
||||
public class LettuceConnectionPipelineTxIntegrationTests extends
|
||||
LettuceConnectionTransactionIntegrationTests {
|
||||
|
||||
@Test(expected = RedisPipelineException.class)
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testEvalShaNotFound() {
|
||||
super.testEvalShaNotFound();
|
||||
}
|
||||
|
||||
@Test(expected = RedisPipelineException.class)
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testEvalReturnSingleError() {
|
||||
super.testEvalReturnSingleError();
|
||||
}
|
||||
|
||||
@Test(expected = RedisPipelineException.class)
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testRestoreBadData() {
|
||||
super.testRestoreBadData();
|
||||
}
|
||||
|
||||
@Test(expected = RedisPipelineException.class)
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
public void testRestoreExistingKey() {
|
||||
super.testRestoreExistingKey();
|
||||
}
|
||||
|
||||
protected void initConnection() {
|
||||
connection.openPipeline();
|
||||
connection.multi();
|
||||
@@ -21,17 +49,6 @@ public class LettuceConnectionPipelineTxIntegrationTests extends
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<Object> getResults() {
|
||||
assertNull(connection.exec());
|
||||
List<Object> pipelined = connection.closePipeline();
|
||||
// We expect only the results of exec to be in the closed pipeline
|
||||
assertEquals(1,pipelined.size());
|
||||
List<Object> txResults = (List<Object>)pipelined.get(0);
|
||||
// Return exec results and this test should behave exactly like its superclass
|
||||
return convertResults(txResults);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<Object> getResultsNoConversion() {
|
||||
assertNull(connection.exec());
|
||||
List<Object> pipelined = connection.closePipeline();
|
||||
// We expect only the results of exec to be in the closed pipeline
|
||||
|
||||
@@ -17,31 +17,18 @@ package org.springframework.data.redis.connection.lettuce;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.data.redis.connection.AbstractConnectionTransactionIntegrationTests;
|
||||
import org.springframework.data.redis.connection.DefaultStringRedisConnection;
|
||||
import org.springframework.data.redis.connection.DefaultStringTuple;
|
||||
import org.springframework.data.redis.connection.RedisZSetCommands.Tuple;
|
||||
import org.springframework.data.redis.connection.StringRedisConnection;
|
||||
import org.springframework.data.redis.connection.StringRedisConnection.StringTuple;
|
||||
import org.springframework.data.redis.connection.convert.SetConverter;
|
||||
import org.springframework.test.annotation.IfProfileValue;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
import com.lambdaworks.redis.KeyValue;
|
||||
import com.lambdaworks.redis.ScoredValue;
|
||||
|
||||
/**
|
||||
* Integration test of {@link LettuceConnection} functionality within a
|
||||
* transaction
|
||||
@@ -54,141 +41,11 @@ import com.lambdaworks.redis.ScoredValue;
|
||||
public class LettuceConnectionTransactionIntegrationTests extends
|
||||
AbstractConnectionTransactionIntegrationTests {
|
||||
|
||||
private boolean convertListToSet;
|
||||
|
||||
|
||||
@Test
|
||||
@Ignore("Exceptions on native execute are swallowed in tx")
|
||||
@Ignore("DATAREDIS-226 Exceptions on native execute are swallowed in tx")
|
||||
public void exceptionExecuteNative() throws Exception {
|
||||
}
|
||||
|
||||
// Native Lettuce returns ZSets as Lists
|
||||
@Test
|
||||
public void testZAddAndZRange() {
|
||||
convertListToSet = true;
|
||||
super.testZAddAndZRange();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZIncrBy() {
|
||||
convertListToSet = true;
|
||||
super.testZIncrBy();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZInterStore() {
|
||||
convertListToSet = true;
|
||||
super.testZInterStore();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZInterStoreAggWeights() {
|
||||
convertListToSet = true;
|
||||
super.testZInterStoreAggWeights();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRangeWithScores() {
|
||||
convertListToSet = true;
|
||||
super.testZRangeWithScores();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRangeByScore() {
|
||||
convertListToSet = true;
|
||||
super.testZRangeByScore();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRangeByScoreOffsetCount() {
|
||||
convertListToSet = true;
|
||||
super.testZRangeByScoreOffsetCount();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRangeByScoreWithScores() {
|
||||
convertListToSet = true;
|
||||
super.testZRangeByScoreWithScores();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRangeByScoreWithScoresOffsetCount() {
|
||||
convertListToSet = true;
|
||||
super.testZRangeByScoreWithScoresOffsetCount();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRevRangeByScoreOffsetCount() {
|
||||
convertListToSet = true;
|
||||
super.testZRevRangeByScoreOffsetCount();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRevRangeByScore() {
|
||||
convertListToSet = true;
|
||||
super.testZRevRangeByScore();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRevRange() {
|
||||
convertListToSet = true;
|
||||
super.testZRevRange();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRevRangeWithScores() {
|
||||
convertListToSet = true;
|
||||
super.testZRevRangeWithScores();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRem() {
|
||||
convertListToSet = true;
|
||||
super.testZRem();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRemRangeByRank() {
|
||||
convertListToSet = true;
|
||||
super.testZRemRangeByRank();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZRemRangeByScore() {
|
||||
convertListToSet = true;
|
||||
super.testZRemRangeByScore();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZUnionStore() {
|
||||
convertListToSet = true;
|
||||
super.testZUnionStore();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZUnionStoreAggWeights() {
|
||||
convertListToSet = true;
|
||||
super.testZUnionStoreAggWeights();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBitSet() throws Exception {
|
||||
convertLongToBoolean = false;
|
||||
String key = "bitset-test";
|
||||
connection.setBit(key, 0, false);
|
||||
connection.setBit(key, 1, true);
|
||||
actual.add(connection.getBit(key, 0));
|
||||
actual.add(connection.getBit(key, 1));
|
||||
// Lettuce setBit returns Long instead of void
|
||||
verifyResults(Arrays.asList(new Object[] { 0l, 0l, 0l, 1l }));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHKeys() {
|
||||
convertListToSet = true;
|
||||
super.testHKeys();
|
||||
}
|
||||
|
||||
@Test(expected = UnsupportedOperationException.class)
|
||||
public void testBitOpNotMultipleSources() {
|
||||
super.testBitOpNotMultipleSources();
|
||||
@@ -200,12 +57,6 @@ public class LettuceConnectionTransactionIntegrationTests extends
|
||||
super.testSRandMemberCountNegative();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSortStoreNullParams() {
|
||||
convertLongToBoolean = false;
|
||||
super.testSortStoreNullParams();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMove() {
|
||||
connection.set("foo", "bar");
|
||||
@@ -230,43 +81,4 @@ public class LettuceConnectionTransactionIntegrationTests extends
|
||||
public void testSelect() {
|
||||
super.testSelect();
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
protected Object convertResult(Object result) {
|
||||
if (!convert) {
|
||||
return result;
|
||||
}
|
||||
Object convertedResult = super.convertResult(result);
|
||||
if (convertedResult instanceof KeyValue) {
|
||||
List<String> keyValue = new ArrayList<String>();
|
||||
keyValue.add((String) super.convertResult(((KeyValue) convertedResult).key));
|
||||
keyValue.add((String) super.convertResult(((KeyValue) convertedResult).value));
|
||||
return keyValue;
|
||||
}
|
||||
if (convertedResult instanceof List && !(((List) result).isEmpty())
|
||||
&& ((List) convertedResult).get(0) instanceof ScoredValue) {
|
||||
Set<Tuple> tuples = LettuceConverters.toTupleSet((List) convertedResult);
|
||||
return new SetConverter<Tuple, StringTuple>(new TupleConverter())
|
||||
.convert(tuples);
|
||||
}
|
||||
if (convertListToSet && convertedResult instanceof List) {
|
||||
return new LinkedHashSet((List) convertedResult);
|
||||
}
|
||||
if (convertStringToProps && convertedResult instanceof String) {
|
||||
return LettuceConverters.toProperties((String) convertedResult);
|
||||
}
|
||||
return convertedResult;
|
||||
}
|
||||
|
||||
private class TupleConverter implements Converter<Tuple, StringTuple> {
|
||||
public StringTuple convert(Tuple source) {
|
||||
return new DefaultStringTuple(source, stringSerializer.deserialize(source.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DataAccessException convertException(Exception ex) {
|
||||
return LettuceConverters.toDataAccessException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import java.util.Arrays;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.data.redis.connection.ConvertingAbstractConnectionTransactionIntegrationTests;
|
||||
import org.springframework.data.redis.connection.AbstractConnectionTransactionIntegrationTests;
|
||||
import org.springframework.data.redis.connection.ReturnType;
|
||||
import org.springframework.test.annotation.IfProfileValue;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
@@ -35,7 +35,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration("SrpConnectionIntegrationTests-context.xml")
|
||||
public class SrpConnectionTransactionIntegrationTests extends ConvertingAbstractConnectionTransactionIntegrationTests {
|
||||
public class SrpConnectionTransactionIntegrationTests extends AbstractConnectionTransactionIntegrationTests {
|
||||
|
||||
@Test
|
||||
@IfProfileValue(name = "redisVersion", value = "2.6")
|
||||
|
||||
Reference in New Issue
Block a user