From dd55c2d78004bfb7396e9208f20d2795cf5cc600 Mon Sep 17 00:00:00 2001 From: Clebert Suconic Date: Wed, 15 Jul 2026 14:14:43 -0400 Subject: [PATCH] ARTEMIS-6156 Adding Clustering/Compatibility with security tests --- .../multiVersionCluster/broker1.groovy | 25 ++- .../multiVersionCluster/broker2.groovy | 25 ++- .../multiVersionCoreFederation/broker1.groovy | 68 +++++++ .../broker1Stop.groovy | 20 ++ .../multiVersionCoreFederation/broker2.groovy | 103 ++++++++++ .../broker2Stop.groovy | 20 ++ .../multiVersionFederation/broker1.groovy | 27 ++- .../multiVersionFederation/broker2.groovy | 21 +- .../multiVersionReplica/backupServer.groovy | 17 +- .../multiVersionReplica/mainServer.groovy | 25 ++- .../MultiVersionClusterTest.java | 24 ++- .../MultiVersionCoreFederationTest.java | 179 ++++++++++++++++++ .../MultiVersionFederationTest.java | 24 ++- .../MultiVersionReplicaTest.java | 36 ++-- .../compatibility/base/ClasspathBase.java | 4 + 15 files changed, 580 insertions(+), 38 deletions(-) create mode 100644 tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker1.groovy create mode 100644 tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker1Stop.groovy create mode 100644 tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker2.groovy create mode 100644 tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker2Stop.groovy create mode 100644 tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionCoreFederationTest.java diff --git a/tests/compatibility-tests/src/main/resources/multiVersionCluster/broker1.groovy b/tests/compatibility-tests/src/main/resources/multiVersionCluster/broker1.groovy index 2a6487182af..81649431e0b 100644 --- a/tests/compatibility-tests/src/main/resources/multiVersionCluster/broker1.groovy +++ b/tests/compatibility-tests/src/main/resources/multiVersionCluster/broker1.groovy @@ -21,16 +21,21 @@ import org.apache.activemq.artemis.api.core.RoutingType import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration import org.apache.activemq.artemis.core.config.CoreAddressConfiguration import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl +import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration +import org.apache.activemq.artemis.core.security.Role import org.apache.activemq.artemis.core.server.JournalType import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy import org.apache.activemq.artemis.core.settings.impl.AddressSettings import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType +import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager +import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule String folder = arg[0]; String id = arg[1]; String port = arg[2]; String otherPort = arg[3] +boolean security = Boolean.valueOf(arg[4]); configuration = new ConfigurationImpl(); configuration.setJournalType(JournalType.NIO); @@ -38,7 +43,11 @@ configuration.setBrokerInstance(new File(folder + "/" + id)); configuration.addAcceptorConfiguration("artemis", "tcp://localhost:" + port); configuration.addConnectorConfiguration("local", "tcp://localhost:" + port); configuration.addConnectorConfiguration("other", "tcp://localhost:" + otherPort); -configuration.setSecurityEnabled(false); +configuration.setSecurityEnabled(security); +if (security) { + configuration.setClusterUser("cluster") + configuration.setClusterPassword("cluster") +} configuration.setPersistenceEnabled(true); if (configuration.metaClass.hasMetaProperty("globalMaxMessages")) { @@ -61,6 +70,10 @@ ClusterConnectionConfiguration clusterConfiguration = new ClusterConnectionConfi configuration.addClusterConfiguration(clusterConfiguration) +if (security) { + configuration.putSecurityRoles("#", new HashSet(Arrays.asList(new Role("amq", true, true, true, true, true, true, true, true)))) +} + configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("MultiVersionClusterTestQueue")); configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionClusterTestQueue") .setAddress("MultiVersionClusterTestQueue") @@ -68,4 +81,14 @@ configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionClusterT theBroker1 = new EmbeddedActiveMQ(); theBroker1.setConfiguration(configuration); + +if (security) { + SecurityConfiguration securityConfiguration = new SecurityConfiguration() + securityConfiguration.addUser("admin", "admin") + securityConfiguration.addRole("admin", "amq") + securityConfiguration.setDefaultUser("admin") + ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration) + theBroker1.setSecurityManager(securityManager); +} + theBroker1.start(); diff --git a/tests/compatibility-tests/src/main/resources/multiVersionCluster/broker2.groovy b/tests/compatibility-tests/src/main/resources/multiVersionCluster/broker2.groovy index 6bda892b814..97b16e7a65f 100644 --- a/tests/compatibility-tests/src/main/resources/multiVersionCluster/broker2.groovy +++ b/tests/compatibility-tests/src/main/resources/multiVersionCluster/broker2.groovy @@ -21,16 +21,21 @@ import org.apache.activemq.artemis.api.core.RoutingType import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration import org.apache.activemq.artemis.core.config.CoreAddressConfiguration import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl +import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration +import org.apache.activemq.artemis.core.security.Role import org.apache.activemq.artemis.core.server.JournalType import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy import org.apache.activemq.artemis.core.settings.impl.AddressSettings import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType +import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager +import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule String folder = arg[0]; String id = arg[1]; String port = arg[2]; String otherPort = arg[3] +boolean security = Boolean.valueOf(arg[4]); configuration = new ConfigurationImpl(); configuration.setJournalType(JournalType.NIO); @@ -38,7 +43,11 @@ configuration.setBrokerInstance(new File(folder + "/" + id)); configuration.addAcceptorConfiguration("artemis", "tcp://localhost:" + port); configuration.addConnectorConfiguration("local", "tcp://localhost:" + port); configuration.addConnectorConfiguration("other", "tcp://localhost:" + otherPort); -configuration.setSecurityEnabled(false); +configuration.setSecurityEnabled(security); +if (security) { + configuration.setClusterUser("cluster") + configuration.setClusterPassword("cluster") +} configuration.setPersistenceEnabled(true); if (configuration.metaClass.hasMetaProperty("globalMaxMessages")) { @@ -61,6 +70,10 @@ ClusterConnectionConfiguration clusterConfiguration = new ClusterConnectionConfi configuration.addClusterConfiguration(clusterConfiguration) +if (security) { + configuration.putSecurityRoles("#", new HashSet(Arrays.asList(new Role("amq", true, true, true, true, true, true, true, true)))) +} + configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("MultiVersionClusterTestQueue")); configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionClusterTestQueue") .setAddress("MultiVersionClusterTestQueue") @@ -68,4 +81,14 @@ configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionClusterT theBroker2 = new EmbeddedActiveMQ(); theBroker2.setConfiguration(configuration); + +if (security) { + SecurityConfiguration securityConfiguration = new SecurityConfiguration() + securityConfiguration.addUser("admin", "admin") + securityConfiguration.addRole("admin", "amq") + securityConfiguration.setDefaultUser("admin") + ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration) + theBroker2.setSecurityManager(securityManager); +} + theBroker2.start(); diff --git a/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker1.groovy b/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker1.groovy new file mode 100644 index 00000000000..9c9a758f77d --- /dev/null +++ b/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker1.groovy @@ -0,0 +1,68 @@ +package multiVersionCoreFederation +/* + * 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. + */ + +import org.apache.activemq.artemis.api.core.QueueConfiguration +import org.apache.activemq.artemis.api.core.RoutingType +import org.apache.activemq.artemis.core.config.CoreAddressConfiguration +import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl +import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration +import org.apache.activemq.artemis.core.security.Role +import org.apache.activemq.artemis.core.server.JournalType +import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ +import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy +import org.apache.activemq.artemis.core.settings.impl.AddressSettings +import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager +import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule + +String folder = arg[0]; +boolean security = Boolean.valueOf(arg[1]); + +id = 0; + +configuration = new ConfigurationImpl(); +configuration.setJournalType(JournalType.NIO); +configuration.setBrokerInstance(new File(folder + "/" + id)); +configuration.addAcceptorConfiguration("artemis", "tcp://localhost:61000"); +configuration.setSecurityEnabled(security); +configuration.setPersistenceEnabled(true); + +configuration.addAddressSetting("#", new AddressSettings() + .setAddressFullMessagePolicy(AddressFullMessagePolicy.PAGE).setMaxSizeMessages(100_000).setMaxSizeMessages(100 * 1024 * 1024)); + +if (security) { + configuration.putSecurityRoles("#", new HashSet(Arrays.asList(new Role("amq", true, true, true, true, true, true, true, true)))) +} + +configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("MultiVersionCoreFederationTestQueue")); +configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionCoreFederationTestQueue") + .setAddress("MultiVersionCoreFederationTestQueue") + .setRoutingType(RoutingType.ANYCAST)); + +theBroker1 = new EmbeddedActiveMQ(); +theBroker1.setConfiguration(configuration); + +if (security) { + SecurityConfiguration securityConfiguration = new SecurityConfiguration() + securityConfiguration.addUser("admin", "admin") + securityConfiguration.addRole("admin", "amq") + securityConfiguration.setDefaultUser("admin") + ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration) + theBroker1.setSecurityManager(securityManager); +} + +theBroker1.start(); diff --git a/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker1Stop.groovy b/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker1Stop.groovy new file mode 100644 index 00000000000..e9d96386dfd --- /dev/null +++ b/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker1Stop.groovy @@ -0,0 +1,20 @@ +package multiVersionCoreFederation +/* + * 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. + */ + +theBroker1.stop(); +theBroker1 = null \ No newline at end of file diff --git a/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker2.groovy b/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker2.groovy new file mode 100644 index 00000000000..a143e6e4022 --- /dev/null +++ b/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker2.groovy @@ -0,0 +1,103 @@ +package multiVersionCoreFederation +/* + * 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. + */ + +import org.apache.activemq.artemis.api.core.QueueConfiguration +import org.apache.activemq.artemis.api.core.RoutingType +import org.apache.activemq.artemis.core.config.CoreAddressConfiguration +import org.apache.activemq.artemis.core.config.FederationConfiguration +import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl +import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration +import org.apache.activemq.artemis.core.config.federation.FederationQueuePolicyConfiguration +import org.apache.activemq.artemis.core.config.federation.FederationUpstreamConfiguration +import org.apache.activemq.artemis.core.security.Role +import org.apache.activemq.artemis.core.server.JournalType +import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ +import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy +import org.apache.activemq.artemis.core.settings.impl.AddressSettings +import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager +import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule + +String folder = arg[0]; +boolean security = Boolean.valueOf(arg[1]); + +id = 1; + +configuration = new ConfigurationImpl(); +configuration.setJournalType(JournalType.NIO); +configuration.setBrokerInstance(new File(folder + "/" + id)); +configuration.addAcceptorConfiguration("artemis", "tcp://localhost:61001"); +configuration.addConnectorConfiguration("broker1", "tcp://localhost:61000"); +configuration.setSecurityEnabled(security); +configuration.setPersistenceEnabled(true); + +if (configuration.metaClass.hasMetaProperty("globalMaxMessages")) { + configuration.globalMaxMessages = 10 +} else { + configuration.globalMaxSize = 10 * 1024 +} + +configuration.addAddressSetting("#", new AddressSettings() + .setAddressFullMessagePolicy(AddressFullMessagePolicy.PAGE).setMaxSizeMessages(100_000).setMaxSizeMessages(100 * 1024 * 1024)); + +// Configure core federation upstream to broker1 +FederationQueuePolicyConfiguration queuePolicy = new FederationQueuePolicyConfiguration() +queuePolicy.setName("queue-federation-policy") +queuePolicy.addInclude(new FederationQueuePolicyConfiguration.Matcher() + .setQueueMatch("MultiVersionCoreFederationTestQueue") + .setAddressMatch("MultiVersionCoreFederationTestQueue")) + +FederationUpstreamConfiguration upstream = new FederationUpstreamConfiguration() +upstream.setName("upstream-broker1") +upstream.getConnectionConfiguration().setStaticConnectors(["broker1"]) +upstream.getConnectionConfiguration().setCircuitBreakerTimeout(-1) +upstream.addPolicyRef("queue-federation-policy") + +if (security) { + upstream.getConnectionConfiguration().setUsername("admin") + upstream.getConnectionConfiguration().setPassword("admin") +} + +FederationConfiguration federationConfig = new FederationConfiguration() +federationConfig.setName("default") +federationConfig.addQueuePolicy(queuePolicy) +federationConfig.addUpstreamConfiguration(upstream) + +configuration.getFederationConfigurations().add(federationConfig) + +if (security) { + configuration.putSecurityRoles("#", new HashSet(Arrays.asList(new Role("amq", true, true, true, true, true, true, true, true)))) +} + +configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("MultiVersionCoreFederationTestQueue")); +configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionCoreFederationTestQueue") + .setAddress("MultiVersionCoreFederationTestQueue") + .setRoutingType(RoutingType.ANYCAST)); + +theBroker2 = new EmbeddedActiveMQ(); +theBroker2.setConfiguration(configuration); + +if (security) { + SecurityConfiguration securityConfiguration = new SecurityConfiguration() + securityConfiguration.addUser("admin", "admin") + securityConfiguration.addRole("admin", "amq") + securityConfiguration.setDefaultUser("admin") + ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration) + theBroker2.setSecurityManager(securityManager); +} + +theBroker2.start(); diff --git a/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker2Stop.groovy b/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker2Stop.groovy new file mode 100644 index 00000000000..d7f5fd714ba --- /dev/null +++ b/tests/compatibility-tests/src/main/resources/multiVersionCoreFederation/broker2Stop.groovy @@ -0,0 +1,20 @@ +package multiVersionCoreFederation +/* + * 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. + */ + +theBroker2.stop(); +theBroker2 = null diff --git a/tests/compatibility-tests/src/main/resources/multiVersionFederation/broker1.groovy b/tests/compatibility-tests/src/main/resources/multiVersionFederation/broker1.groovy index b3e19d4d721..25926dbe7fd 100644 --- a/tests/compatibility-tests/src/main/resources/multiVersionFederation/broker1.groovy +++ b/tests/compatibility-tests/src/main/resources/multiVersionFederation/broker1.groovy @@ -20,16 +20,20 @@ import org.apache.activemq.artemis.api.core.QueueConfiguration import org.apache.activemq.artemis.api.core.RoutingType import org.apache.activemq.artemis.core.config.CoreAddressConfiguration import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl +import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPFederationQueuePolicyElement import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPFederatedBrokerConnectionElement +import org.apache.activemq.artemis.core.security.Role import org.apache.activemq.artemis.core.server.JournalType import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy import org.apache.activemq.artemis.core.settings.impl.AddressSettings +import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager +import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule String folder = arg[0]; - +boolean security = Boolean.valueOf(arg[1]); id = 0; @@ -37,7 +41,7 @@ configuration = new ConfigurationImpl(); configuration.setJournalType(JournalType.NIO); configuration.setBrokerInstance(new File(folder + "/" + id)); configuration.addAcceptorConfiguration("amqp", "tcp://localhost:" + 61000); -configuration.setSecurityEnabled(false); +configuration.setSecurityEnabled(security); configuration.setPersistenceEnabled(true); configuration.addAddressSetting("#", new AddressSettings() @@ -51,6 +55,11 @@ AMQPBrokerConnectConfiguration amqpConnection = new AMQPBrokerConnectConfigurati .setReconnectAttempts(-1) .setRetryInterval(1000) +if (security) { + amqpConnection.setUser("admin") + amqpConnection.setPassword("admin") +} + // Configure federation for queues AMQPFederatedBrokerConnectionElement federation = new AMQPFederatedBrokerConnectionElement(); federation.setName("broker2-federation") @@ -64,6 +73,10 @@ amqpConnection.addFederation(federation) configuration.addAMQPConnection(amqpConnection) +if (security) { + configuration.putSecurityRoles("#", new HashSet(Arrays.asList(new Role("amq", true, true, true, true, true, true, true, true)))) +} + configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("MultiVersionFederationTestQueue")); configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionFederationTestQueue") .setAddress("MultiVersionFederationTestQueue") @@ -71,4 +84,14 @@ configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionFederati theBroker1 = new EmbeddedActiveMQ(); theBroker1.setConfiguration(configuration); + +if (security) { + SecurityConfiguration securityConfiguration = new SecurityConfiguration() + securityConfiguration.addUser("admin", "admin") + securityConfiguration.addRole("admin", "amq") + securityConfiguration.setDefaultUser("admin") + ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration) + theBroker1.setSecurityManager(securityManager); +} + theBroker1.start(); diff --git a/tests/compatibility-tests/src/main/resources/multiVersionFederation/broker2.groovy b/tests/compatibility-tests/src/main/resources/multiVersionFederation/broker2.groovy index 16f0a10c889..e1301da65c7 100644 --- a/tests/compatibility-tests/src/main/resources/multiVersionFederation/broker2.groovy +++ b/tests/compatibility-tests/src/main/resources/multiVersionFederation/broker2.groovy @@ -20,15 +20,20 @@ import org.apache.activemq.artemis.api.core.QueueConfiguration import org.apache.activemq.artemis.api.core.RoutingType import org.apache.activemq.artemis.core.config.CoreAddressConfiguration import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl +import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPFederationQueuePolicyElement import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPFederatedBrokerConnectionElement +import org.apache.activemq.artemis.core.security.Role import org.apache.activemq.artemis.core.server.JournalType import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy import org.apache.activemq.artemis.core.settings.impl.AddressSettings +import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager +import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule String folder = arg[0]; +boolean security = Boolean.valueOf(arg[1]); id = 1; @@ -36,7 +41,7 @@ configuration = new ConfigurationImpl(); configuration.setJournalType(JournalType.NIO); configuration.setBrokerInstance(new File(folder + "/" + id)); configuration.addAcceptorConfiguration("artemis", "tcp://localhost:61001"); -configuration.setSecurityEnabled(false); +configuration.setSecurityEnabled(security); configuration.setPersistenceEnabled(true); if (configuration.metaClass.hasMetaProperty("globalMaxMessages")) { @@ -48,6 +53,10 @@ if (configuration.metaClass.hasMetaProperty("globalMaxMessages")) { configuration.addAddressSetting("#", new AddressSettings() .setAddressFullMessagePolicy(AddressFullMessagePolicy.PAGE).setMaxSizeMessages(100_000).setMaxSizeMessages(100 * 1024 * 1024)); +if (security) { + configuration.putSecurityRoles("#", new HashSet(Arrays.asList(new Role("amq", true, true, true, true, true, true, true, true)))) +} + configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("MultiVersionFederationTestQueue")); configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionFederationTestQueue") .setAddress("MultiVersionFederationTestQueue") @@ -55,4 +64,14 @@ configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionFederati theBroker2 = new EmbeddedActiveMQ(); theBroker2.setConfiguration(configuration); + +if (security) { + SecurityConfiguration securityConfiguration = new SecurityConfiguration() + securityConfiguration.addUser("admin", "admin") + securityConfiguration.addRole("admin", "amq") + securityConfiguration.setDefaultUser("admin") + ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration) + theBroker2.setSecurityManager(securityManager); +} + theBroker2.start(); diff --git a/tests/compatibility-tests/src/main/resources/multiVersionReplica/backupServer.groovy b/tests/compatibility-tests/src/main/resources/multiVersionReplica/backupServer.groovy index 9f5921394e5..aa324f81f18 100644 --- a/tests/compatibility-tests/src/main/resources/multiVersionReplica/backupServer.groovy +++ b/tests/compatibility-tests/src/main/resources/multiVersionReplica/backupServer.groovy @@ -22,10 +22,14 @@ import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration import org.apache.activemq.artemis.core.config.CoreAddressConfiguration import org.apache.activemq.artemis.core.config.ha.ReplicaPolicyConfiguration import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl +import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration +import org.apache.activemq.artemis.core.security.Role import org.apache.activemq.artemis.core.server.JournalType import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy import org.apache.activemq.artemis.core.settings.impl.AddressSettings +import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager +import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule String folder = arg[0]; String id = arg[1]; @@ -37,7 +41,9 @@ configuration.setJournalType(JournalType.NIO); configuration.setBrokerInstance(new File(folder + "/" + id)); configuration.addAcceptorConfiguration("artemis", "tcp://localhost:" + port); configuration.addConnectorConfiguration("local", "tcp://localhost:" + port); -configuration.setSecurityEnabled(false); +configuration.setSecurityEnabled(true); +configuration.setClusterUser("cluster") +configuration.setClusterPassword("cluster") configuration.setPersistenceEnabled(true); if (configuration.metaClass.hasMetaProperty("globalMaxMessages")) { @@ -52,11 +58,20 @@ configuration.addAddressesSetting("#", new AddressSettings().setAddressFullMessa ClusterConnectionConfiguration backToMain = new ClusterConnectionConfiguration(new URI("static://(tcp://localhost:" + backupPort + ")")).setName("main").setConnectorName("local") configuration.addClusterConfiguration(backToMain) +configuration.putSecurityRoles("#", new HashSet(Arrays.asList(new Role("amq", true, true, true, true, true, true, true, true)))) + configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("MultiVersionReplicaTestQueue")); configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionReplicaTestQueue").setAddress("MultiVersionReplicaTestQueue").setRoutingType(RoutingType.ANYCAST)); +SecurityConfiguration securityConfiguration = new SecurityConfiguration() +securityConfiguration.addUser("admin", "admin") +securityConfiguration.addRole("admin", "amq") +securityConfiguration.setDefaultUser("admin") +ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration) + theBackupServer = new EmbeddedActiveMQ(); theBackupServer.setConfiguration(configuration); +theBackupServer.setSecurityManager(securityManager); theBackupServer.start(); diff --git a/tests/compatibility-tests/src/main/resources/multiVersionReplica/mainServer.groovy b/tests/compatibility-tests/src/main/resources/multiVersionReplica/mainServer.groovy index 68e46227186..d2b361a2b39 100644 --- a/tests/compatibility-tests/src/main/resources/multiVersionReplica/mainServer.groovy +++ b/tests/compatibility-tests/src/main/resources/multiVersionReplica/mainServer.groovy @@ -22,24 +22,33 @@ import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration import org.apache.activemq.artemis.core.config.CoreAddressConfiguration import org.apache.activemq.artemis.core.config.ha.ReplicatedPolicyConfiguration import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl +import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration +import org.apache.activemq.artemis.core.security.Role // starts an artemis server import org.apache.activemq.artemis.core.server.JournalType import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy import org.apache.activemq.artemis.core.settings.impl.AddressSettings +import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager +import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule String folder = arg[0]; String id = arg[1]; String port = arg[2]; String backupPort = arg[3] +boolean security = Boolean.valueOf(arg[4]); configuration = new ConfigurationImpl(); configuration.setJournalType(JournalType.NIO); configuration.setBrokerInstance(new File(folder + "/" + id)); configuration.addAcceptorConfiguration("artemis", "tcp://localhost:" + port); configuration.addConnectorConfiguration("local", "tcp://localhost:" + port); -configuration.setSecurityEnabled(false); +configuration.setSecurityEnabled(security); +if (security) { + configuration.setClusterUser("cluster") + configuration.setClusterPassword("cluster") +} configuration.setPersistenceEnabled(true); if (configuration.metaClass.hasMetaProperty("globalMaxMessages")) { @@ -55,9 +64,23 @@ configuration.addAddressesSetting("#", new AddressSettings().setAddressFullMessa ClusterConnectionConfiguration backupConfiguration = new ClusterConnectionConfiguration(new URI("static://(tcp://localhost:" + backupPort + ")")).setName("main").setConnectorName("local") configuration.addClusterConfiguration(backupConfiguration) +if (security) { + configuration.putSecurityRoles("#", new HashSet(Arrays.asList(new Role("amq", true, true, true, true, true, true, true, true)))) +} + configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("MultiVersionReplicaTestQueue")); configuration.addQueueConfiguration(new QueueConfiguration("MultiVersionReplicaTestQueue").setAddress("MultiVersionReplicaTestQueue").setRoutingType(RoutingType.ANYCAST)); theMainServer = new EmbeddedActiveMQ(); theMainServer.setConfiguration(configuration); + +if (security) { + SecurityConfiguration securityConfiguration = new SecurityConfiguration() + securityConfiguration.addUser("admin", "admin") + securityConfiguration.addRole("admin", "amq") + securityConfiguration.setDefaultUser("admin") + ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration) + theMainServer.setSecurityManager(securityManager); +} + theMainServer.start(); diff --git a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionClusterTest.java b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionClusterTest.java index d4f034e4fde..98e18506998 100644 --- a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionClusterTest.java +++ b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionClusterTest.java @@ -59,26 +59,32 @@ public class MultiVersionClusterTest extends ClasspathBase { private final String broker2Version; private final ClassLoader broker2Classloader; - @Parameters(name = "broker1={0}, broker2={1}") + private boolean security; + + @Parameters(name = "broker1={0}, broker2={1}, security={2}") public static Collection getParameters() { List combinations = new ArrayList<>(); // Test clustering with mixed versions - combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT}); - combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0}); + combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0, true}); + combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT, false}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0, false}); // The SNAPSHOT/SNAPSHOT is here as a test validation only - combinations.add(new Object[]{SNAPSHOT, SNAPSHOT}); + combinations.add(new Object[]{SNAPSHOT, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, SNAPSHOT, false}); return combinations; } - public MultiVersionClusterTest(String broker1Version, String broker2Version) throws Exception { + public MultiVersionClusterTest(String broker1Version, String broker2Version, boolean security) throws Exception { this.broker1Version = broker1Version; this.broker1Classloader = getClasspath(broker1Version); this.broker2Version = broker2Version; this.broker2Classloader = getClasspath(broker2Version); + this.security = security; } @AfterEach @@ -99,10 +105,10 @@ public void cleanupServers() { public void testCluster() throws Throwable { FileUtil.deleteDirectory(serverFolder.getAbsoluteFile()); System.out.println("Starting broker1 with version " + broker1Version); - evaluate(broker1Classloader, "multiVersionCluster/broker1.groovy", serverFolder.getAbsolutePath(), "broker1", "61000", "61001"); + evaluate(broker1Classloader, "multiVersionCluster/broker1.groovy", serverFolder.getAbsolutePath(), "broker1", "61000", "61001", String.valueOf(security)); System.out.println("Starting broker2 with version " + broker2Version); - evaluate(broker2Classloader, "multiVersionCluster/broker2.groovy", serverFolder.getAbsolutePath(), "broker2", "61001", "61000"); + evaluate(broker2Classloader, "multiVersionCluster/broker2.groovy", serverFolder.getAbsolutePath(), "broker2", "61001", "61000", String.valueOf(security)); // Wait for cluster to form evaluate(broker1Classloader, "multiVersionCluster/broker1WaitForTopology.groovy"); @@ -133,7 +139,7 @@ public void testCluster() throws Throwable { } private void send(ConnectionFactory factory, int numberOfMessages, int textSize) throws Throwable { - try (Connection connection = factory.createConnection()) { + try (Connection connection = factory.createConnection("admin", "admin")) { Queue queue; { @@ -158,7 +164,7 @@ private void send(ConnectionFactory factory, int numberOfMessages, int textSize) } private void receive(ConnectionFactory factory, int numberOfMessages, int textSize) throws Throwable { - try (Connection connection = factory.createConnection()) { + try (Connection connection = factory.createConnection("admin", "admin")) { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue(QUEUE_NAME); connection.start(); diff --git a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionCoreFederationTest.java b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionCoreFederationTest.java new file mode 100644 index 00000000000..09935c91864 --- /dev/null +++ b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionCoreFederationTest.java @@ -0,0 +1,179 @@ +/* + * 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.activemq.artemis.tests.compatibility; + +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.MessageConsumer; +import javax.jms.MessageProducer; +import javax.jms.Queue; +import javax.jms.Session; +import javax.jms.TextMessage; +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; +import org.apache.activemq.artemis.tests.compatibility.base.ClasspathBase; +import org.apache.activemq.artemis.tests.extensions.parameterized.ParameterizedTestExtension; +import org.apache.activemq.artemis.tests.extensions.parameterized.Parameters; +import org.apache.activemq.artemis.utils.FileUtil; +import org.apache.qpid.jms.JmsConnectionFactory; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.apache.activemq.artemis.tests.compatibility.GroovyRun.ARTEMIS_2_44_0; +import static org.apache.activemq.artemis.tests.compatibility.GroovyRun.SNAPSHOT; +import static org.apache.activemq.artemis.tests.compatibility.GroovyRun.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@ExtendWith(ParameterizedTestExtension.class) +public class MultiVersionCoreFederationTest extends ClasspathBase { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private static final String QUEUE_NAME = "MultiVersionCoreFederationTestQueue"; + + private final String broker1Version; + private final ClassLoader broker1Classloader; + + private final String broker2Version; + private final ClassLoader broker2Classloader; + + private boolean security; + + @Parameters(name = "broker1={0}, broker2={1}, security={2}") + public static Collection getParameters() { + List combinations = new ArrayList<>(); + + // Test core federation with mixed versions + combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0, true}); + combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT, false}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0, false}); + + // The SNAPSHOT/SNAPSHOT is here as a test validation only + combinations.add(new Object[]{SNAPSHOT, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, SNAPSHOT, false}); + + return combinations; + } + + public MultiVersionCoreFederationTest(String broker1Version, + String broker2Version, + boolean security) throws Exception { + this.broker1Version = broker1Version; + this.broker1Classloader = getClasspath(broker1Version); + + this.broker2Version = broker2Version; + this.broker2Classloader = getClasspath(broker2Version); + this.security = security; + } + + + + @AfterEach + public void cleanupServers() { + try { + evaluate(broker1Classloader, "multiVersionCoreFederation/broker1Stop.groovy"); + } catch (Exception e) { + logger.warn(e.getMessage(), e); + } + try { + evaluate(broker2Classloader, "multiVersionCoreFederation/broker2Stop.groovy"); + } catch (Exception e) { + logger.warn(e.getMessage(), e); + } + + clearClassLoaders(); + } + + @TestTemplate + public void testCoreFederation() throws Throwable { + FileUtil.deleteDirectory(serverFolder.getAbsoluteFile()); + FileUtil.deleteDirectory(serverFolder.getAbsoluteFile()); + System.out.println("Starting broker1 with version " + broker1Version); + evaluate(broker1Classloader, "multiVersionCoreFederation/broker1.groovy", serverFolder.getAbsolutePath(), String.valueOf(security)); + + System.out.println("Starting broker2 with version " + broker2Version); + evaluate(broker2Classloader, "multiVersionCoreFederation/broker2.groovy", serverFolder.getAbsolutePath(), String.valueOf(security)); + + // Send messages on broker1 + send(new ActiveMQConnectionFactory("tcp://localhost:61000"), 100, 1024); + // Receive messages on broker2 (federated from broker1) + receive(new ActiveMQConnectionFactory("tcp://localhost:61001"), 100, 1024); + + // Send large messages on broker1 + send(new ActiveMQConnectionFactory("tcp://localhost:61000"), 100, 1024); + // Receive large messages on broker2 + receive(new ActiveMQConnectionFactory("tcp://localhost:61001"), 100, 1024); + + // send amqp messages on broker1 + send(new JmsConnectionFactory("amqp://localhost:61000"), 100, 1024); + // receive amqp messages on broker2 + receive(new JmsConnectionFactory("amqp://localhost:61001"), 100, 1024); + + // send amqp large messages on broker1 + send(new JmsConnectionFactory("amqp://localhost:61000"), 10, 300 * 1024); + // receive amqp large messages on broker2 + receive(new JmsConnectionFactory("amqp://localhost:61001"), 10, 300 * 1024); + } + + private void send(ConnectionFactory factory, int numberOfMessages, int textSize) throws Throwable { + try (Connection connection = factory.createConnection("admin", "admin")) { + Queue queue; + + { + Session session = connection.createSession(true, Session.SESSION_TRANSACTED); + queue = session.createQueue(QUEUE_NAME); + MessageProducer producer = session.createProducer(queue); + boolean pending = false; + for (int i = 0; i < numberOfMessages; i++) { + producer.send(session.createTextMessage("A".repeat(textSize))); + pending = true; + if (i > 0 && i % 100 == 0) { + session.commit(); + pending = false; + } + } + if (pending) { + session.commit(); + } + session.close(); + } + } + } + + private void receive(ConnectionFactory factory, int numberOfMessages, int textSize) throws Throwable { + try (Connection connection = factory.createConnection("admin", "admin")) { + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + Queue queue = session.createQueue(QUEUE_NAME); + connection.start(); + MessageConsumer consumer = session.createConsumer(queue); + for (int i = 0; i < numberOfMessages; i++) { + TextMessage message = (TextMessage) consumer.receive(5000); + assertNotNull(message, "Message " + i + " was not received"); + assertEquals("A".repeat(textSize), message.getText()); + } + } + } +} diff --git a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionFederationTest.java b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionFederationTest.java index 35c28c8013e..7ace700bdd9 100644 --- a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionFederationTest.java +++ b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionFederationTest.java @@ -59,26 +59,32 @@ public class MultiVersionFederationTest extends ClasspathBase { private final String broker2Version; private final ClassLoader broker2Classloader; - @Parameters(name = "broker1={0}, broker2={1}") + private boolean security; + + @Parameters(name = "broker1={0}, broker2={1}, security={2}") public static Collection getParameters() { List combinations = new ArrayList<>(); // Test federation with mixed versions - combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT}); - combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0}); + combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0, true}); + combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT, false}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0, false}); // The SNAPSHOT/SNAPSHOT is here as a test validation only - combinations.add(new Object[]{SNAPSHOT, SNAPSHOT}); + combinations.add(new Object[]{SNAPSHOT, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, SNAPSHOT, false}); return combinations; } - public MultiVersionFederationTest(String broker1Version, String broker2Version) throws Exception { + public MultiVersionFederationTest(String broker1Version, String broker2Version, boolean security) throws Exception { this.broker1Version = broker1Version; this.broker1Classloader = getClasspath(broker1Version); this.broker2Version = broker2Version; this.broker2Classloader = getClasspath(broker2Version); + this.security = security; } @AfterEach @@ -99,10 +105,10 @@ public void cleanupServers() { public void testFederation() throws Throwable { FileUtil.deleteDirectory(serverFolder.getAbsoluteFile()); System.out.println("Starting broker1 with version " + broker1Version); - evaluate(broker1Classloader, "multiVersionFederation/broker1.groovy", serverFolder.getAbsolutePath()); + evaluate(broker1Classloader, "multiVersionFederation/broker1.groovy", serverFolder.getAbsolutePath(), String.valueOf(security)); System.out.println("Starting broker2 with version " + broker2Version); - evaluate(broker2Classloader, "multiVersionFederation/broker2.groovy", serverFolder.getAbsolutePath()); + evaluate(broker2Classloader, "multiVersionFederation/broker2.groovy", serverFolder.getAbsolutePath(), String.valueOf(security)); // Send messages on broker1 send(new ActiveMQConnectionFactory("tcp://localhost:61000"), 100, 1024); @@ -129,7 +135,7 @@ public void testFederation() throws Throwable { } private void send(ConnectionFactory factory, int numberOfMessages, int textSize) throws Throwable { - try (Connection connection = factory.createConnection()) { + try (Connection connection = factory.createConnection("admin", "admin")) { Queue queue; { @@ -154,7 +160,7 @@ private void send(ConnectionFactory factory, int numberOfMessages, int textSize) } private void receive(ConnectionFactory factory, int numberOfMessages, int textSize) throws Throwable { - try (Connection connection = factory.createConnection()) { + try (Connection connection = factory.createConnection("admin", "admin")) { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue(QUEUE_NAME); connection.start(); diff --git a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionReplicaTest.java b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionReplicaTest.java index 490c3352616..ead61556f02 100644 --- a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionReplicaTest.java +++ b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/MultiVersionReplicaTest.java @@ -54,34 +54,44 @@ public class MultiVersionReplicaTest extends ClasspathBase { private final String backup; private final ClassLoader backupClassLoader; + private boolean security; - @Parameters(name = "main={0}, backup={1}") + + @Parameters(name = "main={0}, backup={1}, security={2}") public static Collection getParameters() { List combinations = new ArrayList<>(); if (getJavaVersion() <= 22) { // Old 2.x servers fail on JDK23+ without workarounds. - combinations.add(new Object[]{ARTEMIS_2_22_0, SNAPSHOT}); - combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_22_0}); - combinations.add(new Object[]{ARTEMIS_2_17_0, SNAPSHOT}); - combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_17_0}); + combinations.add(new Object[]{ARTEMIS_2_22_0, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_22_0, true}); + combinations.add(new Object[]{ARTEMIS_2_17_0, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_17_0, true}); + combinations.add(new Object[]{ARTEMIS_2_22_0, SNAPSHOT, false}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_22_0, false}); + combinations.add(new Object[]{ARTEMIS_2_17_0, SNAPSHOT, false}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_17_0, false}); } - combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT}); - combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0}); + combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0, true}); + combinations.add(new Object[]{ARTEMIS_2_44_0, SNAPSHOT, false}); + combinations.add(new Object[]{SNAPSHOT, ARTEMIS_2_44_0, false}); // The SNAPSHOT/SNAPSHOT is here as a test validation only, like in other cases where SNAPSHOT/SNAPSHOT is used. - combinations.add(new Object[]{SNAPSHOT, SNAPSHOT}); + combinations.add(new Object[]{SNAPSHOT, SNAPSHOT, true}); + combinations.add(new Object[]{SNAPSHOT, SNAPSHOT, false}); return combinations; } - public MultiVersionReplicaTest(String main, String backup) throws Exception { + public MultiVersionReplicaTest(String main, String backup, boolean security) throws Exception { this.main = main; this.mainClassloader = getClasspath(main); this.backup = backup; this.backupClassLoader = getClasspath(backup); + this.security = security; } @AfterEach @@ -100,9 +110,9 @@ public void cleanupServers() { @TestTemplate public void testReplica() throws Throwable { System.out.println("Starting live"); - evaluate(mainClassloader, "multiVersionReplica/mainServer.groovy", serverFolder.getAbsolutePath(), "1", "61000", "61001"); + evaluate(mainClassloader, "multiVersionReplica/mainServer.groovy", serverFolder.getAbsolutePath(), "1", "61000", "61001", String.valueOf(security)); System.out.println("Starting backup"); - evaluate(backupClassLoader, "multiVersionReplica/backupServer.groovy", serverFolder.getAbsolutePath(), "2", "61001", "61000"); + evaluate(backupClassLoader, "multiVersionReplica/backupServer.groovy", serverFolder.getAbsolutePath(), "2", "61001", "61000", String.valueOf(security)); evaluate(mainClassloader, "multiVersionReplica/mainServerIsReplicated.groovy"); @@ -120,7 +130,7 @@ public void testReplica() throws Throwable { private void send(ConnectionFactory factory, int numberOfMessagesTx, int numberOfMessagesNonTx) throws Throwable { - try (Connection connection = factory.createConnection()) { + try (Connection connection = factory.createConnection("admin", "admin")) { Queue queue; { @@ -153,7 +163,7 @@ private void send(ConnectionFactory factory, int numberOfMessagesTx, int numberO } private void receive(ConnectionFactory factory, int numberOfMessages) throws Throwable { - try (Connection connection = factory.createConnection()) { + try (Connection connection = factory.createConnection("admin", "admin")) { Session session = connection.createSession(true, Session.SESSION_TRANSACTED); Queue queue = session.createQueue(QUEUE_NAME); connection.start(); diff --git a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/base/ClasspathBase.java b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/base/ClasspathBase.java index ac544b4cad7..ae80d4f63ed 100644 --- a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/base/ClasspathBase.java +++ b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/base/ClasspathBase.java @@ -44,6 +44,10 @@ public class ClasspathBase { @AfterAll public static void cleanup() throws Exception { + clearClassLoaders(); + } + + public static void clearClassLoaders() { loaderMap.values().forEach((ClasspathBase::clearClassLoader)); clearClassLoader(VersionedBase.class.getClassLoader()); loaderMap.clear();