Add missing client types to parameterized tests

This commit is contained in:
Jennifer Hickey
2013-03-14 16:39:46 -07:00
parent 0a7e3dd204
commit f45875f628
8 changed files with 246 additions and 31 deletions

View File

@@ -23,6 +23,7 @@ import org.springframework.data.redis.SettingsUtils;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.rjc.RjcConnectionFactory;
import org.springframework.data.redis.connection.srp.SrpConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.collections.ObjectFactory;
@@ -31,6 +32,7 @@ import org.springframework.data.redis.support.collections.StringObjectFactory;
/**
* @author Costin Leau
* @author Jennifer Hickey
*/
public class PubSubTestParams {
@@ -75,10 +77,23 @@ public class PubSubTestParams {
personTemplateLtc.setConnectionFactory(lettuceConnFactory);
personTemplateLtc.afterPropertiesSet();
// SRP
SrpConnectionFactory srpConnFactory = new SrpConnectionFactory();
srpConnFactory.setPort(SettingsUtils.getPort());
srpConnFactory.setHostName(SettingsUtils.getHost());
srpConnFactory.afterPropertiesSet();
RedisTemplate<String, String> stringTemplateSrp = new StringRedisTemplate(srpConnFactory);
RedisTemplate<String, Person> personTemplateSrp = new RedisTemplate<String, Person>();
personTemplateSrp.setConnectionFactory(srpConnFactory);
personTemplateSrp.afterPropertiesSet();
// JRedis does not support pub/sub
return Arrays.asList(new Object[][] { { stringFactory, stringTemplate }, { personFactory, personTemplate },
{ stringFactory, stringTemplateRJC }, { personFactory, personTemplateRJC },
{ stringFactory, stringTemplateLtc }, { personFactory, personTemplateLtc }
{ stringFactory, stringTemplateLtc }, { personFactory, personTemplateLtc },
{ stringFactory, stringTemplateSrp }, { personFactory, personTemplateSrp }
});
}
}

View File

