From c054d59f007bf94a7812fdf85caf5a890b910d99 Mon Sep 17 00:00:00 2001 From: Matteo Maiero Date: Fri, 22 Dec 2023 12:23:36 +0100 Subject: [PATCH] fix: fixed data service code flow in case of configuration change (#5074) * fix: fixed data service code flow in case of configuration change If the device is already connected, it will not try agan to reconnect. Restored the code path from Kura 5.2 Signed-off-by: MMaiero * chore: Addded tests Signed-off-by: MMaiero * fix: Additional test fix Signed-off-by: MMaiero --------- Signed-off-by: MMaiero --- .../kura/core/data/DataServiceImpl.java | 4 +- .../META-INF/MANIFEST.MF | 1 + .../kura/core/data/DataServiceImplTest.java | 40 ++++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceImpl.java b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceImpl.java index d94a9e616e8..1254b51c9e9 100644 --- a/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceImpl.java +++ b/kura/org.eclipse.kura.core/src/main/java/org/eclipse/kura/core/data/DataServiceImpl.java @@ -1130,7 +1130,9 @@ public Map getConnectionInfo() { @Override public void startConnectionTask() { - startConnectionMonitorTask(); + if (!this.dataTransportService.isConnected()) { + startConnectionMonitorTask(); + } } @Override diff --git a/kura/test/org.eclipse.kura.core.test/META-INF/MANIFEST.MF b/kura/test/org.eclipse.kura.core.test/META-INF/MANIFEST.MF index b5697c9c4f8..53c5bec1732 100644 --- a/kura/test/org.eclipse.kura.core.test/META-INF/MANIFEST.MF +++ b/kura/test/org.eclipse.kura.core.test/META-INF/MANIFEST.MF @@ -37,6 +37,7 @@ Import-Package: javax.comm, org.mockito;version="[4.0.0,5.0.0)", org.mockito.invocation;version="[4.0.0,5.0.0)", org.mockito.stubbing;version="[4.0.0,5.0.0)", + org.mockito.verification;version="4.8.1", org.osgi.framework, org.osgi.service.cm, org.osgi.service.component, diff --git a/kura/test/org.eclipse.kura.core.test/src/test/java/org/eclipse/kura/core/data/DataServiceImplTest.java b/kura/test/org.eclipse.kura.core.test/src/test/java/org/eclipse/kura/core/data/DataServiceImplTest.java index 0b07053c186..f8f3c4b505e 100644 --- a/kura/test/org.eclipse.kura.core.test/src/test/java/org/eclipse/kura/core/data/DataServiceImplTest.java +++ b/kura/test/org.eclipse.kura.core.test/src/test/java/org/eclipse/kura/core/data/DataServiceImplTest.java @@ -17,11 +17,14 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -45,6 +48,7 @@ import org.eclipse.kura.message.store.StoredMessage; import org.eclipse.kura.message.store.provider.MessageStore; import org.eclipse.kura.message.store.provider.MessageStoreProvider; +import org.eclipse.kura.status.CloudConnectionStatusComponent; import org.eclipse.kura.status.CloudConnectionStatusEnum; import org.eclipse.kura.status.CloudConnectionStatusService; import org.eclipse.kura.watchdog.WatchdogService; @@ -53,6 +57,7 @@ import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import org.mockito.verification.VerificationMode; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; @@ -60,6 +65,7 @@ public class DataServiceImplTest { private DataServiceImpl dataServiceImpl; private DataTransportService dataTransportServiceMock; + private CloudConnectionStatusService ccssMock; private Map properties; private Optional exception = Optional.empty(); private final MessageStoreProvider messageStoreProvider = Mockito.mock(MessageStoreProvider.class); @@ -151,6 +157,21 @@ public void shouldStoreMessagesWithPayloadSizeEqualThanConfiguredThreshold() thr thenNoExceptionIsTrown(); thenMessageIsStored(0, "foo", new byte[4], 0, false, 9); } + + @Test + public void shouldNotDisconnectOnConfigChange() throws KuraStoreException { + givenDataService(); + givenMessageStoreProvider(); + givenDataTrasportServiceDisconnected(); + givenConfigurationProperty("connect.auto-on-startup", true); + givenIsActive(); + givenDataTrasportServiceConnected(); + + whenConfigurationIsChanged("enable.recovery.on.connection.failure", true); + + thenDataTrasportStaysConnected(); + thenCloudConnectionStatusServiceIsNotChanged(); + } @Test public void shouldNotStoreMessagesWithPayloadSizeGreaterThanConfiguredThreshold() throws KuraStoreException { @@ -225,7 +246,7 @@ private void givenDataService() { DataServiceOptions dataServiceOptions = new DataServiceOptions(Collections.emptyMap()); MessageStoreProvider messageStoreProviderMock = mock(MessageStoreProvider.class); MessageStore messageStoreMock = mock(MessageStore.class); - CloudConnectionStatusService ccssMock = mock(CloudConnectionStatusService.class); + this.ccssMock = mock(CloudConnectionStatusService.class); WatchdogService watchdogServiceMock = mock(WatchdogService.class); initMockMessageStore(messageStoreProviderMock, messageStoreMock); TestUtil.setFieldValue(this.dataServiceImpl, "dataServiceOptions", dataServiceOptions); @@ -237,6 +258,11 @@ private void givenDataService() { } } + + private void whenConfigurationIsChanged(final String key, final Object value) { + this.properties.put(key, value); + this.dataServiceImpl.updated(properties); + } private void whenMessageIsPublished(final String topic, final byte[] payload, final int qos, final boolean retain, final int priority) { @@ -266,7 +292,19 @@ private void thenDataTrasportIsConnected() { fail(); } } + + private void thenDataTrasportStaysConnected() { + try { + verify(this.dataTransportServiceMock, times(0)).connect(); + } catch (KuraConnectException e) { + fail(); + } + } + private void thenCloudConnectionStatusServiceIsNotChanged() { + verify(this.ccssMock, times(1)).updateStatus(any(CloudConnectionStatusComponent.class), eq(CloudConnectionStatusEnum.SLOW_BLINKING)); + } + private void thenStartConnectionTaskIsInvoked() { verify(this.dataServiceImpl, times(2)).startConnectionTask(); }