2 changed files with 237 additions and 1 deletions
@ -0,0 +1,236 @@ |
|||
/** |
|||
* ThingsBoard, Inc. ("COMPANY") CONFIDENTIAL |
|||
* |
|||
* Copyright © 2016-2026 ThingsBoard, Inc. All Rights Reserved. |
|||
* |
|||
* NOTICE: All information contained herein is, and remains |
|||
* the property of ThingsBoard, Inc. and its suppliers, |
|||
* if any. The intellectual and technical concepts contained |
|||
* herein are proprietary to ThingsBoard, Inc. |
|||
* and its suppliers and may be covered by U.S. and Foreign Patents, |
|||
* patents in process, and are protected by trade secret or copyright law. |
|||
* |
|||
* Dissemination of this information or reproduction of this material is strictly forbidden |
|||
* unless prior written permission is obtained from COMPANY. |
|||
* |
|||
* Access to the source code contained herein is hereby forbidden to anyone except current COMPANY employees, |
|||
* managers or contractors who have executed Confidentiality and Non-disclosure agreements |
|||
* explicitly covering such access. |
|||
* |
|||
* The copyright notice above does not evidence any actual or intended publication |
|||
* or disclosure of this source code, which includes |
|||
* information that is confidential and/or proprietary, and is a trade secret, of COMPANY. |
|||
* ANY REPRODUCTION, MODIFICATION, DISTRIBUTION, PUBLIC PERFORMANCE, |
|||
* OR PUBLIC DISPLAY OF OR THROUGH USE OF THIS SOURCE CODE WITHOUT |
|||
* THE EXPRESS WRITTEN CONSENT OF COMPANY IS STRICTLY PROHIBITED, |
|||
* AND IN VIOLATION OF APPLICABLE LAWS AND INTERNATIONAL TREATIES. |
|||
* THE RECEIPT OR POSSESSION OF THIS SOURCE CODE AND/OR RELATED INFORMATION |
|||
* DOES NOT CONVEY OR IMPLY ANY RIGHTS TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS CONTENTS, |
|||
* OR TO MANUFACTURE, USE, OR SELL ANYTHING THAT IT MAY DESCRIBE, IN WHOLE OR IN PART. |
|||
*/ |
|||
package org.thingsboard.server.service.edge.rpc.processor; |
|||
|
|||
import com.google.common.util.concurrent.Futures; |
|||
import com.google.common.util.concurrent.ListenableFuture; |
|||
import org.junit.jupiter.api.Test; |
|||
import org.thingsboard.common.util.JacksonUtil; |
|||
import org.thingsboard.server.common.data.Dashboard; |
|||
import org.thingsboard.server.common.data.Device; |
|||
import org.thingsboard.server.common.data.EntityView; |
|||
import org.thingsboard.server.common.data.User; |
|||
import org.thingsboard.server.common.data.asset.Asset; |
|||
import org.thingsboard.server.common.data.device.data.DeviceData; |
|||
import org.thingsboard.server.common.data.device.data.DefaultDeviceConfiguration; |
|||
import org.thingsboard.server.common.data.device.data.DefaultDeviceTransportConfiguration; |
|||
import org.thingsboard.server.common.data.id.AssetId; |
|||
import org.thingsboard.server.common.data.id.DashboardId; |
|||
import org.thingsboard.server.common.data.id.DeviceId; |
|||
import org.thingsboard.server.common.data.id.EntityViewId; |
|||
import org.thingsboard.server.common.data.id.TenantId; |
|||
import org.thingsboard.server.common.data.id.UserId; |
|||
import org.thingsboard.server.gen.transport.TransportProtos; |
|||
|
|||
import java.util.UUID; |
|||
|
|||
import static org.assertj.core.api.Assertions.assertThat; |
|||
|
|||
public class BaseEdgeProcessorTest { |
|||
|
|||
private final BaseEdgeProcessor processor = new BaseEdgeProcessor() { |
|||
@Override |
|||
public ListenableFuture<Void> processEntityNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto msg) { |
|||
return Futures.immediateFuture(null); |
|||
} |
|||
}; |
|||
|
|||
@Test |
|||
public void dashboardSaveRequiredWhenConfigurationChanges() { |
|||
DashboardId dashboardId = new DashboardId(UUID.randomUUID()); |
|||
Dashboard current = new Dashboard(dashboardId); |
|||
current.setTitle("Dashboard"); |
|||
current.setConfiguration(JacksonUtil.toJsonNode("{\"widgets\":{\"w1\":{\"type\":\"timeseries\"}}}")); |
|||
|
|||
Dashboard updated = new Dashboard(current); |
|||
updated.setConfiguration(JacksonUtil.toJsonNode("{\"widgets\":{\"w1\":{\"type\":\"latest\"}}}")); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isTrue(); |
|||
} |
|||
|
|||
@Test |
|||
public void dashboardSaveNotRequiredWhenOnlyVersionChanges() { |
|||
DashboardId dashboardId = new DashboardId(UUID.randomUUID()); |
|||
Dashboard current = new Dashboard(dashboardId); |
|||
current.setTitle("Dashboard"); |
|||
current.setConfiguration(JacksonUtil.toJsonNode("{\"widgets\":{\"w1\":{\"type\":\"timeseries\"}}}")); |
|||
current.setVersion(1L); |
|||
|
|||
Dashboard updated = new Dashboard(current); |
|||
updated.setVersion(2L); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isFalse(); |
|||
} |
|||
|
|||
@Test |
|||
public void dashboardSaveNotRequiredWhenIdentical() { |
|||
DashboardId dashboardId = new DashboardId(UUID.randomUUID()); |
|||
Dashboard current = new Dashboard(dashboardId); |
|||
current.setTitle("Dashboard"); |
|||
current.setConfiguration(JacksonUtil.toJsonNode("{\"widgets\":{\"w1\":{\"type\":\"timeseries\"}}}")); |
|||
|
|||
Dashboard updated = new Dashboard(current); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isFalse(); |
|||
} |
|||
|
|||
@Test |
|||
public void deviceSaveRequiredWhenDeviceDataChanges() { |
|||
DeviceId deviceId = new DeviceId(UUID.randomUUID()); |
|||
Device current = new Device(deviceId); |
|||
current.setName("Device"); |
|||
current.setDeviceData(deviceDataWithTransport()); |
|||
|
|||
Device updated = new Device(current); |
|||
DeviceData withoutTransport = new DeviceData(); |
|||
withoutTransport.setConfiguration(new DefaultDeviceConfiguration()); |
|||
updated.setDeviceData(withoutTransport); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isTrue(); |
|||
} |
|||
|
|||
@Test |
|||
public void deviceSaveRequiredWhenAdditionalInfoChanges() { |
|||
DeviceId deviceId = new DeviceId(UUID.randomUUID()); |
|||
Device current = new Device(deviceId); |
|||
current.setName("Device"); |
|||
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"old\"}")); |
|||
|
|||
Device updated = new Device(current); |
|||
updated.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"new\"}")); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isTrue(); |
|||
} |
|||
|
|||
@Test |
|||
public void deviceSaveNotRequiredWhenOnlyVersionChanges() { |
|||
DeviceId deviceId = new DeviceId(UUID.randomUUID()); |
|||
Device current = new Device(deviceId); |
|||
current.setName("Device"); |
|||
current.setDeviceData(deviceDataWithTransport()); |
|||
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"same\"}")); |
|||
current.setVersion(1L); |
|||
|
|||
Device updated = new Device(current); |
|||
updated.setVersion(2L); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isFalse(); |
|||
} |
|||
|
|||
@Test |
|||
public void assetSaveRequiredWhenAdditionalInfoChanges() { |
|||
AssetId assetId = new AssetId(UUID.randomUUID()); |
|||
Asset current = new Asset(assetId); |
|||
current.setName("Asset"); |
|||
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"old\"}")); |
|||
|
|||
Asset updated = new Asset(current); |
|||
updated.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"new\"}")); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isTrue(); |
|||
} |
|||
|
|||
@Test |
|||
public void assetSaveNotRequiredWhenOnlyVersionChanges() { |
|||
AssetId assetId = new AssetId(UUID.randomUUID()); |
|||
Asset current = new Asset(assetId); |
|||
current.setName("Asset"); |
|||
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"same\"}")); |
|||
current.setVersion(1L); |
|||
|
|||
Asset updated = new Asset(current); |
|||
updated.setVersion(2L); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isFalse(); |
|||
} |
|||
|
|||
@Test |
|||
public void entityViewSaveRequiredWhenAdditionalInfoChanges() { |
|||
EntityViewId entityViewId = new EntityViewId(UUID.randomUUID()); |
|||
EntityView current = new EntityView(entityViewId); |
|||
current.setName("EntityView"); |
|||
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"old\"}")); |
|||
|
|||
EntityView updated = new EntityView(current); |
|||
updated.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"new\"}")); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isTrue(); |
|||
} |
|||
|
|||
@Test |
|||
public void entityViewSaveNotRequiredWhenOnlyVersionChanges() { |
|||
EntityViewId entityViewId = new EntityViewId(UUID.randomUUID()); |
|||
EntityView current = new EntityView(entityViewId); |
|||
current.setName("EntityView"); |
|||
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"same\"}")); |
|||
current.setVersion(1L); |
|||
|
|||
EntityView updated = new EntityView(current); |
|||
updated.setVersion(2L); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isFalse(); |
|||
} |
|||
|
|||
@Test |
|||
public void userSaveRequiredWhenAdditionalInfoChanges() { |
|||
UserId userId = new UserId(UUID.randomUUID()); |
|||
User current = new User(userId); |
|||
current.setEmail("user@thingsboard.io"); |
|||
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"old\"}")); |
|||
|
|||
User updated = new User(current); |
|||
updated.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"new\"}")); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isTrue(); |
|||
} |
|||
|
|||
@Test |
|||
public void userSaveNotRequiredWhenOnlyVersionChanges() { |
|||
UserId userId = new UserId(UUID.randomUUID()); |
|||
User current = new User(userId); |
|||
current.setEmail("user@thingsboard.io"); |
|||
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"same\"}")); |
|||
current.setVersion(1L); |
|||
|
|||
User updated = new User(current); |
|||
updated.setVersion(2L); |
|||
|
|||
assertThat(processor.isSaveRequired(current, updated)).isFalse(); |
|||
} |
|||
|
|||
private static DeviceData deviceDataWithTransport() { |
|||
DeviceData deviceData = new DeviceData(); |
|||
deviceData.setConfiguration(new DefaultDeviceConfiguration()); |
|||
deviceData.setTransportConfiguration(new DefaultDeviceTransportConfiguration()); |
|||
return deviceData; |
|||
} |
|||
|
|||
} |
|||
Loading…
Reference in new issue