INT-3355 Improve Redis Tests

JIRA: https://jira.spring.io/browse/INT-3355

Previously, the RedisAvailableTests unconditionally
flushed Redis; this is not appropriate and could affect
other builds on the CI server (as well as wiping out the
developer's Redis DB).

Change the tests to clean up their own redis data.

Conflicts:

	.gitignore
	spring-integration-redis/src/test/java/org/springframework/integration/redis/inbound/RedisStoreInboundChannelAdapterIntegrationTests.java
	spring-integration-redis/src/test/java/org/springframework/integration/redis/outbound/RedisStoreOutboundChannelAdapterIntegrationTests.java
	spring-integration-redis/src/test/java/org/springframework/integration/redis/outbound/RedisStoreWritingMessageHandlerTests.java
	spring-integration-redis/src/test/java/org/springframework/integration/redis/rules/RedisAvailableTests.java
	spring-integration-redis/src/test/java/org/springframework/integration/redis/store/DelayerHandlerRescheduleIntegrationTests.java
	spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageGroupStoreTests.java
	spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageStoreTests.java

Resolved.
This commit is contained in:
Gary Russell
2014-04-07 09:11:18 -04:00
committed by Artem Bilan
parent e74599f18f
commit 5eb93aa2f0
8 changed files with 254 additions and 56 deletions

3
.gitignore vendored
View File

@@ -26,3 +26,6 @@ spring-integration-jms/activemq-data/
spring-integration-samples/loanshark/application.log*
target
vf.gf.dmn-*
/atlassian-ide-plugin.xml
hostkey.ser
.springBeans

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2012 the original author or authors.
* Copyright 2002-2014 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.
@@ -19,21 +19,31 @@ package org.springframework.integration.redis.inbound;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.collections.RedisList;
import org.springframework.data.redis.support.collections.RedisZSet;
import org.springframework.integration.Message;
import org.springframework.integration.MessagingException;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.core.MessageHandler;
import org.springframework.integration.core.SubscribableChannel;
import org.springframework.integration.endpoint.SourcePollingChannelAdapter;
import org.springframework.integration.redis.rules.RedisAvailable;
import org.springframework.integration.redis.rules.RedisAvailableTests;
/**
* @author Oleg Zhurakousky
* @author Artem Bilan
* @author Gary Russell
* @since 2.2
*/
public class RedisStoreInboundChannelAdapterIntegrationTests extends RedisAvailableTests{
@@ -57,14 +67,18 @@ public class RedisStoreInboundChannelAdapterIntegrationTests extends RedisAvaila
message = (Message<RedisList<Object>>) redisChannel.receive(1000);
assertNotNull(message);
assertEquals(13, message.getPayload().size());
this.deletePresidents(jcf);
context.close();
}
@Test
@RedisAvailable
@SuppressWarnings("unchecked")
// synchronization commit renames the list
public void testListInboundConfigurationWithSynchronization() throws Exception{
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
StringRedisTemplate template = this.createStringRedisTemplate(jcf);
template.delete("bar");
this.prepareList(jcf);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("list-inbound-adapter.xml", this.getClass());
SourcePollingChannelAdapter spca = context.getBean("listAdapterWithSynchronization", SourcePollingChannelAdapter.class);
@@ -78,6 +92,44 @@ public class RedisStoreInboundChannelAdapterIntegrationTests extends RedisAvaila
//poll again, should get nothing since the collection was removed during synchronization
message = (Message<RedisList<Object>>) redisChannel.receive(1000);
assertNull(message);
assertEquals(Long.valueOf(13), template.boundListOps("bar").size());
template.delete("bar");
spca.stop();
context.close();
}
@Test
@RedisAvailable
// synchronization rollback renames the list
public void testListInboundConfigurationWithSynchronizationAndRollback() throws Exception{
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
StringRedisTemplate template = this.createStringRedisTemplate(jcf);
template.delete("baz");
this.prepareList(jcf);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("list-inbound-adapter.xml",
this.getClass());
SubscribableChannel fail = context.getBean("redisFailChannel", SubscribableChannel.class);
final CountDownLatch latch = new CountDownLatch(1);
fail.subscribe(new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
latch.countDown();
throw new RuntimeException("Test Rollback");
}
});
SourcePollingChannelAdapter spca = context.getBean("listAdapterWithSynchronizationAndRollback",
SourcePollingChannelAdapter.class);
spca.start();
assertTrue(latch.await(10, TimeUnit.SECONDS));
int n = 0;
while (n++ < 100 && template.keys("baz").size() == 0) {
Thread.sleep(100);
}
assertTrue("Rename didn't occcur", n < 100);
assertEquals(Long.valueOf(13), template.boundListOps("baz").size());
template.delete("baz");
spca.stop();
context.close();
@@ -86,8 +138,11 @@ public class RedisStoreInboundChannelAdapterIntegrationTests extends RedisAvaila
@Test
@RedisAvailable
@SuppressWarnings("unchecked")
// synchronization commit renames the list
public void testListInboundConfigurationWithSynchronizationAndTemplate() throws Exception{
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
StringRedisTemplate template = this.createStringRedisTemplate(jcf);
template.delete("bar");
this.prepareList(jcf);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("list-inbound-adapter.xml", this.getClass());
SourcePollingChannelAdapter spca = context.getBean("listAdapterWithSynchronizationAndRedisTemplate", SourcePollingChannelAdapter.class);
@@ -101,6 +156,8 @@ public class RedisStoreInboundChannelAdapterIntegrationTests extends RedisAvaila
//poll again, should get nothing since the collection was removed during synchronization
message = (Message<RedisList<Object>>) redisChannel.receive(1000);
assertNull(message);
assertEquals(Long.valueOf(13), template.boundListOps("bar").size());
template.delete("bar");
spca.stop();
context.close();
@@ -224,6 +281,9 @@ public class RedisStoreInboundChannelAdapterIntegrationTests extends RedisAvaila
assertEquals(11, message.getPayload().size());
zsetAdapterNoScore.stop();
zsetAdapterWithSingleScoreAndSynchronization.stop();
this.deletePresidents(jcf);
context.close();
}

View File

@@ -49,7 +49,7 @@
</int-redis:store-inbound-channel-adapter>
<int:transaction-synchronization-factory id="syncFactory">
<int:after-commit expression="#resource.attributes['store'].rename('bar')"/>
<int:after-commit expression="#store.rename('bar')"/>
<int:after-rollback expression="#store.rename('baz')"/>
</int:transaction-synchronization-factory>

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2007-2012 the original author or authors
* Copyright 2007-2014 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.
@@ -27,6 +27,7 @@ import java.util.Properties;
import java.util.Set;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
@@ -56,6 +57,7 @@ import org.springframework.integration.test.util.TestUtils;
/**
* @author Oleg Zhurakousky
* @author Mark Fisher
* @author Gary Russell
* @since 2.2
*/
public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvailableTests {
@@ -65,6 +67,7 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
public void testListWithKeyAsHeader(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisList<String> redisList =
new DefaultRedisList<String>("pepboys", this.initTemplate(jcf, new StringRedisTemplate()));
assertEquals(0, redisList.size());
@@ -79,6 +82,8 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
redisChannel.send(message);
assertEquals(3, redisList.size());
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test
@@ -98,12 +103,14 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals(1, redisList.size());
redisTemplate.delete("foo");
context.close();
}
@Test
@RedisAvailable
public void testListWithProvidedKey(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisList<String> redisList =
new DefaultRedisList<String>("pepboys", this.initTemplate(jcf, new StringRedisTemplate()));
assertEquals(0, redisList.size());
@@ -118,6 +125,8 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
redisChannel.send(message);
assertEquals(3, redisList.size());
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test
@@ -143,6 +152,7 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals(1, redisZSet.size());
assertEquals(Double.valueOf(2), redisZSet.score("bar"));
redisTemplate.delete("foo");
context.close();
}
@Test
@@ -171,6 +181,7 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals(1, redisZSet.size());
assertEquals(Double.valueOf(1), redisZSet.score("bar"));
redisTemplate.delete("foo");
context.close();
}
@Test
@@ -199,6 +210,7 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals(1, redisZSet.size());
assertEquals(Double.valueOf(4), redisZSet.score("bar"));
redisTemplate.delete("foo");
context.close();
}
@Test
@@ -228,12 +240,14 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals(1, redisZSet.size());
assertEquals(Double.valueOf(15), redisZSet.score("bar"));
redisTemplate.delete("foo");
context.close();
}
@Test
@RedisAvailable
public void testMapToZsetWithProvidedKey(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deletePresidents(jcf);
RedisZSet<String> redisZset =
new DefaultRedisZSet<String>("presidents", this.initTemplate(jcf, new StringRedisTemplate()));
assertEquals(0, redisZset.size());
@@ -274,12 +288,15 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals(1, redisZset.rangeByScore(18, 18).size());
assertEquals(4, redisZset.rangeByScore(18, 19).size());
assertEquals(1, redisZset.rangeByScore(31, 31).size());
this.deletePresidents(jcf);
context.close();
}
@Test
@RedisAvailable
public void testMapToMapWithProvidedKey(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisMap<String, String> redisMap =
new DefaultRedisMap<String, String>("pepboys",
this.initTemplate(jcf, new StringRedisTemplate()));
@@ -303,12 +320,15 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
RedisStoreWritingMessageHandler.class);
assertEquals("pepboys", TestUtils.getPropertyValue(handler, "keyExpression", LiteralExpression.class).getExpressionString());
assertEquals("'foo'", TestUtils.getPropertyValue(handler, "mapKeyExpression", SpelExpression.class).getExpressionString());
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test(expected=MessageHandlingException.class) // map key is not provided
@RedisAvailable
public void testMapToMapAsSingleEntryWithKeyAsHeaderFail(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisMap<String, Map<String, String>> redisMap =
new DefaultRedisMap<String, Map<String, String>>("pepboys",
this.initTemplate(jcf, new RedisTemplate<String, Map<String, Map<String, String>>>()));
@@ -325,12 +345,15 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
Message<Map<String, String>> message = MessageBuilder.withPayload(pepboys).
setHeader(RedisHeaders.KEY, "pepboys").build();
redisChannel.send(message);
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test(expected=MessageHandlingException.class) // key is not provided
@RedisAvailable
public void testMapToMapNoKey(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisTemplate<String, Map<String, Map<String, String>>> redisTemplate = new RedisTemplate<String, Map<String, Map<String, String>>>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
@@ -349,12 +372,15 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
Message<Map<String, String>> message = MessageBuilder.withPayload(pepboys).build();
redisChannel.send(message);
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test
@RedisAvailable
public void testMapToMapAsSingleEntryWithKeyAsHeader(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisTemplate<String, Map<String, Map<String, String>>> redisTemplate = new RedisTemplate<String, Map<String, Map<String, String>>>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
@@ -379,12 +405,15 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals("Manny", pepboyz.get("1"));
assertEquals("Moe", pepboyz.get("2"));
assertEquals("Jack", pepboyz.get("3"));
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test
@RedisAvailable
public void testStoreSimpleStringInMap(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "bar");
StringRedisTemplate redisTemplate = new StringRedisTemplate();
RedisMap<String, String> redisMap =
new DefaultRedisMap<String, String>("bar",
@@ -401,12 +430,15 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
String hello = redisMap.get("foo");
assertEquals("hello, world!", hello);
this.deleteKey(jcf, "bar");
context.close();
}
@Test
@RedisAvailable
public void testSetWithKeyAsHeader(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisSet<String> redisSet =
new DefaultRedisSet<String>("pepboys", this.initTemplate(jcf, new StringRedisTemplate()));
assertEquals(0, redisSet.size());
@@ -421,6 +453,8 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
redisChannel.send(message);
assertEquals(3, redisSet.size());
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test
@@ -440,12 +474,14 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals(1, redisSet.size());
redisTemplate.delete("foo");
context.close();
}
@Test
@RedisAvailable
public void testSetWithKeyAsHeaderNotParsed(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
@@ -463,12 +499,15 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
redisChannel.send(message);
assertEquals(1, redisSet.size());
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test
@RedisAvailable
public void testPojoIntoSet(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisSet<String> redisSet =
new DefaultRedisSet<String>("pepboys", this.initTemplate(jcf, new StringRedisTemplate()));
assertEquals(0, redisSet.size());
@@ -480,12 +519,15 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
redisChannel.send(message);
assertEquals(1, redisSet.size());
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test
@RedisAvailable
public void testProperties(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "pepboys");
RedisProperties redisProperties =
new RedisProperties("pepboys", this.initTemplate(jcf, new StringRedisTemplate()));
@@ -503,6 +545,8 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals("Manny", redisProperties.get("1"));
assertEquals("Moe", redisProperties.get("2"));
assertEquals("Jack", redisProperties.get("3"));
this.deleteKey(jcf, "pepboys");
context.close();
}
@Test
@@ -525,6 +569,7 @@ public class RedisStoreOutboundChannelAdapterIntegrationTests extends RedisAvail
assertEquals("bar", redisProperties.get("qux"));
redisTemplate.delete("foo");
context.close();
}
private <K,V> RedisTemplate<K,V> initTemplate(RedisConnectionFactory rcf, RedisTemplate<K,V> redisTemplate){

View File

@@ -34,6 +34,7 @@ import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.data.redis.support.collections.DefaultRedisList;
import org.springframework.data.redis.support.collections.DefaultRedisZSet;
import org.springframework.data.redis.support.collections.RedisCollectionFactoryBean.CollectionType;
@@ -59,6 +60,7 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
@RedisAvailable
public void testListWithListPayloadParsedAndProvidedKey() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisList<String> redisList =
new DefaultRedisList<String>(key, this.initTemplate(jcf, new StringRedisTemplate()));
@@ -81,12 +83,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
assertEquals("Manny", redisList.get(0));
assertEquals("Moe", redisList.get(1));
assertEquals("Jack", redisList.get(2));
this.deleteKey(jcf, "foo");
}
@Test
@RedisAvailable
public void testListWithListPayloadParsedAndProvidedKeyAsHeader() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisList<String> redisList =
new DefaultRedisList<String>(key, this.initTemplate(jcf, new StringRedisTemplate()));
@@ -109,12 +113,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
assertEquals("Manny", redisList.get(0));
assertEquals("Moe", redisList.get(1));
assertEquals("Jack", redisList.get(2));
this.deleteKey(jcf, "foo");
}
@RedisAvailable
@Test(expected=MessageHandlingException.class)
public void testListWithListPayloadParsedAndNoKey() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisList<String> redisList =
new DefaultRedisList<String>(key, this.initTemplate(jcf, new RedisTemplate<String, String>()));
@@ -131,12 +137,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
list.add("Jack");
Message<List<String>> message = MessageBuilder.withPayload(list).build();
handler.handleMessage(message);
this.deleteKey(jcf, "foo");
}
@Test
@RedisAvailable
public void testListWithListPayloadAsSingleEntry() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisList<List<String>> redisList =
new DefaultRedisList<List<String>>(key, this.initTemplate(jcf, new RedisTemplate<String, List<String>>()));
@@ -162,12 +170,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
assertEquals("Manny", resultList.get(0));
assertEquals("Moe", resultList.get(1));
assertEquals("Jack", resultList.get(2));
this.deleteKey(jcf, "foo");
}
@Test
@RedisAvailable
public void testZsetWithListPayloadParsedAndProvidedKeyDefault() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisZSet<String> redisZset =
new DefaultRedisZSet<String>(key, this.initTemplate(jcf, new StringRedisTemplate()));
@@ -200,12 +210,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
for (TypedTuple<String> pepboy : pepboys) {
assertEquals(Double.valueOf(2), pepboy.getScore());
}
this.deleteKey(jcf, "foo");
}
@Test
@RedisAvailable
public void testZsetWithListPayloadParsedAndProvidedKeyScoreIncrement() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisZSet<String> redisZset =
new DefaultRedisZSet<String>(key, this.initTemplate(jcf, new StringRedisTemplate()));
@@ -241,12 +253,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
for (TypedTuple<String> pepboy : pepboys) {
assertTrue(pepboy.getScore() == 2);
}
this.deleteKey(jcf, "foo");
}
@Test
@RedisAvailable
public void testZsetWithListPayloadParsedAndProvidedKeyScoreIncrementAsStringHeader() {// see INT-2775
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisZSet<String> redisZset =
new DefaultRedisZSet<String>(key, this.initTemplate(jcf, new StringRedisTemplate()));
@@ -282,12 +296,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
for (TypedTuple<String> pepboy : pepboys) {
assertTrue(pepboy.getScore() == 2);
}
this.deleteKey(jcf, "foo");
}
@Test
@RedisAvailable
public void testZsetWithListPayloadAsSingleEntryAndHeaderKeyHeaderScore() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisZSet<List<String>> redisZset =
new DefaultRedisZSet<List<String>>(key, this.initTemplate(jcf, new RedisTemplate<String, List<String>>()));
@@ -315,12 +331,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
for (TypedTuple<List<String>> pepboys : entries) {
assertTrue(pepboys.getScore() == 4);
}
this.deleteKey(jcf, "foo");
}
@Test
@RedisAvailable
public void testZsetWithMapPayloadParsedHeaderKey() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deletePresidents(jcf);
String key = "presidents";
RedisZSet<String> redisZset =
new DefaultRedisZSet<String>(key, this.initTemplate(jcf, new StringRedisTemplate()));
@@ -357,12 +375,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
Set<TypedTuple<String>> entries = redisZset.rangeByScoreWithScores(18, 19);
assertEquals(6, entries.size());
this.deletePresidents(jcf);
}
@Test
@RedisAvailable
public void testZsetWithMapPayloadPojoParsedHeaderKey() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deletePresidents(jcf);
String key = "presidents";
RedisZSet<President> redisZset =
new DefaultRedisZSet<President>(key, this.initTemplate(jcf, new RedisTemplate<String, President>()));
@@ -400,12 +420,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
Set<TypedTuple<President>> entries = redisZset.rangeByScoreWithScores(18, 19);
assertEquals(6, entries.size());
this.deletePresidents(jcf);
}
@Test
@RedisAvailable
public void testZsetWithMapPayloadPojoAsSingleEntryHeaderKey() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deletePresidents(jcf);
String key = "presidents";
RedisZSet<Map<President, Double>> redisZset =
new DefaultRedisZSet<Map<President, Double>>(key, this.initTemplate(jcf, new RedisTemplate<String, Map<President, Double>>()));
@@ -430,6 +452,7 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
handler.handleMessage(message);
assertEquals(1, redisZset.size());
this.deletePresidents(jcf);
}
@Test(expected=IllegalStateException.class)
@@ -474,6 +497,7 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
@RedisAvailable
public void testMapWithMapKeyExpression() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisStoreWritingMessageHandler handler =
new RedisStoreWritingMessageHandler(jcf);
@@ -486,12 +510,14 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
catch (Exception e) {
fail("No exception expected:" + e.getMessage());
}
this.deleteKey(jcf, "foo");
}
@Test
@RedisAvailable
public void testPropertiesWithMapKeyExpression() {
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
this.deleteKey(jcf, "foo");
String key = "foo";
RedisStoreWritingMessageHandler handler =
new RedisStoreWritingMessageHandler(jcf);
@@ -504,10 +530,12 @@ public class RedisStoreWritingMessageHandlerTests extends RedisAvailableTests{
catch (Exception e) {
fail("No exception expected:" + e.getMessage());
}
this.deleteKey(jcf, "foo");
}
private <K,V> RedisTemplate<K,V> initTemplate(RedisConnectionFactory rcf, RedisTemplate<K,V> redisTemplate) {
redisTemplate.setConnectionFactory(rcf);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

View File

@@ -15,17 +15,18 @@
*/
package org.springframework.integration.redis.rules;
import java.util.UUID;
import static org.junit.Assert.assertTrue;
import org.junit.Rule;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.BoundZSetOperations;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.integration.test.util.TestUtils;
/**
* @author Oleg Zhurakousky
@@ -36,29 +37,50 @@ public class RedisAvailableTests {
@Rule
public RedisAvailableRule redisAvailableRule = new RedisAvailableRule();
@SuppressWarnings({ "rawtypes", "unchecked" })
public JedisConnectionFactory getConnectionFactoryForTest(){
private JedisConnectionFactory connectionFactory;
public JedisConnectionFactory getConnectionFactoryForTest() {
if (this.connectionFactory != null) {
return this.connectionFactory;
}
JedisConnectionFactory jcf = new JedisConnectionFactory();
jcf.setPort(7379);
jcf.afterPropertiesSet();
RedisTemplate rt = new RedisTemplate<UUID, Object>();
rt.setConnectionFactory(jcf);
rt.execute(new RedisCallback() {
public Object doInRedis(RedisConnection connection)
throws DataAccessException {
connection.flushDb();
return null;
}
});
this.connectionFactory = jcf;
return jcf;
}
protected void awaitContainerSubscribed(RedisMessageListenerContainer container) throws Exception {
RedisConnection connection = TestUtils.getPropertyValue(container, "subscriptionTask.connection",
RedisConnection.class);
int n = 0;
while (n++ < 100 && !connection.isSubscribed()) {
Thread.sleep(100);
}
// TODO: remove this additional delay when/if https://jira.springsource.org/browse/DATAREDIS-242 is resolved
Thread.sleep(250);
assertTrue("RedisMessageListenerContainer Failed to Subscribe", n < 100);
}
protected void awaitContainerSubscribedWithPatterns(RedisMessageListenerContainer container) throws Exception {
this.awaitContainerSubscribed(container);
RedisConnection connection = TestUtils.getPropertyValue(container, "subscriptionTask.connection",
RedisConnection.class);
int n = 0;
while (n++ < 100 && connection.getSubscription().getPatterns().size() == 0) {
Thread.sleep(100);
}
// TODO: remove this additional delay when/if https://jira.springsource.org/browse/DATAREDIS-242 is resolved
Thread.sleep(250);
assertTrue("RedisMessageListenerContainer Failed to Subscribe with patterns", n < 100);
}
protected void prepareList(JedisConnectionFactory jcf){
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(jcf);
redisTemplate.afterPropertiesSet();
StringRedisTemplate redisTemplate = createStringRedisTemplate(connectionFactory);
redisTemplate.delete("presidents");
BoundListOperations<String, String> ops = redisTemplate.boundListOps("presidents");
ops.rightPush("John Adams");
@@ -80,10 +102,9 @@ public class RedisAvailableTests {
protected void prepareZset(JedisConnectionFactory jcf){
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(jcf);
redisTemplate.afterPropertiesSet();
StringRedisTemplate redisTemplate = createStringRedisTemplate(connectionFactory);
redisTemplate.delete("presidents");
BoundZSetOperations<String, String> ops = redisTemplate.boundZSetOps("presidents");
ops.add("John Adams", 18);
@@ -100,6 +121,22 @@ public class RedisAvailableTests {
ops.add("Ronald Reagan", 20);
ops.add("William J. Clinton", 20);
ops.add("Abraham Lincoln", 19);
ops.add("George Washington", 18);
ops.add("George Wahington", 18);
}
protected void deletePresidents(RedisConnectionFactory connectionFactory){
this.deleteKey(connectionFactory, "presidents");
}
protected void deleteKey(RedisConnectionFactory connectionFactory, String key) {
StringRedisTemplate redisTemplate = createStringRedisTemplate(connectionFactory);
redisTemplate.delete(key);
}
protected StringRedisTemplate createStringRedisTemplate(RedisConnectionFactory connectionFactory) {
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}

View File

@@ -31,11 +31,14 @@ import java.util.concurrent.TimeUnit;
import junit.framework.AssertionFailedError;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.integration.Message;
import org.springframework.integration.MessageChannel;
import org.springframework.integration.channel.DirectChannel;
@@ -50,10 +53,21 @@ import org.springframework.integration.support.MessageBuilder;
/**
* @author Oleg Zhurakousky
* @author Artem Bilan
* @author Gary Russell
*
*/
public class RedisMessageGroupStoreTests extends RedisAvailableTests {
@Before
@After
public void setUpTearDown() {
StringRedisTemplate template = this.createStringRedisTemplate(this.getConnectionFactoryForTest());
template.delete("MESSAGE_GROUP_1");
template.delete("MESSAGE_GROUP_2");
template.delete("MESSAGE_GROUP_3");
}
@Test
@RedisAvailable
public void testNonExistingEmptyMessageGroup() throws Exception{
@@ -317,6 +331,7 @@ public class RedisMessageGroupStoreTests extends RedisAvailableTests {
executor = Executors.newCachedThreadPool();
executor.execute(new Runnable() {
@Override
public void run() {
MessageGroup group = store1.addMessageToGroup(1, message);
if (group.getMessages().size() != 1){
@@ -326,6 +341,7 @@ public class RedisMessageGroupStoreTests extends RedisAvailableTests {
}
});
executor.execute(new Runnable() {
@Override
public void run() {
MessageGroup group = store2.removeMessageFromGroup(1, message);
if (group.getMessages().size() != 0){
@@ -344,9 +360,7 @@ public class RedisMessageGroupStoreTests extends RedisAvailableTests {
@Test
@RedisAvailable
public void testWithAggregatorWithShutdown(){
this.getConnectionFactoryForTest(); // for this test it only ensures that DB was flushed before test
public void testWithAggregatorWithShutdown() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("redis-aggregator-config.xml", this.getClass());
MessageChannel input = context.getBean("inputChannel", MessageChannel.class);
QueueChannel output = context.getBean("outputChannel", QueueChannel.class);
@@ -366,6 +380,7 @@ public class RedisMessageGroupStoreTests extends RedisAvailableTests {
Message<?> m3 = MessageBuilder.withPayload("3").setSequenceNumber(3).setSequenceSize(3).setCorrelationId(1).build();
input.send(m3);
assertNotNull(output.receive(1000));
context.close();
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2007-2011 the original author or authors
* Copyright 2007-2014 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.
@@ -15,13 +15,21 @@
*/
package org.springframework.integration.redis.store;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import java.io.Serializable;
import java.util.Properties;
import java.util.UUID;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.integration.Message;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.history.MessageHistory;
@@ -29,37 +37,39 @@ import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.redis.rules.RedisAvailable;
import org.springframework.integration.redis.rules.RedisAvailableTests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
/**
* @author Oleg Zhurakousky
*
*/
public class RedisMessageStoreTests extends RedisAvailableTests {
@Before
@After
public void setUpTearDown() {
StringRedisTemplate template = this.createStringRedisTemplate(this.getConnectionFactoryForTest());
template.delete(template.keys("MESSAGE_*"));
}
@Test
@RedisAvailable
public void testGetNonExistingMessage(){
public void testGetNonExistingMessage(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
RedisMessageStore store = new RedisMessageStore(jcf);
Message<?> message = store.getMessage(UUID.randomUUID());
assertNull(message);
}
@Test
@RedisAvailable
public void testGetMessageCountWhenEmpty(){
public void testGetMessageCountWhenEmpty(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
RedisMessageStore store = new RedisMessageStore(jcf);
assertEquals(0, store.getMessageCount());
}
@Test
@RedisAvailable
public void testAddStringMessage(){
public void testAddStringMessage(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
RedisMessageStore store = new RedisMessageStore(jcf);
Message<String> stringMessage = new GenericMessage<String>("Hello Redis");
@@ -67,36 +77,36 @@ public class RedisMessageStoreTests extends RedisAvailableTests {
assertNotSame(stringMessage, storedMessage);
assertEquals("Hello Redis", storedMessage.getPayload());
}
@Test
@RedisAvailable
public void testAddSerializableObjectMessage(){
public void testAddSerializableObjectMessage(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
RedisMessageStore store = new RedisMessageStore(jcf);
Address address = new Address();
address.setAddress("1600 Pennsylvania Av, Washington, DC");
Person person = new Person(address, "Barak Obama");
Message<Person> objectMessage = new GenericMessage<Person>(person);
Message<Person> storedMessage = store.addMessage(objectMessage);
assertNotSame(objectMessage, storedMessage);
assertEquals("Barak Obama", storedMessage.getPayload().getName());
}
@Test(expected=IllegalArgumentException.class)
@RedisAvailable
public void testAddNonSerializableObjectMessage(){
public void testAddNonSerializableObjectMessage(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
RedisMessageStore store = new RedisMessageStore(jcf);
Message<Foo> objectMessage = new GenericMessage<Foo>(new Foo());
store.addMessage(objectMessage);
}
@SuppressWarnings("unchecked")
@Test
@RedisAvailable
public void testAddAndGetStringMessage(){
public void testAddAndGetStringMessage(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
RedisMessageStore store = new RedisMessageStore(jcf);
Message<String> stringMessage = new GenericMessage<String>("Hello Redis");
@@ -108,7 +118,7 @@ public class RedisMessageStoreTests extends RedisAvailableTests {
@SuppressWarnings("unchecked")
@Test
@RedisAvailable
public void testAddAndRemoveStringMessage(){
public void testAddAndRemoveStringMessage(){
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
RedisMessageStore store = new RedisMessageStore(jcf);
Message<String> stringMessage = new GenericMessage<String>("Hello Redis");
@@ -118,19 +128,19 @@ public class RedisMessageStoreTests extends RedisAvailableTests {
assertEquals("Hello Redis", retrievedMessage.getPayload());
assertNull(store.getMessage(stringMessage.getHeaders().getId()));
}
@Test
@RedisAvailable
public void testWithMessageHistory() throws Exception{
public void testWithMessageHistory() throws Exception{
JedisConnectionFactory jcf = this.getConnectionFactoryForTest();
RedisMessageStore store = new RedisMessageStore(jcf);
Message<?> message = new GenericMessage<String>("Hello");
DirectChannel fooChannel = new DirectChannel();
fooChannel.setBeanName("fooChannel");
DirectChannel barChannel = new DirectChannel();
barChannel.setBeanName("barChannel");
message = MessageHistory.write(message, fooChannel);
message = MessageHistory.write(message, barChannel);
store.addMessage(message);
@@ -142,7 +152,7 @@ public class RedisMessageStoreTests extends RedisAvailableTests {
assertEquals("fooChannel", fooChannelHistory.get("name"));
assertEquals("channel", fooChannelHistory.get("type"));
}
@SuppressWarnings("serial")
public static class Person implements Serializable{
private Address address;
@@ -176,8 +186,8 @@ public class RedisMessageStoreTests extends RedisAvailableTests {
this.address = address;
}
}
public static class Foo{
}
}