This is an automated email from the ASF dual-hosted git repository. shown pushed a commit to branch 0306-yuluo/feat in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
commit 136f908fd9990a333b326c49cf384ba80aae1d18 Author: yuluo-yx <[email protected]> AuthorDate: Fri Mar 6 21:13:04 2026 +0800 feat[common]: add hertzbeat common protocol entitiy check Signed-off-by: yuluo-yx <[email protected]> --- .../entity/job/protocol/CommonRequestProtocol.java | 2 +- .../common/entity/job/protocol/DnsSdProtocol.java | 16 +- .../common/entity/job/protocol/HttpSdProtocol.java | 8 +- .../common/entity/job/protocol/ModbusProtocol.java | 18 +- .../common/entity/job/protocol/PlcProtocol.java | 18 +- .../common/entity/job/protocol/S7Protocol.java | 21 +- .../entity/job/protocol/DnsSdProtocolTest.java | 139 ++++++++++++++ .../entity/job/protocol/HttpSdProtocolTest.java | 90 +++++++++ .../entity/job/protocol/ModbusProtocolTest.java | 161 ++++++++++++++++ .../entity/job/protocol/PlcProtocolTest.java | 161 ++++++++++++++++ .../common/entity/job/protocol/S7ProtocolTest.java | 211 +++++++++++++++++++++ 11 files changed, 830 insertions(+), 15 deletions(-) diff --git a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/CommonRequestProtocol.java b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/CommonRequestProtocol.java index b5e0edd6ef..74cb93a1da 100644 --- a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/CommonRequestProtocol.java +++ b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/CommonRequestProtocol.java @@ -18,7 +18,7 @@ package org.apache.hertzbeat.common.entity.job.protocol; /** - * Define common field method for each protocol in {@link org.apache.hertzbeat.common.entity.job.Metrics} + * Define common field method for each protocol in Metrics. */ public interface CommonRequestProtocol { diff --git a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/DnsSdProtocol.java b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/DnsSdProtocol.java index b2d00590ed..f2a5089552 100644 --- a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/DnsSdProtocol.java +++ b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/DnsSdProtocol.java @@ -21,6 +21,10 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; + +import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort; +import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain; /** * Dns protocol @@ -41,8 +45,16 @@ public class DnsSdProtocol implements Protocol { @Override public boolean isInvalid() { + if (!validateIpDomain(host) || !validPort(port)) { + return true; + } + if (StringUtils.isAnyBlank(recordType, recordName)) { + return true; + } + return !isValidRecordType(recordType); + } - // todo: add - return true; + private boolean isValidRecordType(String type) { + return type.matches("^(?i)(A|AAAA|CNAME|MX|TXT|NS|SRV|PTR|SOA|CAA)$"); } } diff --git a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/HttpSdProtocol.java b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/HttpSdProtocol.java index a90751df81..e30a1f9fea 100644 --- a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/HttpSdProtocol.java +++ b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/HttpSdProtocol.java @@ -21,6 +21,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; /** * Dns protocol @@ -35,8 +36,9 @@ public class HttpSdProtocol implements Protocol { @Override public boolean isInvalid() { - - // todo: add - return true; + if (StringUtils.isBlank(url)) { + return true; + } + return !url.matches("^(?i)https?://.+"); } } diff --git a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/ModbusProtocol.java b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/ModbusProtocol.java index b08840dce3..4d7a08a779 100644 --- a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/ModbusProtocol.java +++ b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/ModbusProtocol.java @@ -21,9 +21,14 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.apache.hertzbeat.common.util.CommonUtil; import java.util.List; +import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort; +import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain; + /** * Modbus Protocol @@ -55,8 +60,15 @@ public class ModbusProtocol implements Protocol { @Override public boolean isInvalid() { - - // todo: add - return true; + if (!validateIpDomain(host) || !validPort(port)) { + return true; + } + if (StringUtils.isAnyBlank(driverName, addressSyntax, slaveId)) { + return true; + } + if (StringUtils.isNotBlank(timeout) && !CommonUtil.isNumeric(timeout)) { + return true; + } + return registerAddresses == null || registerAddresses.isEmpty(); } } diff --git a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/PlcProtocol.java b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/PlcProtocol.java index bbcc01b1c9..51024b198e 100644 --- a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/PlcProtocol.java +++ b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/PlcProtocol.java @@ -22,9 +22,14 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.apache.hertzbeat.common.util.CommonUtil; import java.util.List; +import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort; +import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain; + /** * Plc Protocol */ @@ -54,9 +59,16 @@ public class PlcProtocol implements Protocol { @Override public boolean isInvalid() { - - // todo: add - return true; + if (!validateIpDomain(host) || !validPort(port)) { + return true; + } + if (StringUtils.isAnyBlank(driverName, addressSyntax, slaveId)) { + return true; + } + if (StringUtils.isNotBlank(timeout) && !CommonUtil.isNumeric(timeout)) { + return true; + } + return registerAddresses == null || registerAddresses.isEmpty(); } } diff --git a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/S7Protocol.java b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/S7Protocol.java index bfcd18d0ab..d14b75be9c 100644 --- a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/S7Protocol.java +++ b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/S7Protocol.java @@ -21,9 +21,14 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.apache.hertzbeat.common.util.CommonUtil; import java.util.List; +import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort; +import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain; + /** * Modbus Protocol @@ -59,8 +64,18 @@ public class S7Protocol implements Protocol { @Override public boolean isInvalid() { - - // todo: add - return true; + if (!validateIpDomain(host) || !validPort(port)) { + return true; + } + if (StringUtils.isAnyBlank(driverName, addressSyntax, controllerType)) { + return true; + } + if (!CommonUtil.isNumeric(rackId) || !CommonUtil.isNumeric(slotId)) { + return true; + } + if (StringUtils.isNotBlank(timeout) && !CommonUtil.isNumeric(timeout)) { + return true; + } + return registerAddresses == null || registerAddresses.isEmpty(); } } diff --git a/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/DnsSdProtocolTest.java b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/DnsSdProtocolTest.java new file mode 100644 index 0000000000..2194178018 --- /dev/null +++ b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/DnsSdProtocolTest.java @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.hertzbeat.common.entity.job.protocol; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class DnsSdProtocolTest { + + @Test + void isInvalidValidProtocol() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("192.168.1.1") + .port("53") + .recordType("A") + .recordName("example.com") + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidValidProtocolWithIpv6() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("::1") + .port("53") + .recordType("AAAA") + .recordName("example.com") + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidValidProtocolWithLocalhost() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("localhost") + .port("53") + .recordType("CNAME") + .recordName("www.example.com") + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidHost() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("") + .port("53") + .recordType("A") + .recordName("example.com") + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidPort() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("192.168.1.1") + .port("99999") + .recordType("A") + .recordName("example.com") + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankRecordType() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("192.168.1.1") + .port("53") + .recordType("") + .recordName("example.com") + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankRecordName() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("192.168.1.1") + .port("53") + .recordType("A") + .recordName("") + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidRecordType() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("192.168.1.1") + .port("53") + .recordType("INVALID") + .recordName("example.com") + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidValidRecordTypes() { + String[] validTypes = {"A", "AAAA", "CNAME", "MX", "TXT", "NS", "SRV", "PTR", "SOA", "CAA"}; + for (String type : validTypes) { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("192.168.1.1") + .port("53") + .recordType(type) + .recordName("example.com") + .build(); + assertFalse(protocol.isInvalid(), "Record type " + type + " should be valid"); + } + } + + @Test + void isInvalidValidRecordTypesCaseInsensitive() { + DnsSdProtocol protocol = DnsSdProtocol.builder() + .host("192.168.1.1") + .port("53") + .recordType("a") + .recordName("example.com") + .build(); + assertFalse(protocol.isInvalid()); + } +} \ No newline at end of file diff --git a/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/HttpSdProtocolTest.java b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/HttpSdProtocolTest.java new file mode 100644 index 0000000000..ec72018404 --- /dev/null +++ b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/HttpSdProtocolTest.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.hertzbeat.common.entity.job.protocol; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class HttpSdProtocolTest { + + @Test + void isInvalidValidHttpUrl() { + HttpSdProtocol protocol = HttpSdProtocol.builder() + .url("http://example.com/api/discovery") + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidValidHttpsUrl() { + HttpSdProtocol protocol = HttpSdProtocol.builder() + .url("https://example.com/api/discovery") + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidValidUrlWithPort() { + HttpSdProtocol protocol = HttpSdProtocol.builder() + .url("http://example.com:8080/api/discovery") + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidBlankUrl() { + HttpSdProtocol protocol = HttpSdProtocol.builder() + .url("") + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNullUrl() { + HttpSdProtocol protocol = HttpSdProtocol.builder() + .url(null) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidUrlNoProtocol() { + HttpSdProtocol protocol = HttpSdProtocol.builder() + .url("example.com/api/discovery") + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidUrlWrongProtocol() { + HttpSdProtocol protocol = HttpSdProtocol.builder() + .url("ftp://example.com/api/discovery") + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidUrlOnlyProtocol() { + HttpSdProtocol protocol = HttpSdProtocol.builder() + .url("http://") + .build(); + assertTrue(protocol.isInvalid()); + } +} \ No newline at end of file diff --git a/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/ModbusProtocolTest.java b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/ModbusProtocolTest.java new file mode 100644 index 0000000000..645e6afdf7 --- /dev/null +++ b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/ModbusProtocolTest.java @@ -0,0 +1,161 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.hertzbeat.common.entity.job.protocol; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ModbusProtocolTest { + + @Test + void isInvalidValidProtocol() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Arrays.asList("40001", "40002")) + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidValidProtocolWithTimeout() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("localhost") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .timeout("5000") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidHost() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidPort() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("192.168.1.1") + .port("99999") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankDriverName() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankAddressSyntax() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("") + .slaveId("1") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankSlaveId() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNonNumericTimeout() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .timeout("abc") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidEmptyRegisterAddresses() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Collections.emptyList()) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNullRegisterAddresses() { + ModbusProtocol protocol = ModbusProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(null) + .build(); + assertTrue(protocol.isInvalid()); + } +} \ No newline at end of file diff --git a/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/PlcProtocolTest.java b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/PlcProtocolTest.java new file mode 100644 index 0000000000..dbd76fe8bf --- /dev/null +++ b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/PlcProtocolTest.java @@ -0,0 +1,161 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.hertzbeat.common.entity.job.protocol; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PlcProtocolTest { + + @Test + void isInvalidValidProtocol() { + PlcProtocol protocol = PlcProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Arrays.asList("40001", "40002")) + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidValidProtocolWithTimeout() { + PlcProtocol protocol = PlcProtocol.builder() + .host("localhost") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .timeout("5000") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidHost() { + PlcProtocol protocol = PlcProtocol.builder() + .host("") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidPort() { + PlcProtocol protocol = PlcProtocol.builder() + .host("192.168.1.1") + .port("99999") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankDriverName() { + PlcProtocol protocol = PlcProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankAddressSyntax() { + PlcProtocol protocol = PlcProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("") + .slaveId("1") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankSlaveId() { + PlcProtocol protocol = PlcProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNonNumericTimeout() { + PlcProtocol protocol = PlcProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .timeout("abc") + .registerAddresses(Arrays.asList("40001")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidEmptyRegisterAddresses() { + PlcProtocol protocol = PlcProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(Collections.emptyList()) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNullRegisterAddresses() { + PlcProtocol protocol = PlcProtocol.builder() + .host("192.168.1.1") + .port("502") + .driverName("modbus") + .addressSyntax("Modbus") + .slaveId("1") + .registerAddresses(null) + .build(); + assertTrue(protocol.isInvalid()); + } +} \ No newline at end of file diff --git a/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/S7ProtocolTest.java b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/S7ProtocolTest.java new file mode 100644 index 0000000000..205a3ead9a --- /dev/null +++ b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/S7ProtocolTest.java @@ -0,0 +1,211 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.hertzbeat.common.entity.job.protocol; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class S7ProtocolTest { + + @Test + void isInvalidValidProtocol() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .registerAddresses(Arrays.asList("DB1.DBW0", "DB1.DBW2")) + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidValidProtocolWithTimeout() { + S7Protocol protocol = S7Protocol.builder() + .host("localhost") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .timeout("5000") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertFalse(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidHost() { + S7Protocol protocol = S7Protocol.builder() + .host("") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidInvalidPort() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("99999") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankDriverName() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankAddressSyntax() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("s7") + .addressSyntax("") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidBlankControllerType() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNonNumericRackId() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("abc") + .slotId("1") + .controllerType("S7_1200") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNonNumericSlotId() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("xyz") + .controllerType("S7_1200") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNonNumericTimeout() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .timeout("abc") + .registerAddresses(Arrays.asList("DB1.DBW0")) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidEmptyRegisterAddresses() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .registerAddresses(Collections.emptyList()) + .build(); + assertTrue(protocol.isInvalid()); + } + + @Test + void isInvalidNullRegisterAddresses() { + S7Protocol protocol = S7Protocol.builder() + .host("192.168.1.1") + .port("102") + .driverName("s7") + .addressSyntax("S7") + .rackId("0") + .slotId("1") + .controllerType("S7_1200") + .registerAddresses(null) + .build(); + assertTrue(protocol.isInvalid()); + } +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
