committed by
GitHub
2 changed files with 133 additions and 5 deletions
@ -0,0 +1,130 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2025 The Thingsboard Authors |
||||
|
* |
||||
|
* 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. |
||||
|
*/ |
||||
|
package org.thingsboard.server.controller; |
||||
|
|
||||
|
import com.fasterxml.jackson.core.type.TypeReference; |
||||
|
import com.fasterxml.jackson.databind.node.ObjectNode; |
||||
|
import org.junit.Before; |
||||
|
import org.junit.Test; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.jdbc.core.JdbcTemplate; |
||||
|
import org.springframework.test.context.TestPropertySource; |
||||
|
import org.thingsboard.common.util.JacksonUtil; |
||||
|
import org.thingsboard.server.common.data.AttributeScope; |
||||
|
import org.thingsboard.server.common.data.Device; |
||||
|
import org.thingsboard.server.common.data.edqs.EdqsSyncRequest; |
||||
|
import org.thingsboard.server.common.data.edqs.ToCoreEdqsRequest; |
||||
|
import org.thingsboard.server.common.data.id.TenantId; |
||||
|
import org.thingsboard.server.common.data.kv.AttributeKvEntry; |
||||
|
import org.thingsboard.server.common.data.page.PageData; |
||||
|
import org.thingsboard.server.common.data.query.DeviceTypeFilter; |
||||
|
import org.thingsboard.server.common.data.query.EntityData; |
||||
|
import org.thingsboard.server.common.data.query.EntityDataPageLink; |
||||
|
import org.thingsboard.server.common.data.query.EntityDataQuery; |
||||
|
import org.thingsboard.server.common.data.query.EntityKey; |
||||
|
import org.thingsboard.server.common.data.query.EntityKeyType; |
||||
|
import org.thingsboard.server.common.data.query.EntityKeyValueType; |
||||
|
import org.thingsboard.server.common.data.query.FilterPredicateValue; |
||||
|
import org.thingsboard.server.common.data.query.KeyFilter; |
||||
|
import org.thingsboard.server.common.data.query.StringFilterPredicate; |
||||
|
import org.thingsboard.server.dao.service.DaoSqlTest; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Collections; |
||||
|
import java.util.List; |
||||
|
import java.util.Optional; |
||||
|
import java.util.concurrent.TimeUnit; |
||||
|
|
||||
|
import static org.awaitility.Awaitility.await; |
||||
|
|
||||
|
@DaoSqlTest |
||||
|
@TestPropertySource(properties = { |
||||
|
"queue.edqs.sync.enabled=true", |
||||
|
"queue.edqs.api.supported=true", |
||||
|
"queue.edqs.api.auto_enable=true", |
||||
|
"queue.edqs.mode=local" |
||||
|
}) |
||||
|
public class EdqsControllerTest extends AbstractControllerTest { |
||||
|
|
||||
|
@Autowired |
||||
|
private JdbcTemplate jdbcTemplate; |
||||
|
|
||||
|
@Before |
||||
|
public void beforeEdqsControllerTest() throws Exception { |
||||
|
loginTenantAdmin(); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testEdqsSync() throws Exception { |
||||
|
List<Device> devices = new ArrayList<>(); |
||||
|
for (int i = 0; i < 3; i++) { |
||||
|
Device device = new Device(); |
||||
|
device.setName("Device" + i); |
||||
|
device.setType("default"); |
||||
|
device.setLabel("testLabel" + (int) (Math.random() * 1000)); |
||||
|
ObjectNode additionalInfo = JacksonUtil.newObjectNode(); |
||||
|
additionalInfo.put("gateway", true); |
||||
|
device.setAdditionalInfo(additionalInfo); |
||||
|
devices.add(doPost("/api/device", device, Device.class)); |
||||
|
Thread.sleep(1); |
||||
|
} |
||||
|
|
||||
|
DeviceTypeFilter filter = new DeviceTypeFilter(); |
||||
|
filter.setDeviceTypes(List.of("default")); |
||||
|
filter.setDeviceNameFilter(""); |
||||
|
|
||||
|
List<EntityKey> entityFields = Collections.singletonList(new EntityKey(EntityKeyType.ENTITY_FIELD, "name")); |
||||
|
|
||||
|
EntityDataPageLink pageLink = new EntityDataPageLink(10, 0, null, null); |
||||
|
EntityDataQuery query = new EntityDataQuery(filter, pageLink, entityFields, null, Collections.singletonList(getGatewayFilter())); |
||||
|
await().atMost(TIMEOUT, TimeUnit.SECONDS) |
||||
|
.until(() -> doPostWithTypedResponse("/api/entitiesQuery/find", query, new TypeReference<PageData<EntityData>>() { |
||||
|
}), result -> result.getTotalElements() == 3); |
||||
|
|
||||
|
// update db
|
||||
|
Device device1 = devices.get(0); |
||||
|
device1.setAdditionalInfo(JacksonUtil.newObjectNode()); |
||||
|
jdbcTemplate.execute("update device set additional_info = '{}' where id = '" + device1.getId().getId().toString() + "'"); |
||||
|
|
||||
|
// do edqs sync
|
||||
|
loginSysAdmin(); |
||||
|
ToCoreEdqsRequest syncRequest = new ToCoreEdqsRequest(new EdqsSyncRequest(), null); |
||||
|
doPost("/api/edqs/system/request", syncRequest); |
||||
|
|
||||
|
//check sync is finished
|
||||
|
await().atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> { |
||||
|
Optional<AttributeKvEntry> attribute = attributesService.find(TenantId.SYS_TENANT_ID, TenantId.SYS_TENANT_ID, AttributeScope.SERVER_SCOPE, "edqsSyncState").get(); |
||||
|
return attribute.isPresent() && attribute.get().getJsonValue().isPresent() && |
||||
|
attribute.get().getJsonValue().get().contains("\"status\":\"FINISHED\""); |
||||
|
}); |
||||
|
|
||||
|
// check if the count is updated
|
||||
|
loginTenantAdmin(); |
||||
|
await().atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> doPostWithTypedResponse("/api/entitiesQuery/find", query, new TypeReference<PageData<EntityData>>() { |
||||
|
}), result -> result.getTotalElements() == 2); |
||||
|
} |
||||
|
|
||||
|
private KeyFilter getGatewayFilter() { |
||||
|
KeyFilter additionalInfoFilter = new KeyFilter(); |
||||
|
additionalInfoFilter.setKey(new EntityKey(EntityKeyType.ENTITY_FIELD, "additionalInfo")); |
||||
|
additionalInfoFilter.setValueType(EntityKeyValueType.STRING); |
||||
|
StringFilterPredicate predicate = new StringFilterPredicate(); |
||||
|
predicate.setValue(FilterPredicateValue.fromString("\"gateway\":true")); |
||||
|
predicate.setOperation(StringFilterPredicate.StringOperation.CONTAINS); |
||||
|
additionalInfoFilter.setPredicate(predicate); |
||||
|
return additionalInfoFilter; |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue