/* * 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.distributed.ConfigurationProperties.HTTP_SERVICE_BIND_ADDRESS; import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT; import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT; import static org.apache.geode.distributed.ConfigurationProperties.START_DEV_REST_API; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.apache.geode.cache.AttributesFactory; import org.apache.geode.cache.Cache; import org.apache.geode.cache.CacheFactory; import org.apache.geode.cache.CacheLoader; import org.apache.geode.cache.CacheWriter; import org.apache.geode.cache.CacheWriterException; import org.apache.geode.cache.DataPolicy; import org.apache.geode.cache.Declarable; import org.apache.geode.cache.EntryEvent; import org.apache.geode.cache.LoaderHelper; import org.apache.geode.cache.RegionAttributes; import org.apache.geode.cache.RegionDestroyedException; import org.apache.geode.cache.RegionEvent; import org.apache.geode.cache.RegionFactory; import org.apache.geode.cache.RegionShortcut; import org.apache.geode.cache.TimeoutException; import org.apache.geode.cache.execute.FunctionService; import org.apache.geode.distributed.ServerLauncher; import org.apache.geode.internal.AvailablePortHelper; import org.apache.geode.internal.GemFireVersion; import org.apache.geode.internal.net.SocketCreator; import org.apache.geode.management.internal.AgentUtil; import org.apache.geode.management.internal.ManagementConstants; import org.apache.geode.test.junit.categories.IntegrationTest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; @Category(IntegrationTest.class) public class RestAPIsQueryAndFEJUnitTest { private Cache c; private String hostName; private String baseURL; private int restServicePort; private final String CUSTOMER_REGION = "customers"; private final String ITEM_REGION = "items"; private final String ORDER_REGION = "orders"; private final String PRIMITIVE_KV_STORE_REGION = "primitiveKVStore"; private final String UNKNOWN_REGION = "unknown_region"; private final String EMPTY_REGION = "empty_region"; private Map<Integer, QueryResultData> queryResultByIndex; private final String ORDER1_AS_JSON = "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Order\"," + "\"purchaseOrderNo\": 111," + "\"customerId\": 101," + "\"description\": \"Purchase order for company - A\"," + "\"orderDate\": \"01/10/2014\"," + "\"deliveryDate\": \"01/20/2014\"," + "\"contact\": \"Nilkanthkumar N Patel\"," + "\"email\": \"npatel@pivotal.io\"," + "\"phone\": \"020-2048096\"," + "\"totalPrice\": 205," + "\"items\":" + "[" + "{" + "\"itemNo\": 1," + "\"description\": \"Product-1\"," + "\"quantity\": 5," + "\"unitPrice\": 10," + "\"totalPrice\": 50" + "}," + "{" + "\"itemNo\": 1," + "\"description\": \"Product-2\"," + "\"quantity\": 10," + "\"unitPrice\": 15.5," + "\"totalPrice\": 155" + "}" + "]" + "}"; private final String MALFORMED_JSON = "{" + "\"@type\" \"org.apache.geode.rest.internal.web.controllers.Order\"," + "\"purchaseOrderNo\": 111," + "\"customerId\": 101," + "\"description\": \"Purchase order for company - A\"," + "\"orderDate\": \"01/10/2014\"," + "\"deliveryDate\": \"01/20/2014\"," + "\"contact\": \"Nilkanthkumar N Patel\"," + "\"email\": \"npatel@pivotal.io\"," + "\"phone\": \"020-2048096\"," + "\"totalPrice\": 205," + "\"items\":" + "[" + "{" + "\"itemNo\": 1," + "\"description\": \"Product-1\"," + "\"quantity\": 5," + "\"unitPrice\": 10," + "\"totalPrice\": 50" + "}," + "{" + "\"itemNo\": 1," + "\"description\": \"Product-2\"," + "\"quantity\": 10," + "\"unitPrice\": 15.5," + "\"totalPrice\": 155" + "}" + "]" + "}"; private final String ORDER2_AS_JSON = "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Order\"," + "\"purchaseOrderNo\": 112," + "\"customerId\": 102," + "\"description\": \"Purchase order for company - B\"," + "\"orderDate\": \"02/10/2014\"," + "\"deliveryDate\": \"02/20/2014\"," + "\"contact\": \"John Blum\"," + "\"email\": \"jblum@pivotal.io\"," + "\"phone\": \"01-2048096\"," + "\"totalPrice\": 225," + "\"items\":" + "[" + "{" + "\"itemNo\": 1," + "\"description\": \"Product-3\"," + "\"quantity\": 6," + "\"unitPrice\": 20," + "\"totalPrice\": 120" + "}," + "{" + "\"itemNo\": 2," + "\"description\": \"Product-4\"," + "\"quantity\": 10," + "\"unitPrice\": 10.5," + "\"totalPrice\": 105" + "}" + "]" + "}"; private final String ORDER2_UPDATED_AS_JSON = "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Order\"," + "\"purchaseOrderNo\": 1112," + "\"customerId\": 102," + "\"description\": \"Purchase order for company - B\"," + "\"orderDate\": \"02/10/2014\"," + "\"deliveryDate\": \"02/20/2014\"," + "\"contact\": \"John Blum\"," + "\"email\": \"jblum@pivotal.io\"," + "\"phone\": \"01-2048096\"," + "\"totalPrice\": 350," + "\"items\":" + "[" + "{" + "\"itemNo\": 1," + "\"description\": \"Product-AAAA\"," + "\"quantity\": 10," + "\"unitPrice\": 20," + "\"totalPrice\": 200" + "}," + "{" + "\"itemNo\": 2," + "\"description\": \"Product-BBB\"," + "\"quantity\": 15," + "\"unitPrice\": 10," + "\"totalPrice\": 150" + "}" + "]" + "}"; final String CUSTOMER_LIST1_AS_JSON = "[" + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 1," + " \"firstName\": \"Vishal\"," + " \"lastName\": \"Roa\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 2," + " \"firstName\": \"Nilkanth\"," + " \"lastName\": \"Patel\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 3," + " \"firstName\": \"Avinash Dongre\"," + " \"lastName\": \"Roa\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 4," + " \"firstName\": \"Avinash Dongre\"," + " \"lastName\": \"Roa\"" + "}" + "]"; final String CUSTOMER_LIST_AS_JSON = "[" + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 101," + " \"firstName\": \"Vishal\"," + " \"lastName\": \"Roa\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 102," + " \"firstName\": \"Nilkanth\"," + " \"lastName\": \"Patel\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 103," + " \"firstName\": \"Avinash Dongre\"," + " \"lastName\": \"Roa\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 104," + " \"firstName\": \"John\"," + " \"lastName\": \"Blum\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 105," + " \"firstName\": \"Shankar\"," + " \"lastName\": \"Hundekar\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 106," + " \"firstName\": \"Amey\"," + " \"lastName\": \"Barve\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 107," + " \"firstName\": \"Vishal\"," + " \"lastName\": \"Roa\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 108," + " \"firstName\": \"Supriya\"," + " \"lastName\": \"Pillai\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 109," + " \"firstName\": \"Tushar\"," + " \"lastName\": \"khairnar\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 110," + " \"firstName\": \"Rishitesh\"," + " \"lastName\": \"Mishra\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 111," + " \"firstName\": \"Ajay\"," + " \"lastName\": \"Pandey\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 112," + " \"firstName\": \"Suyog\"," + " \"lastName\": \"Bokare\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 113," + " \"firstName\": \"Rajesh\"," + " \"lastName\": \"kumar\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 114," + " \"firstName\": \"swati\"," + " \"lastName\": \"sawant\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 115," + " \"firstName\": \"sonal\"," + " \"lastName\": \"Agrawal\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 116," + " \"firstName\": \"Amogh\"," + " \"lastName\": \"Shetkar\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 117," + " \"firstName\": \"Viren\"," + " \"lastName\": \"Balaut\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 118," + " \"firstName\": \"Namrata\"," + " \"lastName\": \"Tanvi\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 119," + " \"firstName\": \"Rahul\"," + " \"lastName\": \"Diyekar\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 120," + " \"firstName\": \"Varun\"," + " \"lastName\": \"Agrawal\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 121," + " \"firstName\": \"Hemant\"," + " \"lastName\": \"Bhanavat\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 122," + " \"firstName\": \"Sunil\"," + " \"lastName\": \"jigyasu\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 123," + " \"firstName\": \"Sumedh\"," + " \"lastName\": \"wale\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 124," + " \"firstName\": \"saobhik\"," + " \"lastName\": \"chaudhari\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 125," + " \"firstName\": \"Ketki\"," + " \"lastName\": \"Naidu\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 126," + " \"firstName\": \"YOgesh\"," + " \"lastName\": \"Mahajan\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 127," + " \"firstName\": \"Surinder\"," + " \"lastName\": \"Bindra\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 128," + " \"firstName\": \"sandip\"," + " \"lastName\": \"kasbe\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 129," + " \"firstName\": \"shivam\"," + " \"lastName\": \"Panada\"" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Customer\"," + "\"customerId\": 130," + " \"firstName\": \"Preeti\"," + " \"lastName\": \"Kumari\"" + "}," + "{" + "\"customerId\": 131," + " \"firstName\": \"Vishal31\"," + " \"lastName\": \"Roa31\"" + "}," + "{" + "\"customerId\": 132," + " \"firstName\": \"Nilkanth32\"," + " \"lastName\": \"Patel32\"" + "}," + "{" + "\"customerId\": 133," + " \"firstName\": \"Avinash33\"," + " \"lastName\": \"Dongre33\"" + "}," + "{" + "\"customerId\": 134," + " \"firstName\": \"John34\"," + " \"lastName\": \"Blum34\"" + "}," + "{" + "\"customerId\": 135," + " \"firstName\": \"Shankar35\"," + " \"lastName\": \"Hundekar35\"" + "}," + "{" + "\"customerId\": 136," + " \"firstName\": \"Amey36\"," + " \"lastName\": \"Barve36\"" + "}," + "{" + "\"customerId\": 137," + " \"firstName\": \"Vishal37\"," + " \"lastName\": \"Roa37\"" + "}," + "{" + "\"customerId\": 138," + " \"firstName\": \"Supriya38\"," + " \"lastName\": \"Pillai38\"" + "}," + "{" + "\"customerId\": 139," + " \"firstName\": \"Tushar39\"," + " \"lastName\": \"khairnar39\"" + "}," + "{" + "\"customerId\": 140," + " \"firstName\": \"Rishitesh40\"," + " \"lastName\": \"Mishra40\"" + "}," + "{" + "\"customerId\": 141," + " \"firstName\": \"Ajay41\"," + " \"lastName\": \"Pandey41\"" + "}," + "{" + "\"customerId\": 142," + " \"firstName\": \"Suyog42\"," + " \"lastName\": \"Bokare42\"" + "}," + "{" + "\"customerId\": 143," + " \"firstName\": \"Rajesh43\"," + " \"lastName\": \"kumar43\"" + "}," + "{" + "\"customerId\": 144," + " \"firstName\": \"swati44\"," + " \"lastName\": \"sawant44\"" + "}," + "{" + "\"customerId\": 145," + " \"firstName\": \"sonal45\"," + " \"lastName\": \"Agrawal45\"" + "}," + "{" + "\"customerId\": 146," + " \"firstName\": \"Amogh46\"," + " \"lastName\": \"Shetkar46\"" + "}," + "{" + "\"customerId\": 147," + " \"firstName\": \"Viren47\"," + " \"lastName\": \"Balaut47\"" + "}," + "{" + "\"customerId\": 148," + " \"firstName\": \"Namrata48\"," + " \"lastName\": \"Tanvi48\"" + "}," + "{" + "\"customerId\": 149," + " \"firstName\": \"Rahul49\"," + " \"lastName\": \"Diyekar49\"" + "}," + "{" + "\"customerId\": 150," + " \"firstName\": \"Varun50\"," + " \"lastName\": \"Agrawal50\"" + "}," + "{" + "\"customerId\": 151," + " \"firstName\": \"Hemant50\"," + " \"lastName\": \"Bhanavat50\"" + "}," + "{" + "\"customerId\": 152," + " \"firstName\": \"Sunil52\"," + " \"lastName\": \"jigyasu52\"" + "}," + "{" + "\"customerId\": 153," + " \"firstName\": \"Sumedh53\"," + " \"lastName\": \"wale53\"" + "}," + "{" + "\"customerId\": 154," + " \"firstName\": \"saobhik54\"," + " \"lastName\": \"chaudhari54\"" + "}," + "{" + "\"customerId\": 155," + " \"firstName\": \"Ketki55\"," + " \"lastName\": \"Naidu55\"" + "}," + "{" + "\"customerId\": 156," + " \"firstName\": \"YOgesh56\"," + " \"lastName\": \"Mahajan56\"" + "}," + "{" + "\"customerId\": 157," + " \"firstName\": \"Surinder57\"," + " \"lastName\": \"Bindra57\"" + "}," + "{" + "\"customerId\": 158," + " \"firstName\": \"sandip58\"," + " \"lastName\": \"kasbe58\"" + "}," + "{" + "\"customerId\": 159," + " \"firstName\": \"shivam59\"," + " \"lastName\": \"Panada59\"" + "}," + "{" + "\"customerId\": 160," + " \"firstName\": \"Preeti60\"," + " \"lastName\": \"Kumari60\"" + "}" + "]"; private final String ORDER_AS_CASJSON = "{" + "\"@old\" :" + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Order\"," + "\"purchaseOrderNo\": 111," + "\"customerId\": 101," + "\"description\": \"Purchase order for company - A\"," + "\"orderDate\": \"01/10/2014\"," + "\"deliveryDate\": \"01/20/2014\"," + "\"contact\": \"Nilkanthkumar N Patel\"," + "\"email\": \"npatel@pivotal.io\"," + "\"phone\": \"020-2048096\"," + "\"totalPrice\": 205," + "\"items\":" + "[" + "{" + "\"itemNo\": 1," + "\"description\": \"Product-1\"," + "\"quantity\": 5," + "\"unitPrice\": 10," + "\"totalPrice\": 50" + "}," + "{" + "\"itemNo\": 1," + "\"description\": \"Product-2\"," + "\"quantity\": 10," + "\"unitPrice\": 15.5," + "\"totalPrice\": 155" + "}" + "]" + "}," + "\"@new\" :" + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Order\"," + "\"purchaseOrderNo\": 11101," + "\"customerId\": 101," + "\"description\": \"Purchase order for company - A\"," + "\"orderDate\": \"01/10/2014\"," + "\"deliveryDate\": \"01/20/2014\"," + "\"contact\": \"Nilkanthkumar N Patel\"," + "\"email\": \"npatel@pivotal.io\"," + "\"phone\": \"020-2048096\"," + "\"totalPrice\": 205," + "\"items\":" + "[" + "{" + "\"itemNo\": 1," + "\"description\": \"Product-1\"," + "\"quantity\": 5," + "\"unitPrice\": 10," + "\"totalPrice\": 50" + "}," + "{" + "\"itemNo\": 3," + "\"description\": \"Product-3\"," + "\"quantity\": 10," + "\"unitPrice\": 100," + "\"totalPrice\": 1000" + "}," + "{" + "\"itemNo\": 1," + "\"description\": \"Product-2\"," + "\"quantity\": 10," + "\"unitPrice\": 15.5," + "\"totalPrice\": 155" + "}" + "]" + "}" + "}"; private final String MALFORMED_CAS_JSON = "{" + "\"@old\" :" + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Order\"," + "\"purchaseOrderNo\": 111," + "\"customerId\": 101," + "\"description\": \"Purchase order for company - A\"," + "\"orderDate\": \"01/10/2014\"," + "\"deliveryDate\": \"01/20/2014\"," + "\"contact\": \"Nilkanthkumar N Patel\"," + "\"email\": \"npatel@pivotal.io\"," + "\"phone\": \"020-2048096\"," + "\"totalPrice\": 205," + "\"items\":" + "[" + "{" + "\"itemNo\": 1," + "\"description\": \"Product-1\"," + "\"quantity\": 5," + "\"unitPrice\": 10," + "\"totalPrice\": 50" + "}," + "{" + "\"itemNo\": 1," + "\"description\": \"Product-2\"," + "\"quantity\": 10," + "\"unitPrice\": 15.5," + "\"totalPrice\": 155" + "}" + "]" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Order\"," + "\"purchaseOrderNo\": 11101," + "\"customerId\": 101," + "\"description\": \"Purchase order for company - A\"," + "\"orderDate\": \"01/10/2014\"," + "\"deliveryDate\": \"01/20/2014\"," + "\"contact\": \"Nilkanthkumar N Patel\"," + "\"email\": \"npatel@pivotal.io\"," + "\"phone\": \"020-2048096\"," + "\"totalPrice\": 205," + "\"items\":" + "[" + "{" + "\"itemNo\": 1," + "\"description\": \"Product-1\"," + "\"quantity\": 5," + "\"unitPrice\": 10," + "\"totalPrice\": 50" + "}," + "{" + "\"itemNo\": 3," + "\"description\": \"Product-3\"," + "\"quantity\": 10," + "\"unitPrice\": 100," + "\"totalPrice\": 1000" + "}," + "{" + "\"itemNo\": 1," + "\"description\": \"Product-2\"," + "\"quantity\": 10," + "\"unitPrice\": 15.5," + "\"totalPrice\": 155" + "}" + "]" + "}" + "}"; final String[][] PARAMETERIZED_QUERIES = new String[][] { {"selectOrders", "SELECT DISTINCT o FROM /orders o, o.items item WHERE item.quantity > $1 AND item.totalPrice > $2"}, {"selectCustomer", "SELECT c FROM /customers c WHERE c.customerId = $1"}, {"selectHighRollers", "SELECT DISTINCT c FROM /customers c, /orders o, o.items item WHERE item.totalprice > $1 AND c.customerId = o.customerId"}, {"testQuery", "SELECT DISTINCT c from /customers c where lastName=$1"}, {"findSelectedCustomers", "SELECT * from /customers where customerId IN SET ($1, $2, $3)"}, {"invalidQuery", "This is invalid string"}}; final String QUERY_ARGS2 = "{" + "\"@type\": \"int\"," + "\"@value\": 101" + "}"; final String QUERY_ARGS1 = "[" + "{" + "\"@type\": \"int\"," + "\"@value\": 2" + "}," + "{" + "\"@type\": \"double\"," + "\"@value\": 110.00" + "}" + "]"; @SuppressWarnings("unused") final String QUERY_ARGS3 = "[" + "{" + "\"@type\": \"String\"," + "\"@value\": \"Agrawal\"" + "}" + "]"; @SuppressWarnings("unused") final String QUERY_ARGS4 = "[" + "{" + "\"@type\": \"int\"," + "\"@value\": 20" + "}," + "{" + "\"@type\": \"int\"," + "\"@value\": 120" + "}," + "{" + "\"@type\": \"int\"," + "\"@value\": 130" + "}" + "]"; final String FUNCTION_ARGS1 = "[" + "{" + "\"@type\": \"double\"," + "\"@value\": 210" + "}," + "{" + "\"@type\": \"org.apache.geode.rest.internal.web.controllers.Item\"," + "\"itemNo\": \"599\"," + "\"description\": \"Part X Free on Bumper Offer\"," + "\"quantity\": \"2\"," + "\"unitprice\": \"5\"," + "\"totalprice\": \"10.00\"" + "}" + "]"; public final int METHOD_INDEX = 0; public final int URL_INDEX = 1; public final int REQUEST_BODY_INDEX = 2; public final int STATUS_CODE_INDEX = 3; public final int LOCATION_HEADER_INDEX = 4; public final int RESPONSE_HAS_BODY_INDEX = 5; public final int RESPONSE_HAS_EXCEPTION_INDEX = 6; final Object TEST_DATA[][] = { { // 0. create - 200 ok HttpMethod.POST, "/orders?key=1", ORDER1_AS_JSON, HttpStatus.CREATED, "/orders/1", false, false}, { // 1. create - 409 conflict HttpMethod.POST, "/orders?key=1", ORDER1_AS_JSON, HttpStatus.CONFLICT, "/orders/1", true, true}, { // 2. create - 400 bad Req for malformed Json HttpMethod.POST, "/orders?key=k1", MALFORMED_JSON, HttpStatus.BAD_REQUEST, null, true, true}, { // 3. create - 404, Not Found, for Region not exist HttpMethod.POST, "/" + UNKNOWN_REGION + "?key=k1", ORDER1_AS_JSON, HttpStatus.NOT_FOUND, null, true, true}, { // 4. create - 500 creating entry on region having DataPolicy=Empty HttpMethod.POST, "/" + EMPTY_REGION + "?key=k1", ORDER1_AS_JSON, HttpStatus.INTERNAL_SERVER_ERROR, null, true, true}, { // 5. Get data for key - 200 ok HttpMethod.GET, "/orders/1", null, HttpStatus.OK, "/orders/1", true, false}, { // 6. Get data for key - 404 region not exist HttpMethod.GET, "/" + UNKNOWN_REGION + "/1", null, HttpStatus.NOT_FOUND, null, true, true}, { // 7. Get data for Non-existing key - 404, Resource NOT FOUND. HttpMethod.GET, "/" + EMPTY_REGION + "/unknown", null, HttpStatus.INTERNAL_SERVER_ERROR, null, true, true}, { // 8. Put - 200 Ok, successful HttpMethod.PUT, "/orders/2", ORDER2_AS_JSON, HttpStatus.OK, "/orders/2", false, false}, { // 9. Put - 400 Bad Request, Malformed JSOn HttpMethod.PUT, "/orders/3", MALFORMED_JSON, HttpStatus.BAD_REQUEST, null, true, true}, { // 10. Put - 404 Not Found, Region does not exist HttpMethod.PUT, "/" + UNKNOWN_REGION + "/k1", ORDER2_AS_JSON, HttpStatus.NOT_FOUND, null, true, true}, { // 11. Put - 500, Gemfire throws exception HttpMethod.PUT, "/" + EMPTY_REGION + "/k1", ORDER2_AS_JSON, HttpStatus.INTERNAL_SERVER_ERROR, null, true, true}, { // 12. putAll - 200 Ok HttpMethod.PUT, "/customers/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60", CUSTOMER_LIST_AS_JSON, HttpStatus.OK, "/customers/3,4,5,6", false, false}, { // 13. putAll - 400 bad Request, amlformed Json HttpMethod.PUT, "/customers/3,4,5,6", MALFORMED_JSON, HttpStatus.BAD_REQUEST, null, true, true}, { // 14. putAll - 404 Not Found, Region Does not exist HttpMethod.PUT, "/" + UNKNOWN_REGION + "/3,4,5,6", CUSTOMER_LIST1_AS_JSON, HttpStatus.NOT_FOUND, null, true, true}, { // 15. putAll - 500, Gemfire throws exception HttpMethod.PUT, "/" + EMPTY_REGION + "/3,4,5,6", CUSTOMER_LIST1_AS_JSON, HttpStatus.INTERNAL_SERVER_ERROR, null, true, true}, { // 16. PUT?op=REPLACE, 200 Ok test case HttpMethod.PUT, "/orders/2?op=REPLACE", ORDER2_UPDATED_AS_JSON, HttpStatus.OK, "/orders/2", false, false}, { // 17. Put?op=REPLACE, 400 Bad Request, Malformed JSOn HttpMethod.PUT, "/orders/2?op=REPLACE", MALFORMED_JSON, HttpStatus.BAD_REQUEST, null, true, true}, { // 18. Put?op=REPLACE, 404 Not Found, Region does not exist HttpMethod.PUT, "/" + UNKNOWN_REGION + "/k1?op=rePlace", ORDER2_AS_JSON, HttpStatus.NOT_FOUND, null, true, true}, { // 19. Put?op=REPLACE, 500 testcase, Gemfire exception HttpMethod.PUT, "/" + EMPTY_REGION + "/k1?op=REPLACE", ORDER2_AS_JSON, HttpStatus.INTERNAL_SERVER_ERROR, null, true, true}, { // 20. Put?op=CAS, 200 OK testcase. HttpMethod.PUT, "/orders/1?op=CAS", ORDER_AS_CASJSON, HttpStatus.OK, "/orders/1", false, false}, { // 21. Put?op=CAS, 409 OK testcase. HttpMethod.PUT, "/orders/2?op=CAS", ORDER_AS_CASJSON, HttpStatus.CONFLICT, "/orders/2", true, true}, { // 22. Put?op=CAS, 400 Bad Request, Malformed JSOn HttpMethod.PUT, "/orders/2?op=cas", MALFORMED_CAS_JSON, HttpStatus.BAD_REQUEST, null, true, true}, { // 23. Put?op=CAS, 404 Not Found, Region does not exist HttpMethod.PUT, "/" + UNKNOWN_REGION + "/k1?op=CAS", ORDER_AS_CASJSON, HttpStatus.NOT_FOUND, null, true, true}, { // 24. Put?op=cAs, 500 testcase, Gemfire exception HttpMethod.PUT, "/" + EMPTY_REGION + "/k1?op=cAs", ORDER_AS_CASJSON, HttpStatus.INTERNAL_SERVER_ERROR, null, true, true}, { // 25. Get - List all regions/resources - 200 ok testcase HttpMethod.GET, "", null, HttpStatus.OK, RestTestUtils.GEMFIRE_REST_API_WEB_SERVICE_URL, true, true}, { // 26. List all regions/resources - 405 testcase. HttpMethod.POST, "", null, HttpStatus.METHOD_NOT_ALLOWED, null, true, true}, { // 27. GetAll - read all data for region - 200 ok, Default test case [No limit param // specified]. HttpMethod.GET, "/customers", null, HttpStatus.OK, "/customers", true, false}, { // 28 GetAll - read all data for region - 404 NOT FOUND testcase. HttpMethod.GET, "/" + UNKNOWN_REGION, null, HttpStatus.NOT_FOUND, null, true, true}, { // 29 GetAll - read all data for region - limit=ALL testcase. HttpMethod.GET, "/customers?limit=ALL", null, HttpStatus.OK, null, true, false}, { // 30 GetAll - read data for fixed number of keys - limit=<NUMBER> testcase. HttpMethod.GET, "/customers?limit=10", null, HttpStatus.OK, null, true, false}, { // 31. Get keys - List all keys in region - 200 ok testcase HttpMethod.GET, "/customers/keys", null, HttpStatus.OK, "/customers/keys", true, false}, { // 32. Get keys - List all keys for region which does not exist - 404 NOt Found testcase HttpMethod.GET, "/" + UNKNOWN_REGION + "/keys", null, HttpStatus.NOT_FOUND, null, true, true}, { // 33. Get keys - 405 testcase, if any HTTP request method other than GET (e.g. only POST, // NOT PUT, DELETE, as for them its a valid op) is used HttpMethod.POST, "/customers/keys", null, HttpStatus.METHOD_NOT_ALLOWED, null, true, true}, { // 34. Read data for the specific keys. 200 Ok testcase. HttpMethod.GET, "/customers/1,2,3,4,5,6,7,8,9,10", null, HttpStatus.OK, null, true, false}, { // 35. Read data for the specific keys. 404 Ok testcase. HttpMethod.GET, "/" + UNKNOWN_REGION + "/1,2,3,4,5,6,7,8,9,10", null, HttpStatus.NOT_FOUND, null, true, true}, { // 36. delete data for key in region. 200 Ok testcase HttpMethod.DELETE, "/customers/1", null, HttpStatus.OK, "/customers/1", false, false}, { // 37. delete data for key with non-existing region. 404 Not Found, testcase. HttpMethod.DELETE, "/" + UNKNOWN_REGION + "/1", null, HttpStatus.NOT_FOUND, null, true, true}, { // 38. delete data for key, 500 - Gemfire throws exception testcase. HttpMethod.DELETE, "/" + EMPTY_REGION + "/1", null, HttpStatus.NOT_FOUND, null, true, true}, { // 39. delete data for set of keys, 200 Ok, testcase. HttpMethod.DELETE, "/customers/2,3,4,5", null, HttpStatus.OK, null, false, false}, { // 40. delete data for set of keys, 404 Region NOT Found, testcase. HttpMethod.DELETE, "/" + UNKNOWN_REGION + "/2,3,4,5", null, HttpStatus.NOT_FOUND, null, true, true}, { // 41. delete data for set of keys, 500 Gemfire throws exception testcase. HttpMethod.DELETE, "/" + EMPTY_REGION + "/2,3,4,5", null, HttpStatus.NOT_FOUND, null, true, true}, { // 42. create parameterized named query HttpMethod.POST, "/queries?id=" + PARAMETERIZED_QUERIES[0][0] + "&q=" + PARAMETERIZED_QUERIES[0][1], null, HttpStatus.CREATED, "/queries/" + PARAMETERIZED_QUERIES[0][0], false, false}, { // 43. create parameterized named query HttpMethod.POST, "/queries?id=" + PARAMETERIZED_QUERIES[1][0] + "&q=" + PARAMETERIZED_QUERIES[1][1], null, HttpStatus.CREATED, "/queries/" + PARAMETERIZED_QUERIES[1][0], false, false}, { // 44. create parameterized named query HttpMethod.POST, "/queries?id=" + PARAMETERIZED_QUERIES[2][0] + "&q=" + PARAMETERIZED_QUERIES[2][1], null, HttpStatus.CREATED, "/queries/" + PARAMETERIZED_QUERIES[2][0], false, false}, { // 45. list all named/parameterized queries // NOTE: query result = 3. old index=8. HttpMethod.GET, "/queries", null, HttpStatus.OK, "/queries", true, false}, { // 46. Run the specified named query passing in args for query parameters in request body // Note: Query Result = 2, Old index=9 HttpMethod.POST, "/queries/" + PARAMETERIZED_QUERIES[0][0], QUERY_ARGS1, HttpStatus.OK, "/queries/" + PARAMETERIZED_QUERIES[0][0], true, false}, { // 47. Run the specified named query passing in args for query parameters in request body // Note: Query size = 1, old index = 10 HttpMethod.POST, "/queries/" + PARAMETERIZED_QUERIES[1][0], QUERY_ARGS2, HttpStatus.OK, "/queries/" + PARAMETERIZED_QUERIES[1][0], true, false}, { // 48. Run an unnamed (unidentified), ad-hoc query passed as a URL parameter HttpMethod.GET, "/queries/adhoc?q=SELECT * FROM /customers", null, HttpStatus.OK, null, true, false}, { // 49. list all functions available in the GemFire cluster HttpMethod.GET, "/functions", null, HttpStatus.OK, "/functions", true, false}, { // 50. Execute function with args on availabl nodes in the GemFire cluster HttpMethod.POST, "/functions/AddFreeItemToOrders?onRegion=orders", FUNCTION_ARGS1, HttpStatus.OK, "/functions/AddFreeItemToOrders", true, false}, { // 51. create parameterized named query "testQuery" HttpMethod.POST, "/queries?id=" + PARAMETERIZED_QUERIES[3][0] + "&q=" + PARAMETERIZED_QUERIES[3][1], null, HttpStatus.CREATED, "/queries/" + PARAMETERIZED_QUERIES[3][0], false, false}, { // 52. update parameterized named query "testQuery" HttpMethod.PUT, "/queries/" + PARAMETERIZED_QUERIES[0][0] + "?q=" + PARAMETERIZED_QUERIES[4][1], null, HttpStatus.OK, null, false, false}, { // 53. Run the updated named query passing in args for query parameters in request body HttpMethod.POST, "/queries/" + PARAMETERIZED_QUERIES[0][0], QUERY_ARGS1, HttpStatus.INTERNAL_SERVER_ERROR, null, true, false}, { // 54. update unknown parameterized named query HttpMethod.PUT, "/queries/" + "invalidQuery" + "?q=" + PARAMETERIZED_QUERIES[4][1], null, HttpStatus.NOT_FOUND, null, true, true}, { // 55. DELETE parameterized named query with invalid queryString HttpMethod.DELETE, "/queries/" + PARAMETERIZED_QUERIES[3][0], null, HttpStatus.OK, null, false, false}, { // 56. DELETE Non-existing parameterized named HttpMethod.DELETE, "/queries/" + PARAMETERIZED_QUERIES[3][0], null, HttpStatus.NOT_FOUND, null, true, true}, { // 57. Ping the REST service using HTTP HEAD HttpMethod.HEAD, "/ping", null, HttpStatus.OK, null, false, false}, { // 58. Ping the REST service using HTTP GET HttpMethod.GET, "/ping", null, HttpStatus.OK, null, false, false}, { // 59. Get the total number of entries in region HttpMethod.HEAD, "/customers", null, HttpStatus.OK, null, false, false}, { // 60. create parameterized named query "testQuery", passing it in request-body HttpMethod.POST, "/queries?id=" + PARAMETERIZED_QUERIES[3][0], PARAMETERIZED_QUERIES[3][1], HttpStatus.CREATED, "/queries/" + PARAMETERIZED_QUERIES[3][0], false, false}, { // 61. update parameterized named query, passing it in request-body HttpMethod.PUT, "/queries/" + PARAMETERIZED_QUERIES[3][0], PARAMETERIZED_QUERIES[4][1], HttpStatus.OK, null, false, false}, { // 52.5. update parameterized named query "testQuery" HttpMethod.GET, "/queries", null, HttpStatus.OK, null, true, false},}; // TEST_DATA_END final int LIST_ALL_NAMED_QUERIES_INDEX = 45; final List<Integer> VALID_400_URL_INDEXS = Arrays.asList(2, 9, 13, 17, 22); final List<Integer> VALID_404_URL_INDEXS = Arrays.asList(3, 6, 7, 10, 14, 18, 23, 28, 32, 35, 37, 38, 40, 41, 54, 56); final List<Integer> VALID_409_URL_INDEXS = Arrays.asList(1, 21); final List<Integer> VALID_405_URL_INDEXS = Arrays.asList(26, 33); final List<Integer> Query_URL_INDEXS = Arrays.asList(LIST_ALL_NAMED_QUERIES_INDEX, 46, 47, 48); public String createRestURL(String baseURL, Object requestPart) { if (StringUtils.isEmpty(requestPart)) { return baseURL + RestTestUtils.GEMFIRE_REST_API_CONTEXT + RestTestUtils.GEMFIRE_REST_API_VERSION; } else { return baseURL + RestTestUtils.GEMFIRE_REST_API_CONTEXT + RestTestUtils.GEMFIRE_REST_API_VERSION + requestPart; } } public void initializeQueryTestData() { // LIST_ALL_NAMED_QUERY int size = PARAMETERIZED_QUERIES.length; List<String> queryIds = new ArrayList<>(); for (int i = 0; i < size; i++) { queryIds.add(PARAMETERIZED_QUERIES[i][0]); } QueryResultData qIndex45_resultData = new QueryResultData(); qIndex45_resultData.setQueryIndex(45); qIndex45_resultData.setType(QueryType.LIST_ALL_NAMED_QUERY); qIndex45_resultData.setResultSize(2); qIndex45_resultData.setResult(queryIds); queryResultByIndex.put(45, qIndex45_resultData); // index=46 QueryResultData qIndex46_resultData = new QueryResultData(); qIndex46_resultData.setQueryIndex(46); qIndex46_resultData.setType(QueryType.EXECUTE_NAMED_QUERY); qIndex46_resultData.setResultSize(2); qIndex46_resultData.setResult(null); queryResultByIndex.put(46, qIndex46_resultData); // index=47 QueryResultData qIndex47_resultData = new QueryResultData(); qIndex47_resultData.setQueryIndex(47); qIndex47_resultData.setType(QueryType.EXECUTE_NAMED_QUERY); qIndex47_resultData.setResultSize(0); qIndex47_resultData.setResult(null); queryResultByIndex.put(47, qIndex47_resultData); // index=48 QueryResultData qIndex48_resultData = new QueryResultData(); qIndex48_resultData.setQueryIndex(48); qIndex48_resultData.setType(QueryType.EXECUTE_ADHOC_QUERY); qIndex48_resultData.setResultSize(55); qIndex48_resultData.setResult(null); queryResultByIndex.put(48, qIndex48_resultData); } @Before public void setUp() throws Exception { AgentUtil agentUtil = new AgentUtil(GemFireVersion.getGemFireVersion()); if (agentUtil.findWarLocation("geode-web-api") == null) { fail("unable to locate geode-web-api WAR file"); } this.restServicePort = AvailablePortHelper.getRandomAvailableTCPPort(); try { InetAddress addr = SocketCreator.getLocalHost(); this.hostName = addr.getHostName(); } catch (UnknownHostException ex) { this.hostName = ManagementConstants.DEFAULT_HOST_NAME; } String workingDirectory = System.getProperty("geode.build.dir", System.getProperty("user.dir")); ServerLauncher serverLauncher = new ServerLauncher.Builder().set(MCAST_PORT, "0") .setServerBindAddress(this.hostName).setServerPort(0).set(START_DEV_REST_API, "true") .set(HTTP_SERVICE_PORT, String.valueOf(this.restServicePort)) .set(HTTP_SERVICE_BIND_ADDRESS, this.hostName).setPdxReadSerialized(true) .setWorkingDirectory(workingDirectory).build(); serverLauncher.start(); this.baseURL = "http://" + this.hostName + ":" + this.restServicePort; this.c = CacheFactory.getAnyInstance(); final AttributesFactory<String, String> attributesFactory = new AttributesFactory<>(); attributesFactory.setDataPolicy(DataPolicy.REPLICATE); // Create region, customers final RegionAttributes<String, String> regionAttributes = attributesFactory.create(); c.createRegion(CUSTOMER_REGION, regionAttributes); // Create region, items attributesFactory.setDataPolicy(DataPolicy.PARTITION); c.createRegion(ITEM_REGION, regionAttributes); // Create region, /orders final AttributesFactory<Object, Object> af2 = new AttributesFactory<>(); af2.setDataPolicy(DataPolicy.PARTITION); final RegionAttributes<Object, Object> rAttributes2 = af2.create(); c.createRegion(ORDER_REGION, rAttributes2); // Create region, primitiveKVStore final AttributesFactory<Object, Object> af1 = new AttributesFactory<>(); af1.setDataPolicy(DataPolicy.PARTITION); final RegionAttributes<Object, Object> rAttributes = af1.create(); c.createRegion(PRIMITIVE_KV_STORE_REGION, rAttributes); RegionFactory<String, Object> rf = c.createRegionFactory(RegionShortcut.REPLICATE); rf.setDataPolicy(DataPolicy.EMPTY); rf.setCacheLoader(new SimpleCacheLoader()); rf.setCacheWriter(new SampleCacheWriter()); rf.create(EMPTY_REGION); // Register functions here FunctionService.registerFunction(new GetAllEntries()); FunctionService.registerFunction(new GetRegions()); FunctionService.registerFunction(new PutKeyFunction()); FunctionService.registerFunction(new GetDeliveredOrders()); FunctionService.registerFunction(new AddFreeItemToOrders()); } @After public void tearDown() { // shutdown and clean up the manager node. ServerLauncher.getInstance().stop(); } private HttpHeaders setAcceptAndContentTypeHeaders() { List<MediaType> acceptableMediaTypes = new ArrayList<>(); acceptableMediaTypes.add(MediaType.APPLICATION_JSON); HttpHeaders headers = new HttpHeaders(); headers.setAccept(acceptableMediaTypes); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } @Test public void testCreateAsJson() { executeQueryTestCases(); } private void caught(String message, Throwable cause) { throw new AssertionError(message, cause); } private void validateGetAllResult(int index, ResponseEntity<String> result) { if (index == 27 || index == 29 || index == 30) { try { new JSONObject(result.getBody()).getJSONArray("customers"); } catch (JSONException e) { caught("Caught JSONException in validateGetAllResult :: " + e.getMessage(), e); } } } private void verifyRegionSize(int index, ResponseEntity<String> result) { if (index == 59) { HttpHeaders headers = result.getHeaders(); String value = headers.getFirst("Resource-Count"); assertEquals(Integer.parseInt(value), 55); } } private void validateQueryResult(int index, ResponseEntity<String> result) { if (Query_URL_INDEXS.contains(index)) { queryResultByIndex = new HashMap<>(); initializeQueryTestData(); QueryResultData queryResult = queryResultByIndex.get(index); // Check whether received response contains expected query IDs. if (index == 45) { try { JSONObject jsonObject = new JSONObject(result.getBody()); JSONArray jsonArray = new JSONArray(jsonObject.get("queries").toString()); for (int i = 0; i < jsonArray.length(); i++) { assertTrue("PREPARE_PARAMETERIZED_QUERY: function IDs are not matched", queryResult.getResult().contains(jsonArray.getJSONObject(i).getString("id"))); } } catch (JSONException e) { caught("Caught JSONException in validateQueryResult :: " + e.getMessage(), e); } } else if (index == 46 || index == 47 || index == 48) { JSONArray jsonArray; try { jsonArray = new JSONArray(result.getBody()); // verify query result size assertEquals(queryResult.getResultSize(), jsonArray.length()); } catch (JSONException e) { caught("Caught JSONException in validateQueryResult :: " + e.getMessage(), e); } } } } private String addExpectedException(int index) { String expectedEx = "appears to have started a thread named"; if (index == 4 || index == 5 || index == 24) { expectedEx = "java.lang.UnsupportedOperationException"; c.getLogger().info("<ExpectedException action=add>" + expectedEx + "</ExpectedException>"); return expectedEx; } else if (index == 7) { expectedEx = "org.apache.geode.cache.TimeoutException"; c.getLogger().info("<ExpectedException action=add>" + expectedEx + "</ExpectedException>"); return expectedEx; } else if (index == 11 || index == 15) { expectedEx = "org.apache.geode.cache.CacheWriterException"; c.getLogger().info("<ExpectedException action=add>" + expectedEx + "</ExpectedException>"); return expectedEx; } else if (index == 19) { expectedEx = "java.lang.IllegalArgumentException"; c.getLogger().info("<ExpectedException action=add>" + expectedEx + "</ExpectedException>"); return expectedEx; } else if (index == 38 || index == 41) { expectedEx = "org.apache.geode.cache.RegionDestroyedException"; c.getLogger().info("<ExpectedException action=add>" + expectedEx + "</ExpectedException>"); return expectedEx; } return expectedEx; } private void executeQueryTestCases() { HttpHeaders headers = setAcceptAndContentTypeHeaders(); HttpEntity<Object> entity; int totalRequests = TEST_DATA.length; String expectedEx = null; for (int index = 0; index < totalRequests; index++) { try { expectedEx = addExpectedException(index); final String restRequestUrl = createRestURL(this.baseURL, TEST_DATA[index][URL_INDEX]); entity = new HttpEntity<>(TEST_DATA[index][REQUEST_BODY_INDEX], headers); ResponseEntity<String> result = RestTestUtils.getRestTemplate().exchange(restRequestUrl, (HttpMethod) TEST_DATA[index][METHOD_INDEX], entity, String.class); validateGetAllResult(index, result); validateQueryResult(index, result); assertEquals(result.getStatusCode(), TEST_DATA[index][STATUS_CODE_INDEX]); assertEquals(result.hasBody(), ((Boolean) TEST_DATA[index][RESPONSE_HAS_BODY_INDEX]).booleanValue()); verifyRegionSize(index, result); // TODO: // verify location header } catch (HttpClientErrorException e) { if (VALID_409_URL_INDEXS.contains(index)) { // create-409, conflict testcase. [create on already existing key] assertEquals(e.getStatusCode(), TEST_DATA[index][STATUS_CODE_INDEX]); assertEquals(StringUtils.hasText(e.getResponseBodyAsString()), ((Boolean) TEST_DATA[index][RESPONSE_HAS_BODY_INDEX]).booleanValue()); } else if (VALID_400_URL_INDEXS.contains(index)) { // 400, Bad Request testcases. [create with malformed Json] assertEquals(e.getStatusCode(), TEST_DATA[index][STATUS_CODE_INDEX]); assertEquals(StringUtils.hasText(e.getResponseBodyAsString()), ((Boolean) TEST_DATA[index][RESPONSE_HAS_BODY_INDEX]).booleanValue()); } else if (VALID_404_URL_INDEXS.contains(index)) { // create-404, Not Found testcase. [create on not-existing region] assertEquals(e.getStatusCode(), TEST_DATA[index][STATUS_CODE_INDEX]); assertEquals(StringUtils.hasText(e.getResponseBodyAsString()), ((Boolean) TEST_DATA[index][RESPONSE_HAS_BODY_INDEX]).booleanValue()); } else if (VALID_405_URL_INDEXS.contains(index)) { // create-404, Not Found testcase. [create on not-existing region] assertEquals(e.getStatusCode(), TEST_DATA[index][STATUS_CODE_INDEX]); assertEquals(StringUtils.hasText(e.getResponseBodyAsString()), ((Boolean) TEST_DATA[index][RESPONSE_HAS_BODY_INDEX]).booleanValue()); } else { fail("Index:" + index + " " + TEST_DATA[index][METHOD_INDEX] + " " + TEST_DATA[index][URL_INDEX] + " should not have thrown exception "); } } catch (HttpServerErrorException se) { // index=4, create- 500, INTERNAL_SERVER_ERROR testcase. [create on Region with // DataPolicy=Empty set] // index=7, create- 500, INTERNAL_SERVER_ERROR testcase. [Get, attached cache loader throws // Timeout exception] // index=11, put- 500, [While doing R.put, CacheWriter.beforeCreate() has thrown // CacheWriterException] // .... and more test cases assertEquals(se.getStatusCode(), TEST_DATA[index][STATUS_CODE_INDEX]); assertEquals(StringUtils.hasText(se.getResponseBodyAsString()), ((Boolean) TEST_DATA[index][RESPONSE_HAS_BODY_INDEX]).booleanValue()); } catch (Exception e) { caught("caught Exception in executeQueryTestCases " + "Index:" + index + " " + TEST_DATA[index][METHOD_INDEX] + " " + TEST_DATA[index][URL_INDEX] + " :: Unexpected ERROR...!!", e); } finally { c.getLogger() .info("<ExpectedException action=remove>" + expectedEx + "</ExpectedException>"); } } } } // TODO: move following classes to be inner classes class SimpleCacheLoader implements CacheLoader<String, Object>, Declarable { @Override public Object load(LoaderHelper helper) { // throws TimeoutException throw new TimeoutException("Could not load, Request Timedout...!!"); } @Override public void close() {} @Override public void init(Properties props) { } } class SampleCacheWriter implements CacheWriter<String, Object> { @Override public void close() {} @Override public void beforeUpdate(EntryEvent event) throws CacheWriterException {} @Override public void beforeCreate(EntryEvent event) throws CacheWriterException { throw new CacheWriterException("Put request failed as gemfire has thrown error...!!"); } @Override public void beforeDestroy(EntryEvent event) throws CacheWriterException { throw new RegionDestroyedException("Region has been destroyed already...!!", "dummyRegion"); } @Override public void beforeRegionDestroy(RegionEvent event) throws CacheWriterException {} @Override public void beforeRegionClear(RegionEvent event) throws CacheWriterException {} } enum QueryType { LIST_ALL_NAMED_QUERY, EXECUTE_NAMED_QUERY, EXECUTE_ADHOC_QUERY } class QueryResultData { private int queryIndex; private QueryType type; private int resultSize; private List<String> result; public QueryResultData() {} @SuppressWarnings("unused") public QueryResultData(int index, QueryType type, int size, List<String> result) { this.queryIndex = index; this.type = type; this.resultSize = size; this.result = result; } public QueryType getType() { return type; } public void setType(QueryType type) { this.type = type; } public int getQueryIndex() { return queryIndex; } public void setQueryIndex(int queryIndex) { this.queryIndex = queryIndex; } public int getResultSize() { return resultSize; } public void setResultSize(int resultSize) { this.resultSize = resultSize; } public List<String> getResult() { return result; } public void setResult(List<String> result) { this.result = result; } }