@@ -15,7 +15,10 @@
*/
package org.springframework.data.redis.support;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
@@ -27,12 +30,14 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.springframework.data.redis.ConnectionFactoryTracker;
import org.springframework.data.redis.connection.jredis.JredisConnectionFactory;
import org.springframework.data.redis.core.BoundKeyOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.collections.ObjectFactory;
/**
* @author Costin Leau
* @author Jennifer Hickey
*/
@RunWith(Parameterized.class)
public class BoundKeyOperationsTest {
@@ -72,6 +77,7 @@ public class BoundKeyOperationsTest {
keyOps.rename(key);
assertEquals(key, keyOps.getKey());
}
@Test
public void testExpire() throws Exception {
assertEquals(Long.valueOf(-1), keyOps.getExpire());
@@ -83,6 +89,7 @@ public class BoundKeyOperationsTest {
@Test
public void testPersist() throws Exception {
assumeTrue(!isJredis());
keyOps.persist();
assertEquals(Long.valueOf(-1), keyOps.getExpire());
if (keyOps.expire(10, TimeUnit.SECONDS)) {
@@ -91,4 +98,8 @@ public class BoundKeyOperationsTest {
keyOps.persist();
assertEquals(-1, keyOps.getExpire().longValue());
}
private boolean isJredis() {
return template.getConnectionFactory() instanceof JredisConnectionFactory;
}
}

View File

@@ -1,12 +1,12 @@
/*
* Copyright 2011-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.
@@ -21,6 +21,9 @@ import java.util.Collection;
import org.springframework.data.redis.SettingsUtils;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.jredis.JredisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.rjc.RjcConnectionFactory;
import org.springframework.data.redis.connection.srp.SrpConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicInteger;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
@@ -32,37 +35,83 @@ import org.springframework.data.redis.support.collections.StringObjectFactory;
/**
* @author Costin Leau
* @author Jennifer Hickey
*/
public class BoundKeyParams {
public static Collection<Object[]> testParams() {
// create Jedis Factory
// Jedis
JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory();
jedisConnFactory.setPort(SettingsUtils.getPort());
jedisConnFactory.setHostName(SettingsUtils.getHost());
jedisConnFactory.afterPropertiesSet();
// jredis factory
StringRedisTemplate templateJS = new StringRedisTemplate(jedisConnFactory);
DefaultRedisMap mapJS = new DefaultRedisMap("bound:key:map", templateJS);
DefaultRedisSet setJS = new DefaultRedisSet("bound:key:set", templateJS);
RedisList list = new DefaultRedisList("bound:key:list", templateJS);
// JRedis
JredisConnectionFactory jredisConnFactory = new JredisConnectionFactory();
jredisConnFactory.setUsePool(true);
jredisConnFactory.setPort(SettingsUtils.getPort());
jredisConnFactory.setHostName(SettingsUtils.getHost());
jredisConnFactory.afterPropertiesSet();
StringRedisTemplate templateJS = new StringRedisTemplate(jedisConnFactory);
StringRedisTemplate templateJR = new StringRedisTemplate(jredisConnFactory);
DefaultRedisMap mapJR = new DefaultRedisMap("bound:key:mapJR", templateJR);
// Skip list and set. Rename in Collections uses Redis tx, not supported by JRedis
// Lettuce
LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory();
lettuceConnFactory.setPort(SettingsUtils.getPort());
lettuceConnFactory.setHostName(SettingsUtils.getHost());
lettuceConnFactory.afterPropertiesSet();
StringRedisTemplate templateLT = new StringRedisTemplate(lettuceConnFactory);
DefaultRedisMap mapLT = new DefaultRedisMap("bound:key:mapLT", templateLT);
DefaultRedisSet setLT = new DefaultRedisSet("bound:key:setLT", templateLT);
RedisList listLT = new DefaultRedisList("bound:key:listLT", templateLT);
// SRP
SrpConnectionFactory srpConnFactory = new SrpConnectionFactory();
srpConnFactory.setPort(SettingsUtils.getPort());
srpConnFactory.setHostName(SettingsUtils.getHost());
srpConnFactory.afterPropertiesSet();
StringRedisTemplate templateSRP = new StringRedisTemplate(srpConnFactory);
DefaultRedisMap mapSRP = new DefaultRedisMap("bound:key:mapSRP", templateSRP);
DefaultRedisSet setSRP = new DefaultRedisSet("bound:key:setSRP", templateSRP);
RedisList listSRP = new DefaultRedisList("bound:key:listSRP", templateSRP);
// RJC
RjcConnectionFactory rjcConnFactory = new RjcConnectionFactory();
rjcConnFactory.setPort(SettingsUtils.getPort());
rjcConnFactory.setHostName(SettingsUtils.getHost());
rjcConnFactory.afterPropertiesSet();
StringRedisTemplate templateRJC = new StringRedisTemplate(rjcConnFactory);
DefaultRedisMap mapRJC = new DefaultRedisMap("bound:key:mapRJC", templateRJC);
DefaultRedisSet setRJC = new DefaultRedisSet("bound:key:setRJC", templateRJC);
RedisList listRJC = new DefaultRedisList("bound:key:listRJC", templateRJC);
StringObjectFactory sof = new StringObjectFactory();
DefaultRedisMap mapJS = new DefaultRedisMap("bound:key:map", templateJS);
DefaultRedisSet setJS = new DefaultRedisSet("bound:key:set", templateJS);
RedisList list = new DefaultRedisList("bound:key:list", templateJS);
return Arrays.asList(new Object[][] {
{ new RedisAtomicInteger("bound:key:int", jedisConnFactory), sof, templateJS },
{ new RedisAtomicLong("bound:key:long", jedisConnFactory), sof, templateJS },
{ list, sof, templateJS }, { setJS, sof, templateJS }, { mapJS, sof, templateJS } });
{ list, sof, templateJS }, { setJS, sof, templateJS }, { mapJS, sof, templateJS },
{ new RedisAtomicInteger("bound:key:intJR", jredisConnFactory), sof, templateJR },
{ new RedisAtomicLong("bound:key:longJR", jredisConnFactory), sof, templateJR },
{ mapJR, sof, templateJR },
{ new RedisAtomicInteger("bound:key:intLT", lettuceConnFactory), sof, templateLT },
{ new RedisAtomicLong("bound:key:longLT", lettuceConnFactory), sof, templateLT },
{ listLT, sof, templateLT }, { setLT, sof, templateLT }, { mapLT, sof, templateLT },
{ new RedisAtomicInteger("bound:key:intSrp", srpConnFactory), sof, templateSRP },
{ new RedisAtomicLong("bound:key:longSrp", srpConnFactory), sof, templateSRP },
{ listSRP, sof, templateSRP }, { setSRP, sof, templateSRP }, { mapSRP, sof, templateSRP },
{ new RedisAtomicInteger("bound:key:intRjc", rjcConnFactory), sof, templateRJC },
{ new RedisAtomicLong("bound:key:longRjc", rjcConnFactory), sof, templateRJC },
{ listRJC, sof, templateRJC }, { setRJC, sof, templateRJC }, { mapRJC, sof, templateRJC }});
}
}

View File

@@ -20,27 +20,52 @@ import java.util.Collection;
import org.springframework.data.redis.SettingsUtils;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.jredis.JredisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.rjc.RjcConnectionFactory;
import org.springframework.data.redis.connection.srp.SrpConnectionFactory;
/**
* @author Costin Leau
* @author Jennifer Hickey
*/
public abstract class AtomicCountersParam {
public static Collection<Object[]> testParams() {
// create Jedis Factory
// Jedis
JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory();
jedisConnFactory.setPort(SettingsUtils.getPort());
jedisConnFactory.setHostName(SettingsUtils.getHost());
jedisConnFactory.setUsePool(true);
jedisConnFactory.afterPropertiesSet();
// jredis factory
// JredisConnectionFactory jredisConnFactory = new JredisConnectionFactory();
// jredisConnFactory.setUsePool(true);
// jredisConnFactory.setPort(SettingsUtils.getPort());
// jredisConnFactory.setHostName(SettingsUtils.getHost());
// jredisConnFactory.afterPropertiesSet();
// JRedis
JredisConnectionFactory jredisConnFactory = new JredisConnectionFactory();
jredisConnFactory.setUsePool(true);
jredisConnFactory.setPort(SettingsUtils.getPort());
jredisConnFactory.setHostName(SettingsUtils.getHost());
jredisConnFactory.afterPropertiesSet();
return Arrays.asList(new Object[][] { { jedisConnFactory } });
// Lettuce
LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory();
lettuceConnFactory.setPort(SettingsUtils.getPort());
lettuceConnFactory.setHostName(SettingsUtils.getHost());
lettuceConnFactory.afterPropertiesSet();
// SRP
SrpConnectionFactory srpConnFactory = new SrpConnectionFactory();
srpConnFactory.setPort(SettingsUtils.getPort());
srpConnFactory.setHostName(SettingsUtils.getHost());
srpConnFactory.afterPropertiesSet();
// RJC
RjcConnectionFactory rjcConnFactory = new RjcConnectionFactory();
rjcConnFactory.setPort(SettingsUtils.getPort());
rjcConnFactory.setHostName(SettingsUtils.getHost());
rjcConnFactory.afterPropertiesSet();
return Arrays.asList(new Object[][] { { jedisConnFactory },
{ jredisConnFactory}, { lettuceConnFactory },
{ srpConnFactory}, { rjcConnFactory } });
}
}

View File

@@ -18,6 +18,7 @@ package org.springframework.data.redis.support.atomic;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import java.util.Collection;
import java.util.concurrent.CountDownLatch;
@@ -32,9 +33,14 @@ import org.junit.runners.Parameterized.Parameters;
import org.springframework.data.redis.ConnectionFactoryTracker;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jredis.JredisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.rjc.RjcConnectionFactory;
import org.springframework.data.redis.connection.srp.SrpConnectionFactory;
/**
* @author Costin Leau
* @author Jennifer Hickey
*/
@RunWith(Parameterized.class)
public class RedisAtomicTests {
@@ -70,6 +76,8 @@ public class RedisAtomicTests {
@Test
public void testIntCheckAndSet() throws Exception {
// Txs not supported in Jredis
assumeTrue(!isJredis());
intCounter.set(0);
assertFalse(intCounter.compareAndSet(1, 10));
assertTrue(intCounter.compareAndSet(0, 10));
@@ -78,6 +86,8 @@ public class RedisAtomicTests {
@Test
public void testLongCheckAndSet() throws Exception {
// Txs not supported in Jredis
assumeTrue(!isJredis());
longCounter.set(0);
assertFalse(longCounter.compareAndSet(1, 10));
assertTrue(longCounter.compareAndSet(0, 10));
@@ -86,18 +96,24 @@ public class RedisAtomicTests {
@Test
public void testLongIncrement() throws Exception {
// DATAREDIS-121 incr/decr broken in RJC
assumeTrue(!isRjc());
longCounter.set(0);
assertEquals(1, longCounter.incrementAndGet());
}
@Test
public void testIntIncrement() throws Exception {
// DATAREDIS-121 incr/decr broken in RJC
assumeTrue(!isRjc());
intCounter.set(0);
assertEquals(1, intCounter.incrementAndGet());
}
@Test
public void testLongCustomIncrement() throws Exception {
// DATAREDIS-121 incr/decr broken in RJC
assumeTrue(!isRjc());
longCounter.set(0);
long delta = 5;
assertEquals(delta, longCounter.addAndGet(delta));
@@ -105,11 +121,29 @@ public class RedisAtomicTests {
@Test
public void testIntCustomIncrement() throws Exception {
// DATAREDIS-121 incr/decr broken in RJC
assumeTrue(!isRjc());
intCounter.set(0);
int delta = 5;
assertEquals(delta, intCounter.addAndGet(delta));
}
@Test
public void testLongDecrement() throws Exception {
// DATAREDIS-121 incr/decr broken in RJC
assumeTrue(!isRjc());
longCounter.set(1);
assertEquals(0, longCounter.decrementAndGet());
}
@Test
public void testIntDecrement() throws Exception {
// DATAREDIS-121 incr/decr broken in RJC
assumeTrue(!isRjc());
intCounter.set(1);
assertEquals(0, intCounter.decrementAndGet());
}
@Test
public void testReadExistingValue() throws Exception {
longCounter.set(5);
@@ -120,6 +154,9 @@ public class RedisAtomicTests {
// DATAREDIS-108
@Test
public void testCompareSet() throws Exception {
// Txs not supported in Jredis, Lettuce checkAndSet not working DATAREDIS-122,
// SRP checkAndSet not working DATAREDIS-123
assumeTrue(!isJredis() && !isLettuce() && !isSrp());
final AtomicBoolean alreadySet = new AtomicBoolean(false);
final int NUM = 50;
final String KEY = getClass().getSimpleName() + ":atomic:counter";
@@ -148,4 +185,20 @@ public class RedisAtomicTests {
assertFalse("counter already modified", failed.get());
}
private boolean isRjc() {
return factory instanceof RjcConnectionFactory;
}
private boolean isSrp() {
return factory instanceof SrpConnectionFactory;
}
private boolean isJredis() {
return factory instanceof JredisConnectionFactory;
}
private boolean isLettuce() {
return factory instanceof LettuceConnectionFactory;
}
}

View File

@@ -45,6 +45,7 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.redis.ConnectionFactoryTracker;
import org.springframework.data.redis.RedisSystemException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisOperations;
@@ -203,6 +204,8 @@ public abstract class AbstractRedisMapTests<K, V> {
System.out.println("Value is " + value);
} catch (InvalidDataAccessApiUsageException ex) {
// expected
} catch (RedisSystemException ex) {
// expected for SRP and Lettuce
}
}

View File

@@ -169,7 +169,7 @@ public abstract class CollectionTestParams {
lettuceConnFactory.setHostName(SettingsUtils.getHost());
lettuceConnFactory.afterPropertiesSet();
RedisTemplate<String, String> stringTemplateLtc = new StringRedisTemplate(srConnFactory);
RedisTemplate<String, String> stringTemplateLtc = new StringRedisTemplate(lettuceConnFactory);
RedisTemplate<String, Person> personTemplateLtc = new RedisTemplate<String, Person>();
personTemplateLtc.setConnectionFactory(lettuceConnFactory);
personTemplateLtc.afterPropertiesSet();

View File

@@ -23,7 +23,9 @@ import org.springframework.data.redis.Person;
import org.springframework.data.redis.SettingsUtils;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.jredis.JredisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.rjc.RjcConnectionFactory;
import org.springframework.data.redis.connection.srp.SrpConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JacksonJsonRedisSerializer;
import org.springframework.data.redis.serializer.OxmSerializer;
@@ -35,6 +37,7 @@ import org.springframework.oxm.xstream.XStreamMarshaller;
* Integration test for RedisMap.
*
* @author Costin Leau
* @author Jennifer Hickey
*/
public class RedisMapTests extends AbstractRedisMapTests<Object, Object> {
@@ -111,8 +114,6 @@ public class RedisMapTests extends AbstractRedisMapTests<Object, Object> {
jsonPersonTemplateJR.afterPropertiesSet();
// RJC
// rjc
RjcConnectionFactory rjcConnFactory = new RjcConnectionFactory();
rjcConnFactory.setUsePool(true);
rjcConnFactory.setPort(SettingsUtils.getPort());
@@ -135,23 +136,81 @@ public class RedisMapTests extends AbstractRedisMapTests<Object, Object> {
jsonPersonTemplateRJC.setHashValueSerializer(jsonStringSerializer);
jsonPersonTemplateRJC.afterPropertiesSet();
// Lettuce
LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory();
lettuceConnFactory.setPort(SettingsUtils.getPort());
lettuceConnFactory.setHostName(SettingsUtils.getHost());
lettuceConnFactory.afterPropertiesSet();
return Arrays.asList(new Object[][] { { stringFactory, stringFactory, genericTemplate },
{ personFactory, personFactory, genericTemplate }, { stringFactory, personFactory, genericTemplate },
RedisTemplate genericTemplateLettuce = new RedisTemplate();
genericTemplateLettuce.setConnectionFactory(lettuceConnFactory);
genericTemplateLettuce.afterPropertiesSet();
RedisTemplate<String, Person> xGenericTemplateLettuce = new RedisTemplate<String, Person>();
xGenericTemplateLettuce.setConnectionFactory(lettuceConnFactory);
xGenericTemplateLettuce.setDefaultSerializer(serializer);
xGenericTemplateLettuce.afterPropertiesSet();
RedisTemplate<String, Person> jsonPersonTemplateLettuce = new RedisTemplate<String, Person>();
jsonPersonTemplateLettuce.setConnectionFactory(lettuceConnFactory);
jsonPersonTemplateLettuce.setDefaultSerializer(jsonSerializer);
jsonPersonTemplateLettuce.setHashKeySerializer(jsonSerializer);
jsonPersonTemplateLettuce.setHashValueSerializer(jsonStringSerializer);
jsonPersonTemplateLettuce.afterPropertiesSet();
// SRP
SrpConnectionFactory srpConnFactory = new SrpConnectionFactory();
srpConnFactory.setPort(SettingsUtils.getPort());
srpConnFactory.setHostName(SettingsUtils.getHost());
srpConnFactory.afterPropertiesSet();
RedisTemplate genericTemplateSrp = new RedisTemplate();
genericTemplateSrp.setConnectionFactory(srpConnFactory);
genericTemplateSrp.afterPropertiesSet();
RedisTemplate<String, Person> xGenericTemplateSrp = new RedisTemplate<String, Person>();
xGenericTemplateSrp.setConnectionFactory(srpConnFactory);
xGenericTemplateSrp.setDefaultSerializer(serializer);
xGenericTemplateSrp.afterPropertiesSet();
RedisTemplate<String, Person> jsonPersonTemplateSrp = new RedisTemplate<String, Person>();
jsonPersonTemplateSrp.setConnectionFactory(srpConnFactory);
jsonPersonTemplateSrp.setDefaultSerializer(jsonSerializer);
jsonPersonTemplateSrp.setHashKeySerializer(jsonSerializer);
jsonPersonTemplateSrp.setHashValueSerializer(jsonStringSerializer);
jsonPersonTemplateSrp.afterPropertiesSet();
return Arrays.asList(new Object[][] {
{ stringFactory, stringFactory, genericTemplate },
{ personFactory, personFactory, genericTemplate },
{ stringFactory, personFactory, genericTemplate },
{ personFactory, stringFactory, genericTemplate },
{ personFactory, stringFactory, xstreamGenericTemplate },
{ personFactory, stringFactory, jsonPersonTemplate },
{ stringFactory, stringFactory, genericTemplateJR },
{ personFactory, personFactory, genericTemplateJR },
{ stringFactory, personFactory, genericTemplateJR },
{ personFactory, stringFactory, genericTemplateJR },
{ personFactory, stringFactory, xGenericTemplateJR },
{ personFactory, stringFactory, jsonPersonTemplate },
{ personFactory, stringFactory, jsonPersonTemplateJR },
{ stringFactory, stringFactory, genericTemplateRJC },
{ personFactory, personFactory, genericTemplateRJC },
{ stringFactory, personFactory, genericTemplateRJC },
{ personFactory, stringFactory, genericTemplateRJC },
{ personFactory, stringFactory, xGenericTemplateRJC },
{ personFactory, stringFactory, jsonPersonTemplateRJC } });
{ personFactory, stringFactory, jsonPersonTemplateRJC },
{ stringFactory, stringFactory, genericTemplateLettuce },
{ personFactory, personFactory, genericTemplateLettuce },
{ stringFactory, personFactory, genericTemplateLettuce },
{ personFactory, stringFactory, genericTemplateLettuce },
{ personFactory, stringFactory, xGenericTemplateLettuce },
{ personFactory, stringFactory, jsonPersonTemplateLettuce },
{ stringFactory, stringFactory, genericTemplateSrp },
{ personFactory, personFactory, genericTemplateSrp },
{ stringFactory, personFactory, genericTemplateSrp },
{ personFactory, stringFactory, genericTemplateSrp },
{ personFactory, stringFactory, xGenericTemplateSrp },
{ personFactory, stringFactory, jsonPersonTemplateSrp }});
}
}