This is an automated email from the ASF dual-hosted git repository.
shown pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/master by this push:
new 61c9b050b5 feat[common]: add core protoctl entity check (#4065)
61c9b050b5 is described below
commit 61c9b050b5f388784ffb3f3d575b24012822851d
Author: shown <[email protected]>
AuthorDate: Tue Mar 17 20:08:59 2026 +0800
feat[common]: add core protoctl entity check (#4065)
Signed-off-by: yuluo-yx <[email protected]>
Co-authored-by: Duansg <[email protected]>
---
.../common/entity/job/protocol/KafkaProtocol.java | 20 +-
.../common/entity/job/protocol/MqttProtocol.java | 48 ++-
.../entity/job/protocol/NebulaGraphProtocol.java | 18 +-
.../common/entity/job/protocol/NginxProtocol.java | 17 +-
.../entity/job/protocol/RocketmqProtocol.java | 17 +-
.../entity/job/protocol/KafkaProtocolTest.java | 178 ++++++++++++
.../entity/job/protocol/MqttProtocolTest.java | 322 +++++++++++++++++++++
.../job/protocol/NebulaGraphProtocolTest.java | 188 ++++++++++++
.../entity/job/protocol/NginxProtocolTest.java | 197 +++++++++++++
.../entity/job/protocol/RocketmqProtocolTest.java | 148 ++++++++++
10 files changed, 1140 insertions(+), 13 deletions(-)
diff --git
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/KafkaProtocol.java
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/KafkaProtocol.java
index f1a3065577..eda0ae5d27 100644
---
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/KafkaProtocol.java
+++
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/KafkaProtocol.java
@@ -17,10 +17,15 @@
package org.apache.hertzbeat.common.entity.job.protocol;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain;
+
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;
/**
* Kafka protocol
@@ -58,8 +63,17 @@ public class KafkaProtocol implements CommonRequestProtocol,
Protocol {
@Override
public boolean isInvalid() {
-
- // todo: add
- return true;
+ if (!validateIpDomain(host) || !validPort(port)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(timeout) && !CommonUtil.isNumeric(timeout))
{
+ return true;
+ }
+ if (StringUtils.isNotBlank(monitorInternalTopic)
+ && !"true".equalsIgnoreCase(monitorInternalTopic)
+ && !"false".equalsIgnoreCase(monitorInternalTopic)) {
+ return true;
+ }
+ return false;
}
}
diff --git
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/MqttProtocol.java
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/MqttProtocol.java
index e80f660444..b38665cc94 100644
---
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/MqttProtocol.java
+++
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/MqttProtocol.java
@@ -17,11 +17,15 @@
package org.apache.hertzbeat.common.entity.job.protocol;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain;
+
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;
/**
* mqtt protocol
@@ -111,9 +115,47 @@ public class MqttProtocol implements
CommonRequestProtocol, Protocol {
@Override
public boolean isInvalid() {
-
- // todo: add
- return true;
+ if (!validateIpDomain(host) || !validPort(port)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(timeout) && !CommonUtil.isNumeric(timeout))
{
+ return true;
+ }
+ if (StringUtils.isNotBlank(keepalive) &&
!CommonUtil.isNumeric(keepalive)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(protocol)
+ && !"MQTT".equalsIgnoreCase(protocol)
+ && !"MQTTS".equalsIgnoreCase(protocol)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(tlsVersion)
+ && !"TLSv1.2".equalsIgnoreCase(tlsVersion)
+ && !"TLSv1.3".equalsIgnoreCase(tlsVersion)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(insecureSkipVerify)
+ && !"true".equalsIgnoreCase(insecureSkipVerify)
+ && !"false".equalsIgnoreCase(insecureSkipVerify)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(enableMutualAuth)
+ && !"true".equalsIgnoreCase(enableMutualAuth)
+ && !"false".equalsIgnoreCase(enableMutualAuth)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(username) && StringUtils.isBlank(password))
{
+ return true;
+ }
+ if (StringUtils.isBlank(username) && StringUtils.isNotBlank(password))
{
+ return true;
+ }
+ if ("true".equalsIgnoreCase(enableMutualAuth)) {
+ if (StringUtils.isBlank(clientCert) ||
StringUtils.isBlank(clientKey)) {
+ return true;
+ }
+ }
+ return false;
}
}
diff --git
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/NebulaGraphProtocol.java
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/NebulaGraphProtocol.java
index 48d999984a..df6e8cfe3a 100644
---
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/NebulaGraphProtocol.java
+++
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/NebulaGraphProtocol.java
@@ -17,10 +17,15 @@
package org.apache.hertzbeat.common.entity.job.protocol;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain;
+
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;
/**
* NebulaGraph Protocol
@@ -59,9 +64,16 @@ public class NebulaGraphProtocol implements
CommonRequestProtocol, Protocol {
@Override
public boolean isInvalid() {
-
- // todo: add
- return true;
+ if (!validateIpDomain(host) || !validPort(port)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(timeout) && !CommonUtil.isNumeric(timeout))
{
+ return true;
+ }
+ if (StringUtils.isNotBlank(timePeriod) &&
!CommonUtil.isNumeric(timePeriod)) {
+ return true;
+ }
+ return false;
}
}
diff --git
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/NginxProtocol.java
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/NginxProtocol.java
index 62ca0e38c5..54a5d1b65c 100644
---
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/NginxProtocol.java
+++
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/NginxProtocol.java
@@ -17,11 +17,15 @@
package org.apache.hertzbeat.common.entity.job.protocol;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain;
+
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;
/**
* nginx protocol
@@ -62,6 +66,17 @@ public class NginxProtocol implements CommonRequestProtocol,
Protocol {
*/
@Override
public boolean isInvalid() {
- return StringUtils.isAnyBlank(host, port, timeout);
+ if (!validateIpDomain(host) || !validPort(port)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(timeout) && !CommonUtil.isNumeric(timeout))
{
+ return true;
+ }
+ if (StringUtils.isNotBlank(ssl)
+ && !"true".equalsIgnoreCase(ssl)
+ && !"false".equalsIgnoreCase(ssl)) {
+ return true;
+ }
+ return false;
}
}
diff --git
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/RocketmqProtocol.java
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/RocketmqProtocol.java
index 3688e23a54..b5f482be8a 100644
---
a/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/RocketmqProtocol.java
+++
b/hertzbeat-common-core/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/RocketmqProtocol.java
@@ -17,10 +17,14 @@
package org.apache.hertzbeat.common.entity.job.protocol;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validPort;
+import static org.apache.hertzbeat.common.util.IpDomainUtil.validateIpDomain;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
/**
* rocketmq protocol
@@ -68,8 +72,15 @@ public class RocketmqProtocol implements
CommonRequestProtocol, Protocol {
@Override
public boolean isInvalid() {
-
- // todo: add
- return true;
+ if (!validateIpDomain(namesrvHost) || !validPort(namesrvPort)) {
+ return true;
+ }
+ if (StringUtils.isNotBlank(accessKey) &&
StringUtils.isBlank(secretKey)) {
+ return true;
+ }
+ if (StringUtils.isBlank(accessKey) &&
StringUtils.isNotBlank(secretKey)) {
+ return true;
+ }
+ return false;
}
}
diff --git
a/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/KafkaProtocolTest.java
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/KafkaProtocolTest.java
new file mode 100644
index 0000000000..368592a1a0
--- /dev/null
+++
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/KafkaProtocolTest.java
@@ -0,0 +1,178 @@
+/*
+ * 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 KafkaProtocolTest {
+
+ @Test
+ void isInvalidValidProtocol() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithDomain() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("kafka.example.com")
+ .port("9092")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithLocalhost() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("localhost")
+ .port("9092")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidHost() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("")
+ .port("9092")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullHost() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host(null)
+ .port("9092")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidPort() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("99999")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankPort() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullPort() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port(null)
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidTimeout() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .timeout("5000")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankTimeout() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .timeout("")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullTimeout() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .timeout(null)
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidTimeout() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .timeout("abc")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidMonitorInternalTopicTrue() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .monitorInternalTopic("true")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidMonitorInternalTopicFalse() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .monitorInternalTopic("false")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidMonitorInternalTopic() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .monitorInternalTopic("invalid")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankMonitorInternalTopic() {
+ KafkaProtocol protocol = KafkaProtocol.builder()
+ .host("192.168.1.1")
+ .port("9092")
+ .monitorInternalTopic("")
+ .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/MqttProtocolTest.java
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/MqttProtocolTest.java
new file mode 100644
index 0000000000..15b10a2251
--- /dev/null
+++
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/MqttProtocolTest.java
@@ -0,0 +1,322 @@
+/*
+ * 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 MqttProtocolTest {
+
+ @Test
+ void isInvalidValidProtocol() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithDomain() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("mqtt.example.com")
+ .port("1883")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithLocalhost() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("localhost")
+ .port("1883")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidHost() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("")
+ .port("1883")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullHost() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host(null)
+ .port("1883")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidPort() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("99999")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankPort() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullPort() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port(null)
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidTimeout() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .timeout("5000")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankTimeout() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .timeout("")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidTimeout() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .timeout("abc")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidKeepalive() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .keepalive("60")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidKeepalive() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .keepalive("abc")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolMqtt() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .protocol("MQTT")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolMqtts() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .protocol("MQTTS")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidProtocol() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .protocol("INVALID")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidTlsVersion() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .tlsVersion("TLSv1.2")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidTlsVersionV13() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .tlsVersion("TLSv1.3")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidTlsVersion() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .tlsVersion("TLSv1.0")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidInsecureSkipVerify() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .insecureSkipVerify("true")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidInsecureSkipVerify() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .insecureSkipVerify("invalid")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidEnableMutualAuth() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .enableMutualAuth("true")
+ .clientCert("/path/to/cert")
+ .clientKey("/path/to/key")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidEnableMutualAuthWithoutClientCert() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .enableMutualAuth("true")
+ .clientKey("/path/to/key")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidEnableMutualAuthWithoutClientKey() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .enableMutualAuth("true")
+ .clientCert("/path/to/cert")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidEnableMutualAuthFalseWithoutCert() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .enableMutualAuth("false")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidEnableMutualAuth() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("8883")
+ .enableMutualAuth("invalid")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidAuth() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .username("user")
+ .password("pass")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidOnlyUsername() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .username("user")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidOnlyPassword() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .password("pass")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNoAuth() {
+ MqttProtocol protocol = MqttProtocol.builder()
+ .host("192.168.1.1")
+ .port("1883")
+ .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/NebulaGraphProtocolTest.java
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/NebulaGraphProtocolTest.java
new file mode 100644
index 0000000000..e5890807de
--- /dev/null
+++
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/NebulaGraphProtocolTest.java
@@ -0,0 +1,188 @@
+/*
+ * 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 NebulaGraphProtocolTest {
+
+ @Test
+ void isInvalidValidProtocol() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithDomain() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("nebula.example.com")
+ .port("19669")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithLocalhost() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("localhost")
+ .port("19669")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidHost() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("")
+ .port("19669")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullHost() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host(null)
+ .port("19669")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidPort() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("99999")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankPort() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullPort() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port(null)
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidTimeout() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .timeout("5000")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankTimeout() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .timeout("")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullTimeout() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .timeout(null)
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidTimeout() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .timeout("abc")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidTimePeriod() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .timePeriod("60")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankTimePeriod() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .timePeriod("")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidTimePeriod() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .timePeriod("abc")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidWithUrl() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19669")
+ .url("/stats")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidStoragePort() {
+ NebulaGraphProtocol protocol = NebulaGraphProtocol.builder()
+ .host("192.168.1.1")
+ .port("19779")
+ .url("/rocksdb_stats")
+ .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/NginxProtocolTest.java
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/NginxProtocolTest.java
new file mode 100644
index 0000000000..dc1378634b
--- /dev/null
+++
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/NginxProtocolTest.java
@@ -0,0 +1,197 @@
+/*
+ * 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 NginxProtocolTest {
+
+ @Test
+ void isInvalidValidProtocol() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithDomain() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("nginx.example.com")
+ .port("80")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithLocalhost() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("localhost")
+ .port("80")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidHost() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("")
+ .port("80")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullHost() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host(null)
+ .port("80")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidPort() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("99999")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankPort() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullPort() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port(null)
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidTimeout() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .timeout("5000")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankTimeout() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .timeout("")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullTimeout() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .timeout(null)
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidTimeout() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .timeout("abc")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidSslTrue() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("443")
+ .ssl("true")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidSslFalse() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .ssl("false")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidSsl() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .ssl("invalid")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankSsl() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .ssl("")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidWithUrl() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("192.168.1.1")
+ .port("80")
+ .url("/nginx_status")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidIpv6() {
+ NginxProtocol protocol = NginxProtocol.builder()
+ .host("::1")
+ .port("80")
+ .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/RocketmqProtocolTest.java
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/RocketmqProtocolTest.java
new file mode 100644
index 0000000000..2930f7c12d
--- /dev/null
+++
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/RocketmqProtocolTest.java
@@ -0,0 +1,148 @@
+/*
+ * 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 RocketmqProtocolTest {
+
+ @Test
+ void isInvalidValidProtocol() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort("9876")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithDomain() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("rocketmq.example.com")
+ .namesrvPort("9876")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidProtocolWithLocalhost() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("localhost")
+ .namesrvPort("9876")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidHost() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("")
+ .namesrvPort("9876")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullHost() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost(null)
+ .namesrvPort("9876")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidInvalidPort() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort("99999")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidBlankPort() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort("")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNullPort() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort(null)
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidWithAccessKey() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort("9876")
+ .accessKey("testAccessKey")
+ .secretKey("testSecretKey")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidOnlyAccessKey() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort("9876")
+ .accessKey("testAccessKey")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidOnlySecretKey() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort("9876")
+ .secretKey("testSecretKey")
+ .build();
+ assertTrue(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidNoAuth() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort("9876")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+
+ @Test
+ void isInvalidValidWithParseScript() {
+ RocketmqProtocol protocol = RocketmqProtocol.builder()
+ .namesrvHost("192.168.1.1")
+ .namesrvPort("9876")
+ .parseScript("$.data")
+ .build();
+ assertFalse(protocol.isInvalid());
+ }
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]