/*
* Copyright 2002-2016 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.integration.redis.rules;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.junit.Rule;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.BoundZSetOperations;
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.channel.QueueChannel;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.messaging.Message;
/**
* @author Oleg Zhurakousky
* @author Gary Russell
* @author Artem Bilan
*
*/
public class RedisAvailableTests {
@Rule
public RedisAvailableRule redisAvailableRule = new RedisAvailableRule();
private RedisConnectionFactory connectionFactory;
protected RedisConnectionFactory getConnectionFactoryForTest() {
if (this.connectionFactory != null) {
return this.connectionFactory;
}
RedisConnectionFactory connectionFactory = RedisAvailableRule.connectionFactoryResource.get();
this.connectionFactory = connectionFactory;
return connectionFactory;
}
protected void awaitContainerSubscribed(RedisMessageListenerContainer container) throws Exception {
awaitContainerSubscribedNoWait(container);
// wait another second because of race condition
Thread.sleep(1000);
}
private void awaitContainerSubscribedNoWait(RedisMessageListenerContainer container) throws InterruptedException {
RedisConnection connection = null;
int n = 0;
while (n++ < 300 &&
(connection =
TestUtils.getPropertyValue(container, "subscriptionTask.connection", RedisConnection .class)) == null) {
Thread.sleep(100);
}
assertNotNull("RedisMessageListenerContainer Failed to Connect", connection);
n = 0;
while (n++ < 300 && !connection.isSubscribed()) {
Thread.sleep(100);
}
assertTrue("RedisMessageListenerContainer Failed to Subscribe", n < 300);
}
protected void awaitContainerSubscribedWithPatterns(RedisMessageListenerContainer container) throws Exception {
this.awaitContainerSubscribed(container);
RedisConnection connection = TestUtils.getPropertyValue(container, "subscriptionTask.connection",
RedisConnection.class);
int n = 0;
while (n++ < 300 && connection.getSubscription().getPatterns().size() == 0) {
Thread.sleep(100);
}
assertTrue("RedisMessageListenerContainer Failed to Subscribe with patterns", n < 300);
// wait another second because of race condition
Thread.sleep(1000);
}
protected void awaitFullySubscribed(RedisMessageListenerContainer container, RedisTemplate<?, ?> redisTemplate,
String redisChannelName, QueueChannel channel, Object message) throws Exception {
awaitContainerSubscribedNoWait(container);
drain(channel);
long now = System.currentTimeMillis();
Message<?> received = null;
while (received == null && System.currentTimeMillis() - now < 30000) {
redisTemplate.convertAndSend(redisChannelName, message);
received = channel.receive(1000);
}
drain(channel);
assertNotNull("Container failed to fully start", received);
}
private void drain(QueueChannel channel) {
while (channel.receive(0) != null) {
// drain
}
}
protected void prepareList(RedisConnectionFactory connectionFactory) {
StringRedisTemplate redisTemplate = createStringRedisTemplate(connectionFactory);
redisTemplate.delete("presidents");
BoundListOperations<String, String> ops = redisTemplate.boundListOps("presidents");
ops.rightPush("John Adams");
ops.rightPush("Barack Obama");
ops.rightPush("Thomas Jefferson");
ops.rightPush("John Quincy Adams");
ops.rightPush("Zachary Taylor");
ops.rightPush("Theodore Roosevelt");
ops.rightPush("Woodrow Wilson");
ops.rightPush("George W. Bush");
ops.rightPush("Franklin D. Roosevelt");
ops.rightPush("Ronald Reagan");
ops.rightPush("William J. Clinton");
ops.rightPush("Abraham Lincoln");
ops.rightPush("George Washington");
}
protected void prepareZset(RedisConnectionFactory connectionFactory) {
StringRedisTemplate redisTemplate = createStringRedisTemplate(connectionFactory);
redisTemplate.delete("presidents");
BoundZSetOperations<String, String> ops = redisTemplate.boundZSetOps("presidents");
ops.add("John Adams", 18);
ops.add("Barack Obama", 21);
ops.add("Thomas Jefferson", 19);
ops.add("John Quincy Adams", 19);
ops.add("Zachary Taylor", 19);
ops.add("Theodore Roosevelt", 20);
ops.add("Woodrow Wilson", 20);
ops.add("George W. Bush", 21);
ops.add("Franklin D. Roosevelt", 20);
ops.add("Ronald Reagan", 20);
ops.add("William J. Clinton", 20);
ops.add("Abraham Lincoln", 19);
ops.add("George Washington", 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;
}
}