From 0bee9572e6ec78c2d05caf72cb433ed2dcd5342f Mon Sep 17 00:00:00 2001 From: Joze RIHTARSIC <joze.rihtarsic@ext.ec.europa.eu> Date: Wed, 28 Nov 2018 08:21:08 +0100 Subject: [PATCH] - add unit test for keystore - fix application resource attribute smlIntegration --- pom.xml | 2 +- .../edelivery/smp/ui/ApplicationResource.java | 10 +- .../edelivery/smp/ui/DomainResourceTest.java | 1 - .../smp/ui/KeystoreResourceTest.java | 95 ++++++++++++++++-- .../smp-keystore_multiple_domains.jks | Bin 2658 -> 7870 bytes 5 files changed, 95 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 230bba27a..bb4ccab81 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ <project.scm.id>edelivery-scm</project.scm.id> <sonar.host.url>http://edelquality.westeurope.cloudapp.azure.com:9000/sonar/</sonar.host.url> <sonar.exclusions>**/smp/data/model/*,**/smp/data/ui/*, **/smp/ui/exception/*,**/smp/services/ui/filters/*, - **/smp/exceptions/*, **/to_be_removed/* + **/smp/exceptions/*, **/smp/data/ui/enums/*, **/to_be_removed/* </sonar.exclusions> <sonar.language>java</sonar.language> <!-- jacoco remote agent settings start --> diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/ApplicationResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/ApplicationResource.java index 0d79da20d..6d094c76c 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/ApplicationResource.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/ApplicationResource.java @@ -4,7 +4,9 @@ package eu.europa.ec.edelivery.smp.ui; import eu.europa.ec.edelivery.smp.data.ui.ServiceGroupRO; import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; import eu.europa.ec.edelivery.smp.data.ui.SmpInfoRO; +import eu.europa.ec.edelivery.smp.services.SMLIntegrationService; import eu.europa.ec.edelivery.smp.services.ui.UIServiceGroupService; +import eu.europa.ec.edelivery.smp.sml.SmlConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -30,6 +32,9 @@ public class ApplicationResource { @Autowired private Environment env; + @Autowired + SmlConnector smlConnector; + @Value("${smp.artifact.name:eDelivery SMP}") String artifactName; @Value("${smp.artifact.version:}") @@ -37,9 +42,6 @@ public class ApplicationResource { @Value("${smp.artifact.build.time:}") String buildTime; - @Value("${bdmsl.integration.enabled}") - boolean smlIntegrationEnabled; - @RequestMapping(method = RequestMethod.GET, path = "name") public String getName() { @@ -55,7 +57,7 @@ public class ApplicationResource { public SmpInfoRO getApplicationInfo() { SmpInfoRO info = new SmpInfoRO(); info.setVersion(getDisplayVersion()); - info.setSmlIntegrationOn(smlIntegrationEnabled); + info.setSmlIntegrationOn(smlConnector.isSmlIntegrationEnabled()); info.setContextPath(getRootContext()); return info; } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/DomainResourceTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/DomainResourceTest.java index 3c091601d..4e6d99fb8 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/DomainResourceTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/DomainResourceTest.java @@ -64,7 +64,6 @@ public class DomainResourceTest { DomainDao domainDao; private MockMvc mvc; - private static final RequestPostProcessor ADMIN_CREDENTIALS = httpBasic("smp_admin", "test123"); private static final RequestPostProcessor SYSTEM_CREDENTIALS = httpBasic("sys_admin", "test123"); @Before diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/KeystoreResourceTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/KeystoreResourceTest.java index 8e5bdc2da..fae6f0527 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/KeystoreResourceTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/KeystoreResourceTest.java @@ -6,7 +6,9 @@ import eu.europa.ec.edelivery.smp.config.PropertiesTestConfig; import eu.europa.ec.edelivery.smp.config.SmpAppConfig; import eu.europa.ec.edelivery.smp.config.SmpWebAppConfig; import eu.europa.ec.edelivery.smp.config.SpringSecurityConfig; -import eu.europa.ec.edelivery.smp.data.ui.SmpInfoRO; +import eu.europa.ec.edelivery.smp.data.ui.*; +import eu.europa.ec.edelivery.smp.services.ui.UIKeystoreService; +import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,6 +22,7 @@ import org.springframework.test.context.jdbc.SqlConfig; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.RequestPostProcessor; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.ContextLoaderListener; @@ -28,9 +31,18 @@ import org.springframework.web.context.WebApplicationContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; 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.status; @@ -51,16 +63,18 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. "bdmsl.integration.enabled=true"}) public class KeystoreResourceTest { - private static final String PATH = "/ui/rest/application"; + private static final String PATH = "/ui/rest/keystore"; + + Path resourceDirectory = Paths.get("src", "test", "resources", "keystores", "smp-keystore.jks"); @Autowired private WebApplicationContext webAppContext; - - + @Autowired + private UIKeystoreService uiKeystoreService; private MockMvc mvc; - private static final RequestPostProcessor ADMIN_CREDENTIALS = httpBasic("smp_admin", "test123"); + private static final RequestPostProcessor SYSTEM_CREDENTIALS = httpBasic("sys_admin", "test123"); @Before public void setup() { @@ -79,11 +93,78 @@ public class KeystoreResourceTest { } @Test - public void getKeyCertificateList() { + public void getKeyCertificateList() throws Exception { + // given when + int countStart = uiKeystoreService.getKeystoreEntriesList().size(); + MvcResult result = mvc.perform(get(PATH).with(SYSTEM_CREDENTIALS)). + andExpect(status().isOk()).andReturn(); + + //them + ObjectMapper mapper = new ObjectMapper(); + ServiceResult res = mapper.readValue(result.getResponse().getContentAsString(), ServiceResult.class); + + + assertNotNull(res); + assertEquals(countStart, res.getServiceEntities().size()); + res.getServiceEntities().forEach(sgMap -> { + CertificateRO cert = mapper.convertValue(sgMap, CertificateRO.class); + assertNotNull(cert.getAlias()); + assertNotNull(cert.getCertificateId()); + assertNotNull(cert.getBlueCoatHeader()); + assertNull(cert.getEncodedValue()); // submit only metadata + }); + } + + @Test + public void uploadKeystoreFailed() throws Exception { + // given when + MvcResult result = mvc.perform(post(PATH+"/3/upload/JKS/test123") + .with(SYSTEM_CREDENTIALS) + .content("invalid keystore")). + andExpect(status().isOk()).andReturn(); + + //them + ObjectMapper mapper = new ObjectMapper(); + KeystoreImportResult res = mapper.readValue(result.getResponse().getContentAsString(), KeystoreImportResult.class); + + assertNotNull(res); + assertEquals("IOException occurred while reading the keystore: Invalid keystore format", res.getErrorMessage()); + } + + @Test + public void uploadKeystoreInvalidPassword() throws Exception { + + // given when + MvcResult result = mvc.perform(post(PATH+"/3/upload/JKS/NewPassword1234") + .with(SYSTEM_CREDENTIALS) + .content(Files.readAllBytes(resourceDirectory)) ) + .andExpect(status().isOk()).andReturn(); + + //them + ObjectMapper mapper = new ObjectMapper(); + KeystoreImportResult res = mapper.readValue(result.getResponse().getContentAsString(), KeystoreImportResult.class); + + assertNotNull(res); + assertEquals("IOException occurred while reading the keystore: Keystore was tampered with, or password was incorrect", res.getErrorMessage()); } @Test - public void uploadKeystore() { + public void uploadKeystoreOK() throws Exception { + + int countStart = uiKeystoreService.getKeystoreEntriesList().size(); + // given when + MvcResult result = mvc.perform(post(PATH+"/3/upload/JKS/test123") + .with(SYSTEM_CREDENTIALS) + .content(Files.readAllBytes(resourceDirectory)) ) + .andExpect(status().isOk()).andReturn(); + + //them + ObjectMapper mapper = new ObjectMapper(); + KeystoreImportResult res = mapper.readValue(result.getResponse().getContentAsString(), KeystoreImportResult.class); + + assertNotNull(res); + assertNull(res.getErrorMessage()); + assertEquals(countStart+1, uiKeystoreService.getKeystoreEntriesList().size()); } diff --git a/smp-webapp/src/test/resources/keystores/smp-keystore_multiple_domains.jks b/smp-webapp/src/test/resources/keystores/smp-keystore_multiple_domains.jks index 75810c018b1203530f3d02fff46545cf184a71da..716ca6ad4f15ec132c0bc17648b0eafb2cd2ee9f 100644 GIT binary patch delta 2858 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 T<fOZNd-$9-kSAb@Nf`AX;!{Q9 delta 47 zcmdmI`$&Z6-`jt085kItKzJjM3G3!o5k6KC;r-FdcD@1EE@xFKix$*XZZH<L0RV|0 B56l1n -- GitLab