Fix reload endpoint to return status
authorawudzins <adam.wudzinski@nokia.com>
Tue, 3 Mar 2020 13:51:21 +0000 (14:51 +0100)
committerawudzins <adam.wudzinski@nokia.com>
Wed, 4 Mar 2020 12:44:52 +0000 (13:44 +0100)
Signed-off-by: Adam Wudzinski <adam.wudzinski@nokia.com>
Issue-ID: AAF-997
wChange-Id: I4563428ef407b4dc8c84c3efc8ec213145806b32
Change-Id: Iee33a26feb5cc1acd39d91ee9f34a49183040e06

17 files changed:
certService/src/main/java/org/onap/aaf/certservice/api/CertificationController.java [moved from certService/src/main/java/org/onap/aaf/certservice/api/CertificationService.java with 95% similarity]
certService/src/main/java/org/onap/aaf/certservice/api/ReloadConfigController.java [new file with mode: 0644]
certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfig.java
certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoader.java
certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoadingException.java [new file with mode: 0644]
certService/src/main/java/org/onap/aaf/certservice/certification/configuration/model/Authentication.java
certService/src/main/java/org/onap/aaf/certservice/certification/configuration/model/Cmpv2Server.java
certService/src/main/resources/application.properties
certService/src/test/java/org/onap/aaf/certservice/api/CertificationControllerTest.java [moved from certService/src/test/java/org/onap/aaf/certservice/api/CertificationServiceTest.java with 91% similarity]
certService/src/test/java/org/onap/aaf/certservice/api/ReloadConfigControllerTest.java [new file with mode: 0644]
certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoaderTest.java
certService/src/test/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigTest.java
certService/src/test/java/org/onap/aaf/certservice/certification/configuration/validation/Cmpv2ServerConfigurationValidatorTest.java
certService/src/test/java/org/onap/aaf/certservice/certification/configuration/validation/constraints/Cmpv2URLValidatorTest.java
certService/src/test/java/org/onap/aaf/certservice/certification/configuration/validation/constraints/violations/PortNumberViolationTest.java
certService/src/test/java/org/onap/aaf/certservice/certification/configuration/validation/constraints/violations/RequestTypeViolationTest.java
certService/src/test/resources/invalidCmpServers.json [new file with mode: 0644]

@@ -39,15 +39,15 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 @RestController
-public class CertificationService {
+public class CertificationController {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(CertificationService.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(CertificationController.class);
 
     private final CsrModelFactory csrModelFactory;
     private final CertificationModelFactory certificationModelFactory;
 
     @Autowired
-    CertificationService(CsrModelFactory csrModelFactory, CertificationModelFactory certificationModelFactory) {
+    CertificationController(CsrModelFactory csrModelFactory, CertificationModelFactory certificationModelFactory) {
         this.csrModelFactory = csrModelFactory;
         this.certificationModelFactory = certificationModelFactory;
     }
@@ -81,5 +81,4 @@ public class CertificationService {
 
     }
 
-
 }
diff --git a/certService/src/main/java/org/onap/aaf/certservice/api/ReloadConfigController.java b/certService/src/main/java/org/onap/aaf/certservice/api/ReloadConfigController.java
new file mode 100644 (file)
index 0000000..5390a00
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. 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=========================================================
+ */
+
+package org.onap.aaf.certservice.api;
+
+import org.onap.aaf.certservice.certification.configuration.CmpServersConfig;
+import org.onap.aaf.certservice.certification.configuration.CmpServersConfigLoadingException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class ReloadConfigController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ReloadConfigController.class);
+
+    private final CmpServersConfig cmpServersConfig;
+
+    @Autowired
+    public ReloadConfigController(CmpServersConfig cmpServersConfig) {
+        this.cmpServersConfig = cmpServersConfig;
+    }
+
+    @GetMapping("/reload")
+    public ResponseEntity<String> reloadConfiguration() throws CmpServersConfigLoadingException {
+        cmpServersConfig.reloadConfiguration();
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+
+    @ExceptionHandler(value = CmpServersConfigLoadingException.class)
+    public ResponseEntity<String> handle(CmpServersConfigLoadingException exception) {
+        LOGGER.error(exception.getMessage(), exception.getCause());
+        return new ResponseEntity<>(exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
+    }
+
+}
index 25e6925..a304b5a 100644 (file)
 
 package org.onap.aaf.certservice.certification.configuration;
 
+import java.io.File;
+import java.util.Collections;
+import java.util.List;
+import javax.annotation.PostConstruct;
 import org.onap.aaf.certservice.certification.configuration.model.Cmpv2Server;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.cloud.context.config.annotation.RefreshScope;
-import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent;
 import org.springframework.context.annotation.Configuration;
 
-import javax.annotation.PostConstruct;
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-import org.springframework.context.event.EventListener;
-
 @Configuration
 public class CmpServersConfig {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CmpServersConfig.class);
+    private static final String LOADING_SUCCESS_MESSAGE = "CMP Servers configuration successfully loaded from file {}";
     private static final String CMP_SERVERS_CONFIG_FILENAME = "cmpServers.json";
+    private static final String INIT_CONFIGURATION = "Loading initial configuration";
     private static final String REFRESHING_CONFIGURATION = "Refreshing configuration";
 
-    private String configPath;
-    private List<Cmpv2Server> cmpServers;
+    private final String configPath;
     private final CmpServersConfigLoader cmpServersConfigLoader;
 
+    private List<Cmpv2Server> cmpServers;
+
     @Autowired
     public CmpServersConfig(@Value("${app.config.path}") String configPath,
                             CmpServersConfigLoader cmpServersConfigLoader) {
@@ -56,18 +53,28 @@ public class CmpServersConfig {
     }
 
     @PostConstruct
-    void loadConfiguration() {
-        String configFilePath = configPath + File.separator + CMP_SERVERS_CONFIG_FILENAME;
-        this.cmpServers = Collections.unmodifiableList(cmpServersConfigLoader.load(configFilePath));
+    void init() {
+        LOGGER.info(INIT_CONFIGURATION);
+        try {
+            loadConfiguration();
+        } catch (CmpServersConfigLoadingException e) {
+            LOGGER.error(e.getMessage(), e.getCause());
+        }
     }
 
-    @EventListener
-    public void onRefreshScope(final RefreshScopeRefreshedEvent event) {
+    public void reloadConfiguration() throws CmpServersConfigLoadingException {
         LOGGER.info(REFRESHING_CONFIGURATION);
         loadConfiguration();
     }
 
+    void loadConfiguration() throws CmpServersConfigLoadingException {
+        String configFilePath = configPath + File.separator + CMP_SERVERS_CONFIG_FILENAME;
+        this.cmpServers = Collections.unmodifiableList(cmpServersConfigLoader.load(configFilePath));
+        LOGGER.info(LOADING_SUCCESS_MESSAGE, configFilePath);
+    }
+
     public List<Cmpv2Server> getCmpServers() {
         return cmpServers;
     }
+
 }
index 9453010..1072d63 100644 (file)
@@ -24,20 +24,18 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.File;
 import java.io.IOException;
 import java.security.InvalidParameterException;
-import java.util.ArrayList;
 import java.util.List;
 import org.onap.aaf.certservice.certification.configuration.model.CmpServers;
 import org.onap.aaf.certservice.certification.configuration.model.Cmpv2Server;
 import org.onap.aaf.certservice.certification.configuration.validation.Cmpv2ServerConfigurationValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 class CmpServersConfigLoader {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(CmpServersConfigLoader.class);
+    private static final String LOADING_EXCEPTION_MESSAGE = "Exception occurred during CMP Servers configuration loading";
+    private static final String VALIDATION_EXCEPTION_MESSAGE = "Validation of CMPv2 servers configuration failed";
 
     private final Cmpv2ServerConfigurationValidator validator;
 
@@ -46,19 +44,16 @@ class CmpServersConfigLoader {
         this.validator = validator;
     }
 
-    List<Cmpv2Server> load(String path) {
-        List<Cmpv2Server> servers = new ArrayList<>();
+    List<Cmpv2Server> load(String path) throws CmpServersConfigLoadingException {
         try {
-            servers = loadConfigFromFile(path).getCmpv2Servers();
+            List<Cmpv2Server> servers = loadConfigFromFile(path).getCmpv2Servers();
             servers.forEach(validator::validate);
-            LOGGER.info("CMP Servers configuration successfully loaded from file {}", path);
+            return servers;
         } catch (IOException e) {
-            LOGGER.error("Exception occurred during CMP Servers configuration loading: ", e);
+            throw new CmpServersConfigLoadingException(LOADING_EXCEPTION_MESSAGE, e);
         } catch (InvalidParameterException e) {
-            LOGGER.error("Validation of CMPv2 servers configuration failed:", e);
+            throw new CmpServersConfigLoadingException(VALIDATION_EXCEPTION_MESSAGE, e);
         }
-
-        return servers;
     }
 
     private CmpServers loadConfigFromFile(String path) throws IOException {
diff --git a/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoadingException.java b/certService/src/main/java/org/onap/aaf/certservice/certification/configuration/CmpServersConfigLoadingException.java
new file mode 100644 (file)
index 0000000..b7c3638
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. 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=========================================================
+ */
+
+package org.onap.aaf.certservice.certification.configuration;
+
+public class CmpServersConfigLoadingException extends Exception {
+
+    public CmpServersConfigLoadingException(String message) {
+        super(message);
+    }
+
+    public CmpServersConfigLoadingException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
index af254d6..3785cf8 100644 (file)
 
 package org.onap.aaf.certservice.certification.configuration.model;
 
+import javax.validation.constraints.NotNull;
 import org.hibernate.validator.constraints.Length;
 
 public class Authentication {
 
+    @NotNull
     @Length(min = 1, max = 256)
     private String iak;
+    @NotNull
     @Length(min = 1, max = 256)
     private String rv;
 
index 9f8f979..20b83b8 100644 (file)
 
 package org.onap.aaf.certservice.certification.configuration.model;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
 import org.bouncycastle.asn1.x500.X500Name;
 import org.hibernate.validator.constraints.Length;
 import org.onap.aaf.certservice.certification.configuration.validation.constraints.Cmpv2URL;
 
-import javax.validation.Valid;
-
 public class Cmpv2Server {
 
+    @NotNull
     @Valid
     private Authentication authentication;
+    @NotNull
     private CaMode caMode;
+    @NotNull
     @Length(min = 1, max = 128)
     private String caName;
+    @NotNull
     private X500Name issuerDN;
     @Cmpv2URL
     private String url;
index ac81c3a..aac9b96 100644 (file)
@@ -3,7 +3,7 @@ springdoc.show-actuator=true
 
 management.endpoints.enabled-by-default=true
 management.endpoint.configprops.enabled=true
-management.endpoints.web.exposure.include=refresh,health
+management.endpoints.web.exposure.include=health
 
 
 # Swagger configuration
 
 package org.onap.aaf.certservice.api;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import com.google.gson.Gson;
+import java.io.IOException;
+import java.util.Arrays;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.onap.aaf.certservice.certification.CertificationModelFactory;
 import org.onap.aaf.certservice.certification.CsrModelFactory;
 import org.onap.aaf.certservice.certification.CsrModelFactory.StringBase64;
@@ -36,20 +46,11 @@ import org.onap.aaf.certservice.certification.model.CsrModel;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 
-import java.io.IOException;
-import java.util.Arrays;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 
-class CertificationServiceTest {
+@ExtendWith(MockitoExtension.class)
+class CertificationControllerTest {
 
-    private CertificationService certificationService;
+    private CertificationController certificationController;
 
     @Mock
     private CsrModelFactory csrModelFactory;
@@ -58,9 +59,8 @@ class CertificationServiceTest {
     private CertificationModelFactory certificationModelFactory;
 
     @BeforeEach
-    void serUp() {
-        MockitoAnnotations.initMocks(this);
-        certificationService = new CertificationService(csrModelFactory, certificationModelFactory);
+    void setUp() {
+        certificationController = new CertificationController(csrModelFactory, certificationModelFactory);
     }
 
     @Test
@@ -81,7 +81,7 @@ class CertificationServiceTest {
 
         // when
         ResponseEntity<String> testResponse =
-                certificationService.signCertificate(testCaName, "encryptedCSR", "encryptedPK");
+                certificationController.signCertificate(testCaName, "encryptedCSR", "encryptedPK");
 
         CertificationModel responseCertificationModel = new Gson().fromJson(testResponse.getBody(), CertificationModel.class);
 
@@ -101,7 +101,7 @@ class CertificationServiceTest {
 
         // when
         Exception exception = assertThrows(
-                CsrDecryptionException.class, () -> certificationService.
+                CsrDecryptionException.class, () -> certificationController.
                         signCertificate("TestCa", "encryptedCSR", "encryptedPK")
         );
 
@@ -120,7 +120,7 @@ class CertificationServiceTest {
 
         // when
         Exception exception = assertThrows(
-                KeyDecryptionException.class, () -> certificationService.
+                KeyDecryptionException.class, () -> certificationController.
                         signCertificate("TestCa", "encryptedCSR", "encryptedPK")
         );
 
diff --git a/certService/src/test/java/org/onap/aaf/certservice/api/ReloadConfigControllerTest.java b/certService/src/test/java/org/onap/aaf/certservice/api/ReloadConfigControllerTest.java
new file mode 100644 (file)
index 0000000..17db24b
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. 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=========================================================
+ */
+
+package org.onap.aaf.certservice.api;
+
+import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.doThrow;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.onap.aaf.certservice.certification.configuration.CmpServersConfig;
+import org.onap.aaf.certservice.certification.configuration.CmpServersConfigLoadingException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+@ExtendWith(MockitoExtension.class)
+public class ReloadConfigControllerTest {
+
+    private static final String ERROR_MESSAGE = "Exception occurred during CMP Servers configuration loading";
+
+    private ReloadConfigController reloadConfigController;
+
+    @Mock
+    public CmpServersConfig cmpServersConfig;
+
+    @BeforeEach
+    public void setUp() {
+        this.reloadConfigController = new ReloadConfigController(cmpServersConfig);
+    }
+
+    @Test
+    public void shouldReturnStatusOkWhenSuccessfullyReloaded() throws CmpServersConfigLoadingException {
+        // When
+        ResponseEntity<String> response = reloadConfigController.reloadConfiguration();
+
+        // Then
+        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+    }
+
+    @Test
+    public void shouldRethrowSameErrorWhenFailedToReload() throws CmpServersConfigLoadingException {
+        // Given
+        doThrow(new CmpServersConfigLoadingException(ERROR_MESSAGE)).when(cmpServersConfig).reloadConfiguration();
+
+        // When
+        Exception exception = assertThrows(
+            CmpServersConfigLoadingException.class,
+            () -> reloadConfigController.reloadConfiguration());
+
+        // Then
+        Assertions.assertThat(exception.getMessage()).isEqualTo(ERROR_MESSAGE);
+    }
+
+    @Test
+    void shouldReturnErrorStatusAndMessageWhenExceptionOccurred() {
+        // Given
+        CmpServersConfigLoadingException exception = new CmpServersConfigLoadingException(ERROR_MESSAGE);
+
+        // When
+        ResponseEntity<String> response = reloadConfigController.handle(exception);
+
+        // Then
+        assertEquals(ERROR_MESSAGE, response.getBody());
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+    }
+}
index d14dc7b..c78f6ce 100644 (file)
 
 package org.onap.aaf.certservice.certification.configuration;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.List;
+import java.util.Map;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.onap.aaf.certservice.CertServiceApplication;
 import org.onap.aaf.certservice.certification.configuration.model.Cmpv2Server;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.PropertySource;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
 @ExtendWith(SpringExtension.class)
 @ContextConfiguration(classes = CertServiceApplication.class)
 class CmpServersConfigLoaderTest {
     private static final String EXISTING_CONFIG_FILENAME = "cmpServers.json";
-    private static final String NONEXISTING_CONFIG_FILENAME = "nonExisting_cmpServers.json";
+    private static final String INVALID_CONFIG_FILENAME = "invalidCmpServers.json";
+    private static final String NONEXISTENT_CONFIG_FILENAME = "nonExisting_cmpServers.json";
+
     private static final Map<String, String> EXPECTED_FIRST_CMP_SERVER = Map.of(
             "CA_NAME", "TEST",
             "URL", "http://127.0.0.1/ejbca/publicweb/cmp/cmp",
@@ -61,9 +61,9 @@ class CmpServersConfigLoaderTest {
     private CmpServersConfigLoader configLoader;
 
     @Test
-    void shouldLoadCmpServersConfigWhenFileAvailable() {
+    void shouldLoadCmpServersConfigWhenFileAvailable() throws CmpServersConfigLoadingException {
         // Given
-        String path = getClass().getClassLoader().getResource(EXISTING_CONFIG_FILENAME).getFile();
+        String path = getResourcePath(EXISTING_CONFIG_FILENAME);
 
         // When
         List<Cmpv2Server> cmpServers = configLoader.load(path);
@@ -76,13 +76,32 @@ class CmpServersConfigLoaderTest {
     }
 
     @Test
-    void shouldReturnEmptyListWhenFileMissing() {
+    void shouldThrowExceptionWhenFileMissing() {
         // When
-        List<Cmpv2Server> cmpServers = configLoader.load(NONEXISTING_CONFIG_FILENAME);
+        Exception exception = assertThrows(
+            CmpServersConfigLoadingException.class,
+            () -> configLoader.load(NONEXISTENT_CONFIG_FILENAME));
 
         // Then
-        assertThat(cmpServers).isNotNull();
-        assertThat(cmpServers).isEmpty();
+        assertThat(exception.getMessage()).contains("Exception occurred during CMP Servers configuration loading");
+    }
+
+    @Test
+    void shouldThrowExceptionWhenConfigurationIsInvalid() {
+        // Given
+        String path = getResourcePath(INVALID_CONFIG_FILENAME);
+
+        // When
+        Exception exception = assertThrows(
+            CmpServersConfigLoadingException.class,
+            () -> configLoader.load(path));
+
+        // Then
+        assertThat(exception.getMessage()).contains("Validation of CMPv2 servers configuration failed");
+    }
+
+    private String getResourcePath(String invalidConfigFilename) {
+        return getClass().getClassLoader().getResource(invalidConfigFilename).getFile();
     }
 
     private void verifyThatCmpServerEquals(Cmpv2Server cmpv2Server, Map<String, String> expected) {
index 7184384..5d850fe 100644 (file)
 
 package org.onap.aaf.certservice.certification.configuration;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.startsWith;
+
+import java.util.List;
 import org.bouncycastle.asn1.x500.X500Name;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -30,19 +36,12 @@ import org.mockito.junit.jupiter.MockitoExtension;
 import org.onap.aaf.certservice.certification.configuration.model.Authentication;
 import org.onap.aaf.certservice.certification.configuration.model.CaMode;
 import org.onap.aaf.certservice.certification.configuration.model.Cmpv2Server;
-import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent;
-
-import java.util.List;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.startsWith;
 
 @ExtendWith(MockitoExtension.class)
 class CmpServersConfigTest {
 
+    private static final String ERROR_MESSAGE = "Exception occurred during CMP Servers configuration loading";
     private static final String APP_CONFIG_PATH = "/fake/path/to/config";
-
     private static final List<Cmpv2Server> SAMPLE_CMP_SERVERS = generateTestConfiguration();
 
     @Mock
@@ -56,16 +55,19 @@ class CmpServersConfigTest {
     }
 
     @Test
-    void shouldCallLoaderWithPathFromPropertiesWhenCreated() {
-        this.cmpServersConfig.loadConfiguration();      // Manual PostConstruct call
+    void shouldCallLoaderWithPathFromPropertiesWhenCreated() throws CmpServersConfigLoadingException {
+        // When
+        this.cmpServersConfig.init();      // Manual PostConstruct call
+
+        // Then
         Mockito.verify(cmpServersConfigLoader).load(startsWith(APP_CONFIG_PATH));
     }
 
     @Test
-    void shouldReturnLoadedServersWhenGetCalled() {
+    void shouldReturnLoadedServersWhenGetCalled() throws CmpServersConfigLoadingException {
         // Given
         Mockito.when(cmpServersConfigLoader.load(any())).thenReturn(SAMPLE_CMP_SERVERS);
-        this.cmpServersConfig.loadConfiguration();      // Manual PostConstruct call
+        this.cmpServersConfig.init();      // Manual PostConstruct call
 
         // When
         List<Cmpv2Server> receivedCmpServers = this.cmpServersConfig.getCmpServers();
@@ -75,16 +77,14 @@ class CmpServersConfigTest {
     }
 
     @Test
-    void shouldReturnLoadedServersAfterRefreshWhenGetCalled() {
+    void shouldReturnLoadedServersAfterReloadWhenGetCalled() throws CmpServersConfigLoadingException {
         // Given
         Mockito.when(cmpServersConfigLoader.load(any())).thenReturn(SAMPLE_CMP_SERVERS);
-
         List<Cmpv2Server> receivedCmpServers = this.cmpServersConfig.getCmpServers();
         assertThat(receivedCmpServers).isNull();
 
-        this.cmpServersConfig.onRefreshScope(new RefreshScopeRefreshedEvent());
-
         // When
+        this.cmpServersConfig.reloadConfiguration();
         receivedCmpServers = this.cmpServersConfig.getCmpServers();
 
         // Then
@@ -92,20 +92,71 @@ class CmpServersConfigTest {
     }
 
     @Test
-    void shouldNotReturnIakAndRvWhenToStringMethodIsUsed() {
+    void shouldRethrowExceptionWhenReloaded() throws CmpServersConfigLoadingException {
+        // Given
+        Mockito.when(cmpServersConfigLoader.load(any())).thenThrow(new CmpServersConfigLoadingException(
+            ERROR_MESSAGE));
+
+        // Then
+        assertThrows(
+            CmpServersConfigLoadingException.class,
+            () -> cmpServersConfig.reloadConfiguration());
+    }
+
+    @Test
+    void shouldPassMessageToRethrownErrorWhenReloadingFails() throws CmpServersConfigLoadingException {
+        // Given
+        Mockito.when(cmpServersConfigLoader.load(any())).thenThrow(new CmpServersConfigLoadingException(ERROR_MESSAGE));
+
+        // When
+        Exception exception = assertThrows(
+            CmpServersConfigLoadingException.class,
+            () -> cmpServersConfig.reloadConfiguration());
+
+        // Then
+        assertThat(exception.getMessage()).isEqualTo(ERROR_MESSAGE);
+    }
+
+    @Test
+    void shouldNotReturnIakAndRvWhenToStringMethodIsUsed() throws CmpServersConfigLoadingException {
         // Given
         Mockito.when(cmpServersConfigLoader.load(any())).thenReturn(SAMPLE_CMP_SERVERS);
-        this.cmpServersConfig.loadConfiguration();      // Manual PostConstruct call
+        this.cmpServersConfig.init();      // Manual PostConstruct call
 
         // When
         List<Cmpv2Server> receivedCmpServers = this.cmpServersConfig.getCmpServers();
 
         // Then
-        receivedCmpServers.forEach((server)-> assertThat(server.toString())
-                .doesNotContain(
-                        server.getAuthentication().getIak(),
-                        server.getAuthentication().getRv()
-                ));
+        receivedCmpServers.forEach((server) -> assertThat(server.toString())
+            .doesNotContain(
+                server.getAuthentication().getIak(),
+                server.getAuthentication().getRv()
+            ));
+    }
+
+    @Test
+    void shouldRethrowErrorWhenLoadingFails() throws CmpServersConfigLoadingException {
+        // Given
+        Mockito.when(cmpServersConfigLoader.load(any())).thenThrow(new CmpServersConfigLoadingException(ERROR_MESSAGE));
+
+        // Then
+        assertThrows(
+            CmpServersConfigLoadingException.class,
+            () -> cmpServersConfig.loadConfiguration());
+    }
+
+    @Test
+    void shouldPassMessageToRethrownErrorWhenLoadingFails() throws CmpServersConfigLoadingException {
+        // Given
+        Mockito.when(cmpServersConfigLoader.load(any())).thenThrow(new CmpServersConfigLoadingException(ERROR_MESSAGE));
+
+        // When
+        Exception exception = assertThrows(
+            CmpServersConfigLoadingException.class,
+            () -> cmpServersConfig.loadConfiguration());
+
+        // Then
+        assertThat(exception.getMessage()).isEqualTo(ERROR_MESSAGE);
     }
 
     private static List<Cmpv2Server> generateTestConfiguration() {
index 1809760..10a7ba4 100644 (file)
@@ -20,6 +20,9 @@
 
 package org.onap.aaf.certservice.certification.configuration.validation;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 import org.bouncycastle.asn1.x500.X500Name;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -32,13 +35,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
 @ExtendWith(SpringExtension.class)
 @ContextConfiguration(classes = CertServiceApplication.class)
 class Cmpv2ServerConfigurationValidatorTest {
 
+    private static final String EMPTY_STRING = "";
+
     @Autowired
     private Cmpv2ServerConfigurationValidator validator;
 
@@ -52,53 +54,121 @@ class Cmpv2ServerConfigurationValidatorTest {
     }
 
     @Test
-    public void givenValidServerDetailsWhenValidatingShouldNotThrowAnyException() {
-        //then
+    public void shouldNotThrowExceptionWhenServerConfigurationIsValid() {
+        // Then
         assertDoesNotThrow(() -> validator.validate(server));
     }
 
     @Test
-    public void givenWrongProtocolInURLServerDetailsWhenValidatingShouldThrowException() {
-        //given
+    public void shouldThrowExceptionWhenWrongProtocolInURL() {
+        // Given
         server.setUrl("https://test.test.test:60000/");
 
-        //then
-        assertThrows(IllegalArgumentException.class, () -> {validator.validate(server);});
+        // Then
+        assertExceptionIsThrown();
     }
 
     @Test
-    public void givenWrongPortInURLServerDetailsWhenValidatingShouldThrowException() {
-        //given
+    public void shouldThrowExceptionWhenWrongPortInURL() {
+        // Given
         server.setUrl("http://test.test.test:70000/");
 
-        //then
-        assertThrows(IllegalArgumentException.class, () -> validator.validate(server));
+        // Then
+        assertExceptionIsThrown();
     }
 
     @Test
-    public void givenWrongCANameLengthInURLServerDetailsWhenValidatingShouldThrowException() {
-        //given
-        server.setCaName("");
+    public void shouldThrowExceptionWhenWrongCANameLength() {
+        // Given
+        server.setCaName(EMPTY_STRING);
 
-        //then
-        assertThrows(IllegalArgumentException.class, () -> validator.validate(server));
+        // Then
+        assertExceptionIsThrown();
     }
 
     @Test
-    public void givenWrongRVLengthInURLServerDetailsWhenValidatingShouldThrowException() {
-        //given
-        authentication.setRv("");
+    public void shouldThrowExceptionWhenWrongRVLength() {
+        // Given
+        authentication.setRv(EMPTY_STRING);
 
-        //then
-        assertThrows(IllegalArgumentException.class, () -> validator.validate(server));
+        // Then
+        assertExceptionIsThrown();
     }
 
+
     @Test
-    public void givenWrongIAKLengthInURLServerDetailsWhenValidatingShouldThrowException() {
-        //given
-        authentication.setIak("");
+    public void shouldThrowExceptionWhenWrongIAKLength() {
+        // Given
+        authentication.setIak(EMPTY_STRING);
+
+        // Then
+        assertExceptionIsThrown();
+    }
+
+    @Test
+    public void shouldThrowExceptionWhenCaNameIsNull() {
+        // Given
+        server.setCaName(null);
+
+        // Then
+        assertExceptionIsThrown();
+    }
+
+    @Test
+    public void shouldThrowExceptionWhenIssuerDnIsNull() {
+        // Given
+        server.setIssuerDN(null);
+
+        // Then
+        assertExceptionIsThrown();
+    }
+
+    @Test
+    public void shouldThrowExceptionWhenCaModeIsNull() {
+        // Given
+        server.setCaMode(null);
+
+        // Then
+        assertExceptionIsThrown();
+    }
+
+    @Test
+    public void shouldThrowExceptionWhenUrlIsNull() {
+        // Given
+        server.setUrl(null);
+
+        // Then
+        assertExceptionIsThrown();
+    }
+
+    @Test
+    public void shouldThrowExceptionWhenAuthenticationIsNull() {
+        // Given
+        server.setAuthentication(null);
+
+        // Then
+        assertExceptionIsThrown();
+    }
+
+    @Test
+    public void shouldThrowExceptionWhenIakIsNull() {
+        // Given
+        authentication.setIak(null);
+
+        // Then
+        assertExceptionIsThrown();
+    }
+
+    @Test
+    public void shouldThrowExceptionWhenRvIsNull() {
+        // Given
+        authentication.setRv(null);
+
+        // Then
+        assertExceptionIsThrown();
+    }
 
-        //then
+    private void assertExceptionIsThrown() {
         assertThrows(IllegalArgumentException.class, () -> validator.validate(server));
     }
 
index a2a0386..78368d8 100644 (file)
@@ -27,7 +27,7 @@ import static org.junit.jupiter.api.Assertions.*;
 
 class Cmpv2URLValidatorTest {
 
-    private Cmpv2URLValidator validator = new Cmpv2URLValidator();
+    private final Cmpv2URLValidator validator = new Cmpv2URLValidator();
 
     @Test
     public void givenCorrectURLWhenValidatingShouldReturnTrue() {
index 8ae4cd8..d185047 100644 (file)
@@ -27,7 +27,7 @@ import static org.junit.jupiter.api.Assertions.*;
 
 class PortNumberViolationTest {
 
-    private PortNumberViolation violation = new PortNumberViolation();
+    private final PortNumberViolation violation = new PortNumberViolation();
 
     @Test
     public void givenValidPortShouldReturnTrue() {
index 9e22056..cba2f34 100644 (file)
@@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.*;
 
 class RequestTypeViolationTest {
 
-    private RequestTypeViolation violation = new RequestTypeViolation();
+    private final RequestTypeViolation violation = new RequestTypeViolation();
 
     @Test
     public void givenValidRequestTypeShouldReturnTrue() {
diff --git a/certService/src/test/resources/invalidCmpServers.json b/certService/src/test/resources/invalidCmpServers.json
new file mode 100644 (file)
index 0000000..ac4b34a
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "cmpv2Servers": [
+    {
+      "caName": " ",
+      "url": "http://127.0.0.1/ejbca/publicweb/cmp/cmp",
+      "issuerDN": "CN=ManagementCA",
+      "caMode": "CLIENT"
+    },
+    {
+      "caName": "TEST2",
+      "url": "http://127.0.0.1/ejbca/publicweb/cmp/cmpRA",
+      "caMode": "RA",
+      "authentication": {
+        "iak": "xxx",
+        "rv": "yyy"
+      }
+    }
+  ]
+}
\ No newline at end of file