blob: b1d09cccc42a973087333d1aee3c27db74b5fb9d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.apache.geode.rest.internal.web.controllers;
import static org.apache.geode.cache.Region.SEPARATOR;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_BIND_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.START_DEV_REST_API;
import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPort;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheFactory;
import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionFactory;
import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.cache.client.ClientCache;
import org.apache.geode.cache.client.ClientCacheFactory;
import org.apache.geode.cache.client.ClientRegionFactory;
import org.apache.geode.cache.client.ClientRegionShortcut;
import org.apache.geode.cache.server.CacheServer;
import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.internal.cache.xmlcache.RegionAttributesCreation;
import org.apache.geode.pdx.PdxInstance;
import org.apache.geode.test.dunit.NetworkUtils;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.junit.categories.RestAPITest;
import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
/**
* Dunit Test containing inter - operations between REST Client and Gemfire cache client
*
* @since GemFire 8.0
*/
@SuppressWarnings("deprecation")
@Category({RestAPITest.class})
@RunWith(Parameterized.class)
@Parameterized.UseParametersRunnerFactory(CategoryWithParameterizedRunnerFactory.class)
public class RestAPIsAndInterOpsDUnitTest
extends org.apache.geode.cache.client.internal.LocatorTestBase {
private static final String PEOPLE_REGION_NAME = "People";
private static final String findAllPeopleQuery =
"/queries?id=findAllPeople&q=SELECT%20*%20FROM%20" + SEPARATOR + "People";
private static final String findPeopleByGenderQuery =
"/queries?id=filterByGender&q=SELECT%20*%20from%20" + SEPARATOR
+ "People%20where%20gender=$1";
private static final String findPeopleByLastNameQuery =
"/queries?id=filterByLastName&q=SELECT%20*%20from%20" + SEPARATOR
+ "People%20where%20lastName=$1";
private static final String[] PARAM_QUERY_IDS_ARRAY =
{"findAllPeople", "filterByGender", "filterByLastName"};
private static final String QUERY_ARGS =
"[" + "{" + "\"@type\": \"string\"," + "\"@value\": \"Patel\"" + "}" + "]";
private static final String PERSON_AS_JSON_REPLACE =
"{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\"," + "\"id\": 501,"
+ " \"firstName\": \"Barack\"," + " \"middleName\": \"Hussein\","
+ " \"lastName\": \"Obama\"," + " \"birthDate\": \"04/08/1961\"," + "\"gender\": \"MALE\""
+ "}";
private static final String PERSON_LIST_AS_JSON = "[" + "{"
+ "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\"," + "\"id\": 3,"
+ " \"firstName\": \"Nishka3\"," + " \"middleName\": \"Nilkanth3\","
+ " \"lastName\": \"Patel3\"," + " \"birthDate\": \"07/31/2009\"," + "\"gender\": \"FEMALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 4," + " \"firstName\": \"Tanay4\"," + " \"middleName\": \"kiran4\","
+ " \"lastName\": \"Patel4\"," + " \"birthDate\": \"23/08/2012\"," + "\"gender\": \"MALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 5," + " \"firstName\": \"Nishka5\"," + " \"middleName\": \"Nilkanth5\","
+ " \"lastName\": \"Patel5\"," + " \"birthDate\": \"31/09/2009\"," + "\"gender\": \"FEMALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 6," + " \"firstName\": \"Tanay6\"," + " \"middleName\": \"Kiran6\","
+ " \"lastName\": \"Patel\"," + " \"birthDate\": \"23/08/2012\"," + "\"gender\": \"MALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 7," + " \"firstName\": \"Nishka7\"," + " \"middleName\": \"Nilkanth7\","
+ " \"lastName\": \"Patel\"," + " \"birthDate\": \"31/09/2009\"," + "\"gender\": \"FEMALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 8," + " \"firstName\": \"Tanay8\"," + " \"middleName\": \"kiran8\","
+ " \"lastName\": \"Patel\"," + " \"birthDate\": \"23/08/2012\"," + "\"gender\": \"MALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 9," + " \"firstName\": \"Nishka9\"," + " \"middleName\": \"Nilkanth9\","
+ " \"lastName\": \"Patel\"," + " \"birthDate\": \"31/09/2009\"," + "\"gender\": \"FEMALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 10," + " \"firstName\": \"Tanay10\"," + " \"middleName\": \"kiran10\","
+ " \"lastName\": \"Patel\"," + " \"birthDate\": \"23/08/2012\"," + "\"gender\": \"MALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 11," + " \"firstName\": \"Nishka11\"," + " \"middleName\": \"Nilkanth11\","
+ " \"lastName\": \"Patel\"," + " \"birthDate\": \"31/09/2009\"," + "\"gender\": \"FEMALE\""
+ "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Person\","
+ "\"id\": 12," + " \"firstName\": \"Tanay12\"," + " \"middleName\": \"kiran12\","
+ " \"lastName\": \"Patel\"," + " \"birthDate\": \"23/08/2012\"," + "\"gender\": \"MALE\""
+ "}" + "]";
@Parameterized.Parameter
public String urlContext;
@Parameterized.Parameters
public static Collection<String> data() {
return Arrays.asList("/geode", "/gemfire-api");
}
@SuppressWarnings("unchecked")
private CacheServer createRegionAndStartCacheServer(String[] regions, Cache cache)
throws IOException {
RegionAttributesCreation regionAttributes = new RegionAttributesCreation();
regionAttributes.setEnableBridgeConflation(true);
regionAttributes.setDataPolicy(DataPolicy.REPLICATE);
for (String region : regions) {
cache.createRegionFactory(regionAttributes).create(region);
}
CacheServer server = cache.addCacheServer();
server.setPort(0);
server.setLoadProbe(CacheServer.DEFAULT_LOAD_PROBE);
server.start();
return server;
}
private int startManager(final String locators, final String[] regions) throws IOException {
int httpPort = getRandomAvailableTCPPort();
Properties props = new Properties();
props.setProperty(MCAST_PORT, String.valueOf(0));
props.setProperty(LOCATORS, locators);
props.setProperty(JMX_MANAGER, "true");
props.setProperty(JMX_MANAGER_START, "true");
props.setProperty(JMX_MANAGER_PORT, "0");
// Set REST service related configuration
props.setProperty(START_DEV_REST_API, "true");
props.setProperty(HTTP_SERVICE_BIND_ADDRESS, "localhost");
props.setProperty(HTTP_SERVICE_PORT, String.valueOf(httpPort));
Cache cache = new CacheFactory(props).create();
CacheServer server = createRegionAndStartCacheServer(regions, cache);
return server.getPort();
}
private String startBridgeServerWithRestService(final String hostName, final String locators,
final String[] regions) throws IOException {
final int serverPort = getRandomAvailableTCPPort();
// create Cache of given VM and start HTTP service with REST APIs service
Properties props = new Properties();
props.setProperty(MCAST_PORT, String.valueOf(0));
props.setProperty(LOCATORS, locators);
props.setProperty(START_DEV_REST_API, "true");
props.setProperty(HTTP_SERVICE_BIND_ADDRESS, hostName);
props.setProperty(HTTP_SERVICE_PORT, String.valueOf(serverPort));
InternalCache cache =
(InternalCache) new CacheFactory(props).setPdxReadSerialized(true).create();
CacheServer server = createRegionAndStartCacheServer(regions, cache);
remoteObjects.put(CACHE_KEY, cache);
server.getPort();
return "http://" + hostName + ":" + serverPort + urlContext + "/v1";
}
private void doPutsInClientCache() {
ClientCache cache = ClientCacheFactory.getAnyInstance();
assertThat(cache).isNotNull();
Region<String, Object> region = cache.getRegion(PEOPLE_REGION_NAME);
// put person object
final Person person1 = new Person(101L, "Mithali", "Dorai", "Raj",
DateTimeUtils.createDate(1982, Calendar.DECEMBER, 4), Gender.FEMALE);
final Person person2 = new Person(102L, "Sachin", "Ramesh", "Tendulkar",
DateTimeUtils.createDate(1975, Calendar.DECEMBER, 14), Gender.MALE);
final Person person3 = new Person(103L, "Saurabh", "Baburav", "Ganguly",
DateTimeUtils.createDate(1972, Calendar.AUGUST, 29), Gender.MALE);
final Person person4 = new Person(104L, "Rahul", "subrymanyam", "Dravid",
DateTimeUtils.createDate(1979, Calendar.MARCH, 17), Gender.MALE);
final Person person5 = new Person(105L, "Jhulan", "Chidambaram", "Goswami",
DateTimeUtils.createDate(1983, Calendar.NOVEMBER, 25), Gender.FEMALE);
region.put("1", person1);
region.put("2", person2);
region.put("3", person3);
region.put("4", person4);
region.put("5", person5);
final Person person6 = new Person(101L, "Rahul", "Rajiv", "Gndhi",
DateTimeUtils.createDate(1970, Calendar.MAY, 14), Gender.MALE);
final Person person7 = new Person(102L, "Narendra", "Damodar", "Modi",
DateTimeUtils.createDate(1945, Calendar.DECEMBER, 24), Gender.MALE);
final Person person8 = new Person(103L, "Atal", "Bihari", "Vajpayee",
DateTimeUtils.createDate(1920, Calendar.AUGUST, 9), Gender.MALE);
final Person person9 = new Person(104L, "Soniya", "Rajiv", "Gandhi",
DateTimeUtils.createDate(1929, Calendar.MARCH, 27), Gender.FEMALE);
final Person person10 = new Person(104L, "Priyanka", "Robert", "Gandhi",
DateTimeUtils.createDate(1973, Calendar.APRIL, 15), Gender.FEMALE);
final Person person11 = new Person(104L, "Murali", "Manohar", "Joshi",
DateTimeUtils.createDate(1923, Calendar.APRIL, 25), Gender.MALE);
final Person person12 = new Person(104L, "Lalkrishna", "Parmhansh", "Advani",
DateTimeUtils.createDate(1910, Calendar.JANUARY, 1), Gender.MALE);
final Person person13 = new Person(104L, "Shushma", "kumari", "Swaraj",
DateTimeUtils.createDate(1943, Calendar.AUGUST, 10), Gender.FEMALE);
final Person person14 = new Person(104L, "Arun", "raman", "jetly",
DateTimeUtils.createDate(1942, Calendar.OCTOBER, 27), Gender.MALE);
final Person person15 = new Person(104L, "Amit", "kumar", "shah",
DateTimeUtils.createDate(1958, Calendar.DECEMBER, 21), Gender.MALE);
final Person person16 = new Person(104L, "Shila", "kumari", "Dixit",
DateTimeUtils.createDate(1927, Calendar.FEBRUARY, 15), Gender.FEMALE);
Map<String, Object> userMap = new HashMap<>();
userMap.put("6", person6);
userMap.put("7", person7);
userMap.put("8", person8);
userMap.put("9", person9);
userMap.put("10", person10);
userMap.put("11", person11);
userMap.put("12", person12);
userMap.put("13", person13);
userMap.put("14", person14);
userMap.put("15", person15);
userMap.put("16", person16);
region.putAll(userMap);
cache.getLogger().info("Gemfire Cache Client: Puts successfully done");
}
private void doQueryOpsUsingRestApis(String restEndpoint) throws IOException {
// Query TestCase-1 :: Prepare parameterized Queries
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost post = new HttpPost(restEndpoint + findAllPeopleQuery);
post.addHeader("Content-Type", "application/json");
post.addHeader("Accept", "application/json");
CloseableHttpResponse createNamedQueryResponse = httpclient.execute(post);
assertThat(createNamedQueryResponse.getStatusLine().getStatusCode()).isEqualTo(201);
assertThat(createNamedQueryResponse.getEntity()).isNotNull();
createNamedQueryResponse.close();
post = new HttpPost(restEndpoint + findPeopleByGenderQuery);
post.addHeader("Content-Type", "application/json");
post.addHeader("Accept", "application/json");
createNamedQueryResponse = httpclient.execute(post);
assertThat(createNamedQueryResponse.getStatusLine().getStatusCode()).isEqualTo(201);
assertThat(createNamedQueryResponse.getEntity()).isNotNull();
createNamedQueryResponse.close();
post = new HttpPost(restEndpoint + findPeopleByLastNameQuery);
post.addHeader("Content-Type", "application/json");
post.addHeader("Accept", "application/json");
createNamedQueryResponse = httpclient.execute(post);
assertThat(createNamedQueryResponse.getStatusLine().getStatusCode()).isEqualTo(201);
assertThat(createNamedQueryResponse.getEntity()).isNotNull();
createNamedQueryResponse.close();
// Query TestCase-2 :: List all parameterized queries
HttpGet get = new HttpGet(restEndpoint + "/queries");
httpclient = HttpClients.createDefault();
CloseableHttpResponse listAllQueriesResponse = httpclient.execute(get);
assertThat(listAllQueriesResponse.getStatusLine().getStatusCode()).isEqualTo(200);
assertThat(listAllQueriesResponse.getEntity()).isNotNull();
HttpEntity entity = listAllQueriesResponse.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
listAllQueriesResponse.close();
// Check whether received response contains expected query IDs.
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonObject = mapper.readTree(sb.toString());
JsonNode queries = jsonObject.get("queries");
for (int i = 0; i < queries.size(); i++) {
assertThat(Arrays.asList(PARAM_QUERY_IDS_ARRAY))
.contains(queries.get(i).get("id").asText());
}
// Query TestCase-3 :: Run the specified named query passing in scalar values for query
// parameters.
httpclient = HttpClients.createDefault();
post = new HttpPost(restEndpoint + "/queries/filterByLastName");
post.addHeader("Content-Type", "application/json");
post.addHeader("Accept", "application/json");
entity = new StringEntity(QUERY_ARGS);
post.setEntity(entity);
CloseableHttpResponse runNamedQueryResponse = httpclient.execute(post);
assertThat(runNamedQueryResponse.getStatusLine().getStatusCode()).isEqualTo(200);
assertThat(runNamedQueryResponse.getEntity()).isNotNull();
}
private void verifyUpdatesInClientCache() {
ClientCache cache = ClientCacheFactory.getAnyInstance();
assertThat(cache).isNotNull();
Region<String, Object> region = cache.getRegion(PEOPLE_REGION_NAME);
Person expectedPerson = new Person(3L, "Nishka3", "Nilkanth3", "Patel3",
DateTimeUtils.createDate(2009, Calendar.JULY, 31), Gender.FEMALE);
Object value = region.get("3");
assertThat(value).isInstanceOf(PdxInstance.class);
PdxInstance pi3 = (PdxInstance) value;
Person actualPerson = (Person) pi3.getObject();
assertThat(actualPerson.getId()).isEqualTo(expectedPerson.getId());
assertThat(actualPerson.getFirstName()).isEqualTo(expectedPerson.getFirstName());
assertThat(actualPerson.getMiddleName()).isEqualTo(expectedPerson.getMiddleName());
assertThat(actualPerson.getLastName()).isEqualTo(expectedPerson.getLastName());
assertThat(actualPerson.getBirthDate()).isEqualTo(expectedPerson.getBirthDate());
assertThat(actualPerson.getGender()).isEqualTo(expectedPerson.getGender());
// verify update on key "2"
expectedPerson = new Person(501L, "Barack", "Hussein", "Obama",
DateTimeUtils.createDate(1961, Calendar.APRIL, 8), Gender.MALE);
value = region.get("2");
assertThat(value).isInstanceOf(PdxInstance.class);
pi3 = (PdxInstance) value;
actualPerson = (Person) pi3.getObject();
assertThat(actualPerson.getId()).isEqualTo(expectedPerson.getId());
assertThat(actualPerson.getFirstName()).isEqualTo(expectedPerson.getFirstName());
assertThat(actualPerson.getMiddleName()).isEqualTo(expectedPerson.getMiddleName());
assertThat(actualPerson.getLastName()).isEqualTo(expectedPerson.getLastName());
assertThat(actualPerson.getBirthDate()).isEqualTo(expectedPerson.getBirthDate());
assertThat(actualPerson.getGender()).isEqualTo(expectedPerson.getGender());
// verify Deleted key "13"
Object obj = region.get("13");
assertThat(obj).isNull();
obj = region.get("14");
assertThat(obj).isNull();
obj = region.get("15");
assertThat(obj).isNull();
obj = region.get("16");
assertThat(obj).isNull();
}
private void doUpdatesUsingRestApis(String restEndpoint) throws IOException {
// Update keys using REST calls
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPut put = new HttpPut(restEndpoint + "/People/3,4,5,6,7,8,9,10,11,12");
put.addHeader("Content-Type", "application/json");
put.addHeader("Accept", "application/json");
StringEntity entity = new StringEntity(PERSON_LIST_AS_JSON);
put.setEntity(entity);
CloseableHttpResponse result = httpclient.execute(put);
assertThat(result).isNotNull();
// Delete Single keys
httpclient = HttpClients.createDefault();
HttpDelete delete = new HttpDelete(restEndpoint + "/People/13");
delete.addHeader("Content-Type", "application/json");
delete.addHeader("Accept", "application/json");
result = httpclient.execute(delete);
assertThat(result).isNotNull();
// Delete set of keys
httpclient = HttpClients.createDefault();
delete = new HttpDelete(restEndpoint + "/People/14,15,16");
delete.addHeader("Content-Type", "application/json");
delete.addHeader("Accept", "application/json");
result = httpclient.execute(delete);
assertThat(result).isNotNull();
// REST put?op=CAS for key 1
// REST put?op=REPLACE for key 2
httpclient = HttpClients.createDefault();
put = new HttpPut(restEndpoint + "/People/2?op=replace");
put.addHeader("Content-Type", "application/json");
put.addHeader("Accept", "application/json");
entity = new StringEntity(PERSON_AS_JSON_REPLACE);
put.setEntity(entity);
result = httpclient.execute(put);
assertThat(result).isNotNull();
}
private void fetchRestServerEndpoints(String restEndpoint) throws IOException {
HttpGet get = new HttpGet(restEndpoint + "/servers");
get.addHeader("Content-Type", "application/json");
get.addHeader("Accept", "application/json");
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = httpclient.execute(get);
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
// validate the status code
assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonArray = mapper.readTree(sb.toString());
// verify total number of REST service endpoints in DS
assertThat(jsonArray.size()).isEqualTo(2);
}
private void doGetsUsingRestApis(String restEndpoint) throws IOException {
// 1. Get on key="1" and validate result.
HttpGet get = new HttpGet(restEndpoint + "/People/1");
get.addHeader("Content-Type", "application/json");
get.addHeader("Accept", "application/json");
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = httpclient.execute(get);
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
ObjectMapper mapper = new ObjectMapper();
JsonNode json = mapper.readTree(sb.toString());
assertThat(json.get("id").asInt()).isEqualTo(101);
assertThat(json.get("firstName").asText()).isEqualTo("Mithali");
assertThat(json.get("middleName").asText()).isEqualTo("Dorai");
assertThat(json.get("lastName").asText()).isEqualTo("Raj");
assertThat(json.get("gender").asText()).isEqualTo(Gender.FEMALE.name());
// 2. Get on key="16" and validate result.
get = new HttpGet(restEndpoint + "/People/16");
get.addHeader("Content-Type", "application/json");
get.addHeader("Accept", "application/json");
httpclient = HttpClients.createDefault();
response = httpclient.execute(get);
entity = response.getEntity();
content = entity.getContent();
reader = new BufferedReader(new InputStreamReader(content));
sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
json = mapper.readTree(sb.toString());
assertThat(json.get("id").asInt()).isEqualTo(104);
assertThat(json.get("firstName").asText()).isEqualTo("Shila");
assertThat(json.get("middleName").asText()).isEqualTo("kumari");
assertThat(json.get("lastName").asText()).isEqualTo("Dixit");
assertThat(json.get("gender").asText()).isEqualTo(Gender.FEMALE.name());
// 3. Get all (getAll) entries in Region
get = new HttpGet(restEndpoint + "/People");
get.addHeader("Content-Type", "application/json");
get.addHeader("Accept", "application/json");
httpclient = HttpClients.createDefault();
CloseableHttpResponse result = httpclient.execute(get);
assertThat(result.getStatusLine().getStatusCode()).isEqualTo(200);
assertThat(result.getEntity()).isNotNull();
entity = result.getEntity();
content = entity.getContent();
reader = new BufferedReader(new InputStreamReader(content));
sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
result.close();
json = mapper.readTree(sb.toString());
assertThat(json.get("People").size()).isEqualTo(16);
// 4. GetAll?limit=10 (10 entries) and verify results
get = new HttpGet(restEndpoint + "/People?limit=10");
get.addHeader("Content-Type", "application/json");
get.addHeader("Accept", "application/json");
httpclient = HttpClients.createDefault();
response = httpclient.execute(get);
assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200);
assertThat(response.getEntity()).isNotNull();
entity = response.getEntity();
content = entity.getContent();
reader = new BufferedReader(new InputStreamReader(content));
sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
json = mapper.readTree(sb.toString());
assertThat(json.get("People").size()).isEqualTo(10);
// 5. Get keys - List all keys in region
get = new HttpGet(restEndpoint + "/People/keys");
get.addHeader("Content-Type", "application/json");
get.addHeader("Accept", "application/json");
httpclient = HttpClients.createDefault();
response = httpclient.execute(get);
assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200);
assertThat(response.getEntity()).isNotNull();
entity = response.getEntity();
content = entity.getContent();
reader = new BufferedReader(new InputStreamReader(content));
sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
json = mapper.readTree(sb.toString());
assertThat(json.get("keys").size()).isEqualTo(16);
// 6. Get data for specific keys
get = new HttpGet(restEndpoint + "/People/1,3,5,7,9,11");
get.addHeader("Content-Type", "application/json");
get.addHeader("Accept", "application/json");
httpclient = HttpClients.createDefault();
response = httpclient.execute(get);
assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200);
assertThat(response.getEntity()).isNotNull();
entity = response.getEntity();
content = entity.getContent();
reader = new BufferedReader(new InputStreamReader(content));
sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
json = mapper.readTree(sb.toString());
assertThat(json.get("People").size()).isEqualTo(6);
}
private void createRegionInClientCache() {
ClientCache cache = ClientCacheFactory.getAnyInstance();
assertThat(cache).isNotNull();
ClientRegionFactory<String, Object> crf =
cache.createClientRegionFactory(ClientRegionShortcut.PROXY);
crf.create(PEOPLE_REGION_NAME);
}
private void createRegion() {
Cache cache = CacheFactory.getAnyInstance();
assertThat(cache).isNotNull();
RegionFactory<String, Object> rf = cache.createRegionFactory(RegionShortcut.REPLICATE);
rf.create(PEOPLE_REGION_NAME);
}
private void createClientCache(final String host, final int port) {
// Connect using the GemFire locator and create a Caching_Proxy cache
ClientCache clientCache =
new ClientCacheFactory().setPdxReadSerialized(true).addPoolLocator(host, port).create();
clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY).create(REGION_NAME);
}
/**
* InterOps Test between REST-client, Peer Cache Client and Client Cache
*/
@Test
public void testInterOpsWithReplicatedRegion() throws Exception {
VM locator = VM.getVM(0);
VM manager = VM.getVM(1);
VM server = VM.getVM(2);
VM client = VM.getVM(3);
// start locator
final String hostName = NetworkUtils.getServerHostName();
int locatorPort = locator.invoke(() -> startLocator(hostName, ""));
// find locators
String locators = hostName + "[" + locatorPort + "]";
// start manager (peer cache)
manager.invoke(() -> startManager(locators, new String[] {REGION_NAME}));
// start startCacheServer With RestService enabled
final String serverHostName = server.getHost().getHostName();
String restEndpoint = server.invoke(() -> startBridgeServerWithRestService(serverHostName,
locators, new String[] {REGION_NAME}));
// create a client cache
client.invoke(() -> createClientCache(hostName, locatorPort));
// create region in Manager, peer cache and Client cache nodes
manager.invoke(this::createRegion);
server.invoke(this::createRegion);
client.invoke(this::createRegionInClientCache);
// do some person puts from clientcache
client.invoke(this::doPutsInClientCache);
// TEST: fetch all available REST endpoints
fetchRestServerEndpoints(restEndpoint);
// Controller VM - config REST Client and make HTTP calls
doGetsUsingRestApis(restEndpoint);
// update Data using REST APIs
doUpdatesUsingRestApis(restEndpoint);
client.invoke(this::verifyUpdatesInClientCache);
// Querying
doQueryOpsUsingRestApis(restEndpoint);
}
}