blob: a0b41b4bf053cc753fbde74a14e22c3242ab0126 [file] [log] [blame]
package org.apache.ambari.server.api.query;
/**
* 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.
*/
import org.apache.ambari.server.api.resources.ResourceDefinition;
import org.apache.ambari.server.api.util.TreeNode;
import org.apache.ambari.server.api.util.TreeNodeImpl;
import org.apache.ambari.server.controller.predicate.AndPredicate;
import org.apache.ambari.server.controller.predicate.BasePredicate;
import org.apache.ambari.server.controller.spi.*;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.api.resources.ResourceInstance;
import org.apache.ambari.server.api.services.Result;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.junit.After;
import org.junit.Test;
import java.util.*;
import static org.easymock.EasyMock.*;
import static org.easymock.EasyMock.eq;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
//todo: add assertions for temporal info
public class QueryImplTest {
ClusterController m_controller = createNiceMock(ClusterController.class);
@Test
public void testExecute__Component_instance_noSpecifiedProps() throws Exception {
Result result = createNiceMock(Result.class);
ResourceInstance componentResourceInstance = createNiceMock(ResourceInstance.class);
ResourceDefinition componentResourceDefinition = createNiceMock(ResourceDefinition.class);
ResourceInstance hostResourceInstance = createNiceMock(ResourceInstance.class);
ResourceDefinition hostResourceDefinition = createNiceMock(ResourceDefinition.class);
Schema componentSchema = createNiceMock(Schema.class);
Resource componentResource = createNiceMock(Resource.class);
String componentPropertyId = "componentId";
Query hostComponentQuery = createStrictMock(Query.class);
Result hostComponentQueryResult = createNiceMock(Result.class);
TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
TreeNode<Resource> hostComponentResultNode = new TreeNodeImpl<Resource>(null, null, null);
List<Resource> listResources = Collections.singletonList(componentResource);
Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
mapResourceIds.put(Resource.Type.Cluster, "clusterName");
mapResourceIds.put(Resource.Type.Service, "serviceName");
mapResourceIds.put(Resource.Type.Component, "componentName");
Map<String, ResourceInstance> mapChildren = new HashMap<String, ResourceInstance>();
mapChildren.put("host_components", hostResourceInstance);
PredicateBuilder pb = new PredicateBuilder();
Predicate predicate = pb.property("clusterId").equals("clusterName").and().
property("serviceId").equals("serviceName").and().
property("componentId").equals("componentName").toPredicate();
// expectations
expect(componentResourceInstance.getResourceDefinition()).andReturn(componentResourceDefinition).anyTimes();
expect(componentResourceInstance.getSubResources()).andReturn(mapChildren).anyTimes();
expect(componentResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
expect(componentResourceDefinition.getType()).andReturn(Resource.Type.Component).anyTimes();
expect(componentResource.getType()).andReturn(Resource.Type.Component).anyTimes();
expect(componentResource.getPropertyValue(componentPropertyId)).andReturn("keyVal");
expect(m_controller.getSchema(Resource.Type.Component)).andReturn(componentSchema).anyTimes();
expect(componentSchema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("clusterId");
expect(componentSchema.getKeyPropertyId(Resource.Type.Service)).andReturn("serviceId");
expect(componentSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(componentPropertyId).atLeastOnce();
expect(m_controller.getResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(Collections.<String>emptySet())),
eq(predicate))).andReturn(listResources);
expect(result.getResultTree()).andReturn(tree).anyTimes();
Map<Resource.Type, String> mapResourceIdsSet = new HashMap<Resource.Type, String>(mapResourceIds);
mapResourceIdsSet.put(Resource.Type.Component, "keyVal");
hostResourceInstance.setIds(mapResourceIdsSet);
expect(hostResourceInstance.getResourceDefinition()).andReturn(hostResourceDefinition).anyTimes();
expect(hostResourceInstance.getQuery()).andReturn(hostComponentQuery).anyTimes();
expect(hostResourceDefinition.getType()).andReturn(Resource.Type.Host);
expect(hostComponentQuery.execute()).andReturn(hostComponentQueryResult);
expect(hostComponentQueryResult.getResultTree()).andReturn(hostComponentResultNode);
replay(m_controller, result, componentResourceInstance, componentResourceDefinition, hostResourceInstance, componentSchema, componentResource,
hostComponentQuery, hostComponentQueryResult);
QueryImpl query = new TestQuery(componentResourceInstance, result);
query.execute();
verify(m_controller, result, componentResourceInstance, componentResourceDefinition, hostResourceInstance, componentSchema, componentResource,
hostComponentQuery, hostComponentQueryResult);
assertEquals(1, tree.getChildren().size());
TreeNode<Resource> componentNode = tree.getChild("Component:1");
assertEquals("Component:1", componentNode.getName());
assertEquals(componentResource, componentNode.getObject());
assertEquals(1, componentNode.getChildren().size());
assertSame(hostComponentResultNode, componentNode.getChild("host_components"));
assertEquals("false", hostComponentResultNode.getProperty("isCollection"));
}
@Test
public void testExecute__Component_collection_noSpecifiedProps() throws Exception {
Result result = createNiceMock(Result.class);
ResourceInstance componentResourceInstance = createNiceMock(ResourceInstance.class);
ResourceDefinition componentResourceDefinition = createNiceMock(ResourceDefinition.class);
Schema componentSchema = createNiceMock(Schema.class);
Resource componentResource = createNiceMock(Resource.class);
String componentPropertyId = "componentId";
String servicePropertyId = "serviceId";
String clusterPropertyId = "clusterId";
Set<String> setPropertyIds = new HashSet<String>();
setPropertyIds.add(clusterPropertyId);
setPropertyIds.add(servicePropertyId);
setPropertyIds.add(componentPropertyId);
TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
List<Resource> listResources = Collections.singletonList(componentResource);
Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
mapResourceIds.put(Resource.Type.Cluster, "clusterName");
mapResourceIds.put(Resource.Type.Service, "serviceName");
mapResourceIds.put(Resource.Type.Component, null);
PredicateBuilder pb = new PredicateBuilder();
Predicate predicate = pb.property("clusterId").equals("clusterName").and().
property("serviceId").equals("serviceName").toPredicate();
// expectations
expect(componentResource.getType()).andReturn(Resource.Type.Component).anyTimes();
expect(componentResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
expect(componentResourceInstance.getResourceDefinition()).andReturn(componentResourceDefinition).anyTimes();
expect(componentResourceDefinition.getType()).andReturn(Resource.Type.Component).anyTimes();
expect(m_controller.getSchema(Resource.Type.Component)).andReturn(componentSchema).anyTimes();
expect(componentSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(componentPropertyId).anyTimes();
expect(componentSchema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("clusterId").anyTimes();
expect(componentSchema.getKeyPropertyId(Resource.Type.Service)).andReturn("serviceId").anyTimes();
expect(result.getResultTree()).andReturn(tree).anyTimes();
expect(m_controller.getResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(setPropertyIds)),
eq(predicate))).andReturn(listResources);
expect(componentResourceInstance.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
replay(m_controller, result,componentResourceInstance, componentResourceDefinition, componentSchema, componentResource);
QueryImpl query = new TestQuery(componentResourceInstance, result);
query.execute();
verify(m_controller, result, componentResourceInstance, componentResourceDefinition, componentSchema, componentResource);
assertEquals("true", tree.getProperty("isCollection"));
assertEquals(1, tree.getChildren().size());
TreeNode<Resource> componentNode = tree.getChild("Component:1");
assertSame(componentResource, componentNode.getObject());
assertEquals(0, componentNode.getChildren().size());
}
@Test
public void testExecute__collection_nullInternalPredicate_nullUserPredicate() throws Exception {
Result result = createNiceMock(Result.class);
ResourceInstance clusterResourceInstance = createNiceMock(ResourceInstance.class);
ResourceDefinition clusterResourceDefinition = createNiceMock(ResourceDefinition.class);
Schema clusterSchema = createNiceMock(Schema.class);
Resource clusterResource = createNiceMock(Resource.class);
String clusterPropertyId = "clusterId";
TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
List<Resource> listResources = Collections.singletonList(clusterResource);
Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
// expectations
expect(clusterResource.getType()).andReturn(Resource.Type.Cluster).anyTimes();
expect(clusterResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
expect(clusterResourceInstance.getResourceDefinition()).andReturn(clusterResourceDefinition).anyTimes();
expect(clusterResourceDefinition.getType()).andReturn(Resource.Type.Component).anyTimes();
expect(m_controller.getSchema(Resource.Type.Component)).andReturn(clusterSchema).atLeastOnce();
expect(clusterSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(clusterPropertyId).atLeastOnce();
expect(result.getResultTree()).andReturn(tree).atLeastOnce();
expect(m_controller.getResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(Collections.singleton(clusterPropertyId))),
(Predicate) isNull())).andReturn(listResources);
expect(clusterResourceInstance.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
replay(m_controller, result, clusterResourceInstance, clusterResourceDefinition, clusterSchema, clusterResource);
QueryImpl query = new TestQuery(clusterResourceInstance, result);
query.execute();
verify(m_controller, result, clusterResourceInstance, clusterResourceDefinition, clusterSchema, clusterResource);
assertEquals("true", tree.getProperty("isCollection"));
assertEquals(1, tree.getChildren().size());
TreeNode<Resource> clusterNode = tree.getChild("Cluster:1");
assertSame(clusterResource, clusterNode.getObject());
assertEquals(0, clusterNode.getChildren().size());
}
@Test
public void testExecute__collection_nullInternalPredicate_nonNullUserPredicate() throws Exception {
Result result = createNiceMock(Result.class);
ResourceInstance clusterResourceInstance = createNiceMock(ResourceInstance.class);
ResourceDefinition clusterResourceDefinition = createNiceMock(ResourceDefinition.class);
Schema clusterSchema = createNiceMock(Schema.class);
Resource clusterResource = createNiceMock(Resource.class);
String clusterPropertyId = "clusterId";
Predicate userPredicate = createNiceMock(Predicate.class);
TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
List<Resource> listResources = Collections.singletonList(clusterResource);
Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
// expectations
expect(clusterResource.getType()).andReturn(Resource.Type.Cluster).anyTimes();
expect(clusterResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
expect(clusterResourceInstance.getResourceDefinition()).andReturn(clusterResourceDefinition).anyTimes();
expect(clusterResourceDefinition.getType()).andReturn(Resource.Type.Component).atLeastOnce();
expect(m_controller.getSchema(Resource.Type.Component)).andReturn(clusterSchema).anyTimes();
expect(clusterSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(clusterPropertyId).anyTimes();
expect(result.getResultTree()).andReturn(tree).anyTimes();
expect(m_controller.getResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(Collections.singleton(clusterPropertyId))),
eq(userPredicate))).andReturn(listResources);
expect(clusterResourceInstance.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
replay(m_controller, result,clusterResourceInstance, clusterResourceDefinition, clusterSchema, clusterResource, userPredicate);
QueryImpl query = new TestQuery(clusterResourceInstance, result);
query.setUserPredicate(userPredicate);
query.execute();
verify(m_controller, result, clusterResourceInstance, clusterResourceDefinition, clusterSchema, clusterResource, userPredicate);
assertEquals("true", tree.getProperty("isCollection"));
assertEquals(1, tree.getChildren().size());
TreeNode<Resource> clusterNode = tree.getChild("Cluster:1");
assertSame(clusterResource, clusterNode.getObject());
assertEquals(0, clusterNode.getChildren().size());
}
@Test
public void testExecute__collection_nonNullInternalPredicate_nonNullUserPredicate() throws Exception {
Result result = createNiceMock(Result.class);
ResourceInstance componentResourceInstance = createNiceMock(ResourceInstance.class);
ResourceDefinition componentResourceDefinition = createNiceMock(ResourceDefinition.class);
Schema componentSchema = createNiceMock(Schema.class);
Resource componentResource = createNiceMock(Resource.class);
String componentPropertyId = "componentId";
String servicePropertyId = "serviceId";
String clusterPropertyId = "clusterId";
Set<String> setPropertyIds = new HashSet<String>();
setPropertyIds.add(clusterPropertyId);
setPropertyIds.add(servicePropertyId);
setPropertyIds.add(componentPropertyId);
TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
List<Resource> listResources = Collections.singletonList(componentResource);
Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
mapResourceIds.put(Resource.Type.Cluster, "clusterName");
mapResourceIds.put(Resource.Type.Service, "serviceName");
mapResourceIds.put(Resource.Type.Component, null);
PredicateBuilder pb = new PredicateBuilder();
Predicate internalPredicate = pb.property("clusterId").equals("clusterName").and().
property("serviceId").equals("serviceName").toPredicate();
pb = new PredicateBuilder();
Predicate userPredicate = pb.property("foo").equals("bar").toPredicate();
// combine internal predicate and user predicate
//todo: for now, need to cast to BasePredicate
Predicate predicate = new AndPredicate((BasePredicate) internalPredicate, (BasePredicate) userPredicate);
// expectations
expect(componentResource.getType()).andReturn(Resource.Type.Component).anyTimes();
expect(componentResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
expect(componentResourceInstance.getResourceDefinition()).andReturn(componentResourceDefinition).anyTimes();
expect(componentResourceDefinition.getType()).andReturn(Resource.Type.Component).anyTimes();
expect(m_controller.getSchema(Resource.Type.Component)).andReturn(componentSchema).anyTimes();
expect(componentSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(componentPropertyId).atLeastOnce();
expect(componentSchema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("clusterId").anyTimes();
expect(componentSchema.getKeyPropertyId(Resource.Type.Service)).andReturn("serviceId").anyTimes();
expect(result.getResultTree()).andReturn(tree).anyTimes();
expect(m_controller.getResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(setPropertyIds)),
eq(predicate))).andReturn(listResources);
expect(componentResourceInstance.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
replay(m_controller, result, componentResourceInstance, componentResourceDefinition, componentSchema, componentResource);
QueryImpl query = new TestQuery(componentResourceInstance, result);
query.setUserPredicate(userPredicate);
query.execute();
verify(m_controller, result, componentResourceInstance, componentResourceDefinition, componentSchema, componentResource);
assertEquals("true", tree.getProperty("isCollection"));
assertEquals(1, tree.getChildren().size());
TreeNode<Resource> componentNode = tree.getChild("Component:1");
assertSame(componentResource, componentNode.getObject());
assertEquals(0, componentNode.getChildren().size());
}
@Test
public void testAddProperty__localProperty() throws Exception {
ResourceInstance resource = createNiceMock(ResourceInstance.class);
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
Schema schema = createNiceMock(Schema.class);
//expectations
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
replay(m_controller, resource, resourceDefinition, schema);
Query query = new TestQuery(resource, null);
query.addProperty("category", "property", null);
assertEquals(1, query.getProperties().size());
assertTrue(query.getProperties().contains("category/property"));
query.addProperty(null, "property2", null);
assertEquals(2, query.getProperties().size());
assertTrue(query.getProperties().contains("property2"));
verify(m_controller, resource, resourceDefinition, schema);
}
@Test
public void testAddProperty__allProperties() throws Exception {
ResourceInstance resource = createNiceMock(ResourceInstance.class);
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
Schema schema = createNiceMock(Schema.class);
//expectations
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
replay(m_controller, resource, resourceDefinition, schema);
Query query = new TestQuery(resource, null);
query.addProperty(null, "*", null);
assertEquals(0, query.getProperties().size());
verify(m_controller, resource, resourceDefinition, schema);
}
@Test
public void testAddProperty__allCategoryProperties() throws Exception {
ResourceInstance resource = createNiceMock(ResourceInstance.class);
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
Schema schema = createNiceMock(Schema.class);
//expectations
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
replay(m_controller, resource, resourceDefinition, schema);
Query query = new TestQuery(resource, null);
query.addProperty("category", "*", null);
assertEquals(1, query.getProperties().size());
assertTrue(query.getProperties().contains("category"));
verify(m_controller, resource, resourceDefinition, schema);
}
// this is the case where service can't differentiate category and property name
// the category name is give as the property name
@Test
public void testAddProperty__localCategory_asPropertyName() throws Exception {
ResourceInstance resource = createNiceMock(ResourceInstance.class);
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
Schema schema = createNiceMock(Schema.class);
//expectations
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
replay(m_controller, resource, resourceDefinition, schema);
Query query = new TestQuery(resource, null);
query.addProperty(null, "category", null);
Set<String> setProperties = query.getProperties();
assertEquals(1, setProperties.size());
assertTrue(setProperties.contains("category"));
verify(m_controller, resource, resourceDefinition, schema);
}
// This is the case where the service can determine that only a category was provided because it contained
// a trailing '/'
@Test
public void testAddProperty__localCategory_categoryNameOnly() throws Exception {
ResourceInstance resource = createNiceMock(ResourceInstance.class);
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
Schema schema = createNiceMock(Schema.class);
//expectations
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
replay(m_controller, resource, resourceDefinition, schema);
Query query = new TestQuery(resource, null);
query.addProperty("category/", "", null);
Set<String> setProperties = query.getProperties();
assertEquals(1, setProperties.size());
assertTrue(setProperties.contains("category"));
verify(m_controller, resource, resourceDefinition, schema);
}
@Test
public void testAddProperty__localSubCategory() throws Exception {
ResourceInstance resource = createNiceMock(ResourceInstance.class);
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
Schema schema = createNiceMock(Schema.class);
//expectations
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
replay(m_controller, resource, resourceDefinition, schema);
Query query = new TestQuery(resource, null);
query.addProperty("category", "nestedCategory", null);
Set<String> setProperties = query.getProperties();
assertEquals(1, setProperties.size());
assertTrue(setProperties.contains("category/nestedCategory"));
verify(m_controller, resource, resourceDefinition, schema);
}
@Test
public void testAddProperty__localCategorySubPropsOnly() throws Exception {
ResourceInstance resource = createNiceMock(ResourceInstance.class);
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
Schema schema = createNiceMock(Schema.class);
//expectations
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
replay(m_controller, resource, resourceDefinition, schema);
Query query = new TestQuery(resource, null);
query.addProperty(null, "category", null);
Set<String> setProperties = query.getProperties();
assertEquals(1, setProperties.size());
assertTrue(setProperties.contains("category"));
verify(m_controller, resource, resourceDefinition, schema);
}
@Test
public void testAddProperty__subProperty() throws Exception {
ResourceInstance resource = createNiceMock(ResourceInstance.class);
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
ResourceInstance subResource = createNiceMock(ResourceInstance.class);
Schema schema = createNiceMock(Schema.class);
//expectations
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
expect(resource.getSubResources()).andReturn(Collections.singletonMap("components", subResource)).anyTimes();
//todo: ensure that sub-resource was added.
replay(m_controller, resource, resourceDefinition, subResource, schema);
Query query = new TestQuery(resource, null);
query.addProperty(null, "components", null);
verify(m_controller, resource, resourceDefinition, subResource, schema);
}
//todo: sub-resource with property and with sub-path
// @Test
// public void testAddProperty__invalidProperty() {
//
// }
private class TestQuery extends QueryImpl {
private Result m_result;
public TestQuery(ResourceInstance ResourceInstance, Result result) {
super(ResourceInstance);
m_result = result;
}
@Override
ClusterController getClusterController() {
return m_controller;
}
@Override
Result createResult() {
return m_result;
}
}
@After
public void resetGlobalMocks() {
reset(m_controller);
}
}