style: format dc3-common, dc3-driver and dc3-e2e test code

This commit is contained in:
pnoker
2026-05-15 00:28:35 +08:00
parent ca0393ae7b
commit 74e16bfb30
65 changed files with 567 additions and 447 deletions
@@ -52,14 +52,14 @@ public class ChatClientConfig {
public static final String SYSTEM_PROMPT = """
You are an intelligent assistant for the IoT DC3 platform.
You can help users manage IoT devices, query real-time and historical data,
and perform device operations. You have access to the following capabilities:
- **Auth tools**: Read the current low-sensitivity tenant and user context.
- **Manager tools**: Query devices, drivers, and data points (metrics).
- **Data tools**: Read real-time point values, query historical data, and send read/write commands to devices.
Guidelines:
- Always confirm before sending write commands to physical devices.
- Present data in a clear, structured format.
@@ -64,6 +64,12 @@ class ChatClientFactoryTest {
private ChatClientFactory factory;
private static Field cacheField() throws NoSuchFieldException {
Field field = ChatClientFactory.class.getDeclaredField("cache");
field.setAccessible(true);
return field;
}
@BeforeEach
void setUp() {
factory = new ChatClientFactory(modelProviderManager, modelConfigManager, modelProviderBuilder,
@@ -109,10 +115,4 @@ class ChatClientFactoryTest {
factory.evict(2L);
assertThat(cache).isEmpty();
}
private static Field cacheField() throws NoSuchFieldException {
Field field = ChatClientFactory.class.getDeclaredField("cache");
field.setAccessible(true);
return field;
}
}
@@ -36,6 +36,17 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
class AgenticRequestContextTest {
private static RequestHeader.UserHeader userHeader(Long tenantId, Long userId) {
RequestHeader.UserHeader h = new RequestHeader.UserHeader();
h.setTenantId(tenantId);
h.setUserId(userId);
return h;
}
private static ToolContext toolContext(Map<String, Object> values) {
return new ToolContext(new HashMap<>(values));
}
@AfterEach
void cleanThreadLocal() {
AgenticRequestContext.clear();
@@ -159,15 +170,4 @@ class AgenticRequestContextTest {
AgenticRequestContext.recordToolInvocation(ctx, "tool", "domain", "desc");
AgenticRequestContext.recordToolInvocation(null, "tool", "domain", "desc");
}
private static RequestHeader.UserHeader userHeader(Long tenantId, Long userId) {
RequestHeader.UserHeader h = new RequestHeader.UserHeader();
h.setTenantId(tenantId);
h.setUserId(userId);
return h;
}
private static ToolContext toolContext(Map<String, Object> values) {
return new ToolContext(new HashMap<>(values));
}
}
@@ -29,7 +29,6 @@ import reactor.test.StepVerifier;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -22,10 +22,16 @@ import io.github.pnoker.common.agentic.skill.SkillRegistry;
import org.junit.jupiter.api.Test;
import reactor.test.StepVerifier;
import static org.assertj.core.api.Assertions.assertThat;
class SkillControllerTest {
private static SkillDefinition skill(String name, String description) {
SkillDefinition skill = new SkillDefinition();
skill.setName(name);
skill.setDescription(description);
skill.setEnabled(true);
return skill;
}
@Test
void listExposesEverySkillAsVO() {
SkillRegistry registry = new SkillRegistry();
@@ -55,12 +61,4 @@ class SkillControllerTest {
})
.verifyComplete();
}
private static SkillDefinition skill(String name, String description) {
SkillDefinition skill = new SkillDefinition();
skill.setName(name);
skill.setDescription(description);
skill.setEnabled(true);
return skill;
}
}
@@ -31,7 +31,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
@@ -64,7 +64,7 @@ class SessionServiceImplTest {
// SessionServiceImpl uses @Resource which @InjectMocks resolves by field name; the
// names match so injection should succeed but we re-set defensively in case the
// resolution misses.
for (String name : new String[] {"sessionBuilder", "sessionManager", "agenticChatMemory", "messageService"}) {
for (String name : new String[]{"sessionBuilder", "sessionManager", "agenticChatMemory", "messageService"}) {
Field f = SessionServiceImpl.class.getDeclaredField(name);
f.setAccessible(true);
if (f.get(service) == null) {
@@ -28,6 +28,12 @@ import static org.assertj.core.api.Assertions.assertThat;
class SkillLoaderTest {
private static SkillDefinition invokeMapToSkill(SkillLoader loader, Map<String, Object> map) throws Exception {
Method method = SkillLoader.class.getDeclaredMethod("mapToSkill", Map.class);
method.setAccessible(true);
return (SkillDefinition) method.invoke(loader, map);
}
@Test
void loaderRegistersAllEnabledProductionSkills() throws Exception {
SkillRegistry registry = new SkillRegistry();
@@ -81,10 +87,4 @@ class SkillLoaderTest {
SkillDefinition skill = invokeMapToSkill(loader, map);
assertThat(skill.getExamples()).isNull();
}
private static SkillDefinition invokeMapToSkill(SkillLoader loader, Map<String, Object> map) throws Exception {
Method method = SkillLoader.class.getDeclaredMethod("mapToSkill", Map.class);
method.setAccessible(true);
return (SkillDefinition) method.invoke(loader, map);
}
}
@@ -26,6 +26,16 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
class SkillRegistryTest {
private static SkillDefinition skill(String name, List<String> tools) {
SkillDefinition skill = new SkillDefinition();
skill.setName(name);
skill.setEnabled(true);
skill.setDescription("d");
skill.setSystemPromptAddition("");
skill.setTools(tools);
return skill;
}
@Test
void registerAndLookupBySkillName() {
SkillRegistry registry = new SkillRegistry();
@@ -92,14 +102,4 @@ class SkillRegistryTest {
registry.register(skill);
assertThat(registry.getEnabledToolNames("free-form")).isNull();
}
private static SkillDefinition skill(String name, List<String> tools) {
SkillDefinition skill = new SkillDefinition();
skill.setName(name);
skill.setEnabled(true);
skill.setDescription("d");
skill.setSystemPromptAddition("");
skill.setTools(tools);
return skill;
}
}
@@ -35,9 +35,13 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.lang.reflect.Field;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class TenantBindServiceImplTest {
@@ -39,9 +39,13 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.lang.reflect.Field;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class TenantServiceImplTest {
@@ -38,9 +38,13 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.lang.reflect.Field;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class UserLoginServiceImplTest {
@@ -39,7 +39,9 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.lang.reflect.Field;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -66,6 +66,11 @@ public class PointValueVO implements Serializable {
*/
private String calValue;
/**
* Numeric projection of calValue for aggregation queries.
*/
private Double numValue;
/**
* Driver ID
*/
@@ -34,7 +34,10 @@ import org.mockito.junit.jupiter.MockitoExtension;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DeviceEventServiceImplTest {
@@ -34,7 +34,10 @@ import org.mockito.junit.jupiter.MockitoExtension;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DriverEventServiceImplTest {
@@ -43,7 +43,10 @@ import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class PointValueCommandServiceImplTest {
@@ -39,9 +39,14 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class PointValueServiceImplTest {
@@ -35,7 +35,9 @@ import java.lang.reflect.Field;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@ExtendWith(MockitoExtension.class)
class ScheduleForDataServiceImplTest {
@@ -50,7 +50,9 @@ import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class PointValueServerTest {
@@ -38,7 +38,9 @@ import java.util.concurrent.Executors;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
@ExtendWith(MockitoExtension.class)
class PointValueJobTest {
@@ -30,7 +30,10 @@ import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
@ExtendWith(MockitoExtension.class)
class DeviceEventReceiverTest {
@@ -30,7 +30,9 @@ import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
@ExtendWith(MockitoExtension.class)
class DriverEventReceiverTest {
@@ -36,7 +36,9 @@ import java.lang.reflect.Field;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
@ExtendWith(MockitoExtension.class)
class PointValueReceiverTest {
@@ -33,7 +33,10 @@ import org.springframework.amqp.core.MessageProperties;
import java.lang.reflect.Field;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
@ExtendWith(MockitoExtension.class)
class DeviceCommandReceiverTest {
@@ -40,7 +40,9 @@ import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@ExtendWith(MockitoExtension.class)
class MetadataReceiverTest {
@@ -42,7 +42,10 @@ import java.util.Map;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DriverReadServiceImplTest {
@@ -35,7 +35,10 @@ import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
@ExtendWith(MockitoExtension.class)
class DriverScheduleServiceImplTest {
@@ -42,7 +42,10 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DriverSenderServiceImplTest {
@@ -41,7 +41,10 @@ import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DriverWriteServiceImplTest {
@@ -45,6 +45,21 @@ class ResourceRegistryLocalFacadeTest {
private ResourceRegistryLocalFacade facade;
private static FacadeScannedApiBO api(String method, String path, String name, String group) {
return FacadeScannedApiBO.builder()
.method(method)
.path(path)
.apiName(name)
.title(method.toLowerCase())
.remark("")
.apiGroup(group)
.build();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
@BeforeEach
void setUp() throws Exception {
facade = new ResourceRegistryLocalFacade();
@@ -126,19 +141,4 @@ class ResourceRegistryLocalFacadeTest {
org.mockito.Mockito.verify(resourceRegistrySyncService).sync(captor.capture());
assertThat(captor.getValue().getApis()).isEmpty();
}
private static FacadeScannedApiBO api(String method, String path, String name, String group) {
return FacadeScannedApiBO.builder()
.method(method)
.path(path)
.apiName(name)
.title(method.toLowerCase())
.remark("")
.apiGroup(group)
.build();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
}
@@ -45,6 +45,10 @@ class TenantLocalFacadeTest {
private TenantLocalFacade facade;
private static TenantBO any() {
return org.mockito.ArgumentMatchers.any();
}
@BeforeEach
void setUp() throws Exception {
facade = new TenantLocalFacade();
@@ -74,8 +78,4 @@ class TenantLocalFacadeTest {
field.setAccessible(true);
field.set(facade, value);
}
private static TenantBO any() {
return org.mockito.ArgumentMatchers.any();
}
}
@@ -45,6 +45,10 @@ class UserLocalFacadeTest {
private UserLocalFacade facade;
private static UserBO any() {
return org.mockito.ArgumentMatchers.any();
}
@BeforeEach
void setUp() throws Exception {
facade = new UserLocalFacade();
@@ -74,8 +78,4 @@ class UserLocalFacadeTest {
field.setAccessible(true);
field.set(facade, value);
}
private static UserBO any() {
return org.mockito.ArgumentMatchers.any();
}
}
@@ -46,6 +46,10 @@ class UserLoginLocalFacadeTest {
private UserLoginLocalFacade facade;
private static UserLoginBO any() {
return org.mockito.ArgumentMatchers.any();
}
@BeforeEach
void setUp() throws Exception {
facade = new UserLoginLocalFacade();
@@ -78,8 +82,4 @@ class UserLoginLocalFacadeTest {
field.setAccessible(true);
field.set(facade, value);
}
private static UserLoginBO any() {
return org.mockito.ArgumentMatchers.any();
}
}
@@ -49,6 +49,14 @@ class PointValueLocalFacadeTest {
private PointValueLocalFacade facade;
private static <T> T any() {
return org.mockito.ArgumentMatchers.any();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
@BeforeEach
void setUp() throws Exception {
facade = new PointValueLocalFacade();
@@ -109,12 +117,4 @@ class PointValueLocalFacadeTest {
field.setAccessible(true);
field.set(facade, value);
}
private static <T> T any() {
return org.mockito.ArgumentMatchers.any();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
}
@@ -51,6 +51,14 @@ class DeviceLocalFacadeTest {
private DeviceLocalFacade facade;
private static <T> T any() {
return org.mockito.ArgumentMatchers.any();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
@BeforeEach
void setUp() throws Exception {
facade = new DeviceLocalFacade();
@@ -172,12 +180,4 @@ class DeviceLocalFacadeTest {
field.setAccessible(true);
field.set(facade, value);
}
private static <T> T any() {
return org.mockito.ArgumentMatchers.any();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
}
@@ -51,6 +51,14 @@ class DriverLocalFacadeTest {
private DriverLocalFacade facade;
private static <T> T any() {
return org.mockito.ArgumentMatchers.any();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
@BeforeEach
void setUp() throws Exception {
facade = new DriverLocalFacade();
@@ -143,12 +151,4 @@ class DriverLocalFacadeTest {
field.setAccessible(true);
field.set(facade, value);
}
private static <T> T any() {
return org.mockito.ArgumentMatchers.any();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
}
@@ -51,6 +51,14 @@ class PointLocalFacadeTest {
private PointLocalFacade facade;
private static <T> T any() {
return org.mockito.ArgumentMatchers.any();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
@BeforeEach
void setUp() throws Exception {
facade = new PointLocalFacade();
@@ -120,12 +128,4 @@ class PointLocalFacadeTest {
field.setAccessible(true);
field.set(facade, value);
}
private static <T> T any() {
return org.mockito.ArgumentMatchers.any();
}
private static <T> T any(Class<T> clazz) {
return org.mockito.ArgumentMatchers.any(clazz);
}
}
@@ -42,7 +42,9 @@ import java.util.concurrent.atomic.AtomicReference;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class AuthenticGatewayFilterTest {
@@ -40,7 +40,9 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DriverRegisterServiceImplTest {
@@ -43,7 +43,9 @@ import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Reactive controller test that exercises DriverController through StepVerifier
@@ -36,7 +36,11 @@ import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class MetadataEventListenerTest {
@@ -49,7 +49,10 @@ import java.util.ArrayList;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DeviceServiceImplTest {
@@ -41,7 +41,9 @@ import java.util.List;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DriverAttributeServiceImplTest {
@@ -41,9 +41,13 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DriverServiceImplTest {
@@ -41,7 +41,9 @@ import java.util.List;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class PointAttributeServiceImplTest {
@@ -46,10 +46,15 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class PointServiceImplTest {
@@ -34,9 +34,13 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class ProfileBindServiceImplTest {
@@ -40,9 +40,13 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class ProfileServiceImplTest {
@@ -25,7 +25,9 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.offset;
class ArithmeticUtilTest {
@@ -38,7 +38,9 @@ import java.lang.reflect.Field;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class QuartzServiceTest {
@@ -33,9 +33,14 @@ import org.springframework.core.env.Environment;
import java.util.List;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class ResourceRegistrarTest {
@@ -1,4 +1,19 @@
-- Copyright 2016-present the IoT DC3 original author or authors.
/*
* Copyright 2016-present the IoT DC3 original author or authors.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Affero General Public License as
@@ -72,6 +72,26 @@ class ListeningVirtualDriverCustomServiceImplTest {
private ListeningVirtualDriverCustomServiceImpl service;
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(Long id) {
PointBO point = new PointBO();
point.setId(id);
return point;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
@BeforeEach
void setUp() throws Exception {
service = new ListeningVirtualDriverCustomServiceImpl();
@@ -167,24 +187,4 @@ class ListeningVirtualDriverCustomServiceImplTest {
field.setAccessible(true);
field.set(service, value);
}
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(Long id) {
PointBO point = new PointBO();
point.setId(id);
return point;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
}
@@ -82,6 +82,56 @@ class ModbusTcpDriverCustomServiceImplTest {
private ModbusFactory previousFactory;
private static ModbusFactory swapStaticFactory(ModbusFactory replacement) throws Exception {
Field field = ModbusTcpDriverCustomServiceImpl.class.getDeclaredField("modbusFactory");
field.setAccessible(true);
ModbusFactory previous = (ModbusFactory) field.get(null);
field.set(null, replacement);
return previous;
}
private static Map<String, AttributeBO> driverConfig(String host, int port) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("host", AttributeBO.builder().value(host).type(AttributeTypeFlagEnum.STRING).build());
m.put("port", AttributeBO.builder().value(String.valueOf(port)).type(AttributeTypeFlagEnum.INT).build());
return m;
}
private static Map<String, AttributeBO> pointConfig(int slaveId, int functionCode, int offset) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("slaveId",
AttributeBO.builder().value(String.valueOf(slaveId)).type(AttributeTypeFlagEnum.INT).build());
m.put("functionCode",
AttributeBO.builder().value(String.valueOf(functionCode)).type(AttributeTypeFlagEnum.INT).build());
m.put("offset", AttributeBO.builder().value(String.valueOf(offset)).type(AttributeTypeFlagEnum.INT).build());
return m;
}
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(PointTypeFlagEnum type) {
PointBO point = new PointBO();
point.setId(1L);
point.setPointTypeFlag(type);
return point;
}
private static WValue wValue(String value, PointTypeFlagEnum type) {
return WValue.builder().value(value).type(type).build();
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
@BeforeEach
void setUp() throws Exception {
service = new ModbusTcpDriverCustomServiceImpl();
@@ -152,7 +202,7 @@ class ModbusTcpDriverCustomServiceImplTest {
assertThatThrownBy(() -> service.read(driverConfig("host", 1502), pointConfig(1, 1, 0), device(7L),
point(PointTypeFlagEnum.INT))).isInstanceOf(ConnectorException.class)
.hasMessageContaining("offline");
.hasMessageContaining("offline");
}
@Test
@@ -163,11 +213,11 @@ class ModbusTcpDriverCustomServiceImplTest {
assertThat(
service.read(driverConfig("h", 1), pointConfig(1, 1, 0), device(2L), point(PointTypeFlagEnum.BOOLEAN))
.getValue())
.isEqualTo("true");
.isEqualTo("true");
assertThat(
service.read(driverConfig("h", 1), pointConfig(1, 2, 0), device(2L), point(PointTypeFlagEnum.BOOLEAN))
.getValue())
.isEqualTo("false");
.isEqualTo("false");
assertThat(service.read(driverConfig("h", 1), pointConfig(1, 3, 0), device(2L), point(PointTypeFlagEnum.INT))
.getValue()).isEqualTo("42");
assertThat(service.read(driverConfig("h", 1), pointConfig(1, 4, 0), device(2L), point(PointTypeFlagEnum.INT))
@@ -190,7 +240,7 @@ class ModbusTcpDriverCustomServiceImplTest {
assertThatThrownBy(() -> service.read(driverConfig("h", 1), pointConfig(1, 3, 0), device(3L),
point(PointTypeFlagEnum.INT))).isInstanceOf(ReadPointException.class)
.hasMessageContaining("rs485 down");
.hasMessageContaining("rs485 down");
}
@Test
@@ -203,7 +253,7 @@ class ModbusTcpDriverCustomServiceImplTest {
assertThatThrownBy(() -> service.read(driverConfig("h", 1), pointConfig(1, 4, 0), device(3L),
point(PointTypeFlagEnum.INT))).isInstanceOf(ReadPointException.class)
.hasMessageContaining("illegal data address");
.hasMessageContaining("illegal data address");
}
@Test
@@ -238,8 +288,8 @@ class ModbusTcpDriverCustomServiceImplTest {
assertThatThrownBy(() -> service.write(driverConfig("h", 1), pointConfig(1, 1, 0), device(7L),
point(PointTypeFlagEnum.BOOLEAN), wValue("true", PointTypeFlagEnum.BOOLEAN)))
.isInstanceOf(WritePointException.class)
.hasMessageContaining("transport reset");
.isInstanceOf(WritePointException.class)
.hasMessageContaining("transport reset");
}
@Test
@@ -259,8 +309,8 @@ class ModbusTcpDriverCustomServiceImplTest {
assertThatThrownBy(() -> service.write(driverConfig("h", 1), pointConfig(1, 3, 0), device(8L),
point(PointTypeFlagEnum.FLOAT), wValue("1.0", PointTypeFlagEnum.FLOAT)))
.isInstanceOf(WritePointException.class)
.hasMessageContaining("offline");
.isInstanceOf(WritePointException.class)
.hasMessageContaining("offline");
}
@Test
@@ -278,54 +328,4 @@ class ModbusTcpDriverCustomServiceImplTest {
field.setAccessible(true);
field.set(service, value);
}
private static ModbusFactory swapStaticFactory(ModbusFactory replacement) throws Exception {
Field field = ModbusTcpDriverCustomServiceImpl.class.getDeclaredField("modbusFactory");
field.setAccessible(true);
ModbusFactory previous = (ModbusFactory) field.get(null);
field.set(null, replacement);
return previous;
}
private static Map<String, AttributeBO> driverConfig(String host, int port) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("host", AttributeBO.builder().value(host).type(AttributeTypeFlagEnum.STRING).build());
m.put("port", AttributeBO.builder().value(String.valueOf(port)).type(AttributeTypeFlagEnum.INT).build());
return m;
}
private static Map<String, AttributeBO> pointConfig(int slaveId, int functionCode, int offset) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("slaveId",
AttributeBO.builder().value(String.valueOf(slaveId)).type(AttributeTypeFlagEnum.INT).build());
m.put("functionCode",
AttributeBO.builder().value(String.valueOf(functionCode)).type(AttributeTypeFlagEnum.INT).build());
m.put("offset", AttributeBO.builder().value(String.valueOf(offset)).type(AttributeTypeFlagEnum.INT).build());
return m;
}
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(PointTypeFlagEnum type) {
PointBO point = new PointBO();
point.setId(1L);
point.setPointTypeFlag(type);
return point;
}
private static WValue wValue(String value, PointTypeFlagEnum type) {
return WValue.builder().value(value).type(type).build();
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
}
@@ -42,6 +42,16 @@ class MqttReceiveServiceImplTest {
private MqttReceiveServiceImpl service;
private static MqttMessage mqttMessage(String topic, int qos, String payload) {
MessageHeader header = new MessageHeader(null);
header.setMqttReceivedTopic(topic);
header.setMqttReceivedQos(qos);
MqttMessage msg = new MqttMessage();
msg.setHeader(header);
msg.setPayload(payload);
return msg;
}
@BeforeEach
void setUp() throws Exception {
service = new MqttReceiveServiceImpl();
@@ -95,14 +105,4 @@ class MqttReceiveServiceImplTest {
verify(driverSenderService).pointValueSender(org.mockito.ArgumentMatchers.any(PointValue.class));
}
private static MqttMessage mqttMessage(String topic, int qos, String payload) {
MessageHeader header = new MessageHeader(null);
header.setMqttReceivedTopic(topic);
header.setMqttReceivedQos(qos);
MqttMessage msg = new MqttMessage();
msg.setHeader(header);
msg.setPayload(payload);
return msg;
}
}
@@ -64,6 +64,26 @@ class MqttDriverCustomServiceImplTest {
private MqttDriverCustomServiceImpl service;
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(Long id) {
PointBO point = new PointBO();
point.setId(id);
return point;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
@BeforeEach
void setUp() throws Exception {
service = new MqttDriverCustomServiceImpl();
@@ -153,24 +173,4 @@ class MqttDriverCustomServiceImplTest {
field.setAccessible(true);
field.set(service, value);
}
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(Long id) {
PointBO point = new PointBO();
point.setId(id);
return point;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
}
@@ -63,6 +63,21 @@ class OpcDaDriverCustomServiceImplTest {
private OpcDaDriverCustomServiceImpl service;
private static Map<String, AttributeBO> pointConfig(String group, String tag) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("group", AttributeBO.builder().value(group).type(AttributeTypeFlagEnum.STRING).build());
m.put("tag", AttributeBO.builder().value(tag).type(AttributeTypeFlagEnum.STRING).build());
return m;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
@BeforeEach
void setUp() throws Exception {
service = new OpcDaDriverCustomServiceImpl();
@@ -271,19 +286,4 @@ class OpcDaDriverCustomServiceImplTest {
field.setAccessible(true);
field.set(service, value);
}
private static Map<String, AttributeBO> pointConfig(String group, String tag) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("group", AttributeBO.builder().value(group).type(AttributeTypeFlagEnum.STRING).build());
m.put("tag", AttributeBO.builder().value(tag).type(AttributeTypeFlagEnum.STRING).build());
return m;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
}
@@ -35,9 +35,9 @@ import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
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.MockedStatic;
import org.mockito.Mockito;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.lang.reflect.Field;
@@ -71,6 +71,54 @@ class OpcUaDriverCustomServiceImplTest {
private OpcUaDriverCustomServiceImpl service;
private static Map<String, AttributeBO> driverConfig(String host, int port, String path) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("host", AttributeBO.builder().value(host).type(AttributeTypeFlagEnum.STRING).build());
m.put("port", AttributeBO.builder().value(String.valueOf(port)).type(AttributeTypeFlagEnum.INT).build());
m.put("path", AttributeBO.builder().value(path).type(AttributeTypeFlagEnum.STRING).build());
return m;
}
private static Map<String, AttributeBO> pointConfig(int namespace, String tag) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("namespace",
AttributeBO.builder().value(String.valueOf(namespace)).type(AttributeTypeFlagEnum.INT).build());
m.put("tag", AttributeBO.builder().value(tag).type(AttributeTypeFlagEnum.STRING).build());
return m;
}
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(PointTypeFlagEnum type) {
PointBO point = new PointBO();
point.setId(1L);
point.setPointTypeFlag(type);
return point;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
// Reference unused to keep imports stable for future expansion.
@SuppressWarnings("unused")
private static List<EndpointDescription> sampleEndpoints() {
return List.of();
}
@SuppressWarnings("unused")
private static Optional<EndpointDescription> sampleSelector() {
return Optional.empty();
}
@BeforeEach
void setUp() throws Exception {
service = new OpcUaDriverCustomServiceImpl();
@@ -144,7 +192,7 @@ class OpcUaDriverCustomServiceImplTest {
assertThatThrownBy(() -> service.read(driverConfig("h", 4840, "/"), pointConfig(2, "tag.x"),
device(1L), point(PointTypeFlagEnum.STRING))).isInstanceOf(ConnectorException.class)
.hasMessageContaining("endpoint refused");
.hasMessageContaining("endpoint refused");
assertThat(connectionMap()).doesNotContainKey(1L);
}
}
@@ -188,52 +236,4 @@ class OpcUaDriverCustomServiceImplTest {
field.setAccessible(true);
field.set(service, value);
}
private static Map<String, AttributeBO> driverConfig(String host, int port, String path) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("host", AttributeBO.builder().value(host).type(AttributeTypeFlagEnum.STRING).build());
m.put("port", AttributeBO.builder().value(String.valueOf(port)).type(AttributeTypeFlagEnum.INT).build());
m.put("path", AttributeBO.builder().value(path).type(AttributeTypeFlagEnum.STRING).build());
return m;
}
private static Map<String, AttributeBO> pointConfig(int namespace, String tag) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("namespace",
AttributeBO.builder().value(String.valueOf(namespace)).type(AttributeTypeFlagEnum.INT).build());
m.put("tag", AttributeBO.builder().value(tag).type(AttributeTypeFlagEnum.STRING).build());
return m;
}
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(PointTypeFlagEnum type) {
PointBO point = new PointBO();
point.setId(1L);
point.setPointTypeFlag(type);
return point;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
// Reference unused to keep imports stable for future expansion.
@SuppressWarnings("unused")
private static List<EndpointDescription> sampleEndpoints() {
return List.of();
}
@SuppressWarnings("unused")
private static Optional<EndpointDescription> sampleSelector() {
return Optional.empty();
}
}
@@ -37,9 +37,9 @@ import io.github.pnoker.driver.bean.PlcS7PointVariable;
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.MockedStatic;
import org.mockito.Mockito;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.lang.reflect.Field;
@@ -75,6 +75,51 @@ class PlcS7DriverCustomServiceImplTest {
private PlcS7DriverCustomServiceImpl service;
private static Map<String, AttributeBO> driverConfig(String host, int port) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("host", AttributeBO.builder().value(host).type(AttributeTypeFlagEnum.STRING).build());
m.put("port", AttributeBO.builder().value(String.valueOf(port)).type(AttributeTypeFlagEnum.INT).build());
return m;
}
private static Map<String, AttributeBO> pointConfig(int dbNum, int byteOffset, int bitOffset, int blockSize) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("dbNum", AttributeBO.builder().value(String.valueOf(dbNum)).type(AttributeTypeFlagEnum.INT).build());
m.put("byteOffset",
AttributeBO.builder().value(String.valueOf(byteOffset)).type(AttributeTypeFlagEnum.INT).build());
m.put("bitOffset",
AttributeBO.builder().value(String.valueOf(bitOffset)).type(AttributeTypeFlagEnum.INT).build());
m.put("blockSize",
AttributeBO.builder().value(String.valueOf(blockSize)).type(AttributeTypeFlagEnum.INT).build());
return m;
}
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(PointTypeFlagEnum type, String pointName) {
PointBO point = new PointBO();
point.setId(1L);
point.setPointTypeFlag(type);
point.setPointName(pointName);
return point;
}
private static WValue wValue(String value, PointTypeFlagEnum type) {
return WValue.builder().value(value).type(type).build();
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
@BeforeEach
void setUp() throws Exception {
service = new PlcS7DriverCustomServiceImpl();
@@ -235,49 +280,4 @@ class PlcS7DriverCustomServiceImplTest {
field.setAccessible(true);
field.set(service, value);
}
private static Map<String, AttributeBO> driverConfig(String host, int port) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("host", AttributeBO.builder().value(host).type(AttributeTypeFlagEnum.STRING).build());
m.put("port", AttributeBO.builder().value(String.valueOf(port)).type(AttributeTypeFlagEnum.INT).build());
return m;
}
private static Map<String, AttributeBO> pointConfig(int dbNum, int byteOffset, int bitOffset, int blockSize) {
Map<String, AttributeBO> m = new HashMap<>();
m.put("dbNum", AttributeBO.builder().value(String.valueOf(dbNum)).type(AttributeTypeFlagEnum.INT).build());
m.put("byteOffset",
AttributeBO.builder().value(String.valueOf(byteOffset)).type(AttributeTypeFlagEnum.INT).build());
m.put("bitOffset",
AttributeBO.builder().value(String.valueOf(bitOffset)).type(AttributeTypeFlagEnum.INT).build());
m.put("blockSize",
AttributeBO.builder().value(String.valueOf(blockSize)).type(AttributeTypeFlagEnum.INT).build());
return m;
}
private static DeviceBO device(Long id) {
DeviceBO device = new DeviceBO();
device.setId(id);
return device;
}
private static PointBO point(PointTypeFlagEnum type, String pointName) {
PointBO point = new PointBO();
point.setId(1L);
point.setPointTypeFlag(type);
point.setPointName(pointName);
return point;
}
private static WValue wValue(String value, PointTypeFlagEnum type) {
return WValue.builder().value(value).type(type).build();
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
}
@@ -58,6 +58,22 @@ class VirtualDriverCustomServiceImplTest {
@InjectMocks
private VirtualDriverCustomServiceImpl service;
private static PointBO pointOfType(PointTypeFlagEnum type) {
PointBO point = new PointBO();
point.setId(1L);
point.setPointName("p");
point.setPointTypeFlag(type);
return point;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
@BeforeEach
void setUp() throws Exception {
// @InjectMocks resolves @Resource via reflection in the same class re-assert
@@ -123,7 +139,7 @@ class VirtualDriverCustomServiceImplTest {
@Test
void readProducesNumericValueInRangeForOtherPointTypes() {
for (PointTypeFlagEnum type : new PointTypeFlagEnum[] {
for (PointTypeFlagEnum type : new PointTypeFlagEnum[]{
PointTypeFlagEnum.INT, PointTypeFlagEnum.LONG, PointTypeFlagEnum.FLOAT, PointTypeFlagEnum.DOUBLE,
PointTypeFlagEnum.BYTE, PointTypeFlagEnum.SHORT
}) {
@@ -141,20 +157,4 @@ class VirtualDriverCustomServiceImplTest {
assertThat(result).isFalse();
verify(driverSenderService, never()).pointValueSender(org.mockito.ArgumentMatchers.anyList());
}
private static PointBO pointOfType(PointTypeFlagEnum type) {
PointBO point = new PointBO();
point.setId(1L);
point.setPointName("p");
point.setPointTypeFlag(type);
return point;
}
private static MetadataEventDTO metadataEvent(MetadataTypeEnum type, MetadataOperateTypeEnum op, Long id) {
MetadataEventDTO event = new MetadataEventDTO();
event.setMetadataType(type);
event.setOperateType(op);
event.setId(id);
return event;
}
}
@@ -43,8 +43,8 @@ class HarnessSmokeIT extends BaseE2eIT {
void postgresIsReachableAndAcceptsSimpleQueries() throws Exception {
try (java.sql.Connection conn = DriverManager.getConnection(
E2eStack.postgresJdbcUrl(), E2eStack.postgresUsername(), E2eStack.postgresPassword());
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 1")) {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 1")) {
assertThat(rs.next()).isTrue();
assertThat(rs.getInt(1)).isEqualTo(1);
}
@@ -35,12 +35,12 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* Validates the assumptions production point-value persistence relies on:
* - the dc3 schema can mount the timescaledb extension
* - the dc3 schema can mount the pgvector extension
* - a hypertable on (time, device_id, point_id) accepts batched inserts and
* retains them across queries
* - a continuous-aggregate-style time_bucket query returns expected aggregates
*
* - the dc3 schema can mount the timescaledb extension
* - the dc3 schema can mount the pgvector extension
* - a hypertable on (time, device_id, point_id) accepts batched inserts and
* retains them across queries
* - a continuous-aggregate-style time_bucket query returns expected aggregates
* <p>
* Disabled by default; opt in with {@code DC3_E2E=true}.
*/
@EnabledIfEnvironmentVariable(named = "DC3_E2E", matches = "(?i)true|1|yes|on")
@@ -80,10 +80,10 @@ class PostgresHypertableIT extends BaseE2eIT {
}
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT time_bucket('1 minute', time), count(*), avg(cal_value), min(cal_value),"
+ " max(cal_value) FROM dc3_point_value_e2e"
+ " WHERE device_id = 1 AND point_id = 100 GROUP BY 1")) {
ResultSet rs = stmt.executeQuery(
"SELECT time_bucket('1 minute', time), count(*), avg(cal_value), min(cal_value),"
+ " max(cal_value) FROM dc3_point_value_e2e"
+ " WHERE device_id = 1 AND point_id = 100 GROUP BY 1")) {
assertThat(rs.next()).isTrue();
assertThat(rs.getInt(2)).isEqualTo(10);
assertThat(rs.getDouble(3)).isEqualTo(24.5, org.assertj.core.data.Offset.offset(0.0001));
@@ -93,9 +93,9 @@ class PostgresHypertableIT extends BaseE2eIT {
}
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT count(*) FROM timescaledb_information.hypertables"
+ " WHERE hypertable_name = 'dc3_point_value_e2e'")) {
ResultSet rs = stmt.executeQuery(
"SELECT count(*) FROM timescaledb_information.hypertables"
+ " WHERE hypertable_name = 'dc3_point_value_e2e'")) {
assertThat(rs.next()).isTrue();
assertThat(rs.getInt(1)).isEqualTo(1);
}
@@ -143,34 +143,34 @@ class PostgresHypertableIT extends BaseE2eIT {
}
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT count(*) FROM pg_extension WHERE extname IN ('timescaledb', 'vector')")) {
ResultSet rs = stmt.executeQuery(
"SELECT count(*) FROM pg_extension WHERE extname IN ('timescaledb', 'vector')")) {
assertThat(rs.next()).isTrue();
assertThat(rs.getInt(1)).isEqualTo(2);
}
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT vector_dims(embedding) FROM dc3_embedding_e2e WHERE id = 1")) {
ResultSet rs = stmt.executeQuery(
"SELECT vector_dims(embedding) FROM dc3_embedding_e2e WHERE id = 1")) {
assertThat(rs.next()).isTrue();
assertThat(rs.getInt(1)).isEqualTo(3);
}
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT name, embedding <-> '[0.11,0.19,0.31]'::vector AS distance"
+ " FROM dc3_embedding_e2e ORDER BY embedding <-> '[0.11,0.19,0.31]'::vector"
+ " LIMIT 1")) {
ResultSet rs = stmt.executeQuery(
"SELECT name, embedding <-> '[0.11,0.19,0.31]'::vector AS distance"
+ " FROM dc3_embedding_e2e ORDER BY embedding <-> '[0.11,0.19,0.31]'::vector"
+ " LIMIT 1")) {
assertThat(rs.next()).isTrue();
assertThat(rs.getString(1)).isEqualTo("temperature");
assertThat(rs.getDouble(2)).isLessThan(0.03);
}
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT indexdef FROM pg_indexes"
+ " WHERE tablename = 'dc3_embedding_e2e'"
+ " AND indexname = 'dc3_embedding_e2e_hnsw_idx'")) {
ResultSet rs = stmt.executeQuery(
"SELECT indexdef FROM pg_indexes"
+ " WHERE tablename = 'dc3_embedding_e2e'"
+ " AND indexname = 'dc3_embedding_e2e_hnsw_idx'")) {
assertThat(rs.next()).isTrue();
assertThat(rs.getString(1)).contains("USING hnsw", "vector_l2_ops");
}
@@ -35,25 +35,34 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static org.awaitility.Awaitility.await;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.awaitility.Awaitility.await;
/**
* Locks the RabbitMQ delivery contract DC3 relies on:
* - publisher-confirm-mode=correlated guarantees the broker acks every routed message
* - mandatory=true with a return listener fires on unroutable messages
* - manual consumer ack drains a queue exactly once
*
* - publisher-confirm-mode=correlated guarantees the broker acks every routed message
* - mandatory=true with a return listener fires on unroutable messages
* - manual consumer ack drains a queue exactly once
* <p>
* Disabled by default; opt in with {@code DC3_E2E=true}.
*/
@EnabledIfEnvironmentVariable(named = "DC3_E2E", matches = "(?i)true|1|yes|on")
class RabbitDeliveryIT extends BaseE2eIT {
private static Connection newConnection() throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(E2eStack.rabbitHost());
factory.setPort(E2eStack.rabbitAmqpPort());
factory.setUsername(E2eStack.rabbitUsername());
factory.setPassword(E2eStack.rabbitPassword());
return factory.newConnection();
}
@Test
void confirmedPublishRoutesMessageToBoundQueue() throws Exception {
try (Connection conn = newConnection();
Channel channel = conn.createChannel()) {
Channel channel = conn.createChannel()) {
channel.confirmSelect();
String exchange = "dc3.e2e.exchange." + UUID.randomUUID();
String queue = "dc3.e2e.queue." + UUID.randomUUID();
@@ -72,7 +81,7 @@ class RabbitDeliveryIT extends BaseE2eIT {
@Test
void mandatoryReturnsUnroutableMessageThroughReturnListener() throws Exception {
try (Connection conn = newConnection();
Channel channel = conn.createChannel()) {
Channel channel = conn.createChannel()) {
CompletableFuture<String> returned = new CompletableFuture<>();
channel.addReturnListener(ret -> returned.complete(new String(ret.getBody(), StandardCharsets.UTF_8)));
@@ -90,7 +99,7 @@ class RabbitDeliveryIT extends BaseE2eIT {
@Test
void manualAckDrainsQueueExactlyOnce() throws Exception {
try (Connection conn = newConnection();
Channel channel = conn.createChannel()) {
Channel channel = conn.createChannel()) {
String exchange = "dc3.e2e.exchange." + UUID.randomUUID();
String queue = "dc3.e2e.queue." + UUID.randomUUID();
channel.exchangeDeclare(exchange, BuiltinExchangeType.DIRECT, false, true, null);
@@ -131,7 +140,7 @@ class RabbitDeliveryIT extends BaseE2eIT {
@Test
void waitForConfirmsWithoutPendingPublishesCompletesImmediately() throws Exception {
try (Connection conn = newConnection();
Channel channel = conn.createChannel()) {
Channel channel = conn.createChannel()) {
channel.confirmSelect();
assertThat(channel.waitForConfirms(50L)).isTrue();
}
@@ -140,15 +149,19 @@ class RabbitDeliveryIT extends BaseE2eIT {
@Test
void exclusiveQueueRejectsConsumerOnDifferentConnection() throws Exception {
try (Connection owner = newConnection();
Connection other = newConnection();
Channel first = owner.createChannel()) {
Connection other = newConnection();
Channel first = owner.createChannel()) {
String queue = "dc3.e2e.exclusive." + UUID.randomUUID();
first.queueDeclare(queue, false, true, false, null);
first.basicConsume(queue, true, "c1", (tag, delivery) -> {}, tag -> {});
first.basicConsume(queue, true, "c1", (tag, delivery) -> {
}, tag -> {
});
Channel second = other.createChannel();
try {
assertThatThrownBy(() -> second.basicConsume(queue, true, "c2", (tag, delivery) -> {}, tag -> {}))
assertThatThrownBy(() -> second.basicConsume(queue, true, "c2", (tag, delivery) -> {
}, tag -> {
}))
.isInstanceOf(java.io.IOException.class)
.hasRootCauseInstanceOf(com.rabbitmq.client.ShutdownSignalException.class)
.hasStackTraceContaining("RESOURCE_LOCKED");
@@ -172,13 +185,4 @@ class RabbitDeliveryIT extends BaseE2eIT {
assertThatThrownBy(factory::newConnection)
.isInstanceOfAny(java.io.IOException.class, TimeoutException.class);
}
private static Connection newConnection() throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(E2eStack.rabbitHost());
factory.setPort(E2eStack.rabbitAmqpPort());
factory.setUsername(E2eStack.rabbitUsername());
factory.setPassword(E2eStack.rabbitPassword());
return factory.newConnection();
}
}
@@ -17,6 +17,8 @@
package io.github.pnoker.e2e;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer;
import io.github.pnoker.e2e.harness.BaseE2eIT;
import io.restassured.RestAssured;
import io.restassured.config.RestAssuredConfig;
@@ -30,9 +32,6 @@ import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer;
import static io.restassured.RestAssured.given;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.equalTo;
@@ -40,17 +39,17 @@ import static org.hamcrest.Matchers.notNullValue;
/**
* Pins the rest-assured wiring shape that the platform-driven E2E flows will use:
* - JSON request and response shaping
* - status code + body matchers
* - {@link io.restassured.config.RestAssuredConfig} default content type override so
* non-JSON content types do not silently parse as form
*
* - JSON request and response shaping
* - status code + body matchers
* - {@link io.restassured.config.RestAssuredConfig} default content type override so
* non-JSON content types do not silently parse as form
* <p>
* The platform-image-driven user-flow scenarios (login, driver registration, write
* point value, gateway 401, cross-tenant isolation, OFFLINE auto-status, command
* round-trip, DLX requeue, agentic via WireMock, CSV import, token rotation) will
* extend this harness once dc3-center-* and dc3-driver-* publish immutable image
* tags suitable for CI. Until then the dependency on rest-assured is locked here.
*
* <p>
* Disabled by default; opt in with {@code DC3_E2E=true}.
*/
@EnabledIfEnvironmentVariable(named = "DC3_E2E", matches = "(?i)true|1|yes|on")