@Test
public void testFinalizeResultWithAttributes() throws Exception{

  ServiceInfo hdfsService = new ServiceInfo();
  hdfsService.setName("HDFS");
  ServiceInfo mrService = new ServiceInfo();
  mrService.setName("MAPREDUCE");
  Result result = new ResultImpl(true);
  Map<String, Object> testDesiredConfigMap =
    new HashMap<String, Object>();
  DesiredConfig testDesiredConfig =
    new DesiredConfig();
  testDesiredConfig.setTag("test-tag-one");
  testDesiredConfigMap.put("test-type-one", testDesiredConfig);
  createClusterResultTree(result.getResultTree(), testDesiredConfigMap);
  ClusterBlueprintRenderer renderer = new TestBlueprintRenderer(topology);
  Result blueprintResult = renderer.finalizeResult(result);
  TreeNode<Resource> blueprintTree = blueprintResult.getResultTree();
  assertNull(blueprintTree.getStringProperty("isCollection"));
  assertEquals(1, blueprintTree.getChildren().size());
  TreeNode<Resource> blueprintNode = blueprintTree.getChildren().iterator().next();
  assertEquals(0, blueprintNode.getChildren().size());
  Resource blueprintResource = blueprintNode.getObject();
  Map<String, Map<String, Object>> properties = blueprintResource.getPropertiesMap();
  assertEquals("HDP", properties.get("Blueprints").get("stack_name"));
  assertEquals("1.3.3", properties.get("Blueprints").get("stack_version"));
  Collection<Map<String, Object>> host_groups = (Collection<Map<String, Object>>) properties.get("").get("host_groups");
  assertEquals(2, host_groups.size());
  for (Map<String, Object> hostGroupProperties : host_groups) {
    String host_group_name = (String) hostGroupProperties.get("name");
    if (host_group_name.equals("host_group_1")) {
      assertEquals("1", hostGroupProperties.get("cardinality"));
      Collection<Map<String, String>> components = (Collection<Map<String, String>>) hostGroupProperties.get("components");
      // 4 specified components and ambari server
      assertEquals(5, components.size());
      Set<String> expectedValues = new HashSet<String>(
        Arrays.asList("JOBTRACKER", "TASKTRACKER", "NAMENODE", "DATANODE", "AMBARI_SERVER"));
      Set<String> actualValues = new HashSet<String>();
      for (Map<String, String> componentProperties : components) {
        assertEquals(1, componentProperties.size());
        actualValues.add(componentProperties.get("name"));
      }
      assertEquals(expectedValues, actualValues);
    } else if (host_group_name.equals("host_group_2")) {
      // cardinality is 2 because 2 hosts share same topology
      assertEquals("2", hostGroupProperties.get("cardinality"));
      Collection<Map<String, String>> components = (Collection<Map<String, String>>) hostGroupProperties.get("components");
      assertEquals(2, components.size());
      Set<String> expectedValues = new HashSet<String>(
        Arrays.asList("TASKTRACKER", "DATANODE"));
      Set<String> actualValues = new HashSet<String>();
      for (Map<String, String> componentProperties : components) {
        assertEquals(1, componentProperties.size());
        actualValues.add(componentProperties.get("name"));
      }
      assertEquals(expectedValues, actualValues);
    }
  }
  List<Map<String, Map<String, Map<String, ?>>>> configurationsResult =
    (List<Map<String, Map<String, Map<String, ?>>>>)blueprintResource.getPropertyValue("configurations");
  assertEquals("Incorrect number of config maps added",
    1, configurationsResult.size());
  Map<String, Map<String, ?>> configMap =
    configurationsResult.iterator().next().get("test-type-one");
  assertNotNull("Expected config map was not included", configMap);
  assertEquals("Incorrect number of maps added under expected type",
    2, configMap.size());
  assertTrue("Expected properties map was not found",
    configMap.containsKey("properties"));
  assertTrue("Expected properties_attributes map was not found",
    configMap.containsKey("properties_attributes"));
  Map<String, ?> propertiesResult =
    configMap.get("properties");
  assertEquals("Incorrect number of config properties found",
    1, propertiesResult.size());
  Map<String, ?> attributesResult =
    configMap.get("properties_attributes");
  assertEquals("Incorrect number of config attributes found",
    1, attributesResult.size());
  // verify the correct properties were added to the exported Blueprint
  assertEquals("Incorrect property value included",
    "valueOne", propertiesResult.get("propertyOne"));
  // verify that the expected attributes were added to the exported Blueprint
  assertNotNull("Expected attribute not found in exported Blueprint",
    attributesResult.get("final"));
  assertTrue("Attribute type map was not included",
    attributesResult.get("final") instanceof Map);
  Map<String, ?> finalMap =
    (Map<String, ?>)attributesResult.get("final");
  assertEquals("Attribute value is not correct",
      "true", finalMap.get("propertyOne"));
}