blob: 8f065d59ffcabdfb465bdd4c7d243de40adfef1e [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.ambari.server.api.services.parsers;
import org.apache.ambari.server.api.services.NamedPropertySet;
import org.apache.ambari.server.api.services.RequestBody;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
/**
* Unit tests for JsonPropertyParser.
*/
public class JsonRequestBodyParserTest {
String serviceJson = "{\"Services\" : {" +
" \"display_name\" : \"HDFS\"," +
" \"description\" : \"Apache Hadoop Distributed File System\","+
" \"service_name\" : \"HDFS\"" +
" }," +
" \"ServiceInfo\" : {" +
" \"cluster_name\" : \"tbmetrictest\"," +
" \"state\" : \"STARTED\"" +
" }," +
"\"OuterCategory\" : { \"propName\" : 100, \"nested1\" : { \"nested2\" : { \"innerPropName\" : \"innerPropValue\" } } }," +
"\"topLevelProp\" : \"value\" }";
String serviceJsonWithQuery = "{ \"RequestInfo\" : { \"query\" : \"foo=bar\" }, \"Body\":" + serviceJson + "}";
String arrayJson = "[ {" +
"\"Clusters\" : {\n" +
" \"cluster_name\" : \"unitTestCluster1\"" +
"} }," +
"{" +
"\"Clusters\" : {\n" +
" \"cluster_name\" : \"unitTestCluster2\"," +
" \"property1\" : \"prop1Value\"" +
"} }," +
"{" +
"\"Clusters\" : {\n" +
" \"cluster_name\" : \"unitTestCluster3\"," +
" \"Category\" : { \"property2\" : \"prop2Value\"}" +
"} } ]";
String arrayJson2 = "{" +
"\"Clusters\" : {\n" +
" \"cluster_name\" : \"unitTestCluster1\"" +
"} }," +
"{" +
"\"Clusters\" : {\n" +
" \"cluster_name\" : \"unitTestCluster2\"," +
" \"property1\" : \"prop1Value\"" +
"} }," +
"{" +
"\"Clusters\" : {\n" +
" \"cluster_name\" : \"unitTestCluster3\"," +
" \"Category\" : { \"property2\" : \"prop2Value\"}" +
"} }";
String multiBody = "[\n" +
" {\n" +
" \"RequestInfo\":{\n" +
" \"query\":\"Hosts/host_name=h1\"\n" +
" },\n" +
" \"Body\":\n" +
" {\n" +
" \"Hosts\": {\n" +
" \"desired_config\": {\n" +
" \"type\": \"global\",\n" +
" \"tag\": \"version20\",\n" +
" \"properties\": { \"a\": \"b\", \"x\": \"y\" }\n" +
" }\n" +
" }\n" +
" }\n" +
" },\n" +
" {\n" +
" \"RequestInfo\":{\n" +
" \"query\":\"Hosts/host_name=h2\"\n" +
" },\n" +
" \"Body\":\n" +
" {\n" +
" \"Hosts\": {\n" +
" \"desired_config\": {\n" +
" \"type\": \"global\",\n" +
" \"tag\": \"version21\",\n" +
" \"properties\": { \"a\": \"c\", \"x\": \"z\" }\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"]\n";
String queryPostJson = "{ \"services\" : [ {" +
"\"ServiceInfo\" : {\n" +
" \"service_name\" : \"unitTestService1\"" +
"} }," +
"{" +
"\"ServiceInfo\" : {\n" +
" \"service_name\" : \"unitTestService2\"," +
" \"property1\" : \"prop1Value\"" +
"} }," +
"{" +
"\"ServiceInfo\" : {\n" +
" \"service_name\" : \"unitTestService3\"," +
" \"Category\" : { \"property2\" : \"prop2Value\"}" +
"} } ] }";
String queryPostJsonWithQuery = "{ \"RequestInfo\" : { \"query\" : \"foo=bar\" }, \"Body\":" + queryPostJson + "}";
String queryPostMultipleSubResourcesJson = "{ \"foo\" : [ {" +
"\"ServiceInfo\" : {\n" +
" \"service_name\" : \"unitTestService1\"" +
"} }" +
"]," +
" \"bar\" : [" +
"{" +
"\"ServiceInfo\" : {\n" +
" \"service_name\" : \"unitTestService2\"," +
" \"Category\" : { \"property2\" : \"prop2Value\"}" +
"} } ] }";
String bodyQueryOnly = "{ \"RequestInfo\" : { \"query\" : \"foo=bar\" }}";
String malformedJson = "{ \"Category\" : { \"foo\" : \"bar\"}";
String bodyWithRequestInfoProperties = "{ \"RequestInfo\" : { \"query\" : \"foo=bar\", \"prop1\" : \"val1\", \"prop2\" : \"val2\" }, \"Body\":" + serviceJson + "}";
@Test
public void testParse() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(serviceJson).iterator().next();
Set<NamedPropertySet> setProps = body.getNamedPropertySets();
assertEquals(1, setProps.size());
Map<String, Object> mapExpected = new HashMap<String, Object>();
mapExpected.put(PropertyHelper.getPropertyId("Services", "service_name"), "HDFS");
mapExpected.put(PropertyHelper.getPropertyId("Services", "display_name"), "HDFS");
mapExpected.put(PropertyHelper.getPropertyId("ServiceInfo", "cluster_name"), "tbmetrictest");
mapExpected.put(PropertyHelper.getPropertyId("Services", "description"), "Apache Hadoop Distributed File System");
mapExpected.put(PropertyHelper.getPropertyId("ServiceInfo", "state"), "STARTED");
mapExpected.put(PropertyHelper.getPropertyId("OuterCategory", "propName"), "100");
mapExpected.put(PropertyHelper.getPropertyId("OuterCategory/nested1/nested2", "innerPropName"), "innerPropValue");
mapExpected.put(PropertyHelper.getPropertyId(null, "topLevelProp"), "value");
assertEquals(mapExpected, setProps.iterator().next().getProperties());
//assert body is correct by checking that properties match
String b = body.getBody();
body = parser.parse(b).iterator().next();
Set<NamedPropertySet> setProps2 = body.getNamedPropertySets();
assertEquals(mapExpected, setProps2.iterator().next().getProperties());
}
@Test
public void testParse_NullBody() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(null).iterator().next();
assertNotNull(body.getNamedPropertySets());
assertEquals(0, body.getNamedPropertySets().size());
assertNull(body.getQueryString());
assertNull(body.getPartialResponseFields());
assertNull(body.getBody());
}
@Test
public void testParse_EmptyBody() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse("").iterator().next();
assertNotNull(body.getNamedPropertySets());
assertEquals(0, body.getNamedPropertySets().size());
assertNull(body.getQueryString());
assertNull(body.getPartialResponseFields());
assertNull(body.getBody());
}
@Test
public void testParse_MultiBody() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
Set<RequestBody> bodySet = parser.parse(multiBody);
assertEquals(2, bodySet.size());
for (RequestBody body : bodySet) {
Set<NamedPropertySet> setProps = body.getNamedPropertySets();
assertEquals(1, setProps.size());
Map<String, Object> mapProps = setProps.iterator().next().getProperties();
assertEquals(4, mapProps.size());
assertEquals("global", mapProps.get("Hosts/desired_config/type"));
}
}
@Test
public void testParse_Array() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(arrayJson).iterator().next();
Set<NamedPropertySet> setProps = body.getNamedPropertySets();
assertEquals(3, setProps.size());
boolean cluster1Matches = false;
boolean cluster2Matches = false;
boolean cluster3Matches = false;
Map<String, String> mapCluster1 = new HashMap<String, String>();
mapCluster1.put(PropertyHelper.getPropertyId("Clusters", "cluster_name"), "unitTestCluster1");
Map<String, String> mapCluster2 = new HashMap<String, String>();
mapCluster2.put(PropertyHelper.getPropertyId("Clusters", "cluster_name"), "unitTestCluster2");
mapCluster2.put(PropertyHelper.getPropertyId("Clusters", "property1"), "prop1Value");
Map<String, String> mapCluster3 = new HashMap<String, String>();
mapCluster3.put(PropertyHelper.getPropertyId("Clusters", "cluster_name"), "unitTestCluster3");
mapCluster3.put(PropertyHelper.getPropertyId("Clusters/Category", "property2"), "prop2Value");
for (NamedPropertySet propertySet : setProps) {
assertEquals("", propertySet.getName());
Map<String, Object> mapProps = propertySet.getProperties();
if (mapProps.equals(mapCluster1)) {
cluster1Matches = true;
} else if (mapProps.equals(mapCluster2)) {
cluster2Matches = true;
} else if (mapProps.equals(mapCluster3)) {
cluster3Matches = true;
}
}
assertTrue(cluster1Matches);
assertTrue(cluster2Matches);
assertTrue(cluster3Matches);
//assert body is correct by checking that properties match
String b = body.getBody();
body = parser.parse(b).iterator().next();
Set<NamedPropertySet> setProps2 = body.getNamedPropertySets();
assertEquals(3, setProps2.size());
assertEquals(setProps, setProps2);
}
@Test
public void testParse___Array_NoArrayBrackets() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(arrayJson2).iterator().next();
Set<NamedPropertySet> setProps = body.getNamedPropertySets();
assertEquals(3, setProps.size());
boolean cluster1Matches = false;
boolean cluster2Matches = false;
boolean cluster3Matches = false;
Map<String, String> mapCluster1 = new HashMap<String, String>();
mapCluster1.put(PropertyHelper.getPropertyId("Clusters", "cluster_name"), "unitTestCluster1");
Map<String, String> mapCluster2 = new HashMap<String, String>();
mapCluster2.put(PropertyHelper.getPropertyId("Clusters", "cluster_name"), "unitTestCluster2");
mapCluster2.put(PropertyHelper.getPropertyId("Clusters", "property1"), "prop1Value");
Map<String, String> mapCluster3 = new HashMap<String, String>();
mapCluster3.put(PropertyHelper.getPropertyId("Clusters", "cluster_name"), "unitTestCluster3");
mapCluster3.put(PropertyHelper.getPropertyId("Clusters/Category", "property2"), "prop2Value");
for (NamedPropertySet propertySet : setProps) {
Map<String, Object> mapProps = propertySet.getProperties();
if (mapProps.equals(mapCluster1)) {
cluster1Matches = true;
} else if (mapProps.equals(mapCluster2)) {
cluster2Matches = true;
} else if (mapProps.equals(mapCluster3)) {
cluster3Matches = true;
}
}
assertTrue(cluster1Matches);
assertTrue(cluster2Matches);
assertTrue(cluster3Matches);
//assert body is correct by checking that properties match
String b = body.getBody();
body = parser.parse(b).iterator().next();
Set<NamedPropertySet> setProps2 = body.getNamedPropertySets();
assertEquals(3, setProps2.size());
assertEquals(setProps, setProps2);
}
@Test
public void testParse_QueryInBody() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(serviceJsonWithQuery).iterator().next();
Set<NamedPropertySet> setProps = body.getNamedPropertySets();
assertEquals(1, setProps.size());
Map<String, Object> mapExpected = new HashMap<String, Object>();
mapExpected.put(PropertyHelper.getPropertyId("Services", "service_name"), "HDFS");
mapExpected.put(PropertyHelper.getPropertyId("Services", "display_name"), "HDFS");
mapExpected.put(PropertyHelper.getPropertyId("ServiceInfo", "cluster_name"), "tbmetrictest");
mapExpected.put(PropertyHelper.getPropertyId("Services", "description"), "Apache Hadoop Distributed File System");
mapExpected.put(PropertyHelper.getPropertyId("ServiceInfo", "state"), "STARTED");
mapExpected.put(PropertyHelper.getPropertyId("OuterCategory", "propName"), "100");
mapExpected.put(PropertyHelper.getPropertyId("OuterCategory/nested1/nested2", "innerPropName"), "innerPropValue");
mapExpected.put(PropertyHelper.getPropertyId(null, "topLevelProp"), "value");
assertEquals(mapExpected, setProps.iterator().next().getProperties());
assertEquals("foo=bar", body.getQueryString());
//assert body is correct by checking that properties match
String b = body.getBody();
body = parser.parse(b).iterator().next();
Set<NamedPropertySet> setProps2 = body.getNamedPropertySets();
assertEquals(mapExpected, setProps2.iterator().next().getProperties());
}
@Test
public void testParse_QueryPost() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(queryPostJson).iterator().next();
Set<NamedPropertySet> setProperties = body.getNamedPropertySets();
assertEquals(1, setProperties.size());
boolean contains1 = false;
boolean contains2 = false;
boolean contains3 = false;
for (NamedPropertySet ps : setProperties) {
Map<String, Object> mapProps = ps.getProperties();
assertEquals(1, mapProps.size());
Set<Map<String, Object>> set = (Set<Map<String, Object>>) mapProps.get("services");
for (Map<String, Object> map : set) {
String serviceName = (String) map.get("ServiceInfo/service_name");
if (serviceName.equals("unitTestService1")) {
assertEquals(1, map.size());
contains1 = true;
} else if (serviceName.equals("unitTestService2")) {
assertEquals("prop1Value", map.get("ServiceInfo/property1"));
assertEquals(2, map.size());
contains2 = true;
} else if (serviceName.equals("unitTestService3")) {
assertEquals("prop2Value", map.get("ServiceInfo/Category/property2"));
assertEquals(2, map.size());
contains3 = true;
} else {
fail("Unexpected service name");
}
}
}
assertTrue(contains1);
assertTrue(contains2);
assertTrue(contains3);
//assert body is correct by checking that properties match
String b = body.getBody();
body = parser.parse(b).iterator().next();
Set<NamedPropertySet> setProps2 = body.getNamedPropertySets();
assertEquals(1, setProps2.size());
assertEquals(setProperties, setProps2);
}
@Test
public void testParse___QueryPost_multipleSubResTypes() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(queryPostMultipleSubResourcesJson).iterator().next();
Set<NamedPropertySet> setProperties = body.getNamedPropertySets();
assertEquals(1, setProperties.size());
boolean contains1 = false;
boolean contains2 = false;
for (NamedPropertySet ps : setProperties) {
Map<String, Object> mapProps = ps.getProperties();
for (Map.Entry<String, Object> entry : mapProps.entrySet()) {
Set<Map<String, Object>> set = (Set<Map<String, Object>>) entry.getValue();
for (Map<String, Object> map : set) {
String serviceName = (String) map.get("ServiceInfo/service_name");
if (serviceName.equals("unitTestService1")) {
assertEquals("foo", entry.getKey());
assertEquals(1, map.size());
contains1 = true;
} else if (serviceName.equals("unitTestService2")) {
assertEquals("bar", entry.getKey());
assertEquals("prop2Value", map.get("ServiceInfo/Category/property2"));
assertEquals(2, map.size());
contains2 = true;
} else {
fail("Unexpected service name");
}
}
}
}
assertTrue(contains1);
assertTrue(contains2);
//assert body is correct by checking that properties match
String b = body.getBody();
body = parser.parse(b).iterator().next();
Set<NamedPropertySet> setProps2 = body.getNamedPropertySets();
assertEquals(1, setProps2.size());
assertEquals(setProperties, setProps2);
}
@Test
public void testParse___QueryPost_QueryInBody() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(queryPostJsonWithQuery).iterator().next();
Set<NamedPropertySet> setProperties = body.getNamedPropertySets();
assertEquals("foo=bar", body.getQueryString());
assertEquals(1, setProperties.size());
boolean contains1 = false;
boolean contains2 = false;
boolean contains3 = false;
for (NamedPropertySet ps : setProperties) {
assertEquals("", ps.getName());
Map<String, Object> mapProps = ps.getProperties();
for (Map.Entry<String, Object> entry : mapProps.entrySet()) {
Set<Map<String, Object>> set = (Set<Map<String, Object>>) entry.getValue();
for (Map<String, Object> map : set) {
String serviceName = (String) map.get("ServiceInfo/service_name");
if (serviceName.equals("unitTestService1")) {
assertEquals(1, map.size());
contains1 = true;
} else if (serviceName.equals("unitTestService2")) {
assertEquals("prop1Value", map.get("ServiceInfo/property1"));
assertEquals(2, map.size());
contains2 = true;
} else if (serviceName.equals("unitTestService3")) {
assertEquals("prop2Value", map.get("ServiceInfo/Category/property2"));
assertEquals(2, map.size());
contains3 = true;
} else {
fail("Unexpected service name");
}
}
}
}
assertTrue(contains1);
assertTrue(contains2);
assertTrue(contains3);
//assert body is correct by checking that properties match
String b = body.getBody();
assertEquals(queryPostJsonWithQuery , b);
body = parser.parse(b).iterator().next();
Set<NamedPropertySet> setProps2 = body.getNamedPropertySets();
assertEquals(1, setProps2.size());
assertEquals(setProperties, setProps2);
}
@Test
public void testParse_QueryOnlyInBody() throws BodyParseException {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(bodyQueryOnly).iterator().next();
assertEquals("foo=bar", body.getQueryString());
assertEquals(bodyQueryOnly, body.getBody());
}
@Test
public void testParse_malformedBody() {
RequestBodyParser parser = new JsonRequestBodyParser();
try {
parser.parse(malformedJson);
fail("Expected exception due to malformed body");
} catch (BodyParseException e) {
// expected case
}
}
@Test
public void testRequestInfoProps() throws Exception {
RequestBodyParser parser = new JsonRequestBodyParser();
RequestBody body = parser.parse(bodyWithRequestInfoProperties).iterator().next();
Set<NamedPropertySet> setProps = body.getNamedPropertySets();
assertEquals(1, setProps.size());
Map<String, Object> mapExpected = new HashMap<String, Object>();
mapExpected.put(PropertyHelper.getPropertyId("Services", "service_name"), "HDFS");
mapExpected.put(PropertyHelper.getPropertyId("Services", "display_name"), "HDFS");
mapExpected.put(PropertyHelper.getPropertyId("ServiceInfo", "cluster_name"), "tbmetrictest");
mapExpected.put(PropertyHelper.getPropertyId("Services", "description"), "Apache Hadoop Distributed File System");
mapExpected.put(PropertyHelper.getPropertyId("ServiceInfo", "state"), "STARTED");
mapExpected.put(PropertyHelper.getPropertyId("OuterCategory", "propName"), "100");
mapExpected.put(PropertyHelper.getPropertyId("OuterCategory/nested1/nested2", "innerPropName"), "innerPropValue");
mapExpected.put(PropertyHelper.getPropertyId(null, "topLevelProp"), "value");
assertEquals(mapExpected, setProps.iterator().next().getProperties());
assertEquals("foo=bar", body.getQueryString());
Map<String, String > mapRequestInfoProps = body.getRequestInfoProperties();
assertEquals(3, mapRequestInfoProps.size());
assertEquals("val1", mapRequestInfoProps.get("prop1"));
assertEquals("val2", mapRequestInfoProps.get("prop2"));
assertEquals("foo=bar", mapRequestInfoProps.get("query"));
//assert body is correct by checking that properties match
String b = body.getBody();
body = parser.parse(b).iterator().next();
Set<NamedPropertySet> setProps2 = body.getNamedPropertySets();
assertEquals(mapExpected, setProps2.iterator().next().getProperties());
}
}