diff options
Diffstat (limited to 'datarouter-prov/src/test/java')
11 files changed, 2772 insertions, 13 deletions
diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/BaseServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/BaseServletTest.java index 757852aa..61d030d9 100644..100755 --- a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/BaseServletTest.java +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/BaseServletTest.java @@ -28,18 +28,27 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; - +import org.onap.dmaap.datarouter.provisioning.beans.Feed; +import org.onap.dmaap.datarouter.provisioning.beans.FeedAuthorization; +import org.onap.dmaap.datarouter.provisioning.beans.Group; +import org.onap.dmaap.datarouter.provisioning.beans.Subscription; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; import javax.servlet.http.HttpServletRequest; import java.util.HashSet; import java.util.Set; - import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) +@RunWith(PowerMockRunner.class) +@SuppressStaticInitializationFor({"org.onap.dmaap.datarouter.provisioning.beans.Feed", + "org.onap.dmaap.datarouter.provisioning.beans.Subscription", + "org.onap.dmaap.datarouter.provisioning.beans.Group"}) public class BaseServletTest extends DrServletTestBase { private BaseServlet baseServlet; @@ -69,14 +78,118 @@ public class BaseServletTest extends DrServletTestBase { } @Test - public void Given_Request_Path_Info_Is_Not_Valid_Then_Minus_One_Is() throws Exception { + public void Given_Remote_Address_Is_Known_And_RequireCerts_Is_True() throws Exception { when(request.isSecure()).thenReturn(true); Set<String> authAddressesAndNetworks = new HashSet<String>(); authAddressesAndNetworks.add(("127.0.0.1")); - FieldUtils - .writeDeclaredStaticField(BaseServlet.class, "authorizedAddressesAndNetworks", authAddressesAndNetworks, - true); - FieldUtils.writeDeclaredStaticField(BaseServlet.class, "requireCert", false, true); - assertThat(baseServlet.isAuthorizedForProvisioning(request), is(nullValue())); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authorizedAddressesAndNetworks", authAddressesAndNetworks, true); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "requireCert", true, true); + assertThat(baseServlet.isAuthorizedForProvisioning(request), is("Client certificate is missing.")); + } + + @Test + public void Given_Request_Is_GetFeedOwner_And_Feed_Exists() throws Exception { + PowerMockito.mockStatic(Feed.class); + Feed feed = mock(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed); + when(feed.getPublisher()).thenReturn("stub_publisher"); + assertThat(baseServlet.getFeedOwner("3"), is("stub_publisher")); + } + + @Test + public void Given_Request_Is_GetFeedOwner_And_Feed_Does_Not_Exist() throws Exception { + PowerMockito.mockStatic(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(null); + assertThat(baseServlet.getFeedOwner("3"), is(nullValue())); + } + + @Test + public void Given_Request_Is_GetFeedClassification_And_Feed_Exists() throws Exception { + PowerMockito.mockStatic(Feed.class); + Feed feed = mock(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed); + FeedAuthorization fAuth = mock(FeedAuthorization.class); + when(feed.getAuthorization()).thenReturn(fAuth); + when(fAuth.getClassification()).thenReturn("stub_classification"); + assertThat(baseServlet.getFeedClassification("3"), is("stub_classification")); + } + + @Test + public void Given_Request_Is_GetFeedClassification_And_Feed_Does_Not_Exist() throws Exception { + PowerMockito.mockStatic(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(null); + assertThat(baseServlet.getFeedClassification("3"), is(nullValue())); + } + + @Test + public void Given_Request_Is_GetSubscriptionOwner_And_Subscription_Exists() throws Exception { + PowerMockito.mockStatic(Subscription.class); + Subscription subscription = mock(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(subscription); + when(subscription.getSubscriber()).thenReturn("stub_subscriber"); + assertThat(baseServlet.getSubscriptionOwner("3"), is("stub_subscriber")); + } + + @Test + public void Given_Request_Is_GetSubscriptionOwner_And_Subscription_Does_Not_Exist() throws Exception { + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(null); + assertThat(baseServlet.getSubscriptionOwner("3"), is(nullValue())); + } + + @Test + public void Given_Request_Is_GetGroupByFeedGroupId_And_User_Is_A_Member_Of_Group() throws Exception { + PowerMockito.mockStatic(Feed.class); + Feed feed = mock(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed); + when(feed.getGroupid()).thenReturn(3); + PowerMockito.mockStatic(Group.class); + Group group = mock(Group.class); + when(group.getMembers()).thenReturn("{id: stub_user}"); + PowerMockito.when(Group.getGroupById(anyInt())).thenReturn(group); + when(group.getAuthid()).thenReturn("stub_authID"); + assertThat(baseServlet.getGroupByFeedGroupId("stub_user", "3"), is("stub_authID")); + } + + @Test + public void Given_Request_Is_GetGroupByFeedGroupId_And_User_Is_Not_A_Member_Of_Group() throws Exception { + PowerMockito.mockStatic(Feed.class); + Feed feed = mock(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed); + when(feed.getGroupid()).thenReturn(3); + PowerMockito.mockStatic(Group.class); + Group group = mock(Group.class); + when(group.getMembers()).thenReturn("{id: stub_otherUser}"); + PowerMockito.when(Group.getGroupById(anyInt())).thenReturn(group); + when(group.getAuthid()).thenReturn("stub_authID"); + assertThat(baseServlet.getGroupByFeedGroupId("stub_user", "3"), is(nullValue())); + } + + @Test + public void Given_Request_Is_GetGroupBySubGroupId_And_User_Is_A_Member_Of_Group() throws Exception { + PowerMockito.mockStatic(Subscription.class); + Subscription subscription = mock(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(subscription); + when(subscription.getGroupid()).thenReturn(3); + PowerMockito.mockStatic(Group.class); + Group group = mock(Group.class); + when(group.getMembers()).thenReturn("{id: stub_user}"); + PowerMockito.when(Group.getGroupById(anyInt())).thenReturn(group); + when(group.getAuthid()).thenReturn("stub_authID"); + assertThat(baseServlet.getGroupBySubGroupId("stub_user", "3"), is("stub_authID")); + } + + @Test + public void Given_Request_Is_GetGroupBySubGroupId_And_User_Is_Not_A_Member_Of_Group() throws Exception { + PowerMockito.mockStatic(Subscription.class); + Subscription subscription = mock(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(subscription); + when(subscription.getGroupid()).thenReturn(3); + PowerMockito.mockStatic(Group.class); + Group group = mock(Group.class); + when(group.getMembers()).thenReturn("{id: stub_otherUser}"); + PowerMockito.when(Group.getGroupById(anyInt())).thenReturn(group); + when(group.getAuthid()).thenReturn("stub_authID"); + assertThat(baseServlet.getGroupBySubGroupId("stub_user", "3"), is(nullValue())); } } diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/DRFeedsServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/DRFeedsServletTest.java new file mode 100644 index 00000000..35bc85d8 --- /dev/null +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/DRFeedsServletTest.java @@ -0,0 +1,369 @@ +/******************************************************************************* + * ============LICENSE_START================================================== + * * org.onap.dmaap + * * =========================================================================== + * * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * * =========================================================================== + * * Licensed 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. + * * ============LICENSE_END==================================================== + * * + * * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * + ******************************************************************************/ +package org.onap.dmaap.datarouter.provisioning; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.jetbrains.annotations.NotNull; +import org.json.JSONArray; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.onap.dmaap.datarouter.authz.AuthorizationResponse; +import org.onap.dmaap.datarouter.authz.Authorizer; +import org.onap.dmaap.datarouter.provisioning.beans.Feed; +import org.onap.dmaap.datarouter.provisioning.beans.Insertable; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashSet; +import java.util.Set; + +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Mockito.*; +import static org.onap.dmaap.datarouter.provisioning.BaseServlet.BEHALF_HEADER; + + +@RunWith(PowerMockRunner.class) +@SuppressStaticInitializationFor("org.onap.dmaap.datarouter.provisioning.beans.Feed") +public class DRFeedsServletTest extends DrServletTestBase { + private static DRFeedsServlet drfeedsServlet; + + @Mock + private HttpServletRequest request; + @Mock + private HttpServletResponse response; + + @Before + public void setUp() throws Exception { + super.setUp(); + drfeedsServlet = new DRFeedsServlet(); + setAuthoriserToReturnRequestIsAuthorized(); + setPokerToNotCreateTimersWhenDeleteFeedIsCalled(); + setupValidAuthorisedRequest(); + setUpValidSecurityOnHttpRequest(); + setUpValidContentHeadersAndJSONOnHttpRequest(); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_SC_METHOD_NOT_ALLOWED_Response_Is_Generated() throws Exception { + drfeedsServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.isSecure()).thenReturn(false); + drfeedsServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception { + setBehalfHeader(null); + drfeedsServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_GET_And_URL_Path_Not_Valid_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getRequestURI()).thenReturn("/123"); + drfeedsServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + setAuthoriserToReturnRequestNotAuthorized(); + drfeedsServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_Fails_With_Valid_Name_And_Version() throws Exception { + when(request.getParameter("name")).thenReturn("stub_name"); + when(request.getParameter("version")).thenReturn("stub_version"); + drfeedsServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_Succeeds_With_Valid_Name_And_Version() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + when(request.getParameter("name")).thenReturn("stub_name"); + when(request.getParameter("version")).thenReturn("stub_version"); + PowerMockito.mockStatic(Feed.class); + Feed feed = mock(Feed.class); + PowerMockito.when(Feed.getFeedByNameVersion(anyString(), anyString())).thenReturn(feed); + when(feed.asJSONObject(true)).thenReturn(mock(JSONObject.class)); + drfeedsServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_Succeeds_With_Invalid_Name_And_Version() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + drfeedsServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + + @Test + public void Given_Request_Is_HTTP_PUT_SC_METHOD_NOT_ALLOWED_Response_Is_Generated() throws Exception { + drfeedsServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_POST_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.isSecure()).thenReturn(false); + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception { + setBehalfHeader(null); + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_POST_And_URL_Path_Not_Valid_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getRequestURI()).thenReturn("/123"); + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_POST_And_Content_Header_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed; version=1.1"); + when(request.getContentType()).thenReturn("stub_contentType"); + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + setAuthoriserToReturnRequestNotAuthorized(); + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Request_Contains_Badly_Formed_JSON_Then_Bad_Request_Response_Is_Generated() throws Exception { + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Active_Feeds_Equals_Max_Feeds_Then_Bad_Request_Response_Is_Generated() throws Exception { + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "maxFeeds", 0, true); + DRFeedsServlet drfeedsServlet = new DRFeedsServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + return new JSONObject(); + } + }; + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_CONFLICT), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Feed_Is_Not_Valid_Object_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn(null); + JSONObject JSObject = buildRequestJsonObject(); + + DRFeedsServlet drfeedsServlet = new DRFeedsServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + return jo; + } + }; + + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Feed_Already_Exists_Bad_Request_Response_Is_Generated() throws Exception { + setFeedToReturnInvalidFeedIdSupplied(); + JSONObject JSObject = buildRequestJsonObject(); + DRFeedsServlet drfeedsServlet = new DRFeedsServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "not_stub_name"); + jo.put("version", "1.0"); + jo.put("authorization", JSObject); + return jo; + } + }; + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_POST_Fails_Bad_Request_Response_Is_Generated() throws Exception { + JSONObject JSObject = buildRequestJsonObject(); + DRFeedsServlet drfeedsServlet = new DRFeedsServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("authorization", JSObject); + return jo; + } + + @Override + protected boolean doInsert(Insertable bean) { + return false; + } + }; + drfeedsServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_POST_And_Change_On_Feeds_Succeeds_A_STATUS_OK_Response_Is_Generated() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + JSONObject JSObject = buildRequestJsonObject(); + DRFeedsServlet drfeedsServlet = new DRFeedsServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "1.0"); + jo.put("authorization", JSObject); + return jo; + } + + @Override + protected boolean doInsert(Insertable bean) { + return true; + } + }; + drfeedsServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_CREATED)); + } + + @NotNull + private JSONObject buildRequestJsonObject() { + JSONObject JSObject = new JSONObject(); + JSONArray endpointIDs = new JSONArray(); + JSONObject JOEndpointIDs = new JSONObject(); + JOEndpointIDs.put("id", "stub_endpoint_id"); + JOEndpointIDs.put("password", "stub_endpoint_password"); + endpointIDs.put(JOEndpointIDs); + + JSONArray endpointAddresses = new JSONArray(); + endpointAddresses.put("127.0.0.1"); + + JSObject.put("classification", "stub_classification"); + JSObject.put("endpoint_ids", endpointIDs); + JSObject.put("endpoint_addrs", endpointAddresses); + return JSObject; + } + + private void setUpValidSecurityOnHttpRequest() throws Exception { + when(request.isSecure()).thenReturn(true); + Set<String> authAddressesAndNetworks = new HashSet<String>(); + authAddressesAndNetworks.add(("127.0.0.1")); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authorizedAddressesAndNetworks", authAddressesAndNetworks, true); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "requireCert", false, true); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "maxFeeds", 100, true); + } + + private void setBehalfHeader(String headerValue) { + when(request.getHeader(BEHALF_HEADER)).thenReturn(headerValue); + } + + private void setValidPathInfoInHttpHeader() { + when(request.getPathInfo()).thenReturn("/123"); + } + + private void setFeedToReturnInvalidFeedIdSupplied() { + PowerMockito.mockStatic(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(null); + when(Feed.getFeedByNameVersion(anyString(), anyString())).thenReturn(mock(Feed.class)); + } + + private void setFeedToReturnValidFeedForSuppliedId() { + PowerMockito.mockStatic(Feed.class); + Feed feed = mock(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed); + when(feed.isDeleted()).thenReturn(false); + when(feed.asJSONObject(true)).thenReturn(mock(JSONObject.class)); + when(feed.getPublisher()).thenReturn("Stub_Value"); + when(feed.getName()).thenReturn("stub_name"); + when(feed.getVersion()).thenReturn("1.0"); + when(feed.asLimitedJSONObject()).thenReturn(mock(JSONObject.class)); + PowerMockito.when(feed.getFeedByNameVersion(anyString(), anyString())).thenReturn(null); + } + + private void setAuthoriserToReturnRequestNotAuthorized() throws IllegalAccessException { + AuthorizationResponse authResponse = mock(AuthorizationResponse.class); + Authorizer authorizer = mock(Authorizer.class); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true); + when(authorizer.decide(request)).thenReturn(authResponse); + when(authResponse.isAuthorized()).thenReturn(false); + } + + private void setAuthoriserToReturnRequestIsAuthorized() throws IllegalAccessException { + AuthorizationResponse authResponse = mock(AuthorizationResponse.class); + Authorizer authorizer = mock(Authorizer.class); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true); + when(authorizer.decide(request)).thenReturn(authResponse); + when(authResponse.isAuthorized()).thenReturn(true); + } + + private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception { + Poker poker = mock(Poker.class); + FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true); + } + + private void setupValidAuthorisedRequest() throws Exception { + setUpValidSecurityOnHttpRequest(); + setBehalfHeader("Stub_Value"); + setValidPathInfoInHttpHeader(); + setFeedToReturnValidFeedForSuppliedId(); + } + + private void setUpValidContentHeadersAndJSONOnHttpRequest() { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed; version=1.0"); + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn("stub_subjectGroup"); + + } +} diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/DrServletTestBase.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/DrServletTestBase.java index cf035121..414fc185 100644 --- a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/DrServletTestBase.java +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/DrServletTestBase.java @@ -38,6 +38,9 @@ public class DrServletTestBase { public void setUp() throws Exception { Properties props = new Properties(); props.setProperty("org.onap.dmaap.datarouter.provserver.isaddressauthenabled", "false"); + props.setProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir", "datarouter-prov/unit-test-logs"); + props.setProperty("org.onap.dmaap.datarouter.provserver.spooldir", "resources/spooldir"); + props.setProperty("org.onap.dmaap.datarouter.provserver.https.relaxation", "false"); FieldUtils.writeDeclaredStaticField(DB.class, "props", props, true); FieldUtils.writeDeclaredStaticField(BaseServlet.class, "startmsgFlag", false, true); SynchronizerTask synchronizerTask = mock(SynchronizerTask.class); diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/FeedServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/FeedServletTest.java index d65b1f97..f5302cb9 100644..100755 --- a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/FeedServletTest.java +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/FeedServletTest.java @@ -23,6 +23,8 @@ package org.onap.dmaap.datarouter.provisioning; import org.apache.commons.lang3.reflect.FieldUtils; +import org.jetbrains.annotations.NotNull; +import org.json.JSONArray; import org.json.JSONObject; import org.junit.Before; import org.junit.Test; @@ -67,6 +69,7 @@ public class FeedServletTest extends DrServletTestBase { setPokerToNotCreateTimersWhenDeleteFeedIsCalled(); setUpValidAuthorisedRequest(); setUpValidSecurityOnHttpRequest(); + setUpValidContentHeadersAndJSONOnHttpRequest(); } @Test @@ -230,6 +233,7 @@ public class FeedServletTest extends DrServletTestBase { @Test public void Given_Request_Is_HTTP_PUT_And_Content_Header_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed-fail; version=2.0"); when(request.getContentType()).thenReturn("stub_contentType"); feedServlet.doPut(request, response); verify(response) @@ -239,13 +243,161 @@ public class FeedServletTest extends DrServletTestBase { @Test public void Given_Request_Is_HTTP_PUT_And_Request_Contains_Badly_Formed_JSON_Then_Bad_Request_Response_Is_Generated() throws Exception { - when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed; version=1.0"); ServletInputStream inStream = mock(ServletInputStream.class); when(request.getInputStream()).thenReturn(inStream); feedServlet.doPut(request, response); verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); } + @Test + public void Given_Request_Is_HTTP_PUT_And_Request_Contains_Invalid_JSON_Then_Bad_Request_Response_Is_Generated() throws Exception { + FeedServlet feedServlet = new FeedServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + return new JSONObject(); + } + }; + feedServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Feed_Change_Is_Not_Publisher_Who_Requested_Feed_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn(null); + JSONObject JSObject = buildRequestJsonObject(); + FeedServlet feedServlet = new FeedServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "1.0"); + jo.put("authorization", JSObject); + return jo; + } + }; + + feedServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Feed_Name_Change_is_Requested_Bad_Request_Response_Is_Generated() throws Exception { + JSONObject JSObject = buildRequestJsonObject(); + FeedServlet feedServlet = new FeedServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "not_stub_name"); + jo.put("version", "1.0"); + jo.put("authorization", JSObject); + return jo; + } + }; + feedServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Feed_Version_Change_is_Requested_Bad_Request_Response_Is_Generated() throws Exception { + JSONObject JSObject = buildRequestJsonObject(); + FeedServlet feedServlet = new FeedServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("authorization", JSObject); + return jo; + } + }; + feedServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + JSONObject JSObject = buildRequestJsonObject(); + FeedServlet feedServlet = new FeedServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "1.0"); + jo.put("authorization", JSObject); + return jo; + } + }; + setAuthoriserToReturnRequestNotAuthorized(); + feedServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Change_On_Feeds_Fails_A_STATUS_OK_Response_Is_Generated() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + + JSONObject JSObject = buildRequestJsonObject(); + FeedServlet feedServlet = new FeedServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "1.0"); + jo.put("authorization", JSObject); + return jo; + } + + @Override + protected boolean doUpdate(Updateable bean) { + return false; + } + }; + feedServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Change_On_Feeds_Suceeds_A_STATUS_OK_Response_Is_Generated() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + JSONObject JSObject = buildRequestJsonObject(); + FeedServlet feedServlet = new FeedServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "1.0"); + jo.put("authorization", JSObject); + return jo; + } + + @Override + protected boolean doUpdate(Updateable bean) { + return true; + } + }; + feedServlet.doPut(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_POST_SC_METHOD_NOT_ALLOWED_Response_Is_Generated() throws Exception { + feedServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class))); + } + + @NotNull + private JSONObject buildRequestJsonObject() { + JSONObject JSObject = new JSONObject(); + JSONArray endpointIDs = new JSONArray(); + JSONObject JOEndpointIDs = new JSONObject(); + JOEndpointIDs.put("id", "stub_endpoint_id"); + JOEndpointIDs.put("password", "stub_endpoint_password"); + endpointIDs.put(JOEndpointIDs); + + JSONArray endpointAddresses = new JSONArray(); + endpointAddresses.put("127.0.0.1"); + + JSObject.put("classification", "stub_classification"); + JSObject.put("endpoint_ids", endpointIDs); + JSObject.put("endpoint_addrs", endpointAddresses); + return JSObject; + } + private void setUpValidSecurityOnHttpRequest() throws Exception { when(request.isSecure()).thenReturn(true); Set<String> authAddressesAndNetworks = new HashSet<String>(); @@ -275,6 +427,10 @@ public class FeedServletTest extends DrServletTestBase { PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed); when(feed.isDeleted()).thenReturn(false); when(feed.asJSONObject(true)).thenReturn(mock(JSONObject.class)); + when(feed.getPublisher()).thenReturn("Stub_Value"); + when(feed.getName()).thenReturn("stub_name"); + when(feed.getVersion()).thenReturn("1.0"); + when(feed.asLimitedJSONObject()).thenReturn(mock(JSONObject.class)); } private void setAuthoriserToReturnRequestNotAuthorized() throws IllegalAccessException { @@ -304,4 +460,9 @@ public class FeedServletTest extends DrServletTestBase { setValidPathInfoInHttpHeader(); setFeedToReturnValidFeedForSuppliedId(); } + + private void setUpValidContentHeadersAndJSONOnHttpRequest() { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed; version=1.0"); + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn("stub_subjectGroup"); + } }
\ No newline at end of file diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/GroupServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/GroupServletTest.java index ed0e2572..a0831b73 100755..100644 --- a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/GroupServletTest.java +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/GroupServletTest.java @@ -55,6 +55,7 @@ import static org.onap.dmaap.datarouter.provisioning.BaseServlet.BEHALF_HEADER; @RunWith(PowerMockRunner.class) @SuppressStaticInitializationFor("org.onap.dmaap.datarouter.provisioning.beans.Group") public class GroupServletTest extends DrServletTestBase { + private GroupServlet groupServlet; @Mock @@ -68,7 +69,7 @@ public class GroupServletTest extends DrServletTestBase { super.setUp(); groupServlet = new GroupServlet(); setAuthoriserToReturnRequestIsAuthorized(); - setPokerToNotCreateTimersWhenDeleteFeedIsCalled(); + setPokerToNotCreateTimers(); setUpValidAuthorisedRequest(); } @@ -250,7 +251,7 @@ public class GroupServletTest extends DrServletTestBase { when(authResponse.isAuthorized()).thenReturn(true); } - private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception { + private void setPokerToNotCreateTimers() throws Exception { Poker poker = mock(Poker.class); FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true); } diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/InternalServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/InternalServletTest.java new file mode 100644 index 00000000..104d137a --- /dev/null +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/InternalServletTest.java @@ -0,0 +1,405 @@ +/******************************************************************************* + * ============LICENSE_START================================================== + * * org.onap.dmaap + * * =========================================================================== + * * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * * =========================================================================== + * * Licensed 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. + * * ============LICENSE_END==================================================== + * * + * * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * + ******************************************************************************/ +package org.onap.dmaap.datarouter.provisioning; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.onap.dmaap.datarouter.authz.AuthorizationResponse; +import org.onap.dmaap.datarouter.authz.Authorizer; +import org.onap.dmaap.datarouter.provisioning.beans.*; +import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader; +import org.onap.dmaap.datarouter.provisioning.utils.RLEBitSet; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; + +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.net.InetAddress; +import java.util.HashMap; +import java.util.Map; + +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Matchers.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.onap.dmaap.datarouter.provisioning.BaseServlet.BEHALF_HEADER; + +@RunWith(PowerMockRunner.class) +@SuppressStaticInitializationFor({"org.onap.dmaap.datarouter.provisioning.beans.Feed", "org.onap.dmaap.datarouter.provisioning.beans.Parameters", "org.onap.dmaap.datarouter.provisioning.beans.NodeClass", + "org.onap.dmaap.datarouter.provisioning.beans.Subscription", "org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader"}) +public class InternalServletTest extends DrServletTestBase { + private InternalServlet internalServlet; + + @Mock + private HttpServletRequest request; + + @Mock + private HttpServletResponse response; + + @Before + public void setUp() throws Exception { + super.setUp(); + internalServlet = new InternalServlet(); + setAuthoriserToReturnRequestIsAuthorized(); + setUpValidAuthorisedRequest(); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Address_Not_Authorized_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.getRemoteAddr()).thenReturn("127.100.0.3"); + internalServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_With_Halt_In_Endpoint_But_Not_Sent_From_Localhost_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/halt"); + when(request.isSecure()).thenReturn(false); + when(request.getRemoteAddr()).thenReturn("127.100.0.3"); + internalServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_FORBIDDEN)); + } + + @Test + public void Given_Request_Is_HTTP_GET_With_Halt_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/halt"); + when(request.isSecure()).thenReturn(false); + when(request.getRemoteAddr()).thenReturn("127.0.0.1"); + internalServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_With_FetchProv_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/fetchProv"); + when(request.isSecure()).thenReturn(false); + internalServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_With_Prov_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/prov"); + when(request.getQueryString()).thenReturn(null); + setPokerToNotCreateTimers(); + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + internalServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_With_Logs_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/logs/"); + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + internalServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_Starts_With_Logs_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/logs/TestFile"); + internalServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NO_CONTENT), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_With_Api_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/api/Key"); + setParametersToNotContactDb(false); + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + internalServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_With_Drlogs_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/drlogs/"); + PowerMockito.mockStatic(LogfileLoader.class); + LogfileLoader logfileLoader = mock(LogfileLoader.class); + when(logfileLoader.getBitSet()).thenReturn(new RLEBitSet()); + PowerMockito.when(LogfileLoader.getLoader()).thenReturn(logfileLoader); + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + internalServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_Incorrect_Endpoint_Then_No_Content_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/incorrect/"); + internalServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Address_Not_Authorized_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.getRemoteAddr()).thenReturn("127.100.0.3"); + internalServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_With_Api_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/api/Key"); + setParametersToNotContactDb(false); + String[] values = {"V", "a", "l", "u", "e", "s"}; + when(request.getParameterValues(anyString())).thenReturn(values); + internalServlet = internalServerSuccess(); + setPokerToNotCreateTimers(); + mockProvisioningParametersChanged(); + internalServlet.doPut(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_PUT_With_Api_In_Endpoint_And_Update_Fails_Then_Internal_Server_Error_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/api/Key"); + setParametersToNotContactDb(false); + String[] values = {"V", "a", "l", "u", "e", "s"}; + when(request.getParameterValues(anyString())).thenReturn(values); + internalServlet = internalServerFailure(); + internalServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_With_Incorrect_Endpoint_Then_Not_Found_Error_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/incorrect"); + internalServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Address_Not_Authorized_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.getRemoteAddr()).thenReturn("127.100.0.3"); + internalServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_With_Api_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/api/Key"); + setParametersToNotContactDb(false); + String[] values = {"V", "a", "l", "u", "e", "s"}; + when(request.getParameterValues(anyString())).thenReturn(values); + internalServlet = internalServerSuccess(); + setPokerToNotCreateTimers(); + mockProvisioningParametersChanged(); + internalServlet.doDelete(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_With_Api_In_Endpoint_And_Delete_Fails_Then_Internal_Server_Error_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/api/Key"); + setParametersToNotContactDb(false); + String[] values = {"V", "a", "l", "u", "e", "s"}; + when(request.getParameterValues(anyString())).thenReturn(values); + internalServlet = internalServerFailure(); + internalServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_With_Incorrect_Endpoint_Then_Not_Found_Error_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/incorrect"); + internalServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Address_Not_Authorized_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.getRemoteAddr()).thenReturn("127.100.0.3"); + internalServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_With_Api_In_Endpoint_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/api/Key"); + setParametersToNotContactDb(true); + String[] values = {"V", "a", "l", "u", "e", "s"}; + when(request.getParameterValues(anyString())).thenReturn(values); + internalServlet = internalServerSuccess(); + setPokerToNotCreateTimers(); + mockProvisioningParametersChanged(); + internalServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_POST_With_Api_In_Endpoint_And_Insert_Fails_Then_Internal_Server_Error_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/api/Key"); + setParametersToNotContactDb(true); + String[] values = {"V", "a", "l", "u", "e", "s"}; + when(request.getParameterValues(anyString())).thenReturn(values); + internalServlet = internalServerFailure(); + internalServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_To_Logs_And_Content_Header_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Type")).thenReturn("stub_contentType"); + when(request.getPathInfo()).thenReturn("/logs/"); + internalServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE)); + } + + @Test + public void Given_Request_Is_HTTP_POST_To_Logs_And_Content_Encoding_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Encoding")).thenReturn("not-supported"); + when(request.getPathInfo()).thenReturn("/logs/"); + internalServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE)); + } + + @Test + public void Given_Request_Is_HTTP_POST_To_Drlogs_And_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Type")).thenReturn("stub_contentType"); + when(request.getPathInfo()).thenReturn("/drlogs/"); + internalServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE)); + } + + @Test + public void Given_Request_Is_HTTP_POST_To_Drlogs_And_Request_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/drlogs/"); + ServletInputStream inStream = mock(ServletInputStream.class); + when(inStream.read()).thenReturn(1, -1); + when(request.getInputStream()).thenReturn(inStream); + internalServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_POST_With_Incorrect_Endpoint_Then_Not_Found_Error_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn("/incorrect/"); + internalServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + private void setAuthoriserToReturnRequestIsAuthorized() throws IllegalAccessException { + AuthorizationResponse authResponse = mock(AuthorizationResponse.class); + Authorizer authorizer = mock(Authorizer.class); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true); + when(authorizer.decide(request)).thenReturn(authResponse); + when(authResponse.isAuthorized()).thenReturn(true); + } + + private void setUpValidAuthorisedRequest() throws Exception { + setUpValidSecurityOnHttpRequest(); + setBehalfHeader("Stub_Value"); + setValidPathInfoInHttpHeader(); + when(request.getHeader("Content-Type")).thenReturn("text/plain"); + when(request.getHeader("Content-Encoding")).thenReturn("gzip"); + } + + private void setUpValidSecurityOnHttpRequest() throws Exception { + when(request.isSecure()).thenReturn(true); + when(request.getRemoteAddr()).thenReturn(InetAddress.getLocalHost().getHostAddress()); + InetAddress[] nodeAddresses = new InetAddress[1]; + nodeAddresses[0] = InetAddress.getLocalHost(); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "nodeAddresses", nodeAddresses, true); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "requireCert", false, true); + } + + private void setBehalfHeader(String headerValue) { + when(request.getHeader(BEHALF_HEADER)).thenReturn(headerValue); + } + + private void setValidPathInfoInHttpHeader() { + when(request.getPathInfo()).thenReturn("/123"); + } + + private void setPokerToNotCreateTimers() throws Exception { + Poker poker = mock(Poker.class); + FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true); + } + + private void setParametersToNotContactDb(boolean isPost) { + PowerMockito.mockStatic(Parameters.class); + Parameters parameters = mock(Parameters.class); + if (isPost) { + PowerMockito.when(Parameters.getParameter(anyString())).thenReturn(null); + } else { + PowerMockito.when(Parameters.getParameter(anyString())).thenReturn(parameters); + } + } + + private InternalServlet internalServerSuccess() { + InternalServlet internalServlet = new InternalServlet() { + + protected boolean doUpdate(Updateable bean) { + return true; + } + + protected boolean doDelete(Deleteable bean) { + return true; + } + + protected boolean doInsert(Insertable bean) { + return true; + } + }; + return internalServlet; + } + + private InternalServlet internalServerFailure() { + InternalServlet internalServlet = new InternalServlet() { + + protected boolean doUpdate(Updateable bean) { + return false; + } + + protected boolean doDelete(Deleteable bean) { + return false; + } + + protected boolean doInsert(Insertable bean) { + return false; + } + }; + return internalServlet; + } + + private void mockProvisioningParametersChanged() throws IllegalAccessException{ + PowerMockito.mockStatic(Feed.class); + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Feed.countActiveFeeds()).thenReturn(0); + PowerMockito.when(Subscription.countActiveSubscriptions()).thenReturn(0); + Map<String, Integer> map = new HashMap<>(); + FieldUtils.writeDeclaredStaticField(NodeClass.class, "map", map, true); + } +} diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/LogServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/LogServletTest.java new file mode 100755 index 00000000..9a550593 --- /dev/null +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/LogServletTest.java @@ -0,0 +1,226 @@ +/******************************************************************************* + * ============LICENSE_START================================================== + * * org.onap.dmaap + * * =========================================================================== + * * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * * =========================================================================== + * * Licensed 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. + * * ============LICENSE_END==================================================== + * * + * * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * + ******************************************************************************/ +package org.onap.dmaap.datarouter.provisioning; + + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.onap.dmaap.datarouter.provisioning.beans.Subscription; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.powermock.api.mockito.PowerMockito.when; + +@RunWith(PowerMockRunner.class) +@SuppressStaticInitializationFor({"org.onap.dmaap.datarouter.provisioning.beans.Subscription"}) +public class LogServletTest extends DrServletTestBase { + + private static LogServlet logServlet; + + @Mock + private HttpServletRequest request; + @Mock + private HttpServletResponse response; + + @Before + public void setUp() throws Exception { + super.setUp(); + logServlet = new LogServlet(true); + setUpValidParameterValuesForMap(); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Is_Not_Allowed_Then_Forbidden_Response_Is_Generated() + throws Exception { + logServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_FeedID_Is_Invalid_Then_Bad_Request_Response_Is_Generated() + throws Exception { + when(request.getPathInfo()).thenReturn(null); + logServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Has_Bad_Type() + throws Exception { + when(request.getParameter("type")).thenReturn("bad_type"); + logServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Has_Bad_PublishID() + throws Exception { + when(request.getParameter("publishId")).thenReturn("bad_PublishID'"); + logServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Has_Bad_StatusCode() + throws Exception { + when(request.getParameter("statusCode")).thenReturn("1'"); + logServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Has_Bad_ExpiryReason() + throws Exception { + when(request.getParameter("expiryReason")).thenReturn("bad_ExpiryReason"); + logServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Has_Bad_Start() + throws Exception { + when(request.getParameter("start")).thenReturn("bad_startTime"); + logServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Has_Bad_End() + throws Exception { + when(request.getParameter("end")).thenReturn("bad_endTime"); + logServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Is_FeedLog() + throws Exception { + logServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Is_Not_FeedLog() + throws Exception { + LogServlet logServletNotFeedlog = new LogServlet(false); + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(mock(Subscription.class)); + logServletNotFeedlog.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Is_Not_Allowed_Then_Forbidden_Response_Is_Generated() + throws Exception { + logServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Is_Not_Allowed_Then_Forbidden_Response_Is_Generated() + throws Exception { + logServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_GetPublishRecordsForFeed_And_Type_Is_Publish() + throws Exception { + when(request.getParameter("type")).thenReturn("pub"); + when(request.getParameter("expiryReason")).thenReturn(null); + logServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_getDeliveryRecordsForFeed_And_Type_Is_Delivery() + throws Exception { + when(request.getParameter("type")).thenReturn("del"); + when(request.getParameter("expiryReason")).thenReturn(null); + logServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_getExpiryRecordsForFeed_And_Type_Is_Expire() + throws Exception { + when(request.getParameter("type")).thenReturn("exp"); + when(request.getParameter("statusCode")).thenReturn(null); + when(request.getParameter("expiryReason")).thenReturn(null); + ServletOutputStream s = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(s); + logServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_getDeliveryRecordsForSubscription_And_Type_Is_Delivery() + throws Exception { + LogServlet logServletNotFeedlog = new LogServlet(false); + when(request.getParameter("type")).thenReturn("del"); + when(request.getParameter("statusCode")).thenReturn(null); + when(request.getParameter("expiryReason")).thenReturn(null); + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(mock(Subscription.class)); + logServletNotFeedlog.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_getExpiryRecordsForSubscription_And_Type_Is_Expiry() + throws Exception { + LogServlet logServletNotFeedlog = new LogServlet(false); + when(request.getParameter("type")).thenReturn("exp"); + when(request.getParameter("statusCode")).thenReturn(null); + when(request.getParameter("expiryReason")).thenReturn(null); + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(mock(Subscription.class)); + logServletNotFeedlog.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + private void setUpValidParameterValuesForMap() throws Exception { + when(request.getPathInfo()).thenReturn("123"); + when(request.getParameter("type")).thenReturn("exp"); + when(request.getParameter("publishId")).thenReturn("bad_PublishID"); + when(request.getParameter("statusCode")).thenReturn("-1"); + when(request.getParameter("expiryReason")).thenReturn("other"); + when(request.getParameter("start")).thenReturn(null); + when(request.getParameter("end")).thenReturn(null); + ServletOutputStream s = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(s); + } +}
\ No newline at end of file diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/PublishServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/PublishServletTest.java new file mode 100755 index 00000000..92403ac8 --- /dev/null +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/PublishServletTest.java @@ -0,0 +1,214 @@ +/******************************************************************************* + * ============LICENSE_START================================================== + * * org.onap.dmaap + * * =========================================================================== + * * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * * =========================================================================== + * * Licensed 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. + * * ============LICENSE_END==================================================== + * * + * * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * + ******************************************************************************/ + +package org.onap.dmaap.datarouter.provisioning; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Matchers; +import org.mockito.Mock; +import org.onap.dmaap.datarouter.authz.AuthorizationResponse; +import org.onap.dmaap.datarouter.authz.Authorizer; +import org.onap.dmaap.datarouter.provisioning.beans.*; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Matchers.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.onap.dmaap.datarouter.provisioning.BaseServlet.BEHALF_HEADER; + +/** + * Created by ezcoxem on 21/08/2018. + */ + +@RunWith(PowerMockRunner.class) +@SuppressStaticInitializationFor("org.onap.dmaap.datarouter.provisioning.beans.Feed") +public class PublishServletTest extends DrServletTestBase { + private PublishServlet publishServlet; + + private static String START_JSON_STRING = "{"; + private static String END_JSON_STRING = "}"; + private static String START_JSON_ARRAY = "["; + private static String END_JSON_ARRAY = "]"; + private static String COMMA = ","; + + @Mock + private HttpServletRequest request; + + @Mock + private HttpServletResponse response; + + @Before + public void setUp() throws Exception { + super.setUp(); + publishServlet = new PublishServlet(); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_There_Are_No_Nodes_Then_Service_Unavailable_Error_Is_Returned() + throws Exception { + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "nodes", new String[0], true); + publishServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Path_Is_Null_Then_Not_Found_Error_Is_Returned() + throws Exception { + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "nodes", new String[1], true); + publishServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Ix_Is_Null_Then_Not_Found_Error_Is_Returned() + throws Exception { + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "nodes", new String[1], true); + when(request.getPathInfo()).thenReturn("/123/"); + publishServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Feed_Is_Not_Valid_Then_Not_Found_Error_Is_Returned() + throws Exception { + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "nodes", new String[1], true); + when(request.getPathInfo()).thenReturn("/123/fileName.txt"); + PowerMockito.mockStatic(Feed.class); + PowerMockito.when(Feed.isFeedValid(anyInt())).thenReturn(false); + publishServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Feed_Is_Not_A_Number_Then_Not_Found_Error_Is_Returned() + throws Exception { + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "nodes", new String[1], true); + when(request.getPathInfo()).thenReturn("/abc/fileName.txt"); + PowerMockito.mockStatic(Feed.class); + PowerMockito.when(Feed.isFeedValid(anyInt())).thenReturn(false); + publishServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_DELETE_And_All_Ok_Then_Request_succeeds() + throws Exception { + setConditionsForPositiveSuccessFlow(); + when(request.getHeader(anyString())).thenReturn("Basic dXNlcg=="); + publishServlet.doDelete(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_MOVED_PERMANENTLY)); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Request_succeeds() + throws Exception { + setConditionsForPositiveSuccessFlow(); + + publishServlet.doPut(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_MOVED_PERMANENTLY)); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Request_succeeds() + throws Exception { + setConditionsForPositiveSuccessFlow(); + + publishServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_MOVED_PERMANENTLY)); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_succeeds() + throws Exception { + setConditionsForPositiveSuccessFlow(); + + publishServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_MOVED_PERMANENTLY)); + } + + private void setConditionsForPositiveSuccessFlow() throws Exception { + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "nodes", new String[1], true); + FieldUtils.writeDeclaredField(publishServlet, "next_node", 0, true); + FieldUtils.writeDeclaredField(publishServlet, "provstring", "", true); + FieldUtils.writeDeclaredField(publishServlet, "irt", new ArrayList<IngressRoute>(), true); + FieldUtils.writeDeclaredStaticField(NodeClass.class, "map", new HashMap<String,String>(), true); + when(request.getPathInfo()).thenReturn("/123/fileName.txt"); + PowerMockito.mockStatic(Feed.class); + PowerMockito.when(Feed.isFeedValid(anyInt())).thenReturn(true); + setPokerToNotCreateTimersWhenDeleteFeedIsCalled(); + } + + private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception { + Poker poker = mock(Poker.class); + FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true); + when(poker.getProvisioningString()).thenReturn(buildProvisioningString()); + } + + + private String buildProvisioningString(){ + StringBuffer provisionString = new StringBuffer(); + provisionString.append(START_JSON_STRING); + provisionString.append("'ingress':"); + provisionString.append(START_JSON_ARRAY); + provisionString.append(buildIngressRoute()); + provisionString.append(END_JSON_ARRAY); + provisionString.append(END_JSON_STRING); + return provisionString.toString(); + } + + private StringBuffer buildIngressRoute(){ + StringBuffer provisionString = new StringBuffer(); + provisionString.append(START_JSON_STRING); + provisionString.append("'seq':1"); + provisionString.append(COMMA); + provisionString.append("'feedid':123"); + provisionString.append(COMMA); + provisionString.append("'user':'user'"); + provisionString.append(COMMA); + provisionString.append("'subnet':'127.0.0.1'"); + provisionString.append(COMMA); + provisionString.append("'nodelist':-1"); + provisionString.append(COMMA); + provisionString.append("'node':['1','2']"); + provisionString.append(END_JSON_STRING); + return provisionString; + } + + +} diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/RouteServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/RouteServletTest.java new file mode 100755 index 00000000..63715804 --- /dev/null +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/RouteServletTest.java @@ -0,0 +1,450 @@ +/******************************************************************************* + * ============LICENSE_START================================================== + * * org.onap.dmaap + * * =========================================================================== + * * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * * =========================================================================== + * * Licensed 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. + * * ============LICENSE_END==================================================== + * * + * * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * + ******************************************************************************/ + +package org.onap.dmaap.datarouter.provisioning; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.onap.dmaap.datarouter.provisioning.beans.*; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.SortedSet; +import java.util.TreeSet; +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Matchers.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(PowerMockRunner.class) +@SuppressStaticInitializationFor({"org.onap.dmaap.datarouter.provisioning.beans.IngressRoute", + "org.onap.dmaap.datarouter.provisioning.beans.EgressRoute", + "org.onap.dmaap.datarouter.provisioning.beans.NodeClass", + "org.onap.dmaap.datarouter.provisioning.beans.NetworkRoute"}) +public class RouteServletTest extends DrServletTestBase +{ + private RouteServlet routeServlet; + + @Mock + private HttpServletRequest request; + + @Mock + private HttpServletResponse response; + + @Before + public void setUp() throws Exception { + super.setUp(); + setPokerToNotCreateTimersWhenDeleteFeedIsCalled(); + setRouteToReturnValid(); + routeServlet = new RouteServlet(); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Is_Not_Authorized() throws Exception { + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Ingress_Route_Does_Not_Exist_In_Path() throws Exception { + when(request.getPathInfo()).thenReturn("/ingress/3/internal/route/"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Ingress_Path_Contains_Invalid_FeedID() throws Exception { + when(request.getPathInfo()).thenReturn("/ingress/feedID/internal/route/"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Ingress_Path_Contains_Invalid_Sequence_Number() throws Exception { + when(request.getPathInfo()).thenReturn("/ingress/feedID/"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Ingress_Path_Contains_Invalid_Number_Of_Arguments() throws Exception { + when(request.getPathInfo()).thenReturn("/ingress/"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Egress_Route_Does_Not_Exist_In_Path() throws Exception { + when(request.getPathInfo()).thenReturn("/egress/3"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Egress_Path_Contains_Invalid_SubID() throws Exception { + when(request.getPathInfo()).thenReturn("/egress/subID"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Egress_Path_Contains_Invalid_Number_Of_Arguments() throws Exception { + when(request.getPathInfo()).thenReturn("/egress/"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Network_Path_Contains_Invalid_Number_Of_Arguments() throws Exception { + when(request.getPathInfo()).thenReturn("/network/"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Deletable_Is_Null() throws Exception { + when(request.getPathInfo()).thenReturn("/route/"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + + @Override + protected boolean doDelete(Deleteable bean) { + return true; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Fails() throws Exception { + when(request.getPathInfo()).thenReturn("/network/subID/route"); + PowerMockito.mockStatic(NodeClass.class); + PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + + @Override + protected boolean doDelete(Deleteable bean) { + return false; + } + }; + routeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Is_Not_Authorized() throws Exception { + routeServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Path_Does_Not_Start_With_Valid_Route() throws Exception { + when(request.getPathInfo()).thenReturn("/route/"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_GET_And_Path_Equals_Ingress_And_Get_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/ingress/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Path_Equals_Egress_And_Get_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/egress/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Ingress_Path_Equals_Network_And_Get_Succeeds() throws Exception { + when(request.getPathInfo()).thenReturn("/network/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Is_Not_Authorized() throws Exception { + routeServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Contains_Bad_URL() throws Exception { + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_POST_And_Is_Not_Authorized() throws Exception { + routeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Ingress_Path_Starts_With_Ingress_And_Contains_Invalid_Arguments() throws Exception { + when(request.getPathInfo()).thenReturn("/ingress/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + when(request.getParameter("feed")).thenReturn("3"); + when(request.getParameter("user")).thenReturn(null); + when(request.getParameter("subnet")).thenReturn(null); + when(request.getParameter("nodepatt")).thenReturn(null); + when(request.getParameter("seq")).thenReturn(null); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Egress_And_EgressRoute_Already_Exists() throws Exception { + when(request.getPathInfo()).thenReturn("/egress/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + when(request.getParameter("sub")).thenReturn("3"); + EgressRoute e = mock(EgressRoute.class); + PowerMockito.when(EgressRoute.getEgressRoute(anyInt())).thenReturn(e); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Egress_And_Contains_Invalid_Arguments() throws Exception { + when(request.getPathInfo()).thenReturn("/egress/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + when(request.getParameter("sub")).thenReturn("3"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Network_And_Is_Missing_Arguments() throws Exception { + when(request.getPathInfo()).thenReturn("/network/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Network_And_Route_Already_Exists() throws Exception { + when(request.getPathInfo()).thenReturn("/network/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + when(request.getParameter("from")).thenReturn("stub_from"); + when(request.getParameter("to")).thenReturn("stub_to"); + when(request.getParameter("via")).thenReturn("stub_via"); + PowerMockito.mockStatic(NodeClass.class); + PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val"); + SortedSet<NetworkRoute> networkSet = new TreeSet(); + networkSet.add(mock(NetworkRoute.class)); + PowerMockito.when(NetworkRoute.getAllNetworkRoutes()).thenReturn(networkSet); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Path_URL_Is_Null() throws Exception { + when(request.getPathInfo()).thenReturn("/route/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + when(request.getParameter("from")).thenReturn("stub_from"); + when(request.getParameter("to")).thenReturn("stub_to"); + when(request.getParameter("via")).thenReturn("stub_via"); + PowerMockito.mockStatic(NodeClass.class); + PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + }; + routeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Fails() throws Exception { + when(request.getPathInfo()).thenReturn("/network/"); + when(request.getRemoteAddr()).thenReturn("stub_addr"); + when(request.getParameter("from")).thenReturn("stub_from"); + when(request.getParameter("to")).thenReturn("stub_to"); + when(request.getParameter("via")).thenReturn("stub_via"); + PowerMockito.mockStatic(NodeClass.class); + PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val"); + RouteServlet routeServlet = new RouteServlet() { + protected boolean isAuthorizedForInternal(HttpServletRequest req) { + return true; + } + + @Override + protected boolean doInsert(Insertable bean) { + return false; + } + }; + routeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + private void setRouteToReturnValid() throws IllegalAccessException { + PowerMockito.mockStatic(IngressRoute.class); + PowerMockito.when(IngressRoute.getIngressRoute(anyInt(), anyString(), anyString())).thenReturn(null); + SortedSet<IngressRoute> ingressSet = new TreeSet(); + IngressRoute ingressRoute = mock(IngressRoute.class); + JSONObject joIngress = mock(JSONObject.class); + when(joIngress.toString()).thenReturn("{}"); + when(ingressRoute.asJSONObject()).thenReturn(joIngress); + ingressSet.add(ingressRoute); + PowerMockito.when(IngressRoute.getAllIngressRoutes()).thenReturn(ingressSet); + + PowerMockito.mockStatic(EgressRoute.class); + PowerMockito.when(EgressRoute.getEgressRoute(anyInt())).thenReturn(null); + SortedSet<EgressRoute> egressSet = new TreeSet(); + EgressRoute egressRoute = mock(EgressRoute.class); + JSONObject joEgress = mock(JSONObject.class); + when(joEgress.toString()).thenReturn("{}"); + when(egressRoute.asJSONObject()).thenReturn(joEgress); + egressSet.add(egressRoute); + PowerMockito.when(EgressRoute.getAllEgressRoutes()).thenReturn(egressSet); + + PowerMockito.mockStatic(NetworkRoute.class); + SortedSet<NetworkRoute> networkSet = new TreeSet(); + PowerMockito.when(NetworkRoute.getAllNetworkRoutes()).thenReturn(networkSet); + + } + + private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception { + Poker poker = mock(Poker.class); + FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true); + } +} diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/SubscribeServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/SubscribeServletTest.java new file mode 100644 index 00000000..c663451b --- /dev/null +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/SubscribeServletTest.java @@ -0,0 +1,333 @@ +/******************************************************************************* + * ============LICENSE_START================================================== + * * org.onap.dmaap + * * =========================================================================== + * * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * * =========================================================================== + * * Licensed 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. + * * ============LICENSE_END==================================================== + * * + * * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * + ******************************************************************************/ +package org.onap.dmaap.datarouter.provisioning; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.jetbrains.annotations.NotNull; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.onap.dmaap.datarouter.authz.AuthorizationResponse; +import org.onap.dmaap.datarouter.authz.Authorizer; +import org.onap.dmaap.datarouter.provisioning.beans.Feed; +import org.onap.dmaap.datarouter.provisioning.beans.Insertable; +import org.onap.dmaap.datarouter.provisioning.beans.Subscription; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Mockito.*; +import static org.onap.dmaap.datarouter.provisioning.BaseServlet.BEHALF_HEADER; + + +@RunWith(PowerMockRunner.class) +@SuppressStaticInitializationFor({"org.onap.dmaap.datarouter.provisioning.beans.Feed", "org.onap.dmaap.datarouter.provisioning.beans.Subscription"}) +public class SubscribeServletTest extends DrServletTestBase { + private static SubscribeServlet subscribeServlet; + + @Mock + private HttpServletRequest request; + @Mock + private HttpServletResponse response; + + @Before + public void setUp() throws Exception { + super.setUp(); + subscribeServlet = new SubscribeServlet(); + setAuthoriserToReturnRequestIsAuthorized(); + setPokerToNotCreateTimersWhenDeleteFeedIsCalled(); + setupValidAuthorisedRequest(); + setUpValidSecurityOnHttpRequest(); + setUpValidContentHeadersAndJSONOnHttpRequest(); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_SC_METHOD_NOT_ALLOWED_Response_Is_Generated() throws Exception { + subscribeServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.isSecure()).thenReturn(false); + subscribeServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception { + setBehalfHeader(null); + subscribeServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_GET_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn(null); + subscribeServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Feed_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception { + setFeedToReturnInvalidFeedIdSupplied(); + subscribeServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + setAuthoriserToReturnRequestNotAuthorized(); + subscribeServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_Succeeds() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + PowerMockito.mockStatic(Subscription.class); + List<String> list = new ArrayList<String>(); + list.add("{}"); + PowerMockito.when(Subscription.getSubscriptionUrlList(anyInt())).thenReturn(list); + subscribeServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + + @Test + public void Given_Request_Is_HTTP_PUT_SC_METHOD_NOT_ALLOWED_Response_Is_Generated() throws Exception { + subscribeServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class))); + } + @Test + public void Given_Request_Is_HTTP_POST_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.isSecure()).thenReturn(false); + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception { + setBehalfHeader(null); + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_POST_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn(null); + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_POST_And_Feed_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception { + setFeedToReturnInvalidFeedIdSupplied(); + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + setAuthoriserToReturnRequestNotAuthorized(); + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Content_Header_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed; version=1.1"); + when(request.getContentType()).thenReturn("stub_contentType"); + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Request_Contains_Badly_Formed_JSON_Then_Bad_Request_Response_Is_Generated() throws Exception { + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Active_Feeds_Equals_Max_Feeds_Then_Bad_Request_Response_Is_Generated() throws Exception { + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "maxSubs", 0, true); + SubscribeServlet subscribeServlet = new SubscribeServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + return new JSONObject(); + } + }; + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_CONFLICT), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_POST_Fails_Bad_Request_Response_Is_Generated() throws Exception { + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionMatching(mock(Subscription.class))).thenReturn(null); + JSONObject JSObject = buildRequestJsonObject(); + SubscribeServlet subscribeServlet = new SubscribeServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("metadataOnly", true); + jo.put("suspend", true); + jo.put("delivery", JSObject); + jo.put("sync", false); + return jo; + } + + @Override + protected boolean doInsert(Insertable bean) { + return false; + } + }; + subscribeServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + + @Test + public void Given_Request_Is_HTTP_POST_And_Change_On_Feeds_Succeeds_A_STATUS_OK_Response_Is_Generated() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionMatching(mock(Subscription.class))).thenReturn(null); + JSONObject JSObject = buildRequestJsonObject(); + SubscribeServlet subscribeServlet = new SubscribeServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("metadataOnly", true); + jo.put("suspend", true); + jo.put("delivery", JSObject); + jo.put("sync", true); + return jo; + } + + @Override + protected boolean doInsert(Insertable bean) { + return true; + } + }; + subscribeServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_CREATED)); + } + + + @NotNull + private JSONObject buildRequestJsonObject() { + JSONObject JSObject = new JSONObject(); + JSObject.put("url", "https://stub_address"); + JSObject.put("use100", "true"); + JSObject.put("password", "stub_password"); + JSObject.put("user", "stub_user"); + return JSObject; + } + + private void setUpValidSecurityOnHttpRequest() throws Exception { + when(request.isSecure()).thenReturn(true); + Set<String> authAddressesAndNetworks = new HashSet<String>(); + authAddressesAndNetworks.add(("127.0.0.1")); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authorizedAddressesAndNetworks", authAddressesAndNetworks, true); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "requireCert", false, true); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "maxSubs", 1, true); + } + + private void setBehalfHeader(String headerValue) { + when(request.getHeader(BEHALF_HEADER)).thenReturn(headerValue); + } + + private void setValidPathInfoInHttpHeader() { + when(request.getPathInfo()).thenReturn("/123"); + } + + private void setFeedToReturnInvalidFeedIdSupplied() { + PowerMockito.mockStatic(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(null); + } + + private void setFeedToReturnValidFeedForSuppliedId() { + PowerMockito.mockStatic(Feed.class); + Feed feed = mock(Feed.class); + PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed); + when(feed.isDeleted()).thenReturn(false); + when(feed.asJSONObject(true)).thenReturn(mock(JSONObject.class)); + when(feed.getPublisher()).thenReturn("Stub_Value"); + when(feed.getName()).thenReturn("stub_name"); + when(feed.getVersion()).thenReturn("1.0"); + when(feed.asLimitedJSONObject()).thenReturn(mock(JSONObject.class)); + } + + private void setAuthoriserToReturnRequestNotAuthorized() throws IllegalAccessException { + AuthorizationResponse authResponse = mock(AuthorizationResponse.class); + Authorizer authorizer = mock(Authorizer.class); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true); + when(authorizer.decide(request)).thenReturn(authResponse); + when(authResponse.isAuthorized()).thenReturn(false); + } + + private void setAuthoriserToReturnRequestIsAuthorized() throws IllegalAccessException { + AuthorizationResponse authResponse = mock(AuthorizationResponse.class); + Authorizer authorizer = mock(Authorizer.class); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true); + when(authorizer.decide(request)).thenReturn(authResponse); + when(authResponse.isAuthorized()).thenReturn(true); + } + + private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception { + Poker poker = mock(Poker.class); + FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true); + } + + private void setupValidAuthorisedRequest() throws Exception { + setUpValidSecurityOnHttpRequest(); + setBehalfHeader("Stub_Value"); + setValidPathInfoInHttpHeader(); + setFeedToReturnValidFeedForSuppliedId(); + } + + private void setUpValidContentHeadersAndJSONOnHttpRequest() { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription; version=1.0"); + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn("stub_subjectGroup"); + + } +} diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/SubscriptionServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/SubscriptionServletTest.java new file mode 100644 index 00000000..b42e3a76 --- /dev/null +++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/SubscriptionServletTest.java @@ -0,0 +1,484 @@ +/******************************************************************************* + * ============LICENSE_START================================================== + * * org.onap.dmaap + * * =========================================================================== + * * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * * =========================================================================== + * * Licensed 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. + * * ============LICENSE_END==================================================== + * * + * * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * + ******************************************************************************/ +package org.onap.dmaap.datarouter.provisioning; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.jetbrains.annotations.NotNull; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.onap.dmaap.datarouter.authz.AuthorizationResponse; +import org.onap.dmaap.datarouter.authz.Authorizer; +import org.onap.dmaap.datarouter.provisioning.beans.Deleteable; +import org.onap.dmaap.datarouter.provisioning.beans.Subscription; +import org.onap.dmaap.datarouter.provisioning.beans.Updateable; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; + +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashSet; +import java.util.Set; + +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Mockito.*; +import static org.onap.dmaap.datarouter.provisioning.BaseServlet.BEHALF_HEADER; + + +@RunWith(PowerMockRunner.class) +@SuppressStaticInitializationFor("org.onap.dmaap.datarouter.provisioning.beans.Subscription") +public class SubscriptionServletTest extends DrServletTestBase { + private SubscriptionServlet subscriptionServlet; + + @Mock + private HttpServletRequest request; + @Mock + private HttpServletResponse response; + + @Before + public void setUp() throws Exception { + super.setUp(); + subscriptionServlet = new SubscriptionServlet(); + setAuthoriserToReturnRequestIsAuthorized(); + setPokerToNotCreateTimersWhenDeleteSubscriptionIsCalled(); + setupValidAuthorisedRequest(); + setUpValidSecurityOnHttpRequest(); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_SC_Forbidden_Response_Is_Generated() throws Exception { + when(request.isSecure()).thenReturn(false); + subscriptionServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception { + setBehalfHeader(null); + subscriptionServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn(null); + subscriptionServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Subscription_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception { + setSubscriptionToReturnInvalidSubscriptionIdSupplied(); + subscriptionServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + setAuthoriserToReturnRequestNotAuthorized(); + subscriptionServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Delete_On_Database_Fails_An_Internal_Server_Error_Is_Reported() throws Exception { + SubscriptionServlet subscriptionServlet = new SubscriptionServlet(){ + public boolean doDelete(Deleteable deletable){ + return false; + } + }; + subscriptionServlet.doDelete(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_DELETE_And_Delete_On_Database_Succeeds_A_NO_CONTENT_Response_Is_Generated() throws Exception { + SubscriptionServlet subscriptionServlet = new SubscriptionServlet(){ + public boolean doDelete(Deleteable deletable){ + return true; + } + }; + subscriptionServlet.doDelete(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_NO_CONTENT)); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.isSecure()).thenReturn(false); + subscriptionServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception { + setBehalfHeader(null); + subscriptionServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn(null); + subscriptionServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Subscription_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception { + setSubscriptionToReturnInvalidSubscriptionIdSupplied(); + subscriptionServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + setAuthoriserToReturnRequestNotAuthorized(); + subscriptionServlet.doGet(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_GET_And_Request_Succeeds() throws Exception { + JSONObject JSObject = buildRequestJsonObject(); + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("metadataOnly", true); + jo.put("suspend", true); + jo.put("delivery", JSObject); + jo.put("sync", true); + Subscription sub = new Subscription(jo); + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(sub); + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + subscriptionServlet.doGet(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.isSecure()).thenReturn(false); + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception { + setBehalfHeader(null); + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn(null); + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Subscription_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception { + setSubscriptionToReturnInvalidSubscriptionIdSupplied(); + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + setAuthoriserToReturnRequestNotAuthorized(); + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Content_Header_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception { + when(request.getContentType()).thenReturn("stub_ContentType"); + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Request_Contains_Badly_Formed_JSON_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription; version=1.0"); + ServletInputStream inStream = mock(ServletInputStream.class); + when(request.getInputStream()).thenReturn(inStream); + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Subscription_Object_Is_Invalid_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription; version=1.0"); + SubscriptionServlet subscriptionServlet = new SubscriptionServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + return jo; + } + }; + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Subscriber_Modified_By_Different_Creator() throws Exception { + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn(null); + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription; version=1.0"); + JSONObject JSObject = buildRequestJsonObject(); + SubscriptionServlet subscriptionServlet = new SubscriptionServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("metadataOnly", true); + jo.put("suspend", true); + jo.put("delivery", JSObject); + jo.put("sync", true); + return jo; + } + }; + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Update_Fails() throws Exception { + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn("stub_subjectGroup"); + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription; version=1.0"); + JSONObject JSObject = buildRequestJsonObject(); + SubscriptionServlet subscriptionServlet = new SubscriptionServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("metadataOnly", true); + jo.put("suspend", true); + jo.put("delivery", JSObject); + jo.put("sync", true); + return jo; + } + + @Override + protected boolean doUpdate(Updateable bean) { + return false; + } + }; + subscriptionServlet.doPut(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_PUT_And_Update_Succeeds() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn("stub_subjectGroup"); + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription; version=1.0"); + JSONObject JSObject = buildRequestJsonObject(); + SubscriptionServlet subscriptionServlet = new SubscriptionServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("metadataOnly", true); + jo.put("suspend", true); + jo.put("delivery", JSObject); + jo.put("sync", true); + return jo; + } + + @Override + protected boolean doUpdate(Updateable bean) { + return true; + } + }; + subscriptionServlet.doPut(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_OK)); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.isSecure()).thenReturn(false); + subscriptionServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception { + setBehalfHeader(null); + subscriptionServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getPathInfo()).thenReturn(null); + subscriptionServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Subscription_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception { + setSubscriptionToReturnInvalidSubscriptionIdSupplied(); + subscriptionServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Content_Header_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception { + when(request.getContentType()).thenReturn("stub_ContentType"); + subscriptionServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception { + when(request.getHeader(anyString())).thenReturn("application/vnd.att-dr.subscription-control"); + setAuthoriserToReturnRequestNotAuthorized(); + subscriptionServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Request_Contains_Badly_Formed_JSON_Then_Bad_Request_Response_Is_Generated() throws Exception { + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription-control; version=1.0"); + ServletInputStream inStream = mock(ServletInputStream.class); + when(request.getInputStream()).thenReturn(inStream); + subscriptionServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Post_Fails() throws Exception { + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn("stub_subjectGroup"); + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription-control; version=1.0"); + JSONObject JSObject = buildRequestJsonObject(); + SubscriptionServlet subscriptionServlet = new SubscriptionServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("metadataOnly", true); + jo.put("suspend", true); + jo.put("delivery", JSObject); + return jo; + } + }; + subscriptionServlet.doPost(request, response); + verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class))); + } + + @Test + public void Given_Request_Is_HTTP_POST_And_Post_Succeeds() throws Exception { + ServletOutputStream outStream = mock(ServletOutputStream.class); + when(response.getOutputStream()).thenReturn(outStream); + when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn("stub_subjectGroup"); + when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.subscription-control; version=1.0"); + JSONObject JSObject = buildRequestJsonObject(); + SubscriptionServlet subscriptionServlet = new SubscriptionServlet() { + protected JSONObject getJSONfromInput(HttpServletRequest req) { + JSONObject jo = new JSONObject(); + jo.put("name", "stub_name"); + jo.put("version", "2.0"); + jo.put("metadataOnly", true); + jo.put("suspend", true); + jo.put("delivery", JSObject); + jo.put("failed", false); + return jo; + } + }; + subscriptionServlet.doPost(request, response); + verify(response).setStatus(eq(HttpServletResponse.SC_ACCEPTED)); + } + + @NotNull + private JSONObject buildRequestJsonObject() { + JSONObject JSObject = new JSONObject(); + JSObject.put("url", "https://stub_address"); + JSObject.put("use100", "true"); + JSObject.put("password", "stub_password"); + JSObject.put("user", "stub_user"); + return JSObject; + } + + private void setUpValidSecurityOnHttpRequest() throws Exception { + when(request.isSecure()).thenReturn(true); + Set<String> authAddressesAndNetworks = new HashSet<String>(); + authAddressesAndNetworks.add(("127.0.0.1")); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authorizedAddressesAndNetworks", authAddressesAndNetworks, true); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "requireCert", false, true); + } + + private void setBehalfHeader(String headerValue) { + when(request.getHeader(BEHALF_HEADER)).thenReturn(headerValue); + } + + private void setValidPathInfoInHttpHeader() { + when(request.getPathInfo()).thenReturn("/123"); + } + + private void setSubscriptionToReturnInvalidSubscriptionIdSupplied() { + PowerMockito.mockStatic(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(null); + } + + private void setSubscriptionToReturnValidSubscriptionForSuppliedId() { + PowerMockito.mockStatic(Subscription.class); + Subscription subscription = mock(Subscription.class); + PowerMockito.when(Subscription.getSubscriptionById(anyInt())).thenReturn(subscription); + when(subscription.getSubscriber()).thenReturn("Stub_Value"); + when(subscription.asJSONObject()).thenReturn(mock(JSONObject.class)); + } + + private void setAuthoriserToReturnRequestNotAuthorized() throws IllegalAccessException { + AuthorizationResponse authResponse = mock(AuthorizationResponse.class); + Authorizer authorizer = mock(Authorizer.class); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true); + when(authorizer.decide(request)).thenReturn(authResponse); + when(authResponse.isAuthorized()).thenReturn(false); + } + + private void setAuthoriserToReturnRequestIsAuthorized() throws IllegalAccessException { + AuthorizationResponse authResponse = mock(AuthorizationResponse.class); + Authorizer authorizer = mock(Authorizer.class); + FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true); + when(authorizer.decide(request)).thenReturn(authResponse); + when(authResponse.isAuthorized()).thenReturn(true); + } + + private void setPokerToNotCreateTimersWhenDeleteSubscriptionIsCalled() throws Exception { + Poker poker = mock(Poker.class); + FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true); + } + + private void setupValidAuthorisedRequest() throws Exception { + setUpValidSecurityOnHttpRequest(); + setBehalfHeader("Stub_Value"); + setValidPathInfoInHttpHeader(); + setSubscriptionToReturnValidSubscriptionForSuppliedId(); + } +}
\ No newline at end of file |