http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumAuthTestBase.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumAuthTestBase.java b/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumAuthTestBase.java deleted file mode 100644 index 219d5bc..0000000 --- a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumAuthTestBase.java +++ /dev/null @@ -1,248 +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.zookeeper.server.quorum.auth; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.zookeeper.PortAssignment; -import org.apache.zookeeper.ZKTestCase; -import org.apache.zookeeper.server.quorum.QuorumPeerTestBase.MainThread; -import org.apache.zookeeper.test.ClientBase; -import org.junit.Assert; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * QuorumAuthTestBase provides a base class for testing quorum peer mutual - * authentication using SASL mechanisms. - */ -public class QuorumAuthTestBase extends ZKTestCase { - protected static final Logger LOG = LoggerFactory.getLogger(QuorumAuthTestBase.class); - protected List<MainThread> mt = new ArrayList<MainThread>(); - protected static File jaasConfigDir; - - public static void setupJaasConfig(String jaasEntries) { - try { - jaasConfigDir = ClientBase.createTmpDir(); - File saslConfFile = new File(jaasConfigDir, "jaas.conf"); - FileWriter fwriter = new FileWriter(saslConfFile); - fwriter.write(jaasEntries); - fwriter.close(); - System.setProperty("java.security.auth.login.config", - saslConfFile.getAbsolutePath()); - } catch (IOException ioe) { - LOG.error("Failed to create tmp directory to hold JAAS conf file", ioe); - // could not create tmp directory to hold JAAS conf file : test will - // fail now. - } - } - - public static void cleanupJaasConfig() { - if (jaasConfigDir != null) { - FileUtils.deleteQuietly(jaasConfigDir); - } - } - - protected String startQuorum(final int serverCount, - Map<String, String> authConfigs, int authServerCount, - boolean delayedServerStartup) throws IOException { - StringBuilder connectStr = new StringBuilder(); - final int[] clientPorts = startQuorum(serverCount, 0, connectStr, - authConfigs, authServerCount, delayedServerStartup); - for (int i = 0; i < serverCount; i++) { - Assert.assertTrue("waiting for server " + i + " being up", - ClientBase.waitForServerUp("127.0.0.1:" + clientPorts[i], - ClientBase.CONNECTION_TIMEOUT)); - } - return connectStr.toString(); - } - - /** - * Starts the given number of quorum servers and will wait for the quorum - * formation. - * - * @param serverCount - * total server count includes participants + observers - * @param observerCount - * number of observers - * @param authConfigs - * configuration parameters for authentication - * @param authServerCount - * number of auth enabled servers - * @return client port for the respective servers - * @throws IOException - */ - protected String startQuorum(final int serverCount, int observerCount, - Map<String, String> authConfigs, int authServerCount) - throws IOException { - StringBuilder connectStr = new StringBuilder(); - final int[] clientPorts = startQuorum(serverCount, observerCount, - connectStr, authConfigs, authServerCount, false); - for (int i = 0; i < serverCount; i++) { - Assert.assertTrue("waiting for server " + i + " being up", - ClientBase.waitForServerUp("127.0.0.1:" + clientPorts[i], - ClientBase.CONNECTION_TIMEOUT)); - } - return connectStr.toString(); - } - - /** - * Starts the given number of quorum servers and won't wait for the quorum - * formation. - * - * @param serverCount - * total server count includes participants + observers - * @param observerCount - * number of observers - * @param connectStr - * connection string where clients can used for connection - * establishment - * @param authConfigs - * configuration parameters for authentication - * @param authServerCount - * number of auth enabled servers - * @param delayedServerStartup - * true flag value to add delay between server's startup, false otherwise. - * @return client port for the respective servers - * @throws IOException - */ - protected int[] startQuorum(final int serverCount, int observerCount, - StringBuilder connectStr, Map<String, String> authConfigs, - int authServerCount, boolean delayedServerStartup) - throws IOException { - final int clientPorts[] = new int[serverCount]; - StringBuilder sb = new StringBuilder(); - - // If there are any Observers then the Observer server details will be - // placed first in the configuration section. - for (int i = 0; i < serverCount; i++) { - clientPorts[i] = PortAssignment.unique(); - String server = ""; - if (observerCount > 0 && i < observerCount) { - // add observer learner type - server = String.format("server.%d=localhost:%d:%d:observer", - i, PortAssignment.unique(), PortAssignment.unique()); - } else { - // add participant learner type - server = String.format("server.%d=localhost:%d:%d:participant", - i, PortAssignment.unique(), PortAssignment.unique()); - } - sb.append(server + "\n"); - connectStr.append("127.0.0.1:" + clientPorts[i]); - if (i < serverCount - 1) { - connectStr.append(","); - } - } - String quorumCfg = sb.toString(); - // servers with authentication interfaces configured - int i = 0; - for (; i < authServerCount; i++) { - if (observerCount > 0 && i < observerCount) { - String obsCfgSection = quorumCfg + "\npeerType=observer"; - quorumCfg = obsCfgSection; - } - startServer(authConfigs, clientPorts[i], quorumCfg, i, delayedServerStartup); - } - // servers without any authentication configured - for (int j = 0; j < serverCount - authServerCount; j++, i++) { - if (observerCount > 0 && i < observerCount) { - String obsCfgSection = quorumCfg + "\npeerType=observer"; - quorumCfg = obsCfgSection; - } - startServer(null, clientPorts[i], quorumCfg, i, delayedServerStartup); - } - return clientPorts; - } - - private void startServer(Map<String, String> authConfigs, - final int clientPort, String quorumCfg, int i, - boolean delayedServerStartup) throws IOException { - MainThread mthread; - if (authConfigs != null) { - mthread = new MainThread(i, clientPort, quorumCfg, authConfigs); - } else { - mthread = new MainThread(i, clientPort, quorumCfg); - } - mt.add(mthread); - mthread.start(); - - if (delayedServerStartup) { - addDelayBeforeStartingNextServer(mthread); - } - } - - private void addDelayBeforeStartingNextServer(MainThread mThread) { - // Refer https://issues.apache.org/jira/browse/ZOOKEEPER-2712 - LOG.info("Waiting to finish login context init(Krb login), " - + "as there are potential concurrency issues in ApacheDS " - + "if multiple servers starts together!"); - int retries = 60; // 15secs delay - while (retries > 0) { - if (mThread.getQuorumPeer() != null - && mThread.getQuorumPeer().hasAuthInitialized()) { - try { - Thread.sleep(1000); // adding 1sec grace period. - } catch (InterruptedException e) { - LOG.info("Ignore InterruptedException"); - } - break; - } - // moving to next retry cycle - retries--; - try { - Thread.sleep(250); - } catch (InterruptedException e) { - LOG.info("Ignore InterruptedException"); - } - } - } - - protected void startServer(MainThread restartPeer, - Map<String, String> authConfigs) throws IOException { - MainThread mthread = new MainThread(restartPeer.getMyid(), - restartPeer.getClientPort(), restartPeer.getQuorumCfgSection(), - authConfigs); - mt.add(mthread); - mthread.start(); - } - - void shutdownAll() { - for (int i = 0; i < mt.size(); i++) { - shutdown(i); - } - } - - MainThread shutdown(int index) { - MainThread mainThread = mt.get(index); - try { - mainThread.shutdown(); - } catch (InterruptedException e) { - } finally { - mt.remove(index); - } - mainThread.deleteBaseDir(); - return mainThread; - } -}
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumAuthUpgradeTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumAuthUpgradeTest.java b/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumAuthUpgradeTest.java deleted file mode 100644 index 4eeccf3..0000000 --- a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumAuthUpgradeTest.java +++ /dev/null @@ -1,239 +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.zookeeper.server.quorum.auth; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeoutException; - -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.server.quorum.QuorumPeerTestBase.MainThread; -import org.apache.zookeeper.test.ClientBase; -import org.apache.zookeeper.test.ClientTest; -import org.apache.zookeeper.test.ClientBase.CountdownWatcher; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Test; - -/** - * Rolling upgrade should do in three steps: - * - * step-1) Stop the server and set the flags and restart the server. - * quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=false and quorum.auth.serverRequireSasl=false - * Ensure that all the servers should complete this step. Now, move to next step. - * - * step-2) Stop the server one by one and change the flags and restart the server. - * quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=true and quorum.auth.serverRequireSasl=false - * Ensure that all the servers should complete this step. Now, move to next step. - * - * step-3) Stop the server one by one and change the flags and restart the server. - * quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=true and quorum.auth.serverRequireSasl=true - * Now, all the servers are fully upgraded and running in secured mode. - */ -public class QuorumAuthUpgradeTest extends QuorumAuthTestBase { - static { - String jaasEntries = new String("" + "QuorumServer {\n" - + " org.apache.zookeeper.server.auth.DigestLoginModule required\n" - + " user_test=\"mypassword\";\n" + "};\n" - + "QuorumLearner {\n" - + " org.apache.zookeeper.server.auth.DigestLoginModule required\n" - + " username=\"test\"\n" - + " password=\"mypassword\";\n" + "};\n"); - setupJaasConfig(jaasEntries); - } - - @After - public void tearDown() throws Exception { - shutdownAll(); - } - - @AfterClass - public static void cleanup() { - cleanupJaasConfig(); - } - - /** - * Test to verify that servers are able to start without any authentication. - * peer0 -> quorum.auth.enableSasl=false - * peer1 -> quorum.auth.enableSasl=false - */ - @Test(timeout = 30000) - public void testNullAuthLearnerServer() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "false"); - - String connectStr = startQuorum(2, authConfigs, 0, false); - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, - watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - zk.close(); - } - - /** - * Test to verify that servers are able to form quorum. - * peer0 -> quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=false, quorum.auth.serverRequireSasl=false - * peer1 -> quorum.auth.enableSasl=false, quorum.auth.learnerRequireSasl=false, quorum.auth.serverRequireSasl=false - */ - @Test(timeout = 30000) - public void testAuthLearnerAgainstNullAuthServer() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - - String connectStr = startQuorum(2, authConfigs, 1, false); - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, - watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - zk.close(); - } - - /** - * Test to verify that servers are able to form quorum. - * peer0 -> quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=false, quorum.auth.serverRequireSasl=false - * peer1 -> quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=false, quorum.auth.serverRequireSasl=false - */ - @Test(timeout = 30000) - public void testAuthLearnerAgainstNoAuthRequiredServer() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - - String connectStr = startQuorum(2, authConfigs, 2, false); - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, - watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - zk.close(); - } - - /** - * Test to verify that servers are able to form quorum. - * peer0 -> quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=true, quorum.auth.serverRequireSasl=true - * peer1 -> quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=true, quorum.auth.serverRequireSasl=true - */ - @Test(timeout = 30000) - public void testAuthLearnerServer() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - - String connectStr = startQuorum(2, authConfigs, 2, false); - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, - watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - zk.close(); - } - - /** - * Rolling upgrade should do in three steps: - * - * step-1) Stop the server and set the flags and restart the server. - * quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=false and quorum.auth.serverRequireSasl=false - * Ensure that all the servers should complete this step. Now, move to next step. - * - * step-2) Stop the server one by one and change the flags and restart the server. - * quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=true and quorum.auth.serverRequireSasl=false - * Ensure that all the servers should complete this step. Now, move to next step. - * - * step-3) Stop the server one by one and change the flags and restart the server. - * quorum.auth.enableSasl=true, quorum.auth.learnerRequireSasl=true and quorum.auth.serverRequireSasl=true - * Now, all the servers are fully upgraded and running in secured mode. - */ - @Test(timeout = 90000) - public void testRollingUpgrade() throws Exception { - // Start peer0,1,2 servers with quorum.auth.enableSasl=false and - // quorum.auth.learnerRequireSasl=false, quorum.auth.serverRequireSasl=false - // Assume this is an existing cluster. - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "false"); - - String connectStr = startQuorum(3, authConfigs, 0, false); - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, - watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT_SEQUENTIAL); - - //1. Upgrade peer0,1,2 with quorum.auth.enableSasl=true and - // quorum.auth.learnerRequireSasl=false, quorum.auth.serverRequireSasl=false - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "false"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "false"); - restartServer(authConfigs, 0, zk, watcher); - restartServer(authConfigs, 1, zk, watcher); - restartServer(authConfigs, 2, zk, watcher); - - //2. Upgrade peer0,1,2 with quorum.auth.enableSasl=true and - // quorum.auth.learnerRequireSasl=true, quorum.auth.serverRequireSasl=false - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "false"); - restartServer(authConfigs, 0, zk, watcher); - restartServer(authConfigs, 1, zk, watcher); - restartServer(authConfigs, 2, zk, watcher); - - //3. Upgrade peer0,1,2 with quorum.auth.enableSasl=true and - // quorum.auth.learnerRequireSasl=true, quorum.auth.serverRequireSasl=true - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - restartServer(authConfigs, 0, zk, watcher); - restartServer(authConfigs, 1, zk, watcher); - restartServer(authConfigs, 2, zk, watcher); - - //4. Restart peer2 with quorum.auth.learnerEnableSasl=false and - // quorum.auth.serverRequireSasl=false. It should fail to join the - // quorum as this needs auth. - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "false"); - MainThread m = shutdown(2); - startServer(m, authConfigs); - Assert.assertFalse("waiting for server 2 being up", ClientBase - .waitForServerUp("127.0.0.1:" + m.getClientPort(), 5000)); - } - - private void restartServer(Map<String, String> authConfigs, int index, - ZooKeeper zk, CountdownWatcher watcher) throws IOException, - KeeperException, InterruptedException, TimeoutException { - LOG.info("Restarting server myid=" + index); - MainThread m = shutdown(index); - startServer(m, authConfigs); - Assert.assertTrue("waiting for server" + index + "being up", - ClientBase.waitForServerUp("127.0.0.1:" + m.getClientPort(), - ClientBase.CONNECTION_TIMEOUT)); - watcher.waitForConnected(ClientTest.CONNECTION_TIMEOUT); - zk.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT_SEQUENTIAL); - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumDigestAuthTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumDigestAuthTest.java b/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumDigestAuthTest.java deleted file mode 100644 index c2f4cc3..0000000 --- a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumDigestAuthTest.java +++ /dev/null @@ -1,380 +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.zookeeper.server.quorum.auth; - -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.PortAssignment; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.server.quorum.QuorumPeer; -import org.apache.zookeeper.server.quorum.QuorumPeerMain; -import org.apache.zookeeper.server.quorum.QuorumPeerTestBase; -import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; -import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; -import org.apache.zookeeper.server.quorum.QuorumPeerTestBase.MainThread; -import org.apache.zookeeper.test.ClientBase; -import org.apache.zookeeper.test.ClientBase.CountdownWatcher; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Test; - -public class QuorumDigestAuthTest extends QuorumAuthTestBase { - - private ZooKeeper zk; - static { - String jaasEntries = new String("" - + "QuorumServer {\n" - + " org.apache.zookeeper.server.auth.DigestLoginModule required\n" - + " user_test=\"mypassword\";\n" + "};\n" - + "QuorumLearner {\n" - + " org.apache.zookeeper.server.auth.DigestLoginModule required\n" - + " username=\"test\"\n" - + " password=\"mypassword\";\n" + "};\n" - + "QuorumLearnerInvalid {\n" - + " org.apache.zookeeper.server.auth.DigestLoginModule required\n" - + " username=\"test\"\n" - + " password=\"invalid\";\n" + "};" + "\n"); - setupJaasConfig(jaasEntries); - } - - @After - public void tearDown() throws Exception { - for (MainThread mainThread : mt) { - mainThread.shutdown(); - mainThread.deleteBaseDir(); - } - if (zk != null) { - zk.close(); - } - } - - @AfterClass - public static void cleanup(){ - cleanupJaasConfig(); - } - - /** - * Test to verify that server is able to start with valid credentials - */ - @Test(timeout = 30000) - public void testValidCredentials() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - - String connectStr = startQuorum(3, authConfigs, 3, false); - CountdownWatcher watcher = new CountdownWatcher(); - zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - for (int i = 0; i < 10; i++) { - zk.create("/" + i, new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - } - } - - /** - * Test to verify that server is able to start with invalid credentials if - * the configuration is set to quorum.auth.serverRequireSasl=false. - * Quorum will talk each other even if the authentication is not succeeded - */ - @Test(timeout = 30000) - public void testSaslNotRequiredWithInvalidCredentials() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_LOGIN_CONTEXT, "QuorumLearnerInvalid"); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "false"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "false"); - String connectStr = startQuorum(3, authConfigs, 3, false); - CountdownWatcher watcher = new CountdownWatcher(); - zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - for (int i = 0; i < 10; i++) { - zk.create("/" + i, new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - } - } - - /** - * Test to verify that server shouldn't start with invalid credentials - * if the configuration is set to quorum.auth.serverRequireSasl=true, - * quorum.auth.learnerRequireSasl=true - */ - @Test(timeout = 30000) - public void testSaslRequiredInvalidCredentials() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_LOGIN_CONTEXT, "QuorumLearnerInvalid"); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - int serverCount = 2; - final int[] clientPorts = startQuorum(serverCount, 0, - new StringBuilder(), authConfigs, serverCount, false); - for (int i = 0; i < serverCount; i++) { - boolean waitForServerUp = ClientBase.waitForServerUp( - "127.0.0.1:" + clientPorts[i], QuorumPeerTestBase.TIMEOUT); - Assert.assertFalse("Shouldn't start server with invalid credentials", - waitForServerUp); - } - } - - /** - * If quorumpeer learner is not auth enabled then self won't be able to join - * quorum. So this test is ensuring that the quorumpeer learner is also auth - * enabled while enabling quorum server require sasl. - */ - @Test(timeout = 10000) - public void testEnableQuorumServerRequireSaslWithoutQuorumLearnerRequireSasl() - throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_LOGIN_CONTEXT, - "QuorumLearner"); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "false"); - MainThread mthread = new MainThread(1, PortAssignment.unique(), "", - authConfigs); - String args[] = new String[1]; - args[0] = mthread.getConfFile().toString(); - try { - new QuorumPeerMain() { - @Override - protected void initializeAndRun(String[] args) - throws ConfigException, IOException { - super.initializeAndRun(args); - } - }.initializeAndRun(args); - Assert.fail("Must throw exception as quorumpeer learner is not enabled!"); - } catch (ConfigException e) { - // expected - } - } - - - /** - * If quorumpeer learner is not auth enabled then self won't be able to join - * quorum. So this test is ensuring that the quorumpeer learner is also auth - * enabled while enabling quorum server require sasl. - */ - @Test(timeout = 10000) - public void testEnableQuorumAuthenticationConfigurations() - throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_LOGIN_CONTEXT, - "QuorumLearner"); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "false"); - - // case-1) 'quorum.auth.enableSasl' is off. Tries to enable server sasl. - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "false"); - MainThread mthread = new MainThread(1, PortAssignment.unique(), "", - authConfigs); - String args[] = new String[1]; - args[0] = mthread.getConfFile().toString(); - try { - new QuorumPeerMain() { - @Override - protected void initializeAndRun(String[] args) - throws ConfigException, IOException { - super.initializeAndRun(args); - } - }.initializeAndRun(args); - Assert.fail("Must throw exception as quorum sasl is not enabled!"); - } catch (ConfigException e) { - // expected - } - - // case-1) 'quorum.auth.enableSasl' is off. Tries to enable learner sasl. - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "false"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - try { - new QuorumPeerMain() { - @Override - protected void initializeAndRun(String[] args) - throws ConfigException, IOException { - super.initializeAndRun(args); - } - }.initializeAndRun(args); - Assert.fail("Must throw exception as quorum sasl is not enabled!"); - } catch (ConfigException e) { - // expected - } - } - - /** - * Test to verify that Observer server is able to join quorum. - */ - @Test(timeout = 30000) - public void testObserverWithValidCredentials() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - - // Starting auth enabled 5-node cluster. 3-Participants and 2-Observers. - int totalServerCount = 5; - int observerCount = 2; - String connectStr = startQuorum(totalServerCount, observerCount, - authConfigs, totalServerCount); - CountdownWatcher watcher = new CountdownWatcher(); - zk = new ZooKeeper(connectStr.toString(), ClientBase.CONNECTION_TIMEOUT, - watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/myTestRoot", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - } - - /** - * Test to verify that non-auth enabled Observer server should be rejected - * by the auth enabled quorum servers. - */ - @Test(timeout = 30000) - public void testNonAuthEnabledObserverJoiningAuthEnabledQuorum() - throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - - // Starting auth enabled 3-node cluster. - int totalServerCount = 3; - String connectStr = startQuorum(totalServerCount, authConfigs, - totalServerCount, false); - - CountdownWatcher watcher = new CountdownWatcher(); - zk = new ZooKeeper(connectStr.toString(), ClientBase.CONNECTION_TIMEOUT, - watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/myTestRoot", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT_SEQUENTIAL); - - // Adding a non-auth enabled Observer to the 3-node auth cluster. - String quorumCfgSection = mt.get(0).getQuorumCfgSection(); - int observerMyid = totalServerCount + 1; - StringBuilder newObsCfgSection = new StringBuilder(quorumCfgSection); - newObsCfgSection.append("\n"); - newObsCfgSection.append(String.format( - "server.%d=localhost:%d:%d:observer", observerMyid, - PortAssignment.unique(), PortAssignment.unique())); - newObsCfgSection.append("\npeerType=observer"); - newObsCfgSection.append("\n"); - int clientPort = PortAssignment.unique(); - newObsCfgSection.append("127.0.0.1:" + clientPort); - MainThread mthread = new MainThread(observerMyid, clientPort, - newObsCfgSection.toString()); - mt.add(mthread); - mthread.start(); - - boolean waitForServerUp = ClientBase.waitForServerUp( - "127.0.0.1:" + clientPort, QuorumPeerTestBase.TIMEOUT); - Assert.assertFalse( - "Non-auth enabled Observer shouldn't be able join auth-enabled quorum", - waitForServerUp); - - // quorum shouldn't be disturbed due to rejection. - zk.create("/myTestRoot", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT_SEQUENTIAL); - } - - /** - * Test to verify that server is able to reform quorum if the Leader goes - * down. - */ - @Test(timeout = 30000) - public void testRelectionWithValidCredentials() throws Exception { - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - - String connectStr = startQuorum(3, authConfigs, 3, false); - CountdownWatcher watcher = new CountdownWatcher(); - zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/myTestRoot", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT_SEQUENTIAL); - watcher.reset(); - - // Shutdown Leader to trigger re-election - QuorumPeer leaderQP = getLeaderQuorumPeer(mt); - LOG.info("Shutdown Leader sid:{} to trigger quorum leader-election", - leaderQP.getId()); - shutdownQP(leaderQP); - - // Wait for quorum formation - QuorumPeer newLeaderQP = waitForLeader(); - assertNotNull("New leader must have been elected by now", newLeaderQP); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - zk.create("/myTestRoot", new byte[0], Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT_SEQUENTIAL); - } - - private QuorumPeer waitForLeader() throws InterruptedException { - int retryCnt = 0; - QuorumPeer newLeaderQP = null; - while (retryCnt < 30) { - newLeaderQP = getLeaderQuorumPeer(mt); - if (newLeaderQP != null) { - LOG.info("Number of retries:{} to findout new Leader", - retryCnt); - break; - } - retryCnt--; - Thread.sleep(500); - } - return newLeaderQP; - } - - private void shutdownQP(QuorumPeer qp) throws InterruptedException { - assertNotNull("QuorumPeer doesn't exist!", qp); - qp.shutdown(); - - int retryCnt = 30; - while (retryCnt > 0) { - if (qp.getPeerState() == ServerState.LOOKING) { - LOG.info("Number of retries:{} to change the server state to {}", - retryCnt, ServerState.LOOKING); - break; - } - Thread.sleep(500); - retryCnt--; - } - Assert.assertEquals( - "After shutdown, QuorumPeer should change its state to LOOKING", - ServerState.LOOKING, qp.getPeerState()); - } - - private QuorumPeer getLeaderQuorumPeer(List<MainThread> mtList) { - for (MainThread mt : mtList) { - QuorumPeer quorumPeer = mt.getQuorumPeer(); - if (null != quorumPeer - && ServerState.LEADING == quorumPeer.getPeerState()) { - return quorumPeer; - } - } - return null; - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumKerberosAuthTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumKerberosAuthTest.java b/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumKerberosAuthTest.java deleted file mode 100644 index 7263925..0000000 --- a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumKerberosAuthTest.java +++ /dev/null @@ -1,123 +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.zookeeper.server.quorum.auth; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.server.quorum.QuorumPeerTestBase.MainThread; -import org.apache.zookeeper.server.quorum.auth.KerberosTestUtils; -import org.apache.zookeeper.server.quorum.auth.QuorumAuth; -import static org.apache.zookeeper.server.quorum.auth.QuorumAuthTestBase.cleanupJaasConfig; -import static org.apache.zookeeper.server.quorum.auth.QuorumAuthTestBase.setupJaasConfig; -import org.apache.zookeeper.test.ClientBase; -import org.apache.zookeeper.test.ClientBase.CountdownWatcher; -import org.junit.After; -import org.junit.AfterClass; -import static org.junit.Assume.assumeFalse; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -public class QuorumKerberosAuthTest extends KerberosSecurityTestcase { - private static File keytabFile; - static { - String keytabFilePath = FilenameUtils.normalize(KerberosTestUtils.getKeytabFile(), true); - String jaasEntries = new String("" - + "QuorumServer {\n" - + " com.sun.security.auth.module.Krb5LoginModule required\n" - + " useKeyTab=true\n" - + " keyTab=\"" + keytabFilePath + "\"\n" - + " storeKey=true\n" - + " useTicketCache=false\n" - + " debug=false\n" - + " principal=\"" + KerberosTestUtils.getServerPrincipal() + "\";\n" + "};\n" - + "QuorumLearner {\n" - + " com.sun.security.auth.module.Krb5LoginModule required\n" - + " useKeyTab=true\n" - + " keyTab=\"" + keytabFilePath + "\"\n" - + " storeKey=true\n" - + " useTicketCache=false\n" - + " debug=false\n" - + " principal=\"" + KerberosTestUtils.getLearnerPrincipal() + "\";\n" + "};\n"); - setupJaasConfig(jaasEntries); - } - - @BeforeClass - public static void notOnJdk6() throws Exception { - String specsVersion = System.getProperty("java.specification.version", "1.6"); - System.out.println("java.specification.version="+specsVersion); - assumeFalse("Skipping test as Java Major version is "+specsVersion, "1.6".equals(specsVersion)); - } - - @Before - public void setUp() throws Exception { - // create keytab - keytabFile = new File(KerberosTestUtils.getKeytabFile()); - String learnerPrincipal = KerberosTestUtils.getLearnerPrincipal(); - String serverPrincipal = KerberosTestUtils.getServerPrincipal(); - learnerPrincipal = learnerPrincipal.substring(0, learnerPrincipal.lastIndexOf("@")); - serverPrincipal = serverPrincipal.substring(0, serverPrincipal.lastIndexOf("@")); - getKdc().createPrincipal(keytabFile, learnerPrincipal, serverPrincipal); - } - - @After - public void tearDown() throws Exception { - for (MainThread mainThread : mt) { - mainThread.shutdown(); - mainThread.deleteBaseDir(); - } - } - - @AfterClass - public static void cleanup() { - if(keytabFile != null){ - FileUtils.deleteQuietly(keytabFile); - } - cleanupJaasConfig(); - } - - /** - * Test to verify that server is able to start with valid credentials - */ - @Test(timeout = 120000) - public void testValidCredentials() throws Exception { - String serverPrincipal = KerberosTestUtils.getServerPrincipal(); - serverPrincipal = serverPrincipal.substring(0, serverPrincipal.lastIndexOf("@")); - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_KERBEROS_SERVICE_PRINCIPAL, serverPrincipal); - String connectStr = startQuorum(3, authConfigs, 3, false); - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - for (int i = 0; i < 10; i++) { - zk.create("/" + i, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - } - zk.close(); - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumKerberosHostBasedAuthTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumKerberosHostBasedAuthTest.java b/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumKerberosHostBasedAuthTest.java deleted file mode 100644 index aab893e..0000000 --- a/src/java/test/org/apache/zookeeper/server/quorum/auth/QuorumKerberosHostBasedAuthTest.java +++ /dev/null @@ -1,196 +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.zookeeper.server.quorum.auth; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeoutException; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.PortAssignment; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.server.quorum.QuorumPeerTestBase.MainThread; -import org.apache.zookeeper.test.ClientBase; -import org.apache.zookeeper.test.ClientBase.CountdownWatcher; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import junit.framework.Assert; -import org.apache.zookeeper.server.quorum.auth.KerberosTestUtils; -import org.apache.zookeeper.server.quorum.auth.QuorumAuth; -import static org.apache.zookeeper.server.quorum.auth.QuorumAuthTestBase.cleanupJaasConfig; -import static org.apache.zookeeper.server.quorum.auth.QuorumAuthTestBase.setupJaasConfig; -import static org.junit.Assume.assumeFalse; - -public class QuorumKerberosHostBasedAuthTest extends KerberosSecurityTestcase { - private static File keytabFile; - private static String hostServerPrincipal = KerberosTestUtils.getHostServerPrincipal(); - private static String hostLearnerPrincipal = KerberosTestUtils.getHostLearnerPrincipal(); - private static String hostNamedLearnerPrincipal = KerberosTestUtils.getHostNamedLearnerPrincipal("myHost"); - static { - setupJaasConfigEntries(hostServerPrincipal, hostLearnerPrincipal, hostNamedLearnerPrincipal); - } - - private static void setupJaasConfigEntries(String hostServerPrincipal, - String hostLearnerPrincipal, String hostNamedLearnerPrincipal) { - String keytabFilePath = FilenameUtils.normalize(KerberosTestUtils.getKeytabFile(), true); - String jaasEntries = new String("" - + "QuorumServer {\n" - + " com.sun.security.auth.module.Krb5LoginModule required\n" - + " useKeyTab=true\n" - + " keyTab=\"" + keytabFilePath + "\"\n" - + " storeKey=true\n" - + " useTicketCache=false\n" - + " debug=false\n" - + " principal=\"" + KerberosTestUtils.replaceHostPattern(hostServerPrincipal) + "\";\n" + "};\n" - + "QuorumLearner {\n" - + " com.sun.security.auth.module.Krb5LoginModule required\n" - + " useKeyTab=true\n" - + " keyTab=\"" + keytabFilePath + "\"\n" - + " storeKey=true\n" - + " useTicketCache=false\n" - + " debug=false\n" - + " principal=\"" + KerberosTestUtils.replaceHostPattern(hostLearnerPrincipal) + "\";\n" + "};\n" - + "QuorumLearnerMyHost {\n" - + " com.sun.security.auth.module.Krb5LoginModule required\n" - + " useKeyTab=true\n" - + " keyTab=\"" + keytabFilePath + "\"\n" - + " storeKey=true\n" - + " useTicketCache=false\n" - + " debug=false\n" - + " principal=\"" + hostNamedLearnerPrincipal + "\";\n" + "};\n"); - setupJaasConfig(jaasEntries); - } - - @BeforeClass - public static void notOnJdk6() throws Exception { - String specsVersion = System.getProperty("java.specification.version", "1.6"); - System.out.println("java.specification.version="+specsVersion); - assumeFalse("Skipping test as Java Major version is "+specsVersion, "1.6".equals(specsVersion)); - } - - @BeforeClass - public static void setUp() throws Exception { - // create keytab - keytabFile = new File(KerberosTestUtils.getKeytabFile()); - - // Creates principals in the KDC and adds them to a keytab file. - String learnerPrincipal = hostLearnerPrincipal.substring(0, hostLearnerPrincipal.lastIndexOf("@")); - learnerPrincipal = KerberosTestUtils.replaceHostPattern(learnerPrincipal); - String serverPrincipal = hostServerPrincipal.substring(0, hostServerPrincipal.lastIndexOf("@")); - serverPrincipal = KerberosTestUtils.replaceHostPattern(serverPrincipal); - - // learner with ipaddress in principal - String learnerPrincipal2 = hostNamedLearnerPrincipal.substring(0, hostNamedLearnerPrincipal.lastIndexOf("@")); - getKdc().createPrincipal(keytabFile, learnerPrincipal, learnerPrincipal2, serverPrincipal); - } - - @After - public void tearDown() throws Exception { - for (MainThread mainThread : mt) { - mainThread.shutdown(); - mainThread.deleteBaseDir(); - } - } - - @AfterClass - public static void cleanup() { - if(keytabFile != null){ - FileUtils.deleteQuietly(keytabFile); - } - cleanupJaasConfig(); - } - - /** - * Test to verify that server is able to start with valid credentials - */ - @Test(timeout = 120000) - public void testValidCredentials() throws Exception { - String serverPrincipal = hostServerPrincipal.substring(0, hostServerPrincipal.lastIndexOf("@")); - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_KERBEROS_SERVICE_PRINCIPAL, serverPrincipal); - String connectStr = startQuorum(3, authConfigs, 3, false); - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - for (int i = 0; i < 10; i++) { - zk.create("/" + i, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - } - zk.close(); - } - - /** - * Test to verify that the bad server connection to the quorum should be rejected. - */ - @Test(timeout = 120000) - public void testConnectBadServer() throws Exception { - String serverPrincipal = hostServerPrincipal.substring(0, hostServerPrincipal.lastIndexOf("@")); - Map<String, String> authConfigs = new HashMap<String, String>(); - authConfigs.put(QuorumAuth.QUORUM_SASL_AUTH_ENABLED, "true"); - authConfigs.put(QuorumAuth.QUORUM_SERVER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_AUTH_REQUIRED, "true"); - authConfigs.put(QuorumAuth.QUORUM_KERBEROS_SERVICE_PRINCIPAL, serverPrincipal); - String connectStr = startQuorum(3, authConfigs, 3, false); - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, watcher); - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT); - for (int i = 0; i < 10; i++) { - zk.create("/" + i, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - } - zk.close(); - - String quorumCfgSection = mt.get(0).getQuorumCfgSection(); - StringBuilder sb = new StringBuilder(); - sb.append(quorumCfgSection); - - int myid = mt.size() + 1; - final int clientPort = PortAssignment.unique(); - String server = String.format("server.%d=localhost:%d:%d:participant", - myid, PortAssignment.unique(), PortAssignment.unique()); - sb.append(server + "\n"); - quorumCfgSection = sb.toString(); - authConfigs.put(QuorumAuth.QUORUM_LEARNER_SASL_LOGIN_CONTEXT, - "QuorumLearnerMyHost"); - MainThread badServer = new MainThread(myid, clientPort, quorumCfgSection, - authConfigs); - badServer.start(); - watcher = new CountdownWatcher(); - connectStr = "127.0.0.1:" + clientPort; - zk = new ZooKeeper(connectStr, ClientBase.CONNECTION_TIMEOUT, watcher); - try{ - watcher.waitForConnected(ClientBase.CONNECTION_TIMEOUT/3); - Assert.fail("Must throw exception as the myHost is not an authorized one!"); - } catch (TimeoutException e){ - // expected - } finally { - zk.close(); - badServer.shutdown(); - badServer.deleteBaseDir(); - } - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/server/util/PortForwarder.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/util/PortForwarder.java b/src/java/test/org/apache/zookeeper/server/util/PortForwarder.java deleted file mode 100644 index acbad80..0000000 --- a/src/java/test/org/apache/zookeeper/server/util/PortForwarder.java +++ /dev/null @@ -1,256 +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.zookeeper.server.util; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.ConnectException; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A utility that does bi-directional forwarding between two ports. - * Useful, for example, to simulate network failures. - * Example: - * - * Server 1 config file: - * - * server.1=127.0.0.1:7301:7401;8201 - * server.2=127.0.0.1:7302:7402;8202 - * server.3=127.0.0.1:7303:7403;8203 - * - * Server 2 and 3 config files: - * - * server.1=127.0.0.1:8301:8401;8201 - * server.2=127.0.0.1:8302:8402;8202 - * server.3=127.0.0.1:8303:8403;8203 - * - * Initially forward traffic between 730x and 830x and between 740x and 830x - * This way server 1 can communicate with servers 2 and 3 - * .... - * - * List<PortForwarder> pfs = startForwarding(); - * .... - * // simulate a network interruption for server 1 - * stopForwarding(pfs); - * .... - * // restore connection - * pfs = startForwarding(); - * - * - * private List<PortForwarder> startForwarding() throws IOException { - * List<PortForwarder> res = new ArrayList<PortForwarder>(); - * res.add(new PortForwarder(8301, 7301)); - * res.add(new PortForwarder(8401, 7401)); - * res.add(new PortForwarder(7302, 8302)); - * res.add(new PortForwarder(7402, 8402)); - * res.add(new PortForwarder(7303, 8303)); - * res.add(new PortForwarder(7403, 8403)); - * return res; - * } - * - * private void stopForwarding(List<PortForwarder> pfs) throws Exception { - * for (PortForwarder pf : pfs) { - * pf.shutdown(); - * } - * } - * - * - */ -public class PortForwarder extends Thread { - private static final Logger LOG = LoggerFactory - .getLogger(PortForwarder.class); - - private static class PortForwardWorker implements Runnable { - - private final InputStream in; - private final OutputStream out; - private final Socket toClose; - private final Socket toClose2; - - PortForwardWorker(Socket toClose, Socket toClose2, InputStream in, - OutputStream out) throws IOException { - this.toClose = toClose; - this.toClose2 = toClose2; - this.in = in; - this.out = out; - // LOG.info("starting forward for "+toClose); - } - - public void run() { - Thread.currentThread().setName(toClose.toString() + "-->" - + toClose2.toString()); - byte[] buf = new byte[1024]; - try { - while (true) { - try { - int read = this.in.read(buf); - if (read > 0) { - try { - this.out.write(buf, 0, read); - } catch (IOException e) { - LOG.warn("exception during write", e); - try { - toClose.close(); - } catch (IOException ex) { - // ignore - } - try { - toClose2.close(); - } catch (IOException ex) { - // ignore - } - break; - } - } - } catch (SocketTimeoutException e) { - LOG.error("socket timeout", e); - } - Thread.sleep(1); - } - } catch (InterruptedException e) { - LOG.warn("Interrupted", e); - try { - toClose.close(); - } catch (IOException ex) { - // ignore - } - try { - toClose2.close(); - } catch (IOException ex) { - // ignore silently - } - } catch (SocketException e) { - if (!"Socket closed".equals(e.getMessage())) { - LOG.error("Unexpected exception", e); - } - } catch (IOException e) { - LOG.error("Unexpected exception", e); - } - LOG.info("Shutting down forward for " + toClose); - } - - } - - private volatile boolean stopped = false; - private ExecutorService workers = Executors.newCachedThreadPool(); - private ServerSocket serverSocket; - private final int to; - - public PortForwarder(int from, int to) throws IOException { - this.to = to; - serverSocket = new ServerSocket(from); - serverSocket.setSoTimeout(30000); - this.start(); - } - - @Override - public void run() { - try { - while (!stopped) { - Socket sock = null; - try { - LOG.info("accepting socket local:" - + serverSocket.getLocalPort() + " to:" + to); - sock = serverSocket.accept(); - LOG.info("accepted: local:" + sock.getLocalPort() - + " from:" + sock.getPort() - + " to:" + to); - Socket target = null; - int retry = 10; - while(sock.isConnected()) { - try { - target = new Socket("localhost", to); - break; - } catch (IOException e) { - if (retry == 0) { - throw e; - } - LOG.warn("connection failed, retrying(" + retry - + "): local:" + sock.getLocalPort() - + " from:" + sock.getPort() - + " to:" + to, e); - } - Thread.sleep(TimeUnit.SECONDS.toMillis(1)); - retry--; - } - LOG.info("connected: local:" + sock.getLocalPort() - + " from:" + sock.getPort() - + " to:" + to); - sock.setSoTimeout(30000); - target.setSoTimeout(30000); - this.workers.execute(new PortForwardWorker(sock, target, - sock.getInputStream(), target.getOutputStream())); - this.workers.execute(new PortForwardWorker(target, sock, - target.getInputStream(), sock.getOutputStream())); - } catch (SocketTimeoutException e) { - LOG.warn("socket timed out local:" - + (sock != null ? sock.getLocalPort(): "") - + " from:" + (sock != null ? sock.getPort(): "") - + " to:" + to, e); - } catch (ConnectException e) { - LOG.warn("connection exception local:" - + (sock != null ? sock.getLocalPort(): "") - + " from:" + (sock != null ? sock.getPort(): "") - + " to:" + to, e); - sock.close(); - } catch (IOException e) { - if (!"Socket closed".equals(e.getMessage())) { - LOG.warn("unexpected exception local:" - + (sock != null ? sock.getLocalPort(): "") - + " from:" + (sock != null ? sock.getPort(): "") - + " to:" + to, e); - throw e; - } - } - } - } catch (IOException e) { - LOG.error("Unexpected exception to:" + to, e); - } catch (InterruptedException e) { - LOG.error("Interrupted to:" + to, e); - } - } - - public void shutdown() throws Exception { - this.stopped = true; - this.serverSocket.close(); - this.workers.shutdownNow(); - try { - if (!this.workers.awaitTermination(5, TimeUnit.SECONDS)) { - throw new Exception( - "Failed to stop forwarding within 5 seconds"); - } - } catch (InterruptedException e) { - throw new Exception("Failed to stop forwarding"); - } - this.join(); - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/server/util/SerializeUtilsTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/util/SerializeUtilsTest.java b/src/java/test/org/apache/zookeeper/server/util/SerializeUtilsTest.java deleted file mode 100644 index 61893f7..0000000 --- a/src/java/test/org/apache/zookeeper/server/util/SerializeUtilsTest.java +++ /dev/null @@ -1,128 +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 - * <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.zookeeper.server.util; - -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.txn.TxnHeader; -import org.junit.Test; -import org.mockito.InOrder; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -public class SerializeUtilsTest { - - @Test - public void testSerializeRequestRequestIsNull() { - byte[] data = SerializeUtils.serializeRequest(null); - assertNull(data); - } - - @Test - public void testSerializeRequestRequestHeaderIsNull() { - Request request = new Request(0, 0, 0, null, null, 0); - byte[] data = SerializeUtils.serializeRequest(request); - assertNull(data); - } - - @Test - public void testSerializeRequestWithoutTxn() throws IOException { - // Arrange - TxnHeader header = mock(TxnHeader.class); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - Object[] args = invocation.getArguments(); - OutputArchive oa = (OutputArchive) args[0]; - oa.writeString("header", "test"); - return null; - } - }).when(header).serialize(any(OutputArchive.class), anyString()); - Request request = new Request(1, 2, 3, header, null, 4); - - // Act - byte[] data = SerializeUtils.serializeRequest(request); - - // Assert - assertNotNull(data); - verify(header).serialize(any(OutputArchive.class), eq("hdr")); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); - boa.writeString("header", "test"); - baos.close(); - assertArrayEquals(baos.toByteArray(), data); - } - - @Test - public void testSerializeRequestWithTxn() throws IOException { - // Arrange - TxnHeader header = mock(TxnHeader.class); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - Object[] args = invocation.getArguments(); - OutputArchive oa = (OutputArchive) args[0]; - oa.writeString("header", "test"); - return null; - } - }).when(header).serialize(any(OutputArchive.class), anyString()); - Record txn = mock(Record.class); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - Object[] args = invocation.getArguments(); - OutputArchive oa = (OutputArchive) args[0]; - oa.writeString("record", "test"); - return null; - } - }).when(txn).serialize(any(OutputArchive.class), anyString()); - Request request = new Request(1, 2, 3, header, txn, 4); - - // Act - byte[] data = SerializeUtils.serializeRequest(request); - - // Assert - assertNotNull(data); - InOrder inOrder = inOrder(header, txn); - inOrder.verify(header).serialize(any(OutputArchive.class), eq("hdr")); - inOrder.verify(txn).serialize(any(OutputArchive.class), eq("txn")); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); - boa.writeString("header", "test"); - boa.writeString("record", "test"); - baos.close(); - assertArrayEquals(baos.toByteArray(), data); - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/test/ACLCountTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/test/ACLCountTest.java b/src/java/test/org/apache/zookeeper/test/ACLCountTest.java deleted file mode 100644 index 88b8869..0000000 --- a/src/java/test/org/apache/zookeeper/test/ACLCountTest.java +++ /dev/null @@ -1,136 +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.zookeeper.test; - -import static org.apache.zookeeper.test.ClientBase.CONNECTION_TIMEOUT; - -import java.io.File; -import java.util.ArrayList; -import java.util.concurrent.CountDownLatch; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.PortAssignment; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.ZKTestCase; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.Watcher.Event.KeeperState; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.server.ServerCnxnFactory; -import org.apache.zookeeper.server.SyncRequestProcessor; -import org.apache.zookeeper.server.ZooKeeperServer; -import org.junit.Assert; -import org.junit.Test; - -public class ACLCountTest extends ZKTestCase implements Watcher { - private static final Logger LOG = LoggerFactory.getLogger(ACLTest.class); - private static final String HOSTPORT = - "127.0.0.1:" + PortAssignment.unique(); - private volatile CountDownLatch startSignal; - - /** - * - * Create a node and add 4 ACL values to it, but there are only 2 unique ACL values, - * and each is repeated once: - * - * ACL(ZooDefs.Perms.READ,ZooDefs.Ids.ANYONE_ID_UNSAFE); - * ACL(ZooDefs.Perms.ALL,ZooDefs.Ids.AUTH_IDS); - * ACL(ZooDefs.Perms.READ,ZooDefs.Ids.ANYONE_ID_UNSAFE); - * ACL(ZooDefs.Perms.ALL,ZooDefs.Ids.AUTH_IDS); - * - * Even though we've added 4 ACL values, there should only be 2 ACLs for that node, - * since there are only 2 *unique* ACL values. - */ - @Test - public void testAclCount() throws Exception { - File tmpDir = ClientBase.createTmpDir(); - ClientBase.setupTestEnv(); - ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000); - SyncRequestProcessor.setSnapCount(1000); - final int PORT = Integer.parseInt(HOSTPORT.split(":")[1]); - ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1); - f.startup(zks); - ZooKeeper zk; - - final ArrayList<ACL> CREATOR_ALL_AND_WORLD_READABLE = - new ArrayList<ACL>() { { - add(new ACL(ZooDefs.Perms.READ,ZooDefs.Ids.ANYONE_ID_UNSAFE)); - add(new ACL(ZooDefs.Perms.ALL,ZooDefs.Ids.AUTH_IDS)); - add(new ACL(ZooDefs.Perms.READ,ZooDefs.Ids.ANYONE_ID_UNSAFE)); - add(new ACL(ZooDefs.Perms.ALL,ZooDefs.Ids.AUTH_IDS)); - }}; - - try { - LOG.info("starting up the zookeeper server .. waiting"); - Assert.assertTrue("waiting for server being up", - ClientBase.waitForServerUp(HOSTPORT, CONNECTION_TIMEOUT)); - zk = new ZooKeeper(HOSTPORT, CONNECTION_TIMEOUT, this); - - zk.addAuthInfo("digest", "pat:test".getBytes()); - zk.setACL("/", Ids.CREATOR_ALL_ACL, -1); - - String path = "/path"; - - try { - Assert.assertEquals(4,CREATOR_ALL_AND_WORLD_READABLE.size()); - } - catch (Exception e) { - LOG.error("Something is fundamentally wrong with ArrayList's add() method. add()ing four times to an empty ArrayList should result in an ArrayList with 4 members."); - throw e; - } - - zk.create(path,path.getBytes(),CREATOR_ALL_AND_WORLD_READABLE,CreateMode.PERSISTENT); - List<ACL> acls = zk.getACL("/path", new Stat()); - Assert.assertEquals(2,acls.size()); - } - catch (Exception e) { - // test failed somehow. - Assert.assertTrue(false); - } - - f.shutdown(); - zks.shutdown(); - } - - - /* - * (non-Javadoc) - * - * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatcherEvent) - */ - public void process(WatchedEvent event) { - LOG.info("Event:" + event.getState() + " " + event.getType() + " " - + event.getPath()); - if (event.getState() == KeeperState.SyncConnected) { - if (startSignal != null && startSignal.getCount() > 0) { - LOG.info("startsignal.countDown()"); - startSignal.countDown(); - } else { - LOG.warn("startsignal " + startSignal); - } - } - } - -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/c0aa3b3f/src/java/test/org/apache/zookeeper/test/ACLRootTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/test/ACLRootTest.java b/src/java/test/org/apache/zookeeper/test/ACLRootTest.java deleted file mode 100644 index 7307cbf..0000000 --- a/src/java/test/org/apache/zookeeper/test/ACLRootTest.java +++ /dev/null @@ -1,98 +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.zookeeper.test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.ZooDefs.Ids; -import org.junit.Assert; -import org.junit.Test; - -public class ACLRootTest extends ClientBase { - private static final Logger LOG = LoggerFactory.getLogger(ACLRootTest.class); - - @Test - public void testRootAcl() throws Exception { - ZooKeeper zk = createClient(); - try { - // set auth using digest - zk.addAuthInfo("digest", "pat:test".getBytes()); - zk.setACL("/", Ids.CREATOR_ALL_ACL, -1); - zk.getData("/", false, null); - zk.close(); - // verify no access - zk = createClient(); - try { - zk.getData("/", false, null); - Assert.fail("validate auth"); - } catch (KeeperException.NoAuthException e) { - // expected - } - try { - zk.create("/apps", null, Ids.CREATOR_ALL_ACL, - CreateMode.PERSISTENT); - Assert.fail("validate auth"); - } catch (KeeperException.InvalidACLException e) { - // expected - } - zk.addAuthInfo("digest", "world:anyone".getBytes()); - try { - zk.create("/apps", null, Ids.CREATOR_ALL_ACL, - CreateMode.PERSISTENT); - Assert.fail("validate auth"); - } catch (KeeperException.NoAuthException e) { - // expected - } - zk.close(); - // verify access using original auth - zk = createClient(); - zk.addAuthInfo("digest", "pat:test".getBytes()); - zk.getData("/", false, null); - zk.create("/apps", null, Ids.CREATOR_ALL_ACL, - CreateMode.PERSISTENT); - zk.delete("/apps", -1); - // reset acl (back to open) and verify accessible again - zk.setACL("/", Ids.OPEN_ACL_UNSAFE, -1); - zk.close(); - zk = createClient(); - zk.getData("/", false, null); - zk.create("/apps", null, Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - try { - zk.create("/apps", null, Ids.CREATOR_ALL_ACL, - CreateMode.PERSISTENT); - Assert.fail("validate auth"); - } catch (KeeperException.InvalidACLException e) { - // expected - } - zk.delete("/apps", -1); - zk.addAuthInfo("digest", "world:anyone".getBytes()); - zk.create("/apps", null, Ids.CREATOR_ALL_ACL, - CreateMode.PERSISTENT); - zk.close(); - zk = createClient(); - zk.delete("/apps", -1); - } finally { - zk.close(); - } - } -}