/*
* Copyright 2010-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.gemfire;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.is;
import static org.junit.Assume.assumeThat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.annotation.Resource;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.query.SelectResults;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.gemfire.repository.sample.User;
import org.springframework.data.gemfire.util.CacheUtils;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Integration tests for {@link GemfireTemplate}.
*
* @author John Blum
* @see org.junit.Test
* @see org.springframework.data.gemfire.GemfireTemplate
* @see org.springframework.test.context.ContextConfiguration
* @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner
* @since 1.4.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@SuppressWarnings("unused")
public class GemfireTemplateIntegrationTests {
protected static final String DEFAULT_GEMFIRE_LOG_LEVEL = "warning";
protected static final List<User> TEST_USERS = new ArrayList<User>(9);
static {
TEST_USERS.add(newUser("jonDoe"));
TEST_USERS.add(newUser("janeDoe", false));
TEST_USERS.add(newUser("pieDoe", false));
TEST_USERS.add(newUser("cookieDoe"));
TEST_USERS.add(newUser("jackHandy"));
TEST_USERS.add(newUser("mandyHandy", false));
TEST_USERS.add(newUser("randyHandy", false));
TEST_USERS.add(newUser("sandyHandy"));
TEST_USERS.add(newUser("imaPigg"));
}
@Autowired
private GemFireCache gemfireCache;
@Autowired
private GemfireTemplate usersTemplate;
@Resource(name = "Users")
private Region<String, User> users;
protected static User newUser(String username) {
return newUser(username, true);
}
protected static User newUser(String username, Boolean active) {
return newUser(username, String.format("%1$s@companyx.com", username), Calendar.getInstance(), active);
}
protected static User newUser(String username, String email, Calendar since, Boolean active) {
User user = new User(username);
user.setActive(Boolean.TRUE.equals(active));
user.setEmail(email);
user.setSince(since);
return user;
}
protected String getKey(User user) {
return (user != null ? user.getUsername() : null);
}
protected User getUser(String username) {
for (User user : TEST_USERS) {
if (user.getUsername().equals(username)) {
return user;
}
}
return null;
}
protected List<User> getUsers(String... usernames) {
List<String> usernameList = Arrays.asList(usernames);
List<User> users = new ArrayList<User>(usernames.length);
for (User user : TEST_USERS) {
if (usernameList.contains(user.getUsername())) {
users.add(user);
}
}
return users;
}
protected Map<String, User> getUsersAsMap(String... usernames) {
return getUsersAsMap(getUsers(usernames));
}
protected Map<String, User> getUsersAsMap(User... users) {
return getUsersAsMap(Arrays.asList(users));
}
protected Map<String, User> getUsersAsMap(Iterable<User> users) {
Map<String, User> userMap = new HashMap<String, User>();
for (User user : users) {
userMap.put(getKey(user), user);
}
return userMap;
}
protected void assertNullEquals(Object value1, Object value2) {
assertThat(value1 == null ? value2 == null : value1.equals(value2)).isTrue();
}
@Before
public void setup() {
assertThat(users).isNotNull();
if (users.isEmpty()) {
for (User user : TEST_USERS) {
users.put(getKey(user), user);
}
assertThat(users.isEmpty()).isFalse();
assertThat(users.size()).isEqualTo(TEST_USERS.size());
}
}
@Test
public void containsKey() {
assertThat(usersTemplate.containsKey(getKey(getUser("jonDoe")))).isTrue();
assertThat(usersTemplate.containsKey("dukeNukem")).isFalse();
}
@Test
public void containsKeyOnServer() {
assumeThat(CacheUtils.isClient(gemfireCache), is(true));
assertThat(usersTemplate.containsKeyOnServer(getKey(getUser("jackHandy")))).isTrue();
assertThat(usersTemplate.containsKeyOnServer("maxPayne")).isFalse();
}
@Test
public void containsValue() {
assertThat(usersTemplate.containsValue(getUser("pieDoe"))).isTrue();
assertThat(usersTemplate.containsValue(newUser("pieDough"))).isFalse();
}
@Test
public void containsValueForKey() {
assertThat(usersTemplate.containsValueForKey(getKey(getUser("cookieDoe")))).isTrue();
assertThat(usersTemplate.containsValueForKey("chocolateChipCookieDoe")).isFalse();
}
@Test
public void create() {
User bartSimpson = newUser("bartSimpson");
usersTemplate.create(getKey(bartSimpson), bartSimpson);
assertThat(users.containsKey(getKey(bartSimpson))).isTrue();
assertThat(users.containsValueForKey(getKey(bartSimpson))).isTrue();
assertThat(users.containsValue(bartSimpson)).isTrue();
assertThat(users.get(getKey(bartSimpson))).isEqualTo(bartSimpson);
}
@Test
public void get() {
String key = getKey(getUser("imaPigg"));
assertThat((Object) usersTemplate.get(key)).isEqualTo(users.get(key));
assertNullEquals(users.get("mrT"), usersTemplate.get("mrT"));
}
@Test
public void put() {
User peterGriffon = newUser("peterGriffon");
assertThat(usersTemplate.put(getKey(peterGriffon), peterGriffon)).isNull();
assertThat(users.get(getKey(peterGriffon))).isEqualTo(peterGriffon);
}
@Test
public void putIfAbsent() {
User stewieGriffon = newUser("stewieGriffon");
assertThat(users.containsValue(stewieGriffon)).isFalse();
assertThat(usersTemplate.putIfAbsent(getKey(stewieGriffon), stewieGriffon)).isNull();
assertThat(users.containsValue(stewieGriffon)).isTrue();
assertThat(usersTemplate.putIfAbsent(getKey(stewieGriffon), newUser("megGriffon"))).isEqualTo(stewieGriffon);
assertThat(users.get(getKey(stewieGriffon))).isEqualTo(stewieGriffon);
}
@Test
public void remove() {
User mandyHandy = users.get(getKey(getUser("mandyHandy")));
assertThat(mandyHandy).isNotNull();
assertThat((User) usersTemplate.remove(getKey(mandyHandy))).isEqualTo(mandyHandy);
assertThat(users.containsKey(getKey(mandyHandy))).isFalse();
assertThat(users.containsValue(mandyHandy)).isFalse();
assertThat(users.containsKey("loisGriffon")).isFalse();
assertThat((User) usersTemplate.remove("loisGriffon")).isNull();
assertThat(users.containsKey("loisGriffon")).isFalse();
}
@Test
public void replace() {
User randyHandy = users.get(getKey(getUser("randyHandy")));
User lukeFluke = newUser("lukeFluke");
User chrisGriffon = newUser("chrisGriffon");
assertThat(randyHandy).isNotNull();
assertThat(usersTemplate.replace(getKey(randyHandy), lukeFluke)).isEqualTo(randyHandy);
assertThat(users.get(getKey(randyHandy))).isEqualTo(lukeFluke);
assertThat(users.containsValue(randyHandy)).isFalse();
assertThat(users.containsValue(chrisGriffon)).isFalse();
assertThat(usersTemplate.replace(getKey(chrisGriffon), chrisGriffon)).isNull();
assertThat(users.containsValue(chrisGriffon)).isFalse();
}
@Test
public void replaceOldValueWithNewValue() {
User jackHandy = getUser("jackHandy");
User imaPigg = getUser("imaPigg");
assertThat(users.containsValue(jackHandy)).isTrue();
assertThat(usersTemplate.replace(getKey(jackHandy), null, imaPigg)).isFalse();
assertThat(users.containsValue(jackHandy)).isTrue();
assertThat(users.get(getKey(jackHandy))).isEqualTo(jackHandy);
assertThat(usersTemplate.replace(getKey(jackHandy), jackHandy, imaPigg)).isTrue();
assertThat(users.containsValue(jackHandy)).isFalse();
assertThat(users.get(getKey(jackHandy))).isEqualTo(imaPigg);
}
@Test
public void getAllReturnsNoResults() {
List<String> keys = Arrays.asList("keyOne", "keyTwo", "keyThree");
Map<String, User> users = usersTemplate.getAll(keys);
assertThat(users).isNotNull();
assertThat(users).isEqualTo(this.users.getAll(keys));
}
@Test
public void getAllReturnsResults() {
Map<String, User> users = usersTemplate.getAll(Arrays.asList(
getKey(getUser("jonDoe")), getKey(getUser("pieDoe"))));
assertThat(users).isNotNull();
assertThat(users).isEqualTo(getUsersAsMap(getUser("jonDoe"), getUser("pieDoe")));
}
@Test
public void putAll() {
User batMan = newUser("batMan");
User spiderMan = newUser("spiderMan");
User superMan = newUser("superMan");
Map<String, User> userMap = getUsersAsMap(batMan, spiderMan, superMan);
assertThat(users.keySet().containsAll(userMap.keySet())).isFalse();
assertThat(users.values().containsAll(userMap.values())).isFalse();
usersTemplate.putAll(userMap);
assertThat(users.keySet().containsAll(userMap.keySet())).isTrue();
assertThat(users.values().containsAll(userMap.values())).isTrue();
}
@Test
public void query() {
SelectResults<User> queryResults = usersTemplate.query("username LIKE '%Doe'");
assertThat(queryResults).isNotNull();
List<User> usersFound = queryResults.asList();
assertThat(usersFound).isNotNull();
assertThat(usersFound.size()).isEqualTo(4);
assertThat(usersFound.containsAll(getUsers("jonDoe", "janeDoe", "pieDoe", "cookieDoe"))).isTrue();
}
@Test
public void find() {
SelectResults<User> findResults = usersTemplate.find("SELECT u FROM /Users u WHERE u.username LIKE $1 AND u.active = $2", "%Doe", true);
assertThat(findResults).isNotNull();
List<User> usersFound = findResults.asList();
assertThat(usersFound).isNotNull();
assertThat(usersFound.size()).isEqualTo(2);
assertThat(usersFound.containsAll(getUsers("jonDoe", "cookieDoe"))).isTrue();
}
@Test
public void findUniqueReturnsResult() {
User jonDoe = usersTemplate.findUnique("SELECT u FROM /Users u WHERE u.username = $1", "jonDoe");
assertThat(jonDoe).isNotNull();
assertThat(jonDoe).isEqualTo(getUser("jonDoe"));
}
@Test(expected = InvalidDataAccessApiUsageException.class)
public void findUniqueReturnsNoResult() {
usersTemplate.findUnique("SELECT u FROM /Users u WHERE u.username = $1", "benDover");
}
@Test(expected = InvalidDataAccessApiUsageException.class)
public void findUnqiueReturnsTooManyResults() {
usersTemplate.findUnique("SELECT u FROM /Users u WHERE u.username LIKE $1", "%Doe");
}
@Configuration
static class GemfireTemplateConfiguration {
Properties gemfireProperties() {
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty("name", applicationName());
gemfireProperties.setProperty("mcast-port", "0");
gemfireProperties.setProperty("log-level", logLevel());
return gemfireProperties;
}
String applicationName() {
return GemfireTemplateIntegrationTests.class.getName();
}
String logLevel() {
return System.getProperty("gemfire.log-level", DEFAULT_GEMFIRE_LOG_LEVEL);
}
@Bean
CacheFactoryBean gemfireCache() {
CacheFactoryBean gemfireCache = new CacheFactoryBean();
gemfireCache.setClose(false);
gemfireCache.setProperties(gemfireProperties());
return gemfireCache;
}
@Bean(name = "Users")
LocalRegionFactoryBean<Object, Object> usersRegion(GemFireCache gemfireCache) {
LocalRegionFactoryBean<Object, Object> usersRegion = new LocalRegionFactoryBean<Object, Object>();
usersRegion.setCache(gemfireCache);
usersRegion.setClose(false);
usersRegion.setPersistent(false);
return usersRegion;
}
@Bean
GemfireTemplate usersRegionTemplate(Region<Object, Object> simple) {
return new GemfireTemplate(simple);
}
}
}