/*
* 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.management;
import static org.apache.geode.distributed.ConfigurationProperties.*;
import org.apache.geode.cache.*;
import org.apache.geode.cache.query.data.Portfolio;
import org.apache.geode.cache.query.data.Position;
import org.apache.geode.distributed.DistributedSystem;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.management.internal.ManagementConstants;
import org.apache.geode.management.internal.beans.QueryDataFunction;
import org.apache.geode.management.internal.cli.json.TypedJson;
import org.apache.geode.management.model.EmptyObject;
import org.apache.geode.management.model.Item;
import org.apache.geode.management.model.Order;
import org.apache.geode.management.model.SubOrder;
import org.apache.geode.pdx.PdxInstance;
import org.apache.geode.pdx.PdxInstanceFactory;
import org.apache.geode.pdx.internal.PdxInstanceFactoryImpl;
import org.apache.geode.test.junit.categories.IntegrationTest;
import org.json.JSONObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
import static org.junit.Assert.fail;
/**
* @since GemFire 8.1
*
*/
@Category(IntegrationTest.class)
public class DataBrowserJSONValidationJUnitTest {
protected static final long SLEEP = 100;
protected static final long TIMEOUT = 4 * 1000;
protected InternalDistributedSystem system;
private Cache cache;
Region replicatedRegion;
private static final String REPLICATED_REGION = "exampleRegion";
/**
* Number of rows queryData operation will return. By default it will be 1000
*/
private int queryResultSetLimit = ManagementConstants.DEFAULT_QUERY_LIMIT;
/**
* NUmber of elements to be shown in queryData operation if query results contain collections like
* Map, List etc.
*/
private int queryCollectionsDepth = TypedJson.DEFAULT_COLLECTION_ELEMENT_LIMIT;
private String QUERY_1 = "SELECT * FROM /exampleRegion";
@After
public void tearDown() throws Exception {
this.system.disconnect();
this.system = null;
}
@SuppressWarnings("deprecation")
@Before
public void setUp() throws Exception {
// System.setProperty("gemfire.stats.debug.debugSampleCollector", "true");
final Properties props = new Properties();
props.setProperty(MCAST_PORT, "0");
props.setProperty(ENABLE_TIME_STATISTICS, "true");
props.setProperty(STATISTIC_SAMPLING_ENABLED, "false");
props.setProperty(STATISTIC_SAMPLE_RATE, "60000");
props.setProperty(JMX_MANAGER, "true");
props.setProperty(JMX_MANAGER_START, "true");
props.setProperty(JMX_MANAGER_HTTP_PORT, "0");
props.setProperty(JMX_MANAGER_PORT, "0");
this.system = (InternalDistributedSystem) DistributedSystem.connect(props);
this.cache = new CacheFactory().create();
RegionFactory replicatedRegionFac = cache.createRegionFactory(RegionShortcut.REPLICATE);
replicatedRegion = replicatedRegionFac.create(REPLICATED_REGION);
}
private void queryData(String query, String members, int limit) {
try {
Object result = QueryDataFunction.queryData(query, members, limit, false, queryResultSetLimit,
queryCollectionsDepth);
String queryResult = (String) result;
System.out.println("Query Result :" + queryResult.toString());
JSONObject jobj = new JSONObject(queryResult);// If not correct JSON
// format this will throw a
// JSONException
System.out.println("Query Result :" + jobj.toString());
} catch (Exception e) {
fail(e.getLocalizedMessage());
}
}
/**
* #Issue 51048 Tests a model where Objects have a circular reference with object reference. e.g.
* Order1-- Has--> Items each Item --Has --> OrderN where (OrderN == Order1)
*/
@Test
public void testCyclicWithNestedObjectReference() {
Order order = new Order();
order.setId("test");
for (int i = 1; i <= 5; i++) {
Item item = new Item(order, "ID_" + i, "Book");
order.addItem(item);
}
replicatedRegion.put("oreder1", order);
queryData(QUERY_1, "", 0);
}
/**
* Tests a model where Objects have a circular reference with their class types. e.g. Order1--
* Has--> Items each Item --Has --> OrderN where (OrderN != Order1)
*/
@Test
public void testCyclicWithNestedClasses() {
Order order = new Order();
order.setId("test");
for (int i = 1; i <= 5; i++) {
Order ord = new Order();
ord.setId("ORDER_ID_" + i);
Item item = new Item(ord, "ID_" + i, "Book");
order.addItem(item);
}
replicatedRegion.put("oreder1", order);
queryData(QUERY_1, "", 0);
}
/**
* Tests a model where Objects have a circular reference with their class types. e.g. Order1--
* Has--> Items each Item --Has --> OrderN where (OrderN != Order1)
*/
@Test
public void testCyclicWithNestedRefernce2ndLayer() {
Collection<Item> items = new ArrayList<Item>();
Order order = new Order("ORDER_TEST", items);
for (int i = 1; i <= 5; i++) {
Order ord = new Order();
ord.setId("ORDER_ID_" + i);
ord.setItems(items);
Item item = new Item(ord, "ID_" + i, "Book");
order.addItem(item);
}
replicatedRegion.put("oreder1", order);
queryData(QUERY_1, "", 0);
}
@Test
public void testCyclicWithCollection1stLayer() {
Collection<Item> items = new ArrayList<Item>();
Order order = new Order("ORDER_TEST", items);
for (int i = 1; i <= 5; i++) {
Order ord = new Order();
ord.setId("ORDER_ID_" + i);
ord.setItems(items);
Item item = new Item(ord, "ID_" + i, "Book");
order.addItem(item);
}
replicatedRegion.put("items", items);
queryData(QUERY_1, "", 0);
}
@Test
public void testCyclicCollectionWithMultipleObjects() {
for (int j = 1; j <= 5; j++) {
Collection<Item> items = new ArrayList<Item>();
Order order = new Order("ORDER_TEST_" + j, items);
for (int i = 1; i <= 5; i++) {
Order ord = new Order();
ord.setId("ORDER_ID_" + i);
ord.setItems(items);
Item item = new Item(ord, "ID_" + i, "Book");
order.addItem(item);
}
replicatedRegion.put("items_" + j, items);
}
queryData(QUERY_1, "", 0);
}
@Test
public void testCyclicArrayMultipleObjects() {
for (int j = 1; j <= 5; j++) {
Collection<Item> items = new ArrayList<Item>();
Order order = new Order("ORDER_TEST_" + j, items);
for (int i = 1; i <= 5; i++) {
Order ord = new Order();
ord.setId("ORDER_ID_" + i);
ord.setItems(items);
Item item = new Item(ord, "ID_" + i, "Book");
order.addItem(item);
}
replicatedRegion.put("items_" + j, items);
}
queryData(QUERY_1, "", 0);
}
public Portfolio[] createPortfoliosAndPositions(int count) {
Position.cnt = 0; // reset Portfolio counter
Portfolio[] portfolios = new Portfolio[count];
for (int i = 0; i < count; i++) {
portfolios[i] = new Portfolio(i);
}
return portfolios;
}
@Test
public void testCyclicArrayMultipleObjectsMemberWise() {
Portfolio[] ports = createPortfoliosAndPositions(1);
int i = 1;
for (Portfolio p : ports) {
replicatedRegion.put(new Integer(i), p);
i++;
}
queryData(QUERY_1, cache.getDistributedSystem().getMemberId() + ","
+ cache.getDistributedSystem().getMemberId(), 0);
}
@Test
public void testEmptyObject() {
EmptyObject p = new EmptyObject();
replicatedRegion.put("port", p);
queryData(QUERY_1, "", 0);
}
@Test
public void testSubClassOverridingMethods() {
SubOrder so = new SubOrder();
replicatedRegion.put("port", so);
queryData(QUERY_1, "", 0);
}
@Test
public void testNestedPDXObject() {
PdxInstanceFactory pf = PdxInstanceFactoryImpl.newCreator("Portfolio", false);
pf.writeInt("ID", 111);
pf.writeString("status", "active");
pf.writeString("secId", "IBM");
PdxInstance pi = pf.create();
replicatedRegion.put("port", pi);
queryData(QUERY_1, "", 0);
}
@Test
public void testArrayWithNullValues() {
SubOrder[] soArr = new SubOrder[2];
soArr[0] = new SubOrder();
soArr[1] = null;
replicatedRegion.put("p1", soArr);
queryData(QUERY_1, "", 0);
}
@Test
public void testWithSqlDate() {
SubOrder[] soArr = new SubOrder[2];
soArr[0] = new SubOrder();
soArr[1] = null;
replicatedRegion.put("p1", soArr);
queryData(QUERY_1, "", 0);
}
}