This is an automated email from the ASF dual-hosted git repository.

shown pushed a commit to branch 0312-yuluo/add-check
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git

commit 01f766e35d9ca4fb77b47db3c4d6063f41fcc154
Author: yuluo-yx <[email protected]>
AuthorDate: Thu Mar 12 20:28:28 2026 +0800

    feat[common]: add core protoctl entity check
    
    Signed-off-by: yuluo-yx <[email protected]>
---
 .../common/entity/job/protocol/KafkaProtocol.java  |  20 +-
 .../common/entity/job/protocol/MqttProtocol.java   |  37 ++-
 .../entity/job/protocol/NebulaGraphProtocol.java   |  18 +-
 .../common/entity/job/protocol/NginxProtocol.java  |  17 +-
 .../entity/job/protocol/RocketmqProtocol.java      |   7 +-
 .../entity/job/protocol/KafkaProtocolTest.java     | 178 +++++++++++++++
 .../entity/job/protocol/MqttProtocolTest.java      | 248 +++++++++++++++++++++
 .../job/protocol/NebulaGraphProtocolTest.java      | 188 ++++++++++++++++
 .../entity/job/protocol/NginxProtocolTest.java     | 197 ++++++++++++++++
 .../entity/job/protocol/RocketmqProtocolTest.java  | 119 ++++++++++
 10 files changed, 1016 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..ddd5f5ec0b 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,36 @@ 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;
+        }
+        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..e803be79f4 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,6 +17,9 @@
 
 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;
@@ -68,8 +71,6 @@ public class RocketmqProtocol implements 
CommonRequestProtocol, Protocol {
 
     @Override
     public boolean isInvalid() {
-
-        // todo: add
-        return true;
+        return !validateIpDomain(namesrvHost) || !validPort(namesrvPort);
     }
 }
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..b17e1be635
--- /dev/null
+++ 
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/MqttProtocolTest.java
@@ -0,0 +1,248 @@
+/*
+ * 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")
+                .build();
+        assertFalse(protocol.isInvalid());
+    }
+
+    @Test
+    void isInvalidInvalidEnableMutualAuth() {
+        MqttProtocol protocol = MqttProtocol.builder()
+                .host("192.168.1.1")
+                .port("8883")
+                .enableMutualAuth("invalid")
+                .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/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..a007fa391d
--- /dev/null
+++ 
b/hertzbeat-common-core/src/test/java/org/apache/hertzbeat/common/entity/job/protocol/RocketmqProtocolTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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 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