This is an automated email from the ASF dual-hosted git repository. krisden pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push: new 41590e1 KNOX-2474 - RemoteConfigurationRegistryJAASConfigTest fails due to invalid auth (#387) 41590e1 is described below commit 41590e185efa2c8d8c4aaf22fbc562c498ba808d Author: Kevin Risden <risd...@users.noreply.github.com> AuthorDate: Thu Nov 26 11:58:11 2020 -0500 KNOX-2474 - RemoteConfigurationRegistryJAASConfigTest fails due to invalid auth (#387) Signed-off-by: Kevin Risden <kris...@apache.org> --- ...nfigurationRegistryClientServiceSecureTest.java | 115 +++++++++++ ...onfigurationRegistryClientServiceTestBase.java} | 210 +++------------------ ...igurationRegistryClientServiceUnsecureTest.java | 115 +++++++++++ 3 files changed, 251 insertions(+), 189 deletions(-) diff --git a/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceSecureTest.java b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceSecureTest.java new file mode 100644 index 0000000..64c1877 --- /dev/null +++ b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceSecureTest.java @@ -0,0 +1,115 @@ +/* + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.knox.gateway.service.config.remote.zk; + +import org.apache.commons.io.FileUtils; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.test.TestingCluster; +import org.apache.knox.gateway.config.GatewayConfig; +import org.apache.knox.gateway.service.config.remote.util.RemoteRegistryConfigTestUtils; + +import org.easymock.EasyMock; +import org.junit.Test; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class RemoteConfigurationRegistryClientServiceSecureTest extends RemoteConfigurationRegistryClientServiceTestBase { + /* + * Test a configuration for a secure remote registry, included in the gateway configuration. + */ + @Test + public void testZooKeeperWithSimpleRegistryConfig() throws Exception { + final String AUTH_TYPE = "digest"; + final String REGISTRY_CLIENT_NAME = "zk-registry-name"; + final String PRINCIPAL = "knox"; + final String PWD = "knoxtest"; + final String CRED_ALIAS = "zkCredential"; + + // Configure and start a secure ZK cluster + try (TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, PWD)) { + // Create the setup client for the test cluster, and initialize the test znodes + CuratorFramework setupClient = initializeTestClientAndZNodes(zkCluster, PRINCIPAL); + + // Mock configuration + GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class); + final String registryConfigValue = + GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + ZooKeeperClientService.TYPE + ";" + + GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + zkCluster.getConnectString() + ";" + + GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE + "=" + AUTH_TYPE + ";" + + GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL + "=" + PRINCIPAL + ";" + + GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS + "=" + CRED_ALIAS; + EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME)) + .andReturn(registryConfigValue) + .anyTimes(); + EasyMock.expect(config.getRemoteRegistryConfigurationNames()) + .andReturn(Collections.singletonList(REGISTRY_CLIENT_NAME)).anyTimes(); + EasyMock.replay(config); + + doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, CRED_ALIAS, PWD); + } + } + + /* + * Test the remote registry configuration external to, and referenced from, the gateway configuration, for a secure + * client. + */ + @Test + public void testZooKeeperWithSingleExternalRegistryConfig() throws Exception { + final String AUTH_TYPE = "digest"; + final String REGISTRY_CLIENT_NAME = "my-zookeeper_registryNAME"; + final String PRINCIPAL = "knox"; + final String PWD = "knoxtest"; + final String CRED_ALIAS = "zkCredential"; + + // Configure and start a secure ZK cluster + File tmpRegConfigFile = null; + try (TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, PWD)) { + // Create the setup client for the test cluster, and initialize the test znodes + CuratorFramework setupClient = initializeTestClientAndZNodes(zkCluster, PRINCIPAL); + + // Mock configuration + Map<String, String> registryConfigProps = new HashMap<>(); + registryConfigProps.put("type", ZooKeeperClientService.TYPE); + registryConfigProps.put("name", REGISTRY_CLIENT_NAME); + registryConfigProps.put("address", zkCluster.getConnectString()); + registryConfigProps.put("secure", "true"); + registryConfigProps.put("authType", AUTH_TYPE); + registryConfigProps.put("principal", PRINCIPAL); + registryConfigProps.put("credentialAlias", CRED_ALIAS); + String registryConfigXML = + RemoteRegistryConfigTestUtils.createRemoteConfigRegistriesXML(Collections.singleton(registryConfigProps)); + tmpRegConfigFile = File.createTempFile("myRemoteRegistryConfig", "xml"); + FileUtils.writeStringToFile(tmpRegConfigFile, registryConfigXML, StandardCharsets.UTF_8); + + System.setProperty("org.apache.knox.gateway.remote.registry.config.file", tmpRegConfigFile.getAbsolutePath()); + + GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class); + EasyMock.replay(config); + + doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, CRED_ALIAS, PWD); + } finally { + if (tmpRegConfigFile != null && tmpRegConfigFile.exists()) { + tmpRegConfigFile.delete(); + } + System.clearProperty("org.apache.knox.gateway.remote.registry.config.file"); + } + } +} diff --git a/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTest.java b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTestBase.java similarity index 52% rename from gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTest.java rename to gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTestBase.java index adaa26b..3efda8d 100644 --- a/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTest.java +++ b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTestBase.java @@ -16,7 +16,22 @@ */ package org.apache.knox.gateway.service.config.remote.zk; -import org.apache.commons.io.FileUtils; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.Configuration; + import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.ExponentialBackoffRetry; @@ -24,7 +39,6 @@ import org.apache.curator.test.InstanceSpec; import org.apache.curator.test.TestingCluster; import org.apache.knox.gateway.config.GatewayConfig; import org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceFactory; -import org.apache.knox.gateway.service.config.remote.util.RemoteRegistryConfigTestUtils; import org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClient; import org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClientService; import org.apache.knox.gateway.services.security.AliasService; @@ -32,194 +46,12 @@ import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Id; import org.easymock.EasyMock; -import org.junit.Test; - -import javax.security.auth.login.AppConfigurationEntry; -import javax.security.auth.login.Configuration; -import java.io.File; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -public class RemoteConfigurationRegistryClientServiceTest { - - /* - * Test a configuration for an unsecured remote registry, included in the gateway configuration. - */ - @Test - public void testUnsecuredZooKeeperWithSimpleRegistryConfig() throws Exception { - final String REGISTRY_CLIENT_NAME = "unsecured-zk-registry-name"; - final String PRINCIPAL = null; - final String PWD = null; - final String CRED_ALIAS = null; - - // Configure and start a secure ZK cluster - try (TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, PWD)) { - // Create the setup client for the test cluster, and initialize the test znodes - CuratorFramework setupClient = initializeTestClientAndZNodes(zkCluster, PRINCIPAL); - - // Mock configuration - GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class); - final String registryConfigValue = - GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + ZooKeeperClientService.TYPE + ";" + - GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + zkCluster.getConnectString(); - EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME)) - .andReturn(registryConfigValue) - .anyTimes(); - EasyMock.expect(config.getRemoteRegistryConfigurationNames()) - .andReturn(Collections.singletonList(REGISTRY_CLIENT_NAME)).anyTimes(); - EasyMock.replay(config); - - doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, CRED_ALIAS, PWD); - } - } - - /* - * Test multiple configurations for an unsecured remote registry. - */ - @Test - public void testMultipleUnsecuredZooKeeperWithSimpleRegistryConfig() throws Exception { - final String REGISTRY_CLIENT_NAME_1 = "zkclient1"; - final String REGISTRY_CLIENT_NAME_2 = "zkclient2"; - final String PRINCIPAL = null; - final String PWD = null; - - // Configure and start a secure ZK cluster - try (TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, PWD)) { - // Create the setup client for the test cluster, and initialize the test znodes - CuratorFramework setupClient = initializeTestClientAndZNodes(zkCluster, PRINCIPAL); - - // Mock configuration - GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class); - final String registryConfigValue1 = - GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + ZooKeeperClientService.TYPE + ";" + - GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + zkCluster.getConnectString(); - EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME_1)) - .andReturn(registryConfigValue1).anyTimes(); - final String registryConfigValue2 = - GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + ZooKeeperClientService.TYPE + ";" + - GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + zkCluster.getConnectString(); - EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME_2)) - .andReturn(registryConfigValue2).anyTimes(); - EasyMock.expect(config.getRemoteRegistryConfigurationNames()) - .andReturn(Arrays.asList(REGISTRY_CLIENT_NAME_1, REGISTRY_CLIENT_NAME_2)).anyTimes(); - EasyMock.replay(config); - - // Create the client service instance - RemoteConfigurationRegistryClientService clientService = - RemoteConfigurationRegistryClientServiceFactory.newInstance(config); - assertEquals("Wrong registry client service type.", clientService.getClass(), CuratorClientService.class); - clientService.setAliasService(null); - clientService.init(config, null); - clientService.start(); - - RemoteConfigurationRegistryClient client1 = clientService.get(REGISTRY_CLIENT_NAME_1); - assertNotNull(client1); - - RemoteConfigurationRegistryClient client2 = clientService.get(REGISTRY_CLIENT_NAME_2); - assertNotNull(client2); - - doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME_1, clientService, false); - doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME_2, clientService, false); - } - } - - /* - * Test a configuration for a secure remote registry, included in the gateway configuration. - */ - @Test - public void testZooKeeperWithSimpleRegistryConfig() throws Exception { - final String AUTH_TYPE = "digest"; - final String REGISTRY_CLIENT_NAME = "zk-registry-name"; - final String PRINCIPAL = "knox"; - final String PWD = "knoxtest"; - final String CRED_ALIAS = "zkCredential"; - - // Configure and start a secure ZK cluster - try (TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, PWD)) { - // Create the setup client for the test cluster, and initialize the test znodes - CuratorFramework setupClient = initializeTestClientAndZNodes(zkCluster, PRINCIPAL); - - // Mock configuration - GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class); - final String registryConfigValue = - GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + ZooKeeperClientService.TYPE + ";" + - GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + zkCluster.getConnectString() + ";" + - GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE + "=" + AUTH_TYPE + ";" + - GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL + "=" + PRINCIPAL + ";" + - GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS + "=" + CRED_ALIAS; - EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME)) - .andReturn(registryConfigValue) - .anyTimes(); - EasyMock.expect(config.getRemoteRegistryConfigurationNames()) - .andReturn(Collections.singletonList(REGISTRY_CLIENT_NAME)).anyTimes(); - EasyMock.replay(config); - - doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, CRED_ALIAS, PWD); - } - } - - /* - * Test the remote registry configuration external to, and referenced from, the gateway configuration, for a secure - * client. - */ - @Test - public void testZooKeeperWithSingleExternalRegistryConfig() throws Exception { - final String AUTH_TYPE = "digest"; - final String REGISTRY_CLIENT_NAME = "my-zookeeper_registryNAME"; - final String PRINCIPAL = "knox"; - final String PWD = "knoxtest"; - final String CRED_ALIAS = "zkCredential"; - - // Configure and start a secure ZK cluster - File tmpRegConfigFile = null; - try (TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, PWD)) { - // Create the setup client for the test cluster, and initialize the test znodes - CuratorFramework setupClient = initializeTestClientAndZNodes(zkCluster, PRINCIPAL); - - // Mock configuration - Map<String, String> registryConfigProps = new HashMap<>(); - registryConfigProps.put("type", ZooKeeperClientService.TYPE); - registryConfigProps.put("name", REGISTRY_CLIENT_NAME); - registryConfigProps.put("address", zkCluster.getConnectString()); - registryConfigProps.put("secure", "true"); - registryConfigProps.put("authType", AUTH_TYPE); - registryConfigProps.put("principal", PRINCIPAL); - registryConfigProps.put("credentialAlias", CRED_ALIAS); - String registryConfigXML = - RemoteRegistryConfigTestUtils.createRemoteConfigRegistriesXML(Collections.singleton(registryConfigProps)); - tmpRegConfigFile = File.createTempFile("myRemoteRegistryConfig", "xml"); - FileUtils.writeStringToFile(tmpRegConfigFile, registryConfigXML, StandardCharsets.UTF_8); - - System.setProperty("org.apache.knox.gateway.remote.registry.config.file", tmpRegConfigFile.getAbsolutePath()); - - GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class); - EasyMock.replay(config); - - doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, CRED_ALIAS, PWD); - } finally { - if (tmpRegConfigFile != null && tmpRegConfigFile.exists()) { - tmpRegConfigFile.delete(); - } - System.clearProperty("org.apache.knox.gateway.remote.registry.config.file"); - } - } +public class RemoteConfigurationRegistryClientServiceTestBase { /* * Setup and start a secure test ZooKeeper cluster. */ - private TestingCluster setupAndStartSecureTestZooKeeper(String principal, String digestPassword) throws Exception { + protected TestingCluster setupAndStartSecureTestZooKeeper(String principal, String digestPassword) throws Exception { final boolean applyAuthentication = (principal != null); // Configure security for the ZK cluster instances @@ -267,7 +99,7 @@ public class RemoteConfigurationRegistryClientServiceTest { * @param principal principal for SASL digrest auth * @throws Exception exception on failure */ - private CuratorFramework initializeTestClientAndZNodes(TestingCluster zkCluster, String principal) throws Exception { + protected CuratorFramework initializeTestClientAndZNodes(TestingCluster zkCluster, String principal) throws Exception { // Create the client for the test cluster CuratorFramework setupClient = CuratorFrameworkFactory.builder() .connectString(zkCluster.getConnectString()) @@ -298,7 +130,7 @@ public class RemoteConfigurationRegistryClientServiceTest { return setupClient; } - private void doTestZooKeeperClient(final CuratorFramework setupClient, + protected void doTestZooKeeperClient(final CuratorFramework setupClient, final String testClientName, final GatewayConfig config, final String credentialAlias, @@ -332,7 +164,7 @@ public class RemoteConfigurationRegistryClientServiceTest { * @param isSecureTest Flag to indicate whether this is a secure interaction test * @throws Exception exception on failure */ - private void doTestZooKeeperClient(final CuratorFramework setupClient, + protected void doTestZooKeeperClient(final CuratorFramework setupClient, final String testClientName, final RemoteConfigurationRegistryClientService clientService, boolean isSecureTest) throws Exception { diff --git a/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceUnsecureTest.java b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceUnsecureTest.java new file mode 100644 index 0000000..a971fdb --- /dev/null +++ b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceUnsecureTest.java @@ -0,0 +1,115 @@ +/* + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.knox.gateway.service.config.remote.zk; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.Arrays; +import java.util.Collections; + +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.test.TestingCluster; +import org.apache.knox.gateway.config.GatewayConfig; +import org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceFactory; +import org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClient; +import org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClientService; +import org.easymock.EasyMock; +import org.junit.Test; + +public class RemoteConfigurationRegistryClientServiceUnsecureTest extends RemoteConfigurationRegistryClientServiceTestBase { + /* + * Test a configuration for an unsecured remote registry, included in the gateway configuration. + */ + @Test + public void testUnsecuredZooKeeperWithSimpleRegistryConfig() throws Exception { + final String REGISTRY_CLIENT_NAME = "unsecured-zk-registry-name"; + final String PRINCIPAL = null; + final String PWD = null; + final String CRED_ALIAS = null; + + // Configure and start a secure ZK cluster + try (TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, PWD)) { + // Create the setup client for the test cluster, and initialize the test znodes + CuratorFramework setupClient = initializeTestClientAndZNodes(zkCluster, PRINCIPAL); + + // Mock configuration + GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class); + final String registryConfigValue = + GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + ZooKeeperClientService.TYPE + ";" + + GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + zkCluster.getConnectString(); + EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME)) + .andReturn(registryConfigValue) + .anyTimes(); + EasyMock.expect(config.getRemoteRegistryConfigurationNames()) + .andReturn(Collections.singletonList(REGISTRY_CLIENT_NAME)).anyTimes(); + EasyMock.replay(config); + + doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, CRED_ALIAS, PWD); + } + } + + /* + * Test multiple configurations for an unsecured remote registry. + */ + @Test + public void testMultipleUnsecuredZooKeeperWithSimpleRegistryConfig() throws Exception { + final String REGISTRY_CLIENT_NAME_1 = "zkclient1"; + final String REGISTRY_CLIENT_NAME_2 = "zkclient2"; + final String PRINCIPAL = null; + final String PWD = null; + + // Configure and start a secure ZK cluster + try (TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, PWD)) { + // Create the setup client for the test cluster, and initialize the test znodes + CuratorFramework setupClient = initializeTestClientAndZNodes(zkCluster, PRINCIPAL); + + // Mock configuration + GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class); + final String registryConfigValue1 = + GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + ZooKeeperClientService.TYPE + ";" + + GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + zkCluster.getConnectString(); + EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME_1)) + .andReturn(registryConfigValue1).anyTimes(); + final String registryConfigValue2 = + GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + ZooKeeperClientService.TYPE + ";" + + GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + zkCluster.getConnectString(); + EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME_2)) + .andReturn(registryConfigValue2).anyTimes(); + EasyMock.expect(config.getRemoteRegistryConfigurationNames()) + .andReturn(Arrays.asList(REGISTRY_CLIENT_NAME_1, REGISTRY_CLIENT_NAME_2)).anyTimes(); + EasyMock.replay(config); + + // Create the client service instance + RemoteConfigurationRegistryClientService clientService = + RemoteConfigurationRegistryClientServiceFactory.newInstance(config); + assertEquals("Wrong registry client service type.", clientService.getClass(), CuratorClientService.class); + clientService.setAliasService(null); + clientService.init(config, null); + clientService.start(); + + RemoteConfigurationRegistryClient client1 = clientService.get(REGISTRY_CLIENT_NAME_1); + assertNotNull(client1); + + RemoteConfigurationRegistryClient client2 = clientService.get(REGISTRY_CLIENT_NAME_2); + assertNotNull(client2); + + doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME_1, clientService, false); + doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME_2, clientService, false); + } + } +}