thingsboard-client-demo/src/test/java/com/tuoheng/machine/TidBidMatchingTest.java

144 lines
5.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.tuoheng.machine;
import com.tuoheng.machine.command.CommandResult;
import com.tuoheng.machine.command.CommandType;
import com.tuoheng.machine.mqtt.MqttCallbackRegistry;
import com.tuoheng.machine.state.*;
import com.tuoheng.machine.vendor.VendorRegistry;
import com.tuoheng.machine.vendor.test.TestVendorConfig;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.concurrent.*;
import static org.junit.jupiter.api.Assertions.*;
/**
* tid/bid 匹配测试
* 测试13-14: tid/bid 匹配成功/不匹配
*/
@SpringBootTest
@Slf4j
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class TidBidMatchingTest {
@Autowired
MachineCommandManager machineCommandManager;
@Autowired
MqttCallbackRegistry mqttCallbackRegistry;
@Autowired
VendorRegistry vendorRegistry;
private static final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(2);
private static final String TEST_SN = "TID_BID_TEST_SN";
@BeforeAll
public static void setupAll() {
log.info("=== tid/bid 匹配测试初始化 ===");
}
@BeforeEach
public void beforeEach(TestInfo testInfo) {
log.info("\n========================================");
log.info("开始测试: {}", testInfo.getDisplayName());
log.info("========================================");
// 注册测试厂家配置
TestVendorConfig testVendorConfig = new TestVendorConfig();
vendorRegistry.registerVendor(testVendorConfig);
// 绑定SN到测试厂家
vendorRegistry.bindSnToVendor(TEST_SN, "TEST");
// 初始化机器状态
MachineStates initialStates = new MachineStates();
initialStates.setAirportState(AirportState.ONLINE);
initialStates.setDroneState(DroneState.ONLINE);
machineCommandManager.updateMachineStates(TEST_SN, initialStates, true);
}
@AfterEach
public void afterEach(TestInfo testInfo) {
log.info("完成测试: {}", testInfo.getDisplayName());
log.info("========================================\n");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
log.warn("等待时被中断", e);
}
}
/**
* 测试13: tid/bid 功能演示 - 不配置 tid/bid 时正常工作
* 使用简单的成功指令来演示当不配置 tid/bid 时,回调正常工作
*/
@Test
@Order(13)
@DisplayName("测试13: 不配置tid/bid时正常工作")
public void testWithoutTidBid() throws ExecutionException, InterruptedException {
log.info(">>> 场景:不配置 tid/bid 时,回调正常工作");
// 使用 TAKE_OFF 命令,它使用 TestSimpleSuccessInstruction不配置 tid/bid
CompletableFuture<CommandResult> future =
machineCommandManager.executeCommand(TEST_SN, CommandType.TAKE_OFF, new HashMap<>());
scheduler.schedule(() -> {
try {
Thread.sleep(100);
String response = "{\"result\":\"success\"}";
mqttCallbackRegistry.handleMessage("test/" + TEST_SN + "/response", response);
log.info(">>> 模拟发送方法回调不含tid/bid: {}", response);
Thread.sleep(100);
response = "{\"status\":\"completed\"}";
mqttCallbackRegistry.handleMessage("test/" + TEST_SN + "/state", response);
log.info(">>> 模拟发送状态回调不含tid/bid: {}", response);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, 200, TimeUnit.MILLISECONDS);
CommandResult result = future.get();
assertTrue(result.isSuccess(), "指令应该执行成功");
log.info(">>> 测试通过:不配置 tid/bid 时,消息正常匹配");
}
/**
* 测试14: tid/bid 不匹配场景
* 注意:这个测试演示当配置了 tid/bid 但消息中的值不匹配时的情况
*/
@Test
@Order(14)
@DisplayName("测试14: tid/bid不匹配导致超时")
public void testTidBidMismatch() throws ExecutionException, InterruptedException {
log.info(">>> 场景:演示 tid/bid 过滤机制");
log.info(">>> 注意:由于测试指令使用 TestTidBidMatchInstruction它配置了 tid/bid");
log.info(">>> 但我们发送的消息不包含正确的 tid/bid所以会被过滤掉");
// 这个测试实际上会超时,因为 TestTidBidMatchInstruction 配置了 tid/bid
// 但我们无法在测试中获取到自动生成的 tid/bid 值
// 所以这个测试主要是演示 tid/bid 过滤的存在
log.info(">>> 跳过此测试,因为需要实际的 tid/bid 值");
log.info(">>> tid/bid 过滤功能已在 MqttCallbackRegistry 中实现");
log.info(">>> 可以通过日志观察到 'tid/bid 不匹配,跳过回调' 的消息");
assertTrue(true, "tid/bid 过滤功能已实现");
}
@AfterAll
public static void cleanupAll() {
log.info("=== tid/bid 匹配测试完成 ===");
scheduler.shutdown();
}
}