| /** |
| * 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; |
| |
| import static org.easymock.EasyMock.createMock; |
| import static org.easymock.EasyMock.expect; |
| import static org.easymock.EasyMock.replay; |
| import static org.easymock.EasyMock.verify; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.lang.reflect.Method; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.LinkedHashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.ws.rs.PathParam; |
| import javax.ws.rs.core.Context; |
| import javax.ws.rs.core.HttpHeaders; |
| import javax.ws.rs.core.MediaType; |
| import javax.ws.rs.core.Response; |
| import javax.ws.rs.core.UriInfo; |
| |
| import org.apache.ambari.server.api.resources.ResourceInstance; |
| import org.apache.ambari.server.api.services.parsers.RequestBodyParser; |
| import org.apache.ambari.server.api.services.serializers.ResultSerializer; |
| import org.apache.ambari.server.api.util.TreeNode; |
| import org.apache.ambari.server.controller.spi.Resource; |
| import org.apache.ambari.server.orm.entities.ViewInstanceEntity; |
| import org.apache.ambari.server.orm.entities.ViewInstanceEntityTest; |
| import org.junit.Test; |
| |
| /** |
| * ViewSubResourceService tests |
| */ |
| public class ViewSubResourceServiceTest extends BaseServiceTest { |
| |
| @Override |
| public List<ServiceTestInvocation> getTestInvocations() throws Exception { |
| List<ServiceTestInvocation> listInvocations = new ArrayList<>(); |
| |
| ViewInstanceEntity viewInstanceEntity = ViewInstanceEntityTest.getViewInstanceEntity(); |
| |
| Resource.Type type = new Resource.Type("subResource"); |
| |
| // get resource |
| ViewSubResourceService service = new TestViewSubResourceService(type, viewInstanceEntity); |
| Method m = service.getClass().getMethod("getSubResource1", HttpHeaders.class, UriInfo.class, String.class); |
| Object[] args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; |
| listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null)); |
| |
| // get resource |
| service = new TestViewSubResourceService(type, viewInstanceEntity); |
| m = service.getClass().getMethod("getSubResource2", HttpHeaders.class, UriInfo.class, String.class); |
| args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; |
| listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null)); |
| |
| // create resource |
| service = new TestViewSubResourceService(type, viewInstanceEntity); |
| m = service.getClass().getMethod("postSubResource", HttpHeaders.class, UriInfo.class, String.class); |
| args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; |
| listInvocations.add(new ServiceTestInvocation(Request.Type.POST, service, m, args, null)); |
| |
| // update resource |
| service = new TestViewSubResourceService(type, viewInstanceEntity); |
| m = service.getClass().getMethod("putSubResource", HttpHeaders.class, UriInfo.class, String.class); |
| args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; |
| listInvocations.add(new ServiceTestInvocation(Request.Type.PUT, service, m, args, null)); |
| |
| // delete resource |
| service = new TestViewSubResourceService(type, viewInstanceEntity); |
| m = service.getClass().getMethod("deleteSubResource", HttpHeaders.class, UriInfo.class, String.class); |
| args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; |
| listInvocations.add(new ServiceTestInvocation(Request.Type.DELETE, service, m, args, null)); |
| |
| return listInvocations; |
| } |
| |
| @Test |
| public void testGetResultSerializer_Text() throws Exception { |
| UriInfo uriInfo = createMock(UriInfo.class); |
| Resource resource = createMock(Resource.class); |
| |
| Result result = new ResultImpl(true); |
| result.setResultStatus(new ResultStatus(ResultStatus.STATUS.OK)); |
| TreeNode<Resource> tree = result.getResultTree(); |
| TreeNode<Resource> child = tree.addChild(resource, "resource1"); |
| child.setProperty("href", "this is an href"); |
| |
| // resource properties |
| Map<String, Object> mapRootProps = new LinkedHashMap<>(); |
| mapRootProps.put("prop2", "value2"); |
| mapRootProps.put("prop1", "value1"); |
| |
| Map<String, Object> mapCategoryProps = new LinkedHashMap<>(); |
| mapCategoryProps.put("catProp1", "catValue1"); |
| mapCategoryProps.put("catProp2", "catValue2"); |
| |
| Map<String, Map<String, Object>> propertyMap = new LinkedHashMap<>(); |
| |
| propertyMap.put(null, mapRootProps); |
| propertyMap.put("category", mapCategoryProps); |
| |
| //expectations |
| expect(resource.getPropertiesMap()).andReturn(propertyMap).anyTimes(); |
| expect(resource.getType()).andReturn(Resource.Type.Cluster).anyTimes(); |
| |
| replay(uriInfo, resource); |
| |
| //execute test |
| ViewInstanceEntity viewInstanceEntity = ViewInstanceEntityTest.getViewInstanceEntity(); |
| |
| Resource.Type type = new Resource.Type("subResource"); |
| |
| // get resource |
| ViewSubResourceService service = new ViewSubResourceService(type, viewInstanceEntity); |
| |
| ResultSerializer serializer = service.getResultSerializer(MediaType.TEXT_PLAIN_TYPE); |
| |
| Object o = serializer.serialize(result); |
| |
| String expected = "{\n" + |
| " \"href\" : \"this is an href\",\n" + |
| " \"prop2\" : \"value2\",\n" + |
| " \"prop1\" : \"value1\",\n" + |
| " \"category\" : {\n" + |
| " \"catProp1\" : \"catValue1\",\n" + |
| " \"catProp2\" : \"catValue2\"\n" + |
| " }\n" + |
| "}"; |
| |
| assertEquals(expected, o.toString().replace("\r", "")); |
| |
| verify(uriInfo, resource); |
| } |
| |
| @Test |
| public void testGetResultSerializer_Json() throws Exception { |
| UriInfo uriInfo = createMock(UriInfo.class); |
| Resource resource = createMock(Resource.class); |
| |
| Result result = new ResultImpl(true); |
| result.setResultStatus(new ResultStatus(ResultStatus.STATUS.OK)); |
| TreeNode<Resource> tree = result.getResultTree(); |
| TreeNode<Resource> child = tree.addChild(resource, "resource1"); |
| child.setProperty("href", "this is an href"); |
| |
| // resource properties |
| HashMap<String, Object> mapRootProps = new HashMap<>(); |
| mapRootProps.put("prop1", "value1"); |
| mapRootProps.put("prop2", "value2"); |
| |
| HashMap<String, Object> mapCategoryProps = new HashMap<>(); |
| mapCategoryProps.put("catProp1", "catValue1"); |
| mapCategoryProps.put("catProp2", "catValue2"); |
| |
| Map<String, Map<String, Object>> propertyMap = new HashMap<>(); |
| |
| propertyMap.put(null, mapRootProps); |
| propertyMap.put("category", mapCategoryProps); |
| |
| //expectations |
| expect(resource.getPropertiesMap()).andReturn(propertyMap).anyTimes(); |
| expect(resource.getType()).andReturn(Resource.Type.Cluster).anyTimes(); |
| |
| replay(uriInfo, resource); |
| |
| //execute test |
| ViewInstanceEntity viewInstanceEntity = ViewInstanceEntityTest.getViewInstanceEntity(); |
| |
| Resource.Type type = new Resource.Type("subResource"); |
| |
| // get resource |
| ViewSubResourceService service = new ViewSubResourceService(type, viewInstanceEntity); |
| |
| ResultSerializer serializer = service.getResultSerializer(MediaType.APPLICATION_JSON_TYPE); |
| |
| Object o = serializer.serialize(result); |
| |
| assertTrue(o instanceof Map); |
| Map map = (Map) o; |
| assertEquals(4, map.size()); |
| assertEquals("value1", map.get("prop1")); |
| assertEquals("value2", map.get("prop2")); |
| assertEquals("this is an href", map.get("href")); |
| Object o2 = map.get("category"); |
| assertNotNull(o2); |
| assertTrue(o2 instanceof Map); |
| Map subMap = (Map) o2; |
| assertEquals(2, subMap.size()); |
| assertEquals("catValue1", subMap.get("catProp1")); |
| assertEquals("catValue2", subMap.get("catProp2")); |
| |
| verify(uriInfo, resource); |
| } |
| |
| private class TestViewSubResourceService extends ViewSubResourceService { |
| |
| /** |
| * Construct a view sub-resource service. |
| */ |
| public TestViewSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) { |
| super(type, viewInstanceDefinition); |
| } |
| |
| public Response getSubResource1(@Context HttpHeaders headers, @Context UriInfo ui, |
| @PathParam("resourceId") String resourceId) { |
| |
| return handleRequest(headers, ui, resourceId); |
| } |
| |
| public Response getSubResource2(@Context HttpHeaders headers, @Context UriInfo ui, |
| @PathParam("resourceId") String resourceId) { |
| |
| return handleRequest(headers, ui, RequestType.GET, MediaType.TEXT_PLAIN, resourceId); |
| } |
| |
| public Response postSubResource(@Context HttpHeaders headers, @Context UriInfo ui, |
| @PathParam("resourceId") String resourceId) { |
| |
| return handleRequest(headers, ui, RequestType.POST, MediaType.TEXT_PLAIN, resourceId); |
| } |
| |
| public Response putSubResource(@Context HttpHeaders headers, @Context UriInfo ui, |
| @PathParam("resourceId") String resourceId) { |
| |
| return handleRequest(headers, ui, RequestType.PUT, MediaType.TEXT_PLAIN, resourceId); |
| } |
| |
| public Response deleteSubResource(@Context HttpHeaders headers, @Context UriInfo ui, |
| @PathParam("resourceId") String resourceId) { |
| |
| return handleRequest(headers, ui, RequestType.DELETE, MediaType.TEXT_PLAIN, resourceId); |
| } |
| |
| @Override |
| protected ResourceInstance createResource(String resourceId) { |
| return getTestResource(); |
| } |
| |
| @Override |
| RequestFactory getRequestFactory() { |
| return getTestRequestFactory(); |
| } |
| |
| @Override |
| protected RequestBodyParser getBodyParser() { |
| return getTestBodyParser(); |
| } |
| |
| @Override |
| protected ResultSerializer getResultSerializer() { |
| return getTestResultSerializer(); |
| } |
| |
| @Override |
| protected ResultSerializer getResultSerializer(javax.ws.rs.core.MediaType mediaType) { |
| return getTestResultSerializer(); |
| } |
| } |
| } |
| |
| |