/*
* 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.repository.sample;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.geode.cache.Region;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.gemfire.repository.Wrapper;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
/**
* Integration tests testing the use of GemFire Repositories on GemFire Cache Subregions.
*
* @author John Blum
* @see org.junit.Test
* @see org.junit.runner.RunWith
* @see org.springframework.data.gemfire.repository.Wrapper
* @see org.springframework.data.gemfire.repository.sample.Programmer
* @see org.springframework.data.gemfire.repository.sample.ProgrammerRepository
* @see org.springframework.test.context.ContextConfiguration
* @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner
* @see org.apache.geode.cache.Region
* @link https://jira.springsource.org/browse/SGF-251
* @link https://jira.springsource.org/browse/SGF-252
* @since 1.4.0
*/
@RunWith(SpringRunner.class)
@ContextConfiguration("subregionRepository.xml")
@SuppressWarnings("unused")
public class SubRegionRepositoryIntegrationTest {
private static final Map<String, RootUser> ADMIN_USER_DATA = new HashMap<>(5, 0.90f);
private static final Map<String, GuestUser> GUEST_USER_DATA = new HashMap<>(3, 0.90f);
private static final Map<String, Programmer> PROGRAMMER_USER_DATA = new HashMap<>(23, 0.90f);
static {
createAdminUser("supertool");
createAdminUser("thor");
createAdminUser("zeus");
createGuestUser("bubba");
createGuestUser("joeblow");
createProgrammer("AdaLovelace", "Ada");
createProgrammer("AlanKay", "Smalltalk");
createProgrammer("BjarneStroustrup", "C++");
createProgrammer("BrendanEich", "JavaScript");
createProgrammer("DennisRitchie", "C");
createProgrammer("GuidoVanRossum", "Python");
createProgrammer("JamesGosling", "Java");
createProgrammer("JamesStrachan", "Groovy");
createProgrammer("JohnBackus", "Fortran");
createProgrammer("JohnKemeny", "BASIC");
createProgrammer("JohnMcCarthy", "LISP");
createProgrammer("JoshuaBloch", "Java");
createProgrammer("LarryWall", "Perl");
createProgrammer("MartinOdersky", "Scala");
createProgrammer("NiklausWirth", "Modula-2");
createProgrammer("NiklausWirth", "Pascal");
createProgrammer("ThomasKurtz", "BASIC");
createProgrammer("YukihiroMatsumoto", "Ruby");
}
@Autowired
private ProgrammerRepository programmersRepo;
@Resource(name = "/Users/Programmers")
private Region<String, Programmer> programmers;
@Resource(name = "/Local/Admin/Users")
private Region<String, RootUser> adminUsers;
@Resource(name = "/Local/Guest/Users")
private Region<String, GuestUser> guestUsers;
@Autowired
private GuestUserRepository guestUserRepo;
@Autowired
private RootUserRepository adminUserRepo;
protected static RootUser createAdminUser(final String username) {
RootUser user = new RootUser(username);
ADMIN_USER_DATA.put(username, user);
return user;
}
protected static GuestUser createGuestUser(final String username) {
GuestUser user = new GuestUser(username);
GUEST_USER_DATA.put(username, user);
return user;
}
protected static RootUser getAdminUser(final String username) {
List<RootUser> users = getAdminUsers(username);
return (users.isEmpty() ? null : users.get(0));
}
protected static List<RootUser> getAdminUsers(final String... usernames) {
return getUsers(ADMIN_USER_DATA, usernames);
}
protected static GuestUser getGuestUser(final String username) {
List<GuestUser> users = getGuestUsers(username);
return (users.isEmpty() ? null : users.get(0));
}
protected static List<GuestUser> getGuestUsers(final String... usernames) {
return getUsers(GUEST_USER_DATA, usernames);
}
protected static <T extends User> List<T> getUsers(final Map<String, T> userData, final String... usernames) {
List<T> users = new ArrayList<T>(usernames.length);
for (String username : usernames) {
T user = userData.get(username);
if (user != null) {
users.add(user);
}
}
Collections.sort(users);
return users;
}
protected static Programmer createProgrammer(final String username, final String programmingLanguage) {
Programmer programmer = new Programmer(username);
programmer.setProgrammingLanguage(programmingLanguage);
PROGRAMMER_USER_DATA.put(username, programmer);
return programmer;
}
protected static List<Programmer> getProgrammers(final String... usernames) {
List<Programmer> programmers = new ArrayList<Programmer>(usernames.length);
for (String username : usernames) {
Programmer programmer = PROGRAMMER_USER_DATA.get(username);
if (programmer != null) {
programmers.add(PROGRAMMER_USER_DATA.get(username));
}
}
Collections.sort(programmers);
return programmers;
}
@Before
public void setup() {
assertNotNull("The /Users/Programmers Subregion was null!", programmers);
if (programmers.isEmpty()) {
programmers.putAll(PROGRAMMER_USER_DATA);
}
assertEquals(PROGRAMMER_USER_DATA.size(), programmers.size());
assertNotNull("The /Local/Admins/Users Subregion was null!", adminUsers);
if (adminUsers.isEmpty()) {
adminUsers.putAll(ADMIN_USER_DATA);
}
assertEquals(ADMIN_USER_DATA.size(), adminUsers.size());
assertNotNull("The /Local/Guest/Users Subregion was null!", guestUsers);
if (guestUsers.isEmpty()) {
guestUsers.putAll(GUEST_USER_DATA);
}
assertEquals(GUEST_USER_DATA.size(), guestUsers.size());
}
@Test
public void testSubregionRepositoryInteractions() {
assertThat(programmersRepo.findById("JamesGosling").orElse(null)).isEqualTo(PROGRAMMER_USER_DATA.get("JamesGosling"));
List<Programmer> javaProgrammers = programmersRepo.findDistinctByProgrammingLanguageOrderByUsernameAsc("Java");
assertNotNull(javaProgrammers);
assertFalse(javaProgrammers.isEmpty());
assertEquals(2, javaProgrammers.size());
assertEquals(javaProgrammers, getProgrammers("JamesGosling", "JoshuaBloch"));
List<Programmer> groovyProgrammers = programmersRepo.findDistinctByProgrammingLanguageLikeOrderByUsernameAsc("Groovy");
assertNotNull(groovyProgrammers);
assertFalse(groovyProgrammers.isEmpty());
assertEquals(1, groovyProgrammers.size());
assertEquals(groovyProgrammers, getProgrammers("JamesStrachan"));
programmersRepo.save(new Wrapper<>(createProgrammer("RodJohnson", "Java"), "RodJohnson"));
programmersRepo.save(new Wrapper<>(createProgrammer("GuillaumeLaforge", "Groovy"), "GuillaumeLaforge"));
programmersRepo.save(new Wrapper<>(createProgrammer("GraemeRocher", "Groovy"), "GraemeRocher"));
javaProgrammers = programmersRepo.findDistinctByProgrammingLanguageOrderByUsernameAsc("Java");
assertNotNull(javaProgrammers);
assertFalse(javaProgrammers.isEmpty());
assertEquals(3, javaProgrammers.size());
assertEquals(javaProgrammers, getProgrammers("JamesGosling", "JoshuaBloch", "RodJohnson"));
groovyProgrammers = programmersRepo.findDistinctByProgrammingLanguageLikeOrderByUsernameAsc("Groovy");
assertNotNull(groovyProgrammers);
assertFalse(groovyProgrammers.isEmpty());
assertEquals(3, groovyProgrammers.size());
assertEquals(groovyProgrammers, getProgrammers("GraemeRocher", "GuillaumeLaforge", "JamesStrachan"));
List<Programmer> javaLikeProgrammers = programmersRepo.findDistinctByProgrammingLanguageLikeOrderByUsernameAsc("Java%");
assertNotNull(javaLikeProgrammers);
assertFalse(javaLikeProgrammers.isEmpty());
assertEquals(4, javaLikeProgrammers.size());
assertEquals(javaLikeProgrammers, getProgrammers("BrendanEich", "JamesGosling", "JoshuaBloch", "RodJohnson"));
List<Programmer> pseudoCodeProgrammers = programmersRepo.findDistinctByProgrammingLanguageLikeOrderByUsernameAsc("PseudoCode");
assertNotNull(pseudoCodeProgrammers);
assertTrue(pseudoCodeProgrammers.isEmpty());
}
@Test
public void testIdenticallyNamedSubregionDataAccess() {
assertThat(adminUserRepo.findById("supertool").orElse(null)).isEqualTo(getAdminUser("supertool"));
assertThat(guestUserRepo.findById("joeblow").orElse(null)).isEqualTo(getGuestUser("joeblow"));
List<RootUser> rootUsers = adminUserRepo.findDistinctByUsername("zeus");
assertNotNull(rootUsers);
assertFalse(rootUsers.isEmpty());
assertEquals(1, rootUsers.size());
assertEquals(getAdminUser("zeus"), rootUsers.get(0));
List<GuestUser> guestUsers = guestUserRepo.findDistinctByUsername("bubba");
assertNotNull(guestUsers);
assertFalse(guestUsers.isEmpty());
assertEquals(1, guestUsers.size());
assertEquals(getGuestUser("bubba"), guestUsers.get(0));
}
}