You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by je...@apache.org on 2019/02/05 19:52:57 UTC
[geode] branch develop updated: GEODE-6350: Use MockMvc for testing
RegionManagement integration tests (#3149)
This is an automated email from the ASF dual-hosted git repository.
jensdeppe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push:
new 31d73ed GEODE-6350: Use MockMvc for testing RegionManagement integration tests (#3149)
31d73ed is described below
commit 31d73ed1f0450c37c829d26f67ef68e7cd65f1f5
Author: Jens Deppe <jd...@pivotal.io>
AuthorDate: Tue Feb 5 11:52:36 2019 -0800
GEODE-6350: Use MockMvc for testing RegionManagement integration tests (#3149)
* Moves the tests out of geode-assembly and into geode-web-management
* Introduce commonTest sourceSet which will be used for both integrationTest and distributedTest sources
* Drop .security from some test packages
* Fix the lifecycle integration between Spring and JUnit rules
---
.../internal/RegionManagementIntegrationTest.java | 72 -------------
.../RegionManagementSecurityIntegrationTest.java | 104 ------------------
geode-web-management/build.gradle | 52 +++++++--
.../internal/rest/LocatorCleanupEventListener.java | 40 +++++++
.../LocatorWithSecurityManagerContextLoader.java | 47 +++++++++
.../internal/rest/PlainLocatorContextLoader.java | 51 +++++++++
.../rest/StandardRequestPostProcessor.java | 30 ++++++
.../rest/RegionManagementIntegrationTest.java | 87 ++++++++++++++++
.../RegionManagementSecurityIntegrationTest.java | 116 +++++++++++++++++++++
9 files changed, 416 insertions(+), 183 deletions(-)
diff --git a/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/RegionManagementIntegrationTest.java b/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/RegionManagementIntegrationTest.java
deleted file mode 100644
index 8d0b7f0..0000000
--- a/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/RegionManagementIntegrationTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.geode.management.internal;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-import org.apache.geode.cache.configuration.RegionConfig;
-import org.apache.geode.management.internal.api.ClusterManagementResult;
-import org.apache.geode.test.junit.rules.GeodeDevRestClient;
-import org.apache.geode.test.junit.rules.LocatorStarterRule;
-import org.apache.geode.test.junit.rules.RequiresGeodeHome;
-
-public class RegionManagementIntegrationTest {
-
- @ClassRule
- public static LocatorStarterRule locator =
- new LocatorStarterRule().withHttpService().withAutoStart();
-
- @ClassRule
- public static RequiresGeodeHome requiresGeodeHome = new RequiresGeodeHome();
-
- public static GeodeDevRestClient restClient;
-
- @BeforeClass
- public static void setUpClass() throws Exception {
- restClient =
- new GeodeDevRestClient("/geode-management/v2", "localhost", locator.getHttpPort(), false);
- }
-
- @Test
- public void sanityCheck() throws Exception {
- RegionConfig regionConfig = new RegionConfig();
- regionConfig.setName("customers");
- regionConfig.setType("REPLICATE");
-
- ObjectMapper mapper = new ObjectMapper();
- String json = mapper.writeValueAsString(regionConfig);
-
- ClusterManagementResult result =
- restClient.doPostAndAssert("/regions", json, null, null)
- .hasStatusCode(500)
- .getClusterManagementResult();
- assertThat(result.isSuccessful()).isFalse();
- assertThat(result.isSuccessfullyPersisted()).isFalse();
- assertThat(result.isSuccessfullyAppliedOnMembers()).isFalse();
- assertThat(result.getPersistenceStatus().getMessage())
- .isEqualTo("no members found to create cache element");
- }
-
- @Test
- public void ping() throws Exception {
- restClient.doGetAndAssert("/ping").hasStatusCode(200).hasResponseBody().isEqualTo("pong");
- }
-}
diff --git a/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/RegionManagementSecurityIntegrationTest.java b/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/RegionManagementSecurityIntegrationTest.java
deleted file mode 100644
index 61fc91f..0000000
--- a/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/RegionManagementSecurityIntegrationTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.geode.management.internal;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-import org.apache.geode.cache.configuration.RegionConfig;
-import org.apache.geode.management.internal.api.ClusterManagementResult;
-import org.apache.geode.security.SimpleTestSecurityManager;
-import org.apache.geode.test.junit.rules.GeodeDevRestClient;
-import org.apache.geode.test.junit.rules.LocatorStarterRule;
-import org.apache.geode.test.junit.rules.RequiresGeodeHome;
-
-public class RegionManagementSecurityIntegrationTest {
-
- @ClassRule
- public static LocatorStarterRule locator = new LocatorStarterRule().withHttpService()
- .withSecurityManager(SimpleTestSecurityManager.class).withAutoStart();
-
- @ClassRule
- public static RequiresGeodeHome requiresGeodeHome = new RequiresGeodeHome();
-
- public static GeodeDevRestClient restClient;
-
- @BeforeClass
- public static void setUpClass() {
- restClient =
- new GeodeDevRestClient("/geode-management/v2", "localhost", locator.getHttpPort(), false);
- }
-
- private RegionConfig regionConfig;
- private String json;
-
- @Before
- public void before() throws JsonProcessingException {
- regionConfig = new RegionConfig();
- regionConfig.setName("customers");
- regionConfig.setType("REPLICATE");
- ObjectMapper mapper = new ObjectMapper();
- json = mapper.writeValueAsString(regionConfig);
- }
-
- @Test
- public void sanityCheck_not_authorized() throws Exception {
- ClusterManagementResult result =
- restClient.doPostAndAssert("/regions", json, "user", "user")
- .hasStatusCode(403)
- .getClusterManagementResult();
- assertThat(result.isSuccessful()).isFalse();
- assertThat(result.getPersistenceStatus().getMessage())
- .isEqualTo("user not authorized for DATA:MANAGE");
- }
-
- @Test
- public void sanityCheckWithNoCredentials() throws Exception {
- ClusterManagementResult result =
- restClient.doPostAndAssert("/regions", json, null, null)
- .hasStatusCode(401).getClusterManagementResult();
- assertThat(result.getPersistenceStatus().getMessage())
- .isEqualTo("Full authentication is required to access this resource");
- assertThat(result.isSuccessful()).isFalse();
- }
-
- @Test
- public void sanityCheckWithWrongCredentials() throws Exception {
- ClusterManagementResult result =
- restClient.doPostAndAssert("/regions", json, "test", "invalid_pswd")
- .hasStatusCode(401).getClusterManagementResult();
- assertThat(result.getPersistenceStatus().getMessage())
- .isEqualTo("Authentication error. Please check your credentials.");
- assertThat(result.isSuccessful()).isFalse();
- }
-
- @Test
- public void sanityCheck_success() throws Exception {
- ClusterManagementResult result =
- restClient.doPostAndAssert("/regions", json, "dataManage", "dataManage")
- .hasStatusCode(500)
- .getClusterManagementResult();
- assertThat(result.isSuccessful()).isFalse();
- assertThat(result.getPersistenceStatus().getMessage())
- .isEqualTo("no members found to create cache element");
- }
-}
diff --git a/geode-web-management/build.gradle b/geode-web-management/build.gradle
index 3b55c61..f3868c8 100644
--- a/geode-web-management/build.gradle
+++ b/geode-web-management/build.gradle
@@ -18,9 +18,26 @@ apply plugin: 'war'
apply from: "${project.projectDir}/../gradle/geode-dependency-management.gradle"
apply from: "${project.projectDir}/../gradle/publish.gradle"
+configurations {
+ commonTestCompile
+}
-dependencies {
+sourceSets {
+ integrationTest {
+ resources {
+ srcDir "${projectDir}/src/main/webapp"
+ }
+ }
+ commonTest {
+ java {
+ srcDir "${projectDir}/src/commonTest/java"
+ }
+ compileClasspath = configurations.commonTestCompile
+ }
+}
+
+dependencies {
compileOnly(project(':geode-core'))
compileOnly('javax.servlet:javax.servlet-api')
@@ -62,6 +79,15 @@ dependencies {
exclude module: 'spring-beans'
}
+ commonTestCompile(project(':geode-core'))
+ commonTestCompile(project(':geode-junit')) {
+ exclude module: 'geode-core'
+ }
+ commonTestCompile(project(':geode-dunit')) {
+ exclude module: 'geode-core'
+ }
+ commonTestCompile('org.springframework:spring-test')
+ commonTestCompile('org.springframework:spring-webmvc')
testCompile(project(':geode-junit')) {
exclude module: 'geode-core'
@@ -69,7 +95,11 @@ dependencies {
testCompile(project(':geode-core'))
testCompile('javax.servlet:javax.servlet-api')
+ integrationTestCompile(sourceSets.commonTest.output)
+
+ integrationTestCompile(project(':geode-core'))
integrationTestCompile('org.springframework:spring-test')
+ integrationTestCompile('org.springframework:spring-webmvc')
integrationTestCompile('org.springframework.security:spring-security-test')
integrationTestCompile(project(':geode-junit')) {
@@ -78,13 +108,21 @@ dependencies {
integrationTestCompile(project(':geode-dunit')) {
exclude module: 'geode-core'
}
-}
+ integrationTestRuntimeOnly('org.apache.logging.log4j:log4j-slf4j-impl') {
+ exclude module: 'slf4j-api'
+ }
+
+ distributedTestCompile(sourceSets.commonTest.output)
+
+ distributedTestCompile('org.springframework:spring-test')
+ distributedTestCompile('org.springframework:spring-webmvc')
+ distributedTestCompile('org.springframework.security:spring-security-test')
-sourceSets {
- integrationTest {
- resources {
- srcDir "${projectDir}/src/main/webapp"
- }
+ distributedTestCompile(project(':geode-junit')) {
+ exclude module: 'geode-core'
+ }
+ distributedTestCompile(project(':geode-dunit')) {
+ exclude module: 'geode-core'
}
}
diff --git a/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/LocatorCleanupEventListener.java b/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/LocatorCleanupEventListener.java
new file mode 100644
index 0000000..d7af991
--- /dev/null
+++ b/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/LocatorCleanupEventListener.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.rest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.WebApplicationContext;
+
+import org.apache.geode.test.junit.rules.LocatorStarterRule;
+
+@Component
+public class LocatorCleanupEventListener {
+
+ @Autowired
+ private WebApplicationContext webApplicationContext;
+
+ @EventListener
+ public void handleContextCloseEvent(ContextClosedEvent closedEvent) {
+ LocatorStarterRule locator =
+ (LocatorStarterRule) webApplicationContext.getServletContext().getAttribute("locator");
+ if (locator != null) {
+ locator.after();
+ }
+ }
+}
diff --git a/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/LocatorWithSecurityManagerContextLoader.java b/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/LocatorWithSecurityManagerContextLoader.java
new file mode 100644
index 0000000..4f03a2a
--- /dev/null
+++ b/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/LocatorWithSecurityManagerContextLoader.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.rest;
+
+import org.springframework.test.context.web.GenericXmlWebContextLoader;
+import org.springframework.test.context.web.WebMergedContextConfiguration;
+import org.springframework.web.context.support.GenericWebApplicationContext;
+
+import org.apache.geode.internal.cache.HttpService;
+import org.apache.geode.security.SimpleTestSecurityManager;
+import org.apache.geode.test.junit.rules.LocatorStarterRule;
+
+class LocatorWithSecurityManagerContextLoader extends GenericXmlWebContextLoader {
+
+ private LocatorStarterRule locator = new LocatorStarterRule()
+ .withSecurityManager(SimpleTestSecurityManager.class)
+ .withAutoStart();
+
+ @Override
+ protected void loadBeanDefinitions(GenericWebApplicationContext context,
+ WebMergedContextConfiguration webMergedConfig) {
+
+ locator.before();
+
+ super.loadBeanDefinitions(context, webMergedConfig);
+ context.getServletContext().setAttribute(HttpService.SECURITY_SERVICE_SERVLET_CONTEXT_PARAM,
+ locator.getCache().getSecurityService());
+ context.getServletContext().setAttribute(HttpService.CLUSTER_MANAGEMENT_SERVICE_CONTEXT_PARAM,
+ locator.getLocator().getClusterManagementService());
+
+ context.getServletContext().setAttribute("locator", locator);
+ }
+
+}
diff --git a/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/PlainLocatorContextLoader.java b/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/PlainLocatorContextLoader.java
new file mode 100644
index 0000000..e2a28b7
--- /dev/null
+++ b/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/PlainLocatorContextLoader.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.rest;
+
+import org.springframework.test.context.web.GenericXmlWebContextLoader;
+import org.springframework.test.context.web.WebMergedContextConfiguration;
+import org.springframework.web.context.support.GenericWebApplicationContext;
+
+import org.apache.geode.internal.cache.HttpService;
+import org.apache.geode.test.junit.rules.LocatorStarterRule;
+
+/**
+ * This is quite horrible. In particular we're trying to link the lifecycle of the
+ * LocatorStarterRule and Spring's application context. The locator is injected into the
+ * ServletContext so that it can be retrieved and cleaned up in the LocatorCleanupEventListener.
+ * There has to be a better way...
+ */
+class PlainLocatorContextLoader extends GenericXmlWebContextLoader {
+
+ private LocatorStarterRule locator = new LocatorStarterRule()
+ .withAutoStart();
+
+ @Override
+ protected void loadBeanDefinitions(GenericWebApplicationContext context,
+ WebMergedContextConfiguration webMergedConfig) {
+
+ locator.before();
+
+ super.loadBeanDefinitions(context, webMergedConfig);
+ context.getServletContext().setAttribute(HttpService.SECURITY_SERVICE_SERVLET_CONTEXT_PARAM,
+ locator.getCache().getSecurityService());
+ context.getServletContext().setAttribute(HttpService.CLUSTER_MANAGEMENT_SERVICE_CONTEXT_PARAM,
+ locator.getLocator().getClusterManagementService());
+
+ context.getServletContext().setAttribute("locator", locator);
+ }
+
+}
diff --git a/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/StandardRequestPostProcessor.java b/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/StandardRequestPostProcessor.java
new file mode 100644
index 0000000..92a3d5f
--- /dev/null
+++ b/geode-web-management/src/commonTest/java/org/apache/geode/management/internal/rest/StandardRequestPostProcessor.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.rest;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.test.web.servlet.request.RequestPostProcessor;
+
+class StandardRequestPostProcessor implements RequestPostProcessor {
+ @Override
+ public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) {
+ request.addHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
+ request.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
+ return request;
+ }
+}
diff --git a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementIntegrationTest.java b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementIntegrationTest.java
new file mode 100644
index 0000000..afca659
--- /dev/null
+++ b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementIntegrationTest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.rest;
+
+import static org.hamcrest.Matchers.is;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.RequestPostProcessor;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import org.apache.geode.cache.configuration.RegionConfig;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(locations = {"classpath*:WEB-INF/geode-management-servlet.xml"},
+ loader = PlainLocatorContextLoader.class)
+@WebAppConfiguration
+public class RegionManagementIntegrationTest {
+
+ static RequestPostProcessor POST_PROCESSOR =
+ new StandardRequestPostProcessor();
+
+ @Autowired
+ private WebApplicationContext webApplicationContext;
+
+ private MockMvc mockMvc;
+
+ @Before
+ public void before() {
+ mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
+ .build();
+ }
+
+ @Test
+ @WithMockUser
+ public void sanityCheck() throws Exception {
+ RegionConfig regionConfig = new RegionConfig();
+ regionConfig.setName("customers");
+ regionConfig.setType("REPLICATE");
+
+ ObjectMapper mapper = new ObjectMapper();
+ String json = mapper.writeValueAsString(regionConfig);
+
+ mockMvc.perform(post("/v2/regions")
+ .with(POST_PROCESSOR)
+ .content(json))
+ .andExpect(status().isInternalServerError())
+ .andExpect(jsonPath("$.persistenceStatus.status", is("FAILURE")))
+ .andExpect(jsonPath("$.persistenceStatus.message",
+ is("no members found to create cache element")));
+ }
+
+ @Test
+ @WithMockUser
+ public void ping() throws Exception {
+ mockMvc.perform(get("/v2/ping")
+ .with(POST_PROCESSOR))
+ .andExpect(content().string("pong"));
+ }
+}
diff --git a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementSecurityIntegrationTest.java b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementSecurityIntegrationTest.java
new file mode 100644
index 0000000..5516254
--- /dev/null
+++ b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementSecurityIntegrationTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.rest;
+
+import static org.hamcrest.Matchers.is;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
+import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.RequestPostProcessor;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import org.apache.geode.cache.configuration.RegionConfig;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(locations = {"classpath*:WEB-INF/geode-management-servlet.xml"},
+ loader = LocatorWithSecurityManagerContextLoader.class)
+@WebAppConfiguration
+public class RegionManagementSecurityIntegrationTest {
+
+ static RequestPostProcessor POST_PROCESSOR =
+ new StandardRequestPostProcessor();
+
+ @Autowired
+ private WebApplicationContext webApplicationContext;
+
+ private RegionConfig regionConfig;
+ private String json;
+ private MockMvc mockMvc;
+
+ @Before
+ public void before() throws JsonProcessingException {
+ regionConfig = new RegionConfig();
+ regionConfig.setName("customers");
+ regionConfig.setType("REPLICATE");
+ ObjectMapper mapper = new ObjectMapper();
+ json = mapper.writeValueAsString(regionConfig);
+ mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
+ .apply(springSecurity())
+ .build();
+ }
+
+ @Test
+ public void sanityCheck_not_authorized() throws Exception {
+ mockMvc.perform(post("/v2/regions")
+ .with(httpBasic("user", "user"))
+ .with(POST_PROCESSOR)
+ .content(json))
+ .andExpect(status().isForbidden())
+ .andExpect(jsonPath("$.persistenceStatus.status", is("FAILURE")))
+ .andExpect(jsonPath("$.persistenceStatus.message",
+ is("user not authorized for DATA:MANAGE")));
+ }
+
+ @Test
+ public void sanityCheckWithNoCredentials() throws Exception {
+ mockMvc.perform(post("/v2/regions")
+ .with(POST_PROCESSOR)
+ .content(json))
+ .andExpect(status().isUnauthorized())
+ .andExpect(jsonPath("$.persistenceStatus.status", is("FAILURE")))
+ .andExpect(jsonPath("$.persistenceStatus.message",
+ is("Full authentication is required to access this resource")));
+ }
+
+ @Test
+ public void sanityCheckWithWrongCredentials() throws Exception {
+ mockMvc.perform(post("/v2/regions")
+ .with(httpBasic("user", "wrong_password"))
+ .with(POST_PROCESSOR)
+ .content(json))
+ .andExpect(status().isUnauthorized())
+ .andExpect(jsonPath("$.persistenceStatus.status", is("FAILURE")))
+ .andExpect(jsonPath("$.persistenceStatus.message",
+ is("Authentication error. Please check your credentials.")));
+ }
+
+ @Test
+ public void sanityCheck_success() throws Exception {
+ mockMvc.perform(post("/v2/regions")
+ .with(httpBasic("dataManage", "dataManage"))
+ .with(POST_PROCESSOR)
+ .content(json))
+ .andExpect(status().isInternalServerError())
+ .andExpect(jsonPath("$.persistenceStatus.status", is("FAILURE")))
+ .andExpect(jsonPath("$.persistenceStatus.message",
+ is("no members found to create cache element")));
+ }
+
+}