You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/05/16 08:53:51 UTC

[camel] branch main updated: CAMEL-19298 Snmp: version 3 is not supported for several actions for the component (#10101)

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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new e77eedef0ba CAMEL-19298 Snmp: version 3 is not supported for several actions for the component (#10101)
e77eedef0ba is described below

commit e77eedef0ba5250b8a460f38f53e1849892e6919
Author: JiriOndrusek <on...@gmail.com>
AuthorDate: Tue May 16 10:53:37 2023 +0200

    CAMEL-19298 Snmp: version 3 is not supported for several actions for the component (#10101)
---
 .../apache/camel/component/snmp/SnmpHelper.java    | 178 ++++++++++++++++++
 .../apache/camel/component/snmp/SnmpOIDPoller.java | 126 +------------
 .../apache/camel/component/snmp/SnmpProducer.java  |  28 ++-
 .../camel/component/snmp/SnmpTrapProducer.java     |  20 +-
 .../camel/component/snmp/AbstractTrapTest.java     |  73 --------
 .../apache/camel/component/snmp/PollOIDTest.java   |  56 +++---
 .../apache/camel/component/snmp/ProducerTest.java  |  49 +++--
 .../component/snmp/SnmpRespondTestSupport.java     | 204 +++++++++++++++++++++
 .../camel/component/snmp/SnmpTestSupport.java      |  29 +++
 .../camel/component/snmp/Snmpv1TrapTest.java       |  73 --------
 .../camel/component/snmp/Snmpv2TrapTest.java       |  75 --------
 .../org/apache/camel/component/snmp/TrapTest.java  | 126 +++++++++++++
 .../apache/camel/component/snmp/WalkOIDTest.java   |  55 +++---
 13 files changed, 639 insertions(+), 453 deletions(-)

diff --git a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpHelper.java b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpHelper.java
new file mode 100644
index 00000000000..cc1d29e1ea0
--- /dev/null
+++ b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpHelper.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.camel.component.snmp;
+
+import org.snmp4j.CommunityTarget;
+import org.snmp4j.PDU;
+import org.snmp4j.PDUv1;
+import org.snmp4j.ScopedPDU;
+import org.snmp4j.Target;
+import org.snmp4j.UserTarget;
+import org.snmp4j.mp.MPv3;
+import org.snmp4j.mp.SnmpConstants;
+import org.snmp4j.security.AuthMD5;
+import org.snmp4j.security.AuthSHA;
+import org.snmp4j.security.Priv3DES;
+import org.snmp4j.security.PrivAES128;
+import org.snmp4j.security.PrivAES192;
+import org.snmp4j.security.PrivAES256;
+import org.snmp4j.security.PrivDES;
+import org.snmp4j.security.SecurityModels;
+import org.snmp4j.security.SecurityProtocols;
+import org.snmp4j.security.USM;
+import org.snmp4j.security.UsmUser;
+import org.snmp4j.smi.GenericAddress;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.OctetString;
+
+final class SnmpHelper {
+
+    private SnmpHelper() {
+    }
+
+    static PDU createPDU(SnmpEndpoint endpoint) {
+        return switch (endpoint.getSnmpVersion()) {
+            case SnmpConstants.version1, SnmpConstants.version2c -> createPDU(endpoint.getSnmpVersion());
+            case SnmpConstants.version3 -> createScopedPDU(endpoint);
+            default -> null;
+        };
+    }
+
+    static PDU createPDU(int version) {
+        return switch (version) {
+            case SnmpConstants.version1 -> new PDUv1();
+            case SnmpConstants.version2c -> new PDU();
+            case SnmpConstants.version3 -> createScopedPDU(null);
+            default -> null;
+        };
+    }
+
+    static Target createTarget(SnmpEndpoint endpoint) {
+        return switch (endpoint.getSnmpVersion()) {
+            case SnmpConstants.version1, SnmpConstants.version2c -> createCommunityTarget(endpoint);
+            case SnmpConstants.version3 -> createUserTarget(endpoint);
+            default -> null;
+        };
+    }
+
+    static USM createAndSetUSM(SnmpEndpoint endpoint) {
+        return switch (endpoint.getSnmpVersion()) {
+            case SnmpConstants.version3 -> internalCreateAndSetUSM(endpoint);
+            default -> null;
+        };
+    }
+
+    private static USM internalCreateAndSetUSM(SnmpEndpoint endpoint) {
+        if (endpoint.getSecurityName() == null) {
+            throw new IllegalArgumentException("SecurityNme is required for SNMP v3");
+        }
+
+        USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
+        SecurityModels.getInstance().addSecurityModel(usm);
+
+        OID authProtocol = convertAuthenticationProtocol(endpoint.getAuthenticationProtocol());
+
+        OctetString authPwd = convertToOctetString(endpoint.getAuthenticationPassphrase());
+
+        OID privProtocol = convertPrivacyProtocol(endpoint.getPrivacyProtocol());
+
+        OctetString privPwd = convertToOctetString(endpoint.getPrivacyPassphrase());
+
+        UsmUser user = new UsmUser(
+                convertToOctetString(endpoint.getSecurityName()), authProtocol, authPwd, privProtocol, privPwd);
+
+        usm.addUser(convertToOctetString(endpoint.getSecurityName()), user);
+
+        return usm;
+    }
+
+    private static ScopedPDU createScopedPDU(SnmpEndpoint endpoint) {
+        ScopedPDU scopedPDU = new ScopedPDU();
+        if (endpoint != null && endpoint.getSnmpContextEngineId() != null) {
+            scopedPDU.setContextEngineID(convertToOctetString(endpoint.getSnmpContextEngineId()));
+        }
+        if (endpoint != null && endpoint.getSnmpContextName() != null) {
+            scopedPDU.setContextName(convertToOctetString(endpoint.getSnmpContextName()));
+        }
+
+        return scopedPDU;
+    }
+
+    private static CommunityTarget createCommunityTarget(SnmpEndpoint endpoint) {
+        CommunityTarget communityTarget = new CommunityTarget();
+
+        communityTarget.setCommunity(convertToOctetString(endpoint.getSnmpCommunity()));
+        communityTarget.setAddress(GenericAddress.parse(endpoint.getAddress()));
+        communityTarget.setRetries(endpoint.getRetries());
+        communityTarget.setTimeout(endpoint.getTimeout());
+        communityTarget.setVersion(endpoint.getSnmpVersion());
+
+        return communityTarget;
+    }
+
+    private static UserTarget createUserTarget(SnmpEndpoint endpoint) {
+        UserTarget userTarget = new UserTarget();
+
+        userTarget.setSecurityLevel(endpoint.getSecurityLevel());
+        userTarget.setSecurityName(convertToOctetString(endpoint.getSecurityName()));
+        userTarget.setAddress(GenericAddress.parse(endpoint.getAddress()));
+        userTarget.setRetries(endpoint.getRetries());
+        userTarget.setTimeout(endpoint.getTimeout());
+        userTarget.setVersion(endpoint.getSnmpVersion());
+
+        return userTarget;
+    }
+
+    private static OctetString convertToOctetString(String value) {
+        if (value == null) {
+            return null;
+        }
+        return new OctetString(value);
+    }
+
+    private static OID convertAuthenticationProtocol(String authenticationProtocol) {
+        if (authenticationProtocol == null) {
+            return null;
+        }
+        if ("MD5".equals(authenticationProtocol)) {
+            return AuthMD5.ID;
+        } else if ("SHA1".equals(authenticationProtocol)) {
+            return AuthSHA.ID;
+        } else {
+            throw new IllegalArgumentException("Unknown authentication protocol: " + authenticationProtocol);
+        }
+    }
+
+    private static OID convertPrivacyProtocol(String privacyProtocol) {
+        if (privacyProtocol == null) {
+            return null;
+        }
+        if ("DES".equals(privacyProtocol)) {
+            return PrivDES.ID;
+        } else if ("TRIDES".equals(privacyProtocol)) {
+            return Priv3DES.ID;
+        } else if ("AES128".equals(privacyProtocol)) {
+            return PrivAES128.ID;
+        } else if ("AES192".equals(privacyProtocol)) {
+            return PrivAES192.ID;
+        } else if ("AES256".equals(privacyProtocol)) {
+            return PrivAES256.ID;
+        } else {
+            throw new IllegalArgumentException("Unknown privacy protocol: " + privacyProtocol);
+        }
+    }
+}
diff --git a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpOIDPoller.java b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpOIDPoller.java
index 6518f3ec3f2..0296d16106a 100644
--- a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpOIDPoller.java
+++ b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpOIDPoller.java
@@ -23,32 +23,15 @@ import org.apache.camel.Processor;
 import org.apache.camel.support.ScheduledPollConsumer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.snmp4j.CommunityTarget;
 import org.snmp4j.PDU;
-import org.snmp4j.ScopedPDU;
 import org.snmp4j.Snmp;
 import org.snmp4j.Target;
 import org.snmp4j.TransportMapping;
-import org.snmp4j.UserTarget;
 import org.snmp4j.event.ResponseEvent;
 import org.snmp4j.event.ResponseListener;
-import org.snmp4j.mp.MPv3;
-import org.snmp4j.mp.SnmpConstants;
-import org.snmp4j.security.AuthMD5;
-import org.snmp4j.security.AuthSHA;
-import org.snmp4j.security.Priv3DES;
-import org.snmp4j.security.PrivAES128;
-import org.snmp4j.security.PrivAES192;
-import org.snmp4j.security.PrivAES256;
-import org.snmp4j.security.PrivDES;
-import org.snmp4j.security.SecurityModels;
-import org.snmp4j.security.SecurityProtocols;
-import org.snmp4j.security.USM;
-import org.snmp4j.security.UsmUser;
 import org.snmp4j.smi.Address;
 import org.snmp4j.smi.GenericAddress;
 import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
 import org.snmp4j.smi.VariableBinding;
 import org.snmp4j.transport.DefaultTcpTransportMapping;
 import org.snmp4j.transport.DefaultUdpTransportMapping;
@@ -89,59 +72,9 @@ public class SnmpOIDPoller extends ScheduledPollConsumer implements ResponseList
         }
 
         this.snmp = new Snmp(this.transport);
-
-        if (SnmpConstants.version3 == endpoint.getSnmpVersion()) {
-            UserTarget userTarget = new UserTarget();
-
-            userTarget.setSecurityLevel(endpoint.getSecurityLevel());
-            userTarget.setSecurityName(convertToOctetString(endpoint.getSecurityName()));
-            userTarget.setAddress(targetAddress);
-            userTarget.setRetries(endpoint.getRetries());
-            userTarget.setTimeout(endpoint.getTimeout());
-            userTarget.setVersion(endpoint.getSnmpVersion());
-
-            this.target = userTarget;
-
-            USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
-            SecurityModels.getInstance().addSecurityModel(usm);
-
-            OID authProtocol = convertAuthenticationProtocol(endpoint.getAuthenticationProtocol());
-
-            OctetString authPwd = convertToOctetString(endpoint.getAuthenticationPassphrase());
-
-            OID privProtocol = convertPrivacyProtocol(endpoint.getPrivacyProtocol());
-
-            OctetString privPwd = convertToOctetString(endpoint.getPrivacyPassphrase());
-
-            UsmUser user = new UsmUser(
-                    convertToOctetString(endpoint.getSecurityName()), authProtocol, authPwd, privProtocol, privPwd);
-
-            usm.addUser(convertToOctetString(endpoint.getSecurityName()), user);
-
-            ScopedPDU scopedPDU = new ScopedPDU();
-
-            if (endpoint.getSnmpContextEngineId() != null) {
-                scopedPDU.setContextEngineID(new OctetString(endpoint.getSnmpContextEngineId()));
-            }
-
-            if (endpoint.getSnmpContextName() != null) {
-                scopedPDU.setContextName(new OctetString(endpoint.getSnmpContextName()));
-            }
-
-            this.pdu = scopedPDU;
-        } else {
-            CommunityTarget communityTarget = new CommunityTarget();
-
-            communityTarget.setCommunity(convertToOctetString(endpoint.getSnmpCommunity()));
-            communityTarget.setAddress(targetAddress);
-            communityTarget.setRetries(endpoint.getRetries());
-            communityTarget.setTimeout(endpoint.getTimeout());
-            communityTarget.setVersion(endpoint.getSnmpVersion());
-
-            this.target = communityTarget;
-
-            this.pdu = new PDU();
-        }
+        SnmpHelper.createAndSetUSM(endpoint);
+        this.pdu = SnmpHelper.createPDU(endpoint);
+        this.target = SnmpHelper.createTarget(endpoint);
 
         // listen to the transport
         if (LOG.isDebugEnabled()) {
@@ -247,59 +180,6 @@ public class SnmpOIDPoller extends ScheduledPollConsumer implements ResponseList
         }
     }
 
-    /**
-     * * @return Returns the target.
-     */
-    public Target getTarget() {
-        return this.target;
-    }
-
-    /**
-     * @param target The target to set.
-     */
-    public void setTarget(Target target) {
-        this.target = target;
-    }
-
-    private OctetString convertToOctetString(String value) {
-        if (value == null) {
-            return null;
-        }
-        return new OctetString(value);
-    }
-
-    private OID convertAuthenticationProtocol(String authenticationProtocol) {
-        if (authenticationProtocol == null) {
-            return null;
-        }
-        if ("MD5".equals(authenticationProtocol)) {
-            return AuthMD5.ID;
-        } else if ("SHA1".equals(authenticationProtocol)) {
-            return AuthSHA.ID;
-        } else {
-            throw new IllegalArgumentException("Unknown authentication protocol: " + authenticationProtocol);
-        }
-    }
-
-    private OID convertPrivacyProtocol(String privacyProtocol) {
-        if (privacyProtocol == null) {
-            return null;
-        }
-        if ("DES".equals(privacyProtocol)) {
-            return PrivDES.ID;
-        } else if ("TRIDES".equals(privacyProtocol)) {
-            return Priv3DES.ID;
-        } else if ("AES128".equals(privacyProtocol)) {
-            return PrivAES128.ID;
-        } else if ("AES192".equals(privacyProtocol)) {
-            return PrivAES192.ID;
-        } else if ("AES256".equals(privacyProtocol)) {
-            return PrivAES256.ID;
-        } else {
-            throw new IllegalArgumentException("Unknown privacy protocol: " + privacyProtocol);
-        }
-    }
-
     private int getPduType(SnmpActionType type) {
         if (SnmpActionType.GET_NEXT == type) {
             return PDU.GETNEXT;
diff --git a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java
index 7c7fd1b846e..81754956d9c 100644
--- a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java
+++ b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java
@@ -25,20 +25,18 @@ import org.apache.camel.Exchange;
 import org.apache.camel.support.DefaultProducer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.snmp4j.CommunityTarget;
 import org.snmp4j.PDU;
 import org.snmp4j.Snmp;
+import org.snmp4j.Target;
 import org.snmp4j.TransportMapping;
 import org.snmp4j.event.ResponseEvent;
-import org.snmp4j.mp.MPv3;
+import org.snmp4j.mp.SnmpConstants;
 import org.snmp4j.security.SecurityModels;
-import org.snmp4j.security.SecurityProtocols;
 import org.snmp4j.security.USM;
 import org.snmp4j.smi.Address;
 import org.snmp4j.smi.GenericAddress;
 import org.snmp4j.smi.Integer32;
 import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
 import org.snmp4j.smi.VariableBinding;
 import org.snmp4j.transport.DefaultTcpTransportMapping;
 import org.snmp4j.transport.DefaultUdpTransportMapping;
@@ -54,7 +52,7 @@ public class SnmpProducer extends DefaultProducer {
 
     private Address targetAddress;
     private USM usm;
-    private CommunityTarget target;
+    private Target target;
     private SnmpActionType actionType;
     private PDU pdu;
 
@@ -71,18 +69,10 @@ public class SnmpProducer extends DefaultProducer {
         this.targetAddress = GenericAddress.parse(this.endpoint.getAddress());
         LOG.debug("targetAddress: {}", targetAddress);
 
-        this.usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
-        SecurityModels.getInstance().addSecurityModel(this.usm);
+        this.usm = SnmpHelper.createAndSetUSM(endpoint);
+        this.pdu = SnmpHelper.createPDU(endpoint);
+        this.target = SnmpHelper.createTarget(endpoint);
 
-        // setting up target
-        this.target = new CommunityTarget();
-        this.target.setCommunity(new OctetString(endpoint.getSnmpCommunity()));
-        this.target.setAddress(this.targetAddress);
-        this.target.setRetries(this.endpoint.getRetries());
-        this.target.setTimeout(this.endpoint.getTimeout());
-        this.target.setVersion(this.endpoint.getSnmpVersion());
-
-        this.pdu = new PDU();
         // in here,only POLL do set the oids
         if (this.actionType == SnmpActionType.POLL) {
             for (OID oid : this.endpoint.getOids()) {
@@ -91,13 +81,16 @@ public class SnmpProducer extends DefaultProducer {
         }
         this.pdu.setErrorIndex(0);
         this.pdu.setErrorStatus(0);
-        this.pdu.setMaxRepetitions(0);
+        if (endpoint.getSnmpVersion() > SnmpConstants.version1) {
+            this.pdu.setMaxRepetitions(0);
+        }
         // support POLL and GET_NEXT
         if (this.actionType == SnmpActionType.GET_NEXT) {
             this.pdu.setType(PDU.GETNEXT);
         } else {
             this.pdu.setType(PDU.GET);
         }
+
     }
 
     @Override
@@ -194,4 +187,5 @@ public class SnmpProducer extends DefaultProducer {
             }
         }
     } //end process
+
 }
diff --git a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpTrapProducer.java b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpTrapProducer.java
index 034fec6e5ee..265379ceab9 100644
--- a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpTrapProducer.java
+++ b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpTrapProducer.java
@@ -20,19 +20,16 @@ import org.apache.camel.Exchange;
 import org.apache.camel.support.DefaultProducer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.snmp4j.CommunityTarget;
 import org.snmp4j.PDU;
 import org.snmp4j.Snmp;
+import org.snmp4j.Target;
 import org.snmp4j.TransportMapping;
-import org.snmp4j.mp.MPv3;
 import org.snmp4j.mp.SnmpConstants;
 import org.snmp4j.security.SecurityModels;
-import org.snmp4j.security.SecurityProtocols;
 import org.snmp4j.security.USM;
 import org.snmp4j.smi.Address;
 import org.snmp4j.smi.GenericAddress;
 import org.snmp4j.smi.Integer32;
-import org.snmp4j.smi.OctetString;
 import org.snmp4j.transport.DefaultTcpTransportMapping;
 import org.snmp4j.transport.DefaultUdpTransportMapping;
 
@@ -47,7 +44,7 @@ public class SnmpTrapProducer extends DefaultProducer {
 
     private Address targetAddress;
     private USM usm;
-    private CommunityTarget target;
+    private Target target;
 
     public SnmpTrapProducer(SnmpEndpoint endpoint) {
         super(endpoint);
@@ -61,16 +58,8 @@ public class SnmpTrapProducer extends DefaultProducer {
         this.targetAddress = GenericAddress.parse(this.endpoint.getAddress());
         LOG.debug("targetAddress: {}", targetAddress);
 
-        this.usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
-        SecurityModels.getInstance().addSecurityModel(this.usm);
-
-        // setting up target
-        this.target = new CommunityTarget();
-        this.target.setCommunity(new OctetString(endpoint.getSnmpCommunity()));
-        this.target.setAddress(this.targetAddress);
-        this.target.setRetries(this.endpoint.getRetries());
-        this.target.setTimeout(this.endpoint.getTimeout());
-        this.target.setVersion(this.endpoint.getSnmpVersion());
+        this.usm = SnmpHelper.createAndSetUSM(endpoint);
+        this.target = SnmpHelper.createTarget(endpoint);
     }
 
     @Override
@@ -117,7 +106,6 @@ public class SnmpTrapProducer extends DefaultProducer {
                 trap.setType(PDU.TRAP);
                 trap.setMaxRepetitions(0);
             }
-
             LOG.debug("SnmpTrap: sending");
             snmp.send(trap, this.target);
             LOG.debug("SnmpTrap: sent");
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/AbstractTrapTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/AbstractTrapTest.java
deleted file mode 100644
index b955596d0b2..00000000000
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/AbstractTrapTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.camel.component.snmp;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
-import org.apache.camel.Producer;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.snmp4j.PDU;
-import org.snmp4j.smi.VariableBinding;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public abstract class AbstractTrapTest extends CamelTestSupport {
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractTrapTest.class);
-
-    protected abstract PDU createTrap();
-
-    @Test
-    public void testSendReceiveTraps() throws Exception {
-        PDU trap = createTrap();
-
-        // Send it
-        LOG.info("Sending pdu " + trap);
-        Endpoint endpoint = context.getEndpoint("direct:snmptrap");
-        Exchange exchange = endpoint.createExchange();
-        exchange.getIn().setBody(trap);
-        Producer producer = endpoint.createProducer();
-        producer.process(exchange);
-
-        synchronized (this) {
-            Thread.sleep(1000);
-        }
-
-        // If all goes right it should come here
-        MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedMessageCount(1);
-        mock.assertIsSatisfied();
-
-        List<Exchange> exchanges = mock.getExchanges();
-        SnmpMessage msg = (SnmpMessage) exchanges.get(0).getIn();
-        PDU receivedTrap = msg.getSnmpMessage();
-        assertEquals(trap, receivedTrap);
-        if (LOG.isInfoEnabled()) {
-            LOG.info("Received SNMP TRAP:");
-            Vector<? extends VariableBinding> variableBindings = receivedTrap.getVariableBindings();
-            for (VariableBinding vb : variableBindings) {
-                LOG.info("  " + vb.toString());
-            }
-        }
-    }
-}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/PollOIDTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/PollOIDTest.java
index 3ebe0e57a0e..3e02c5205d0 100644
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/PollOIDTest.java
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/PollOIDTest.java
@@ -16,49 +16,45 @@
  */
 package org.apache.camel.component.snmp;
 
-import java.util.List;
-
-import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.snmp4j.mp.SnmpConstants;
 
-public class PollOIDTest extends CamelTestSupport {
-    private static final Logger LOG = LoggerFactory.getLogger(PollOIDTest.class);
+public class PollOIDTest extends SnmpRespondTestSupport {
 
-    // a disabled test... before enabling you must fill in a working IP, Port
-    // and maybe oids in the route below
-    @Disabled
-    @Test
-    public void testOIDPolling() throws Exception {
-        MockEndpoint mock = getMockEndpoint("mock:result");
+    @ParameterizedTest
+    @MethodSource("supportedVersions")
+    public void testOIDPolling(int version) throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:resultV" + version);
         mock.expectedMinimumMessageCount(1);
         mock.assertIsSatisfied();
-        List<Exchange> oids = mock.getExchanges();
-        if (LOG.isInfoEnabled()) {
-            for (Exchange e : oids) {
-                LOG.info("OID: " + e.getIn().getBody(String.class));
-            }
-        }
-    }
 
-    @Test
-    public void testStartRoute() {
-        // do nothing here , just make sure the camel route can started.
+        SnmpMessage snmpMessage = mock.getReceivedExchanges().get(0).getIn().getBody(SnmpMessage.class);
+        String responseToMatch = "My Printer - response #\\d+, using version: " + version;
+        String receivedMessage = snmpMessage.getSnmpMessage().getVariable(SnmpConstants.sysDescr).toString();
+        Assertions.assertTrue(receivedMessage.matches(responseToMatch),
+                "Expected string matching '" + responseToMatch + "'. Got: " + receivedMessage);
     }
 
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                // START SNIPPET: e1
-                from("snmp:192.168.178.23:161?protocol=udp&type=POLL&oids=1.3.6.1.2.1.1.5.0")
-                        .transform(body().convertToString()).to("mock:result");
-                // END SNIPPET: e1
+                from(String.format("snmp:%s?protocol=udp&type=POLL&snmpVersion=0&oids=%s&delay=100", getListeningAddress(),
+                        SnmpConstants.sysName))
+                        .to("mock:resultV0");
+
+                from(String.format("snmp:%s?protocol=udp&type=POLL&snmpVersion=1&oids=%s&delay=100", getListeningAddress(),
+                        SnmpConstants.sysName))
+                        .to("mock:resultV1");
+
+                from(String.format(
+                        "snmp:%s?protocol=udp&type=POLL&snmpVersion=3&securityName=%s&securityLevel=1&oids=%s&delay=100",
+                        getListeningAddress(), SECURITY_NAME, SnmpConstants.sysName))
+                        .to("mock:resultV3");
             }
         };
     }
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java
index ee24f56ddfb..609ca5ad652 100644
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java
@@ -16,39 +16,52 @@
  */
 package org.apache.camel.component.snmp;
 
-import java.util.concurrent.TimeUnit;
-
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.snmp4j.mp.SnmpConstants;
 
-@Disabled("CAMEL-10319: Set host, port and oids to test snmp producer.")
-public class ProducerTest extends CamelTestSupport {
+public class ProducerTest extends SnmpRespondTestSupport {
 
-    private String host = "192.168.0.254";
-    private String port = "161";
     private String oids = "1.3.6.1.2.1.1.3.0,1.3.6.1.2.1.25.3.2.1.5.1,1.3.6.1.2.1.25.3.5.1.1.1,1.3.6.1.2.1.43.5.1.1.11.1";
 
-    @Test
-    public void testSnmpProducer() throws Exception {
-        template.sendBody("direct:in", "");
+    @ParameterizedTest
+    @MethodSource("supportedVersions")
+    public void testSnmpProducer(int version) throws Exception {
+        template.sendBody("direct:inV" + version, "");
 
-        MockEndpoint mock = getMockEndpoint("mock:result");
+        MockEndpoint mock = getMockEndpoint("mock:resultV" + version);
         mock.expectedMinimumMessageCount(1);
 
-        MockEndpoint.assertIsSatisfied(context, 5, TimeUnit.SECONDS);
+        mock.assertIsSatisfied();
+
+        SnmpMessage snmpMessage = mock.getReceivedExchanges().get(0).getIn().getBody(SnmpMessage.class);
+        String responseToMatch = "My Printer - response #\\d+, using version: " + version;
+        String receivedMessage = snmpMessage.getSnmpMessage().getVariable(SnmpConstants.sysDescr).toString();
+        Assertions.assertTrue(receivedMessage.matches(responseToMatch),
+                "Expected string matching '" + responseToMatch + "'. Got: " + receivedMessage);
     }
 
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from("direct:in")
-                        .to("snmp://" + host + ":" + port + "?oids=" + oids)
-                        .log("${body}")
-                        .to("mock:result");
+                from("direct:inV0")
+                        .to("snmp://" + getListeningAddress() + "?oids=" + oids)
+                        .log("V0: ${body}")
+                        .to("mock:resultV0");
+
+                from("direct:inV1")
+                        .to("snmp://" + getListeningAddress() + "?snmpVersion=1&oids=" + oids)
+                        .log("V0: ${body}")
+                        .to("mock:resultV1");
+
+                from("direct:inV3")
+                        .to("snmp://" + getListeningAddress() + "?securityName=test&securityLevel=1&snmpVersion=3&oids=" + oids)
+                        .log("V0: ${body}")
+                        .to("mock:resultV3");
             }
         };
     }
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpRespondTestSupport.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpRespondTestSupport.java
new file mode 100644
index 00000000000..2e0e38dc9e6
--- /dev/null
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpRespondTestSupport.java
@@ -0,0 +1,204 @@
+/*
+ * 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.camel.component.snmp;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.TestInstance;
+import org.snmp4j.CommandResponder;
+import org.snmp4j.CommandResponderEvent;
+import org.snmp4j.MessageException;
+import org.snmp4j.PDU;
+import org.snmp4j.PDUv1;
+import org.snmp4j.ScopedPDU;
+import org.snmp4j.Snmp;
+import org.snmp4j.mp.CounterSupport;
+import org.snmp4j.mp.DefaultCounterListener;
+import org.snmp4j.mp.MPv3;
+import org.snmp4j.mp.SnmpConstants;
+import org.snmp4j.mp.StatusInformation;
+import org.snmp4j.security.AuthSHA;
+import org.snmp4j.security.SecurityModels;
+import org.snmp4j.security.SecurityProtocols;
+import org.snmp4j.security.USM;
+import org.snmp4j.security.UsmUser;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.OctetString;
+import org.snmp4j.smi.UdpAddress;
+import org.snmp4j.smi.VariableBinding;
+import org.snmp4j.transport.DefaultUdpTransportMapping;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class SnmpRespondTestSupport extends SnmpTestSupport {
+    static final String SECURITY_NAME = "test";
+    private static final String LOCAL_ADDRESS = "127.0.0.1/0";
+
+    Snmp snmpResponder;
+    String listeningAddress;
+
+    @BeforeAll
+    public void beforeAll() {
+        SecurityProtocols.getInstance().addDefaultProtocols();
+        DefaultUdpTransportMapping udpTransportMapping;
+        try {
+            udpTransportMapping = new DefaultUdpTransportMapping(new UdpAddress(LOCAL_ADDRESS));
+            snmpResponder = new Snmp(udpTransportMapping);
+
+            TestCommandResponder responder = new TestCommandResponder(snmpResponder);
+            snmpResponder.addCommandResponder(responder);
+
+            SecurityModels respSecModels = new SecurityModels() {
+            };
+
+            CounterSupport.getInstance().addCounterListener(new DefaultCounterListener());
+            MPv3 mpv3CR = (MPv3) snmpResponder.getMessageDispatcher().getMessageProcessingModel(MPv3.ID);
+            mpv3CR.setLocalEngineID(MPv3.createLocalEngineID(new OctetString("responder")));
+            respSecModels.addSecurityModel(new USM(
+                    SecurityProtocols.getInstance(),
+                    new OctetString(mpv3CR.getLocalEngineID()), 0));
+            mpv3CR.setSecurityModels(respSecModels);
+
+            snmpResponder.getUSM().addUser(
+                    new UsmUser(
+                            new OctetString(SECURITY_NAME), AuthSHA.ID, new OctetString("changeit"),
+                            AuthSHA.ID, new OctetString("changeit")));
+
+            snmpResponder.listen();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        listeningAddress = udpTransportMapping.getListenAddress().toString().replaceFirst("/", ":");
+    }
+
+    @AfterAll
+    public void afterAll(/*ExtensionContext context*/) {
+        if (snmpResponder != null) {
+            try {
+                snmpResponder.close();
+            } catch (IOException e) {
+                //nothing
+            }
+        }
+    }
+
+    static class TestCommandResponder implements CommandResponder {
+
+        private final Snmp commandResponder;
+        private final Map<String, Integer> counts = new ConcurrentHashMap<>();
+
+        public TestCommandResponder(Snmp commandResponder) {
+            this.commandResponder = commandResponder;
+        }
+
+        @Override
+        public synchronized void processPdu(CommandResponderEvent event) {
+            PDU pdu = event.getPDU();
+            Vector<? extends VariableBinding> vbs;
+            if (pdu.getVariableBindings() != null) {
+                vbs = new Vector<>(pdu.getVariableBindings());
+            } else {
+                vbs = new Vector<>(0);
+            }
+            String key = vbs.stream().sequential().map(vb -> vb.getOid().toString()).collect(Collectors.joining(","));
+
+            int version;
+            //differ snmp versions
+            if (pdu instanceof PDUv1) {
+                version = SnmpConstants.version1;
+                key = "v1_" + key;
+            } else if (pdu instanceof ScopedPDU) {
+                version = SnmpConstants.version3;
+                key = "v3_" + key;
+            } else {
+                version = SnmpConstants.version2c;
+                key = "v2_" + key;
+            }
+            int numberOfSent = counts.getOrDefault(key, 0);
+
+            try {
+                PDU response = makeResponse(pdu, ++numberOfSent, version, vbs);
+                if (response != null) {
+                    response.setRequestID(pdu.getRequestID());
+                    commandResponder.getMessageDispatcher().returnResponsePdu(
+                            event.getMessageProcessingModel(), event.getSecurityModel(),
+                            event.getSecurityName(), event.getSecurityLevel(),
+                            response, event.getMaxSizeResponsePDU(),
+                            event.getStateReference(), new StatusInformation());
+                }
+            } catch (MessageException e) {
+                Assertions.assertNull(e);
+            }
+            counts.put(key, numberOfSent);
+        }
+
+        private PDU makeResponse(PDU originalPDU, int counter, int version, Vector<? extends VariableBinding> vbs) {
+            PDU responsePDU = (PDU) originalPDU.clone();
+            responsePDU.setType(PDU.RESPONSE);
+            responsePDU.setErrorStatus(PDU.noError);
+            responsePDU.setErrorIndex(0);
+            if (vbs.isEmpty()) {
+                VariableBinding vb = generateResponseBinding(counter, version, SnmpConstants.sysDescr);
+                if (vb != null) {
+                    responsePDU.add(vb);
+                }
+            } else {
+                vbs.stream().forEach(vb -> responsePDU.add(generateResponseBinding(counter, version, vb.getOid())));
+            }
+            return responsePDU;
+        }
+
+        private VariableBinding generateResponseBinding(int counter, int version, OID oid) {
+            //real responses
+            //1.3.6.1.2.1.2.2.1.2 -> 1.3.6.1.2.1.2.2.1.2.1 = ether1
+            if ("1.3.6.1.2.1.2.2.1.2".equals(oid.toString())) {
+                return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.2.1"), new OctetString("ether1"));
+            }
+            //1.3.6.1.2.1.2.2.1.2.1 -> 1.3.6.1.2.1.2.2.1.2.2 = ether2
+            if ("1.3.6.1.2.1.2.2.1.2.1".equals(oid.toString())) {
+                return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.2.2"), new OctetString("ether2"));
+            }
+            //1.3.6.1.2.1.2.2.1.2.2 -> 1.3.6.1.2.1.2.2.1.2.3 = ether3
+            if ("1.3.6.1.2.1.2.2.1.2.2".equals(oid.toString())) {
+                return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.2.3"), new OctetString("ether3"));
+            }
+            //1.3.6.1.2.1.2.2.1.2.3 -> 1.3.6.1.2.1.2.2.1.2.4 = ether4
+            if ("1.3.6.1.2.1.2.2.1.2.3".equals(oid.toString())) {
+                return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.2.4"), new OctetString("ether4"));
+            }
+            //1.3.6.1.2.1.2.2.1.2.4 -> 1.3.6.1.2.1.2.2.1.3.1 = 6
+            if ("1.3.6.1.2.1.2.2.1.2.4".equals(oid.toString())) {
+                return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.3.1"), new OctetString("6"));
+            }
+
+            return new VariableBinding(
+                    SnmpConstants.sysDescr,
+                    new OctetString("My Printer - response #" + counter + ", using version: " + version));
+        }
+    }
+
+    public String getListeningAddress() {
+        return listeningAddress;
+    }
+}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpTestSupport.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpTestSupport.java
new file mode 100644
index 00000000000..390eeb30d97
--- /dev/null
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpTestSupport.java
@@ -0,0 +1,29 @@
+/*
+ * 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.camel.component.snmp;
+
+import java.util.stream.Stream;
+
+import org.apache.camel.test.junit5.CamelTestSupport;
+
+public class SnmpTestSupport extends CamelTestSupport {
+
+    static Stream<Integer> supportedVersions() {
+        return Stream.of(0, 1, 3);
+    }
+
+}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv1TrapTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv1TrapTest.java
deleted file mode 100644
index a740e9f27f9..00000000000
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv1TrapTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.camel.component.snmp;
-
-import org.apache.camel.LoggingLevel;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.snmp4j.PDU;
-import org.snmp4j.PDUv1;
-import org.snmp4j.mp.SnmpConstants;
-import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
-import org.snmp4j.smi.TimeTicks;
-import org.snmp4j.smi.Variable;
-import org.snmp4j.smi.VariableBinding;
-
-public class Snmpv1TrapTest extends AbstractTrapTest {
-
-    @Override
-    public PDU createTrap() {
-        PDUv1 trap = new PDUv1();
-        trap.setGenericTrap(PDUv1.ENTERPRISE_SPECIFIC);
-        trap.setSpecificTrap(1);
-
-        OID oid = new OID("1.2.3.4.5");
-        trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
-        trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
-        trap.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
-        trap.setEnterprise(oid);
-
-        //Add Payload
-        Variable var = new OctetString("some string");
-        trap.add(new VariableBinding(oid, var));
-        return trap;
-    }
-
-    /**
-     * RouteBuilders for the SNMP TRAP producer and consumer
-     */
-    @Override
-    protected RoutesBuilder[] createRouteBuilders() {
-        return new RoutesBuilder[] {
-                new RouteBuilder() {
-                    public void configure() {
-                        from("direct:snmptrap")
-                                .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
-                                .to("snmp:127.0.0.1:1662?protocol=udp&type=TRAP&snmpVersion=0");
-                    }
-                },
-                new RouteBuilder() {
-                    public void configure() {
-                        from("snmp:0.0.0.0:1662?protocol=udp&type=TRAP&snmpVersion=0")
-                                .id("SnmpTrapConsumer")
-                                .to("mock:result");
-                    }
-                }
-        };
-    }
-}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv2TrapTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv2TrapTest.java
deleted file mode 100644
index 1f210b2e8e8..00000000000
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv2TrapTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.camel.component.snmp;
-
-import org.apache.camel.LoggingLevel;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.snmp4j.PDU;
-import org.snmp4j.mp.SnmpConstants;
-import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
-import org.snmp4j.smi.TimeTicks;
-import org.snmp4j.smi.Variable;
-import org.snmp4j.smi.VariableBinding;
-
-/**
- * This test covers both producing and consuming snmp traps
- */
-public class Snmpv2TrapTest extends AbstractTrapTest {
-
-    @Override
-    protected PDU createTrap() {
-        // Create a trap PDU
-        PDU trap = new PDU();
-        trap.setType(PDU.TRAP);
-
-        OID oid = new OID("1.2.3.4.5");
-        trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
-        trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
-        trap.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
-
-        //Add Payload
-        Variable var = new OctetString("some string");
-        trap.add(new VariableBinding(oid, var));
-
-        return trap;
-    }
-
-    /**
-     * RouteBuilders for the SNMP TRAP producer and consumer
-     */
-    @Override
-    protected RoutesBuilder[] createRouteBuilders() {
-        return new RoutesBuilder[] {
-                new RouteBuilder() {
-                    public void configure() {
-                        from("direct:snmptrap")
-                                .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
-                                .to("snmp:127.0.0.1:1662?protocol=udp&type=TRAP&snmpVersion=" + SnmpConstants.version2c);
-                    }
-                },
-                new RouteBuilder() {
-                    public void configure() {
-                        from("snmp:0.0.0.0:1662?protocol=udp&type=TRAP&snmpVersion=" + SnmpConstants.version2c)
-                                .id("SnmpTrapConsumer")
-                                .to("mock:result");
-                    }
-                }
-        };
-    }
-}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/TrapTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/TrapTest.java
new file mode 100644
index 00000000000..5abbf7b8d40
--- /dev/null
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/TrapTest.java
@@ -0,0 +1,126 @@
+/*
+ * 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.camel.component.snmp;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.Message;
+import org.apache.camel.Producer;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.AvailablePortFinder;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.snmp4j.PDU;
+import org.snmp4j.PDUv1;
+import org.snmp4j.mp.SnmpConstants;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.OctetString;
+import org.snmp4j.smi.TimeTicks;
+import org.snmp4j.smi.Variable;
+import org.snmp4j.smi.VariableBinding;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class TrapTest extends SnmpTestSupport {
+    private static final Logger LOG = LoggerFactory.getLogger(TrapTest.class);
+
+    @ParameterizedTest
+    @MethodSource("supportedVersions")
+    public void testSendReceiveTraps(int version) throws Exception {
+        PDU trap = createTrap(version);
+
+        // Send it
+        LOG.info("Sending pdu " + trap);
+        Endpoint endpoint = context.getEndpoint("direct:snmptrapV" + version);
+        Exchange exchange = endpoint.createExchange();
+        exchange.getIn().setBody(trap);
+        Producer producer = endpoint.createProducer();
+        producer.process(exchange);
+
+        synchronized (this) {
+            Thread.sleep(1000);
+        }
+
+        // If all goes right it should come here
+        MockEndpoint mock = getMockEndpoint("mock:resultV" + version);
+        mock.expectedMessageCount(1);
+        mock.assertIsSatisfied();
+
+        Message in = mock.getReceivedExchanges().get(0).getIn();
+        Assertions.assertTrue(in instanceof SnmpMessage, "Expected received object 'SnmpMessage.class'. Got: " + in.getClass());
+        String msg = in.getBody(String.class);
+        String expected = "<oid>1.2.3.4.5</oid><value>some string</value>";
+        Assertions.assertTrue(msg.contains(expected), "Expected string containing '" + expected + "'. Got: " + msg);
+    }
+
+    private PDU createTrap(int version) {
+        PDU trap = SnmpHelper.createPDU(version);
+
+        OID oid = new OID("1.2.3.4.5");
+        trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
+        trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
+        trap.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
+        if (version == 0) {
+            ((PDUv1) trap).setEnterprise(oid); //?
+        }
+
+        //Add Payload
+        Variable var = new OctetString("some string");
+        trap.add(new VariableBinding(oid, var));
+        return trap;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                //genrate ports for trap consumers/producers
+                int portV0 = AvailablePortFinder.getNextAvailable();
+                int portV1 = AvailablePortFinder.getNextAvailable();
+                int portV3 = AvailablePortFinder.getNextAvailable();
+
+                from("direct:snmptrapV0")
+                        .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
+                        .to("snmp:127.0.0.1:" + portV0 + "?protocol=udp&type=TRAP&snmpVersion=0");
+
+                from("snmp:0.0.0.0:" + portV0 + "?protocol=udp&type=TRAP&snmpVersion=0")
+                        .to("mock:resultV0");
+
+                from("direct:snmptrapV1")
+                        .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
+                        .to("snmp:127.0.0.1:" + portV1 + "?protocol=udp&type=TRAP&snmpVersion=1");
+
+                from("snmp:0.0.0.0:" + portV1 + "?protocol=udp&type=TRAP&snmpVersion=1")
+                        .to("mock:resultV1");
+
+                from("direct:snmptrapV3")
+                        .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
+                        .to("snmp:127.0.0.1:" + portV3
+                            + "?securityName=test&securityLevel=1&protocol=udp&type=TRAP&snmpVersion=3");
+
+                from("snmp:0.0.0.0:" + portV3 + "?securityName=test&securityLevel=1&protocol=udp&type=TRAP&snmpVersion=3")
+                        .to("mock:resultV3");
+            }
+        };
+    }
+
+}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/WalkOIDTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/WalkOIDTest.java
index a3a60c8833d..41736b1d35c 100644
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/WalkOIDTest.java
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/WalkOIDTest.java
@@ -16,49 +16,48 @@
  */
 package org.apache.camel.component.snmp;
 
-import java.util.List;
-
-import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class WalkOIDTest extends CamelTestSupport {
+public class WalkOIDTest extends SnmpRespondTestSupport {
     private static final Logger LOG = LoggerFactory.getLogger(PollOIDTest.class);
 
-    // a disabled test... before enabling you must fill in a working IP, Port
-    // and maybe oids in the route below
-    @Disabled
-    @Test
-    public void testOIDWalk() throws Exception {
-        MockEndpoint mock = getMockEndpoint("mock:result");
+    @ParameterizedTest
+    @MethodSource("supportedVersions")
+    public void testOIDWalk(int version) throws Exception {
+        template.sendBody("direct:inV" + version, "");
+
+        MockEndpoint mock = getMockEndpoint("mock:resultV" + version);
         mock.expectedMinimumMessageCount(1);
         mock.assertIsSatisfied();
-        List<Exchange> oids = mock.getExchanges();
-        if (LOG.isInfoEnabled()) {
-            for (Exchange e : oids) {
-                LOG.info("OID: " + e.getIn().getBody(String.class));
-            }
-        }
-    }
 
-    @Test
-    public void testStartRoute() {
-        // do nothing here , just make sure the camel route can started.
+        String msg = mock.getReceivedExchanges().get(0).getIn().getBody(String.class);
+        String pattern = ".*<value>ether1</value>.*<value>ether2</value>.*<value>ether3</value>.*<value>ether4</value>.*";
+        Assertions.assertTrue(msg.matches(pattern), "Expected string matching '" + pattern + "'. Got: " + msg);
     }
 
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                // START SNIPPET: e1
-                from("timer:foo?repeatCount=1")
-                        .to("snmp:10.211.55.6:161?protocol=udp&type=GET_NEXT&oids=1.3.6.1.2.1.2.2.1.2,1.3.6.1.2.1.25.3.3.1.2")
-                        .transform(body().convertToString()).to("mock:result");
-                // END SNIPPET: e1
+
+                from("direct:inV0")
+                        .to("snmp:" + getListeningAddress() + "?protocol=udp&type=GET_NEXT&oids=1.3.6.1.2.1.2.2.1.2")
+                        .transform(body().convertToString()).to("mock:resultV0");
+
+                from("direct:inV1")
+                        .to("snmp:" + getListeningAddress()
+                            + "?protocol=udp&snmpVersion=1&type=GET_NEXT&oids=1.3.6.1.2.1.2.2.1.2")
+                        .transform(body().convertToString()).to("mock:resultV1");
+
+                from("direct:inV3")
+                        .to("snmp:" + getListeningAddress()
+                            + "?protocol=udp&snmpVersion=3&type=GET_NEXT&securityName=test&securityLevel=1&oids=1.3.6.1.2.1.2.2.1.2")
+                        .transform(body().convertToString()).to("mock:resultV3");
             }
         };
     }