From 4117c9fd7fcea895e18872e0d541e0f14a9a41b9 Mon Sep 17 00:00:00 2001 From: grabinsk Date: Tue, 4 Jun 2019 15:18:44 +0200 Subject: fetching configuration from CBS at application bootstrap Change-Id: Ibaa56c38b87fc8b8cfa858f74b7bc201bd507b37 Issue-ID: DCAEGEN2-1544 Signed-off-by: grabinsk --- .../CbsClientConfigurationResolverTest.java | 51 +++++++ .../CbsJsonToPropertyMapConverterTest.java | 86 +++++++++++ .../bootstrap/CbsPropertySourceLocatorTest.java | 164 +++++++++++++++++++++ .../CbsClientConfigFileReaderTest.java | 46 ------ .../CbsClientConfigurationResolverTest.java | 52 ------- .../CbsConfigRefreshSchedulerTest.java | 138 +++++++++++++++++ .../services/prh/tasks/CbsConfigTestConfig.java | 34 +++++ 7 files changed, 473 insertions(+), 98 deletions(-) create mode 100644 prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsClientConfigurationResolverTest.java create mode 100644 prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsJsonToPropertyMapConverterTest.java create mode 100644 prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsPropertySourceLocatorTest.java delete mode 100644 prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsClientConfigFileReaderTest.java delete mode 100644 prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsClientConfigurationResolverTest.java create mode 100644 prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsConfigRefreshSchedulerTest.java create mode 100644 prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/CbsConfigTestConfig.java (limited to 'prh-app-server/src/test/java/org/onap') diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsClientConfigurationResolverTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsClientConfigurationResolverTest.java new file mode 100644 index 00000000..2f871618 --- /dev/null +++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsClientConfigurationResolverTest.java @@ -0,0 +1,51 @@ +/* + * ============LICENSE_START======================================================= + * PNF-REGISTRATION-HANDLER + * ================================================================================ + * Copyright (C) 2019 NOKIA 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========================================================= + */ + +package org.onap.dcaegen2.services.bootstrap; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.*; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.CbsClientConfiguration; + +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class CbsClientConfigurationResolverTest { + + @Mock + private CbsProperties cbsProperties; + @Mock + private CbsClientConfiguration defaultCbsClientConfigFromSpringProps; + + @Test + @DisabledIfEnvironmentVariable(named = "CONFIG_BINDING_SERVICE", matches = ".+") + void whenCbsEnvPropertiesAreNotePresentInEnvironment_ShouldFallbackToLoadingDefaults() { + when(cbsProperties.toCbsClientConfiguration()).thenReturn(defaultCbsClientConfigFromSpringProps); + CbsClientConfigurationResolver cbsClientConfigurationResolver = new CbsClientConfigurationResolver(cbsProperties); + + CbsClientConfiguration config = cbsClientConfigurationResolver.resolveCbsClientConfiguration(); + + assertSame(defaultCbsClientConfigFromSpringProps, config); + } +} \ No newline at end of file diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsJsonToPropertyMapConverterTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsJsonToPropertyMapConverterTest.java new file mode 100644 index 00000000..da9a0008 --- /dev/null +++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsJsonToPropertyMapConverterTest.java @@ -0,0 +1,86 @@ +/* + * ============LICENSE_START======================================================= + * PNF-REGISTRATION-HANDLER + * ================================================================================ + * Copyright (C) 2019 NOKIA 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========================================================= + */ + +package org.onap.dcaegen2.services.bootstrap; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.assertj.core.api.Condition; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class CbsJsonToPropertyMapConverterTest { + + private static final JsonObject SOME_JSON_FROM_CBS = asJsonObject( + "{\n" + + " \"config\": {\n" + + " \"someStringProp\": \"foo\",\n" + + " \"someNumericalProp\": 123,\n" + + " \"someBooleanProp\": true,\n" + + " \"someObjectProp\": {\n" + + " \"bar\": \"baz\"\n" + + " }\n" + + " }\n" + + "}" + ); + + private CbsJsonToPropertyMapConverter cbsJsonToPropertyMapConverter = new CbsJsonToPropertyMapConverter(); + + @Test + void shouldExtractPrimitivePropertiesToSimpleJavaTypes() { + Map map = cbsJsonToPropertyMapConverter.convertToMap(SOME_JSON_FROM_CBS); + + assertThat(map).containsEntry("someStringProp", "foo"); + assertThat(map).containsEntry("someNumericalProp", 123L); + assertThat(map).containsEntry("someBooleanProp", true); + + } + + @Test + void shouldLeaveComplexPropertiesAsJsonTypes() { + Map map = cbsJsonToPropertyMapConverter.convertToMap(SOME_JSON_FROM_CBS); + + assertThat(map).hasEntrySatisfying("someObjectProp", hasClass(JsonObject.class)); + } + + @Test + void shouldProduceDescriptiveExceptionInCaseExpectedRootElementInCbsJsonIsMissing() { + assertThatThrownBy(() -> cbsJsonToPropertyMapConverter.convertToMap(asJsonObject("{}"))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Missing expected 'config' property in json from CBS."); + } + + + private static JsonObject asJsonObject(String jsonString) { + return new JsonParser().parse(jsonString).getAsJsonObject(); + } + + private static Condition hasClass(Class clazz) { + return new Condition(clazz.getCanonicalName()){ + public boolean matches(Object value) { + return value.getClass().equals(clazz); + } + }; + } +} \ No newline at end of file diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsPropertySourceLocatorTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsPropertySourceLocatorTest.java new file mode 100644 index 00000000..faf1867a --- /dev/null +++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/bootstrap/CbsPropertySourceLocatorTest.java @@ -0,0 +1,164 @@ +/* + * ============LICENSE_START======================================================= + * PNF-REGISTRATION-HANDLER + * ================================================================================ + * Copyright (C) 2019 NOKIA 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========================================================= + */ + +package org.onap.dcaegen2.services.bootstrap; + +import com.google.common.collect.ImmutableMap; +import com.google.gson.JsonObject; +import org.junit.jupiter.api.AfterEach; +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.dcaegen2.services.prh.configuration.CbsConfiguration; +import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.CbsClient; +import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.CbsRequests; +import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.CbsClientConfiguration; +import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.CbsRequest; +import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.RequestPath; +import org.onap.dcaegen2.services.sdk.rest.services.model.logging.RequestDiagnosticContext; +import org.springframework.core.env.Environment; +import org.springframework.core.env.PropertySource; +import reactor.core.publisher.Mono; +import reactor.test.scheduler.VirtualTimeScheduler; + +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assumptions.assumeThat; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.*; + + +@ExtendWith(MockitoExtension.class) +class CbsPropertySourceLocatorTest { + + private static final RequestPath GET_ALL_REQUEST_PATH = CbsRequests.getAll(RequestDiagnosticContext.create()).requestPath(); + + private CbsProperties cbsProperties = new CbsProperties(); + @Mock + private CbsJsonToPropertyMapConverter cbsJsonToPropertyMapConverter; + @Mock + private CbsClientConfiguration cbsClientConfiguration; + @Mock + private CbsClientConfigurationResolver cbsClientConfigurationResolver; + @Mock + private CbsClientFactoryFacade cbsClientFactoryFacade; + @Mock + private CbsConfiguration cbsConfiguration; + @Mock + private Environment environment; + @Mock + private CbsClient cbsClient; + @Mock + private JsonObject cbsConfigJsonObject; + private Map cbsConfigMap = ImmutableMap.of("foo", "bar"); + + private VirtualTimeScheduler virtualTimeScheduler; + + private CbsPropertySourceLocator cbsPropertySourceLocator; + + + @BeforeEach + void setup() { + virtualTimeScheduler = VirtualTimeScheduler.getOrSet(); + + when(cbsClientConfigurationResolver.resolveCbsClientConfiguration()).thenReturn(cbsClientConfiguration); + when(cbsClientFactoryFacade.createCbsClient(cbsClientConfiguration)).thenReturn(Mono.just(cbsClient)); + + cbsPropertySourceLocator = new CbsPropertySourceLocator( + cbsProperties, cbsJsonToPropertyMapConverter, cbsClientConfigurationResolver, + cbsClientFactoryFacade, cbsConfiguration); + } + + @AfterEach + void cleanup() { + virtualTimeScheduler.dispose(); + } + + + @Test + void shouldBuildCbsPropertySourceBasedOnDataFetchedUsingCbsClient() { + when(cbsClient.get(argThat(request -> request.requestPath().equals(GET_ALL_REQUEST_PATH)))) + .thenReturn(Mono.just(cbsConfigJsonObject)); + when(cbsJsonToPropertyMapConverter.convertToMap(cbsConfigJsonObject)).thenReturn(cbsConfigMap); + + PropertySource propertySource = cbsPropertySourceLocator.locate(environment); + + assertThat(propertySource).extracting(PropertySource::getName).isEqualTo("cbs"); + assertThat(propertySource).extracting(s -> s.getProperty("foo")).isEqualTo("bar"); + } + + + @Test + void shouldUpdateCbsConfigurationStateBasedOnDataFetchedUsingCbsClient() { + when(cbsClient.get(argThat(request -> request.requestPath().equals(GET_ALL_REQUEST_PATH)))) + .thenReturn(Mono.just(cbsConfigJsonObject)); + when(cbsJsonToPropertyMapConverter.convertToMap(cbsConfigJsonObject)).thenReturn(cbsConfigMap); + + cbsPropertySourceLocator.locate(environment); + + verify(cbsConfiguration).parseCBSConfig(cbsConfigJsonObject); + } + + + @Test + void shouldPropagateExceptionWhenCbsConfigurationParsingFails() { + when(cbsClient.get(any(CbsRequest.class))).thenReturn(Mono.just(cbsConfigJsonObject)); + + RuntimeException someCbsConfigParsingException = new RuntimeException("boom!"); + doThrow(someCbsConfigParsingException).when(cbsConfiguration).parseCBSConfig(cbsConfigJsonObject); + + assertThatThrownBy(() -> cbsPropertySourceLocator.locate(environment)) + .isSameAs(someCbsConfigParsingException); + } + + @Test + void shouldRetryFetchingConfigFromCbsInCaseOfFailure() { + assumeThat(cbsProperties.getFetchRetries().getMaxAttempts()).isGreaterThan(1); + when(cbsClient.get(any(CbsRequest.class))) + .thenReturn(Mono.defer(() -> { + virtualTimeScheduler.advanceTimeBy(cbsProperties.getFetchRetries().getMaxBackoff()); + return Mono.error(new RuntimeException("some connection failure")); + })) + .thenReturn(Mono.just(cbsConfigJsonObject)); + when(cbsJsonToPropertyMapConverter.convertToMap(cbsConfigJsonObject)).thenReturn(cbsConfigMap); + + PropertySource propertySource = cbsPropertySourceLocator.locate(environment); + + assertThat(propertySource).extracting(s -> s.getProperty("foo")).isEqualTo("bar"); + } + + @Test + void shouldFailAfterExhaustingAllOfConfiguredRetryAttempts() { + assumeThat(cbsProperties.getFetchRetries().getMaxAttempts()).isGreaterThan(1); + when(cbsClient.get(any(CbsRequest.class))) + .thenReturn(Mono.defer(() -> { + virtualTimeScheduler.advanceTimeBy(cbsProperties.getFetchRetries().getMaxBackoff()); + return Mono.error(new RuntimeException("some connection failure")); + })); + + assertThatThrownBy(() -> cbsPropertySourceLocator.locate(environment)) + .hasMessageContaining("Retries exhausted") + .hasMessageContaining(cbsProperties.getFetchRetries().getMaxAttempts().toString()); + } +} diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsClientConfigFileReaderTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsClientConfigFileReaderTest.java deleted file mode 100644 index c4cf7089..00000000 --- a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsClientConfigFileReaderTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * PNF-REGISTRATION-HANDLER - * ================================================================================ - * Copyright (C) 2018 NOKIA 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========================================================= - */ - - -package org.onap.dcaegen2.services.prh.configuration; - -import org.junit.jupiter.api.Test; -import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.CbsClientConfiguration; -import org.springframework.core.io.ClassRelativeResourceLoader; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; - -import static org.junit.jupiter.api.Assertions.*; - -class CbsClientConfigFileReaderTest { - - private ResourceLoader resourceLoader = new ClassRelativeResourceLoader(ConsulConfigurationParserTest.class); - - @Test - void shouldProvideDefaultCbsClientConfigurationLoadedFromTheFile() { - Resource configFile = resourceLoader.getResource("classpath:cbs_client_config.json"); - - CbsClientConfiguration configuration = new CbsClientConfigFileReader(configFile).readConfig().block(); - - assertEquals("dcae-prh", configuration.appName()); - assertEquals("cbs", configuration.hostname()); - assertEquals(Integer.valueOf(10000), configuration.port()); - } -} \ No newline at end of file diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsClientConfigurationResolverTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsClientConfigurationResolverTest.java deleted file mode 100644 index 11981b50..00000000 --- a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsClientConfigurationResolverTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * PNF-REGISTRATION-HANDLER - * ================================================================================ - * Copyright (C) 2019 NOKIA 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========================================================= - */ - -package org.onap.dcaegen2.services.prh.configuration; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.*; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.CbsClientConfiguration; -import reactor.core.publisher.Mono; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -class CbsClientConfigurationResolverTest { - - @Mock - private CbsClientConfigFileReader cbsClientConfigFileReader; - @Mock - private CbsClientConfiguration configurationFromFile; - - @Test - @DisabledIfEnvironmentVariable(named = "CONSUL_HOST", matches = ".+") - void whenCbsEnvPropertiesAreNotePresentInEnvironment_ShouldFallbackToLoadingDefaults() { - when(cbsClientConfigFileReader.readConfig()).thenReturn(Mono.just(configurationFromFile)); - CbsClientConfigurationResolver cbsClientConfigurationResolver = new CbsClientConfigurationResolver(cbsClientConfigFileReader); - - CbsClientConfiguration config = cbsClientConfigurationResolver.resolveCbsClientConfiguration().block(); - - assertSame(configurationFromFile, config); - } -} \ No newline at end of file diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsConfigRefreshSchedulerTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsConfigRefreshSchedulerTest.java new file mode 100644 index 00000000..7ea08aea --- /dev/null +++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/CbsConfigRefreshSchedulerTest.java @@ -0,0 +1,138 @@ +/* + * ============LICENSE_START======================================================= + * PNF-REGISTRATION-HANDLER + * ================================================================================ + * Copyright (C) 2019 NOKIA 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========================================================= + */ + +package org.onap.dcaegen2.services.prh.configuration; + +import org.junit.jupiter.api.AfterEach; +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.springframework.cloud.context.environment.EnvironmentChangeEvent; +import org.springframework.cloud.context.refresh.ContextRefresher; +import org.springframework.core.env.Environment; +import reactor.test.scheduler.VirtualTimeScheduler; + +import java.time.Duration; +import java.util.Collections; + +import static org.mockito.Mockito.*; + + +@ExtendWith(MockitoExtension.class) +class CbsConfigRefreshSchedulerTest { + + private static final Duration SOME_UPDATES_INTERVAL = Duration.ofMinutes(5); + private static final String CBS_UPDATES_INTERVAL_PROPERTY = "cbs.updates-interval"; + + @Mock + private ContextRefresher contextRefresher; + @Mock + private Environment environment; + + private VirtualTimeScheduler virtualTimeScheduler; + + private CbsConfigRefreshScheduler cbsConfigRefreshScheduler; + + + @BeforeEach + void setUp() { + virtualTimeScheduler = VirtualTimeScheduler.getOrSet(); + when(environment.getProperty(CBS_UPDATES_INTERVAL_PROPERTY, Duration.class, Duration.ZERO)) + .thenReturn(SOME_UPDATES_INTERVAL); + + cbsConfigRefreshScheduler = new CbsConfigRefreshScheduler(contextRefresher, environment); + } + + @AfterEach + void tearDown() { + virtualTimeScheduler.dispose(); + } + + @Test + void configRefreshUpdatesShouldBeFiredAccordingToConfiguredInterval() { + cbsConfigRefreshScheduler.startPollingForCbsUpdates(); + + verify(contextRefresher, times(0)).refresh(); + + virtualTimeScheduler.advanceTimeBy(SOME_UPDATES_INTERVAL); + verify(contextRefresher, times(1)).refresh(); + + virtualTimeScheduler.advanceTimeBy(SOME_UPDATES_INTERVAL); + verify(contextRefresher, times(2)).refresh(); + } + + @Test + void whenConfigUpdateIntervalIsSetToZero_UpdatesShouldNotBeExecuted() { + when(environment.getProperty(CBS_UPDATES_INTERVAL_PROPERTY, Duration.class, Duration.ZERO)) + .thenReturn(Duration.ZERO); + + cbsConfigRefreshScheduler.startPollingForCbsUpdates(); + + virtualTimeScheduler.advanceTimeBy(Duration.ofHours(10)); + + verifyZeroInteractions(contextRefresher); + } + + @Test + void whenUpdateFails_shouldContinueWithUpdateRequestsAccordingToConfiguredSchedule() { + when(contextRefresher.refresh()) + .thenThrow(new RuntimeException("kaboom!")) + .thenReturn(Collections.emptySet()); + + cbsConfigRefreshScheduler.startPollingForCbsUpdates(); + + virtualTimeScheduler.advanceTimeBy(SOME_UPDATES_INTERVAL.plus(SOME_UPDATES_INTERVAL)); + verify(contextRefresher, times(2)).refresh(); + } + + + @Test + void whenUpdatesIntervalIsChangedInEnvironment_UpdatesShouldBeRescheduled() { + when(environment.getProperty(CBS_UPDATES_INTERVAL_PROPERTY, Duration.class, Duration.ZERO)) + .thenReturn(Duration.ofMinutes(30)) + .thenReturn(Duration.ofSeconds(10)); + + cbsConfigRefreshScheduler.startPollingForCbsUpdates(); + + cbsConfigRefreshScheduler.onEnvironmentChanged( + new EnvironmentChangeEvent(Collections.singleton(CBS_UPDATES_INTERVAL_PROPERTY))); + + virtualTimeScheduler.advanceTimeBy(Duration.ofMinutes(1)); + + verify(contextRefresher, times(6)).refresh(); + } + + + @Test + void whenEnvironmentChangeDoesNotAffectUpdatesInterval_UpdatesScheduleShouldNotBeImpacted() { + cbsConfigRefreshScheduler.startPollingForCbsUpdates(); + + Duration envChangeDelay = Duration.ofMinutes(1); + virtualTimeScheduler.advanceTimeBy(envChangeDelay); + + cbsConfigRefreshScheduler.onEnvironmentChanged(new EnvironmentChangeEvent(Collections.emptySet())); + + virtualTimeScheduler.advanceTimeBy(SOME_UPDATES_INTERVAL.minus(envChangeDelay)); + + verify(contextRefresher).refresh(); + } +} \ No newline at end of file diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/CbsConfigTestConfig.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/CbsConfigTestConfig.java new file mode 100644 index 00000000..9e3ef2e1 --- /dev/null +++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/CbsConfigTestConfig.java @@ -0,0 +1,34 @@ +/* + * ============LICENSE_START======================================================= + * PROJECT + * ================================================================================ + * Copyright (C) 2018 NOKIA 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========================================================= + */ + +package org.onap.dcaegen2.services.prh.tasks; + +import org.onap.dcaegen2.services.prh.configuration.CbsConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CbsConfigTestConfig { + + @Bean + public CbsConfiguration cbsConfiguration() { + return new CbsConfiguration(); + } +} -- cgit 1.2.3-korg