You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by js...@apache.org on 2013/03/11 20:26:50 UTC

svn commit: r1455293 [4/4] - in /incubator/ambari/trunk: ./ ambari-server/src/main/java/org/apache/ambari/server/api/handlers/ ambari-server/src/main/java/org/apache/ambari/server/api/services/ ambari-server/src/main/java/org/apache/ambari/server/api/s...

Added: incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/services/parsers/JsonRequestBodyParserTest.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/services/parsers/JsonRequestBodyParserTest.java?rev=1455293&view=auto
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/services/parsers/JsonRequestBodyParserTest.java (added)
+++ incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/services/parsers/JsonRequestBodyParserTest.java Mon Mar 11 19:26:49 2013
@@ -0,0 +1,455 @@
+/**
+ * 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.*;
+
+/**
+ * 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 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 queryPostJson = "{ \"services\" : [ {" +
+      "\"ServiceInfo\" : {\n" +
+      "    \"service_name\" : \"unitTestService1\"" +
+      "} }," +
+      "{" +
+      "\"ServiceInfo\" : {\n" +
+      "    \"service_name\" : \"unitTestService2\"," +
+      "    \"property1\" : \"prop1Value\"" +
+      "} }," +
+      "{" +
+      "\"ServiceInfo\" : {\n" +
+      "    \"service_name\" : \"unitTestService3\"," +
+      "    \"Category\" : { \"property2\" : \"prop2Value\"}" +
+      "} } ] }";
+
+  String queryPostMultipleSubResourcesJson = "{ \"foo\" : [ {" +
+      "\"ServiceInfo\" : {\n" +
+      "    \"service_name\" : \"unitTestService1\"" +
+      "} }" +
+      "]," +
+      " \"bar\" : [" +
+      "{" +
+      "\"ServiceInfo\" : {\n" +
+      "    \"service_name\" : \"unitTestService2\"," +
+      "    \"Category\" : { \"property2\" : \"prop2Value\"}" +
+      "} } ] }";
+
+
+  String malformedJson = "{ \"Category\" : { \"foo\" : \"bar\"}";
+
+
+  @Test
+  public void testParse() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    RequestBody body = parser.parse(serviceJson);
+
+    Set<NamedPropertySet> setProps = body.getPropertySets();
+    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);
+    Set<NamedPropertySet> setProps2 = body.getPropertySets();
+    assertEquals(mapExpected, setProps2.iterator().next().getProperties());
+  }
+
+  @Test
+  public void testParse_NullBody() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    RequestBody body = parser.parse(null);
+
+    assertNotNull(body.getPropertySets());
+    assertEquals(0, body.getPropertySets().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("");
+
+    assertNotNull(body.getPropertySets());
+    assertEquals(0, body.getPropertySets().size());
+    assertNull(body.getQueryString());
+    assertNull(body.getPartialResponseFields());
+    assertNull(body.getBody());
+  }
+
+  @Test
+  public void testParse_Array() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    RequestBody body = parser.parse(arrayJson);
+
+    Set<NamedPropertySet> setProps = body.getPropertySets();
+
+    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);
+
+    Set<NamedPropertySet> setProps2 = body.getPropertySets();
+    assertEquals(3, setProps2.size());
+    assertEquals(setProps, setProps2);
+  }
+
+  @Test
+  public void testParse___Array_NoArrayBrackets() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    RequestBody body = parser.parse(arrayJson2);
+
+    Set<NamedPropertySet> setProps = body.getPropertySets();
+
+    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);
+
+    Set<NamedPropertySet> setProps2 = body.getPropertySets();
+    assertEquals(3, setProps2.size());
+    assertEquals(setProps, setProps2);
+  }
+
+  @Test
+  public void testParse_QueryInBody() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    String queryBody = "{ \"RequestInfo\" : { \"query\" : \"foo=bar\" }, \"Body\":" + serviceJson + "}";
+    RequestBody body = parser.parse(queryBody);
+
+
+    Set<NamedPropertySet> setProps = body.getPropertySets();
+    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);
+
+    Set<NamedPropertySet> setProps2 = body.getPropertySets();
+    assertEquals(mapExpected, setProps2.iterator().next().getProperties());
+  }
+
+  @Test
+  public void testParse_QueryPost() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    RequestBody body = parser.parse(queryPostJson);
+
+
+    Set<NamedPropertySet> setProperties = body.getPropertySets();
+
+    assertEquals(3, setProperties.size());
+    boolean contains1 = false;
+    boolean contains2 = false;
+    boolean contains3 = false;
+
+    for (NamedPropertySet ps : setProperties) {
+      assertEquals("services", ps.getName());
+      Map<String, Object> mapProps = ps.getProperties();
+      String serviceName = (String) mapProps.get("ServiceInfo/service_name");
+      if (serviceName.equals("unitTestService1")) {
+        assertEquals(1, mapProps.size());
+        contains1 = true;
+      } else if (serviceName.equals("unitTestService2")) {
+        assertEquals("prop1Value", mapProps.get("ServiceInfo/property1"));
+        assertEquals(2, mapProps.size());
+        contains2 = true;
+      } else if (serviceName.equals("unitTestService3")) {
+        assertEquals("prop2Value", mapProps.get("ServiceInfo/Category/property2"));
+        assertEquals(2, mapProps.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);
+
+    Set<NamedPropertySet> setProps2 = body.getPropertySets();
+    assertEquals(3, setProps2.size());
+    assertEquals(setProperties, setProps2);
+  }
+
+  @Test
+  public void testParse___QueryPost_multipleSubResTypes() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    RequestBody body = parser.parse(queryPostMultipleSubResourcesJson);
+
+
+    Set<NamedPropertySet> setProperties = body.getPropertySets();
+
+    assertEquals(2, setProperties.size());
+    boolean contains1 = false;
+    boolean contains2 = false;
+
+    for (NamedPropertySet ps : setProperties) {
+      Map<String, Object> mapProps = ps.getProperties();
+      String serviceName = (String) mapProps.get("ServiceInfo/service_name");
+      if (serviceName.equals("unitTestService1")) {
+        assertEquals("foo", ps.getName());
+        assertEquals(1, mapProps.size());
+        contains1 = true;
+      } else if (serviceName.equals("unitTestService2")) {
+        assertEquals("bar", ps.getName());
+        assertEquals("prop2Value", mapProps.get("ServiceInfo/Category/property2"));
+        assertEquals(2, mapProps.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);
+
+    Set<NamedPropertySet> setProps2 = body.getPropertySets();
+    assertEquals(2, setProps2.size());
+    assertEquals(setProperties, setProps2);
+  }
+
+  @Test
+  public void testParse___QueryPost_QueryInBody() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    String queryBody = "{ \"RequestInfo\" : { \"query\" : \"foo=bar\" }, \"Body\":" + queryPostJson + "}";
+    RequestBody body = parser.parse(queryBody);
+
+
+    Set<NamedPropertySet> setProperties = body.getPropertySets();
+
+    assertEquals("foo=bar", body.getQueryString());
+    assertEquals(3, setProperties.size());
+    boolean contains1 = false;
+    boolean contains2 = false;
+    boolean contains3 = false;
+
+    for (NamedPropertySet ps : setProperties) {
+      assertEquals("services", ps.getName());
+      Map<String, Object> mapProps = ps.getProperties();
+      String serviceName = (String) mapProps.get("ServiceInfo/service_name");
+      if (serviceName.equals("unitTestService1")) {
+        assertEquals(1, mapProps.size());
+        contains1 = true;
+      } else if (serviceName.equals("unitTestService2")) {
+        assertEquals("prop1Value", mapProps.get("ServiceInfo/property1"));
+        assertEquals(2, mapProps.size());
+        contains2 = true;
+      } else if (serviceName.equals("unitTestService3")) {
+        assertEquals("prop2Value", mapProps.get("ServiceInfo/Category/property2"));
+        assertEquals(2, mapProps.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("{\"services\":[{\"ServiceInfo\":{" +
+        "\"service_name\":\"unitTestService1\"}},{\"ServiceInfo\":{" +
+        "\"service_name\":\"unitTestService2\",\"property1\":\"prop1Value\"}},{\"ServiceInfo\":{" +
+        "\"service_name\":\"unitTestService3\",\"Category\":{\"property2\":\"prop2Value\"}}}]}", b);
+
+    body = parser.parse(b);
+
+    Set<NamedPropertySet> setProps2 = body.getPropertySets();
+    assertEquals(3, setProps2.size());
+    assertEquals(setProperties, setProps2);
+  }
+
+  @Test
+  public void testParse_QueryOnlyInBody() throws BodyParseException {
+    RequestBodyParser parser = new JsonRequestBodyParser();
+    String queryBody = "{ \"RequestInfo\" : { \"query\" : \"foo=bar\" }}";
+    RequestBody body = parser.parse(queryBody);
+
+    assertEquals("foo=bar", body.getQueryString());
+    assertNull(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
+    }
+  }
+}
+
+