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]


Reply via email to