From commits-return-8065-archive-asf-public=cust-asf.ponee.io@zookeeper.apache.org Wed Dec 18 07:26:47 2019 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [207.244.88.153]) by mx-eu-01.ponee.io (Postfix) with SMTP id 6AF5818065B for ; Wed, 18 Dec 2019 08:26:47 +0100 (CET) Received: (qmail 49986 invoked by uid 500); 18 Dec 2019 07:26:46 -0000 Mailing-List: contact commits-help@zookeeper.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@zookeeper.apache.org Delivered-To: mailing list commits@zookeeper.apache.org Received: (qmail 49974 invoked by uid 99); 18 Dec 2019 07:26:46 -0000 Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Dec 2019 07:26:46 +0000 Received: by gitbox.apache.org (ASF Mail Server at gitbox.apache.org, from userid 33) id 51EF88D80D; Wed, 18 Dec 2019 07:26:46 +0000 (UTC) Date: Wed, 18 Dec 2019 07:26:46 +0000 To: "commits@zookeeper.apache.org" Subject: [zookeeper] branch branch-3.5 updated: ZOOKEEPER-3057: Fix IPv6 literal usage MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Message-ID: <157665400618.766.5289964609507864326@gitbox.apache.org> From: andor@apache.org X-Git-Host: gitbox.apache.org X-Git-Repo: zookeeper X-Git-Refname: refs/heads/branch-3.5 X-Git-Reftype: branch X-Git-Oldrev: 56a82caac3f978a2bb400145d7644fe15f8fad8f X-Git-Newrev: 0ec8ffc13cd543a51ffa63af7c6d07290d1b23d1 X-Git-Rev: 0ec8ffc13cd543a51ffa63af7c6d07290d1b23d1 X-Git-NotificationType: ref_changed_plus_diff X-Git-Multimail-Version: 1.5.dev Auto-Submitted: auto-generated This is an automated email from the ASF dual-hosted git repository. andor pushed a commit to branch branch-3.5 in repository https://gitbox.apache.org/repos/asf/zookeeper.git The following commit(s) were added to refs/heads/branch-3.5 by this push: new 0ec8ffc ZOOKEEPER-3057: Fix IPv6 literal usage 0ec8ffc is described below commit 0ec8ffc13cd543a51ffa63af7c6d07290d1b23d1 Author: Xiangyu Yao AuthorDate: Wed Dec 18 08:26:39 2019 +0100 ZOOKEEPER-3057: Fix IPv6 literal usage This commit backports #548 to branch-3.5. I cherry picked all the changes except the file (NetUtils.java) where modification were already made by other backports. Author: Xiangyu Yao Reviewers: eolivelli@apache.org, andor@apache.org Closes #1168 from xy24/fix-ipv6-literal --- .../zookeeper/server/quorum/LocalPeerBean.java | 9 ++-- .../zookeeper/server/quorum/QuorumCnxManager.java | 18 ++++--- .../apache/zookeeper/server/quorum/QuorumPeer.java | 36 ++++---------- .../zookeeper/server/quorum/QuorumPeerConfig.java | 10 ++-- .../apache/zookeeper/server/util/ConfigUtils.java | 25 ++++++++++ .../org/apache/zookeeper/common/NetUtilsTest.java | 55 ++++++++++++++++++++++ .../zookeeper/server/quorum/LocalPeerBeanTest.java | 2 +- .../server/quorum/QuorumPeerMainTest.java | 46 +++++++++++++----- .../zookeeper/server/util/ConfigUtilsTest.java | 52 ++++++++++++++++++++ 9 files changed, 197 insertions(+), 56 deletions(-) diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LocalPeerBean.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LocalPeerBean.java index 91d779b..25ea3f3 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LocalPeerBean.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LocalPeerBean.java @@ -19,6 +19,7 @@ package org.apache.zookeeper.server.quorum; +import static org.apache.zookeeper.common.NetUtils.formatInetAddr; /** * Implementation of the local peer MBean interface. @@ -71,7 +72,7 @@ public class LocalPeerBean extends ServerBean implements LocalPeerMXBean { } public String getQuorumAddress() { - return peer.getQuorumAddress().toString(); + return formatInetAddr(peer.getQuorumAddress()); } public int getElectionType() { @@ -79,14 +80,12 @@ public class LocalPeerBean extends ServerBean implements LocalPeerMXBean { } public String getElectionAddress() { - return peer.getElectionAddress().getHostString() + ":" + - peer.getElectionAddress().getPort(); + return formatInetAddr(peer.getElectionAddress()); } public String getClientAddress() { if (null != peer.cnxnFactory) { - return String.format("%s:%d", peer.cnxnFactory.getLocalAddress() - .getHostString(), peer.getClientPort()); + return formatInetAddr(peer.cnxnFactory.getLocalAddress()); } else { return ""; } diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumCnxManager.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumCnxManager.java index 4dcab9b..22a24bc 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumCnxManager.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumCnxManager.java @@ -54,6 +54,8 @@ import org.apache.zookeeper.server.ZooKeeperThread; import org.apache.zookeeper.server.quorum.auth.QuorumAuthLearner; import org.apache.zookeeper.server.quorum.auth.QuorumAuthServer; import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; +import org.apache.zookeeper.server.util.ConfigUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -225,10 +227,13 @@ public class QuorumCnxManager { num_read, remaining, sid); } - // FIXME: IPv6 is not supported. Using something like Guava's HostAndPort - // parser would be good. String addr = new String(b); - String[] host_port = addr.split(":"); + String[] host_port; + try { + host_port = ConfigUtils.getHostAndPort(addr); + } catch (ConfigException e) { + throw new InitialMessageException("Badly formed address: %s", addr); + } if (host_port.length != 2) { throw new InitialMessageException("Badly formed address: %s", addr); @@ -239,6 +244,8 @@ public class QuorumCnxManager { port = Integer.parseInt(host_port[1]); } catch (NumberFormatException e) { throw new InitialMessageException("Bad port number: %s", host_port[1]); + } catch (ArrayIndexOutOfBoundsException e) { + throw new InitialMessageException("No port number in: %s", addr); } return new InitialMessage(sid, new InetSocketAddress(host_port[0], port)); @@ -405,8 +412,7 @@ public class QuorumCnxManager { // represents protocol version (in other words - message type) dout.writeLong(PROTOCOL_VERSION); dout.writeLong(self.getId()); - final InetSocketAddress electionAddr = self.getElectionAddress(); - String addr = electionAddr.getHostString() + ":" + electionAddr.getPort(); + String addr = formatInetAddr(self.getElectionAddress()); byte[] addr_bytes = addr.getBytes(); dout.writeInt(addr_bytes.length); dout.write(addr_bytes); @@ -916,7 +922,7 @@ public class QuorumCnxManager { client = ss.accept(); setSockOpts(client); LOG.info("Received connection request " - + formatInetAddr((InetSocketAddress)client.getRemoteSocketAddress())); + + formatInetAddr((InetSocketAddress)client.getRemoteSocketAddress())); // Receive and handle the connection request // asynchronously if the quorum sasl authentication is // enabled. This is required because sasl server diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java index 9ac635e..40ea311 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java @@ -72,10 +72,13 @@ import org.apache.zookeeper.server.persistence.FileTxnSnapLog; import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; import org.apache.zookeeper.server.quorum.flexible.QuorumMaj; import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; +import org.apache.zookeeper.server.util.ConfigUtils; import org.apache.zookeeper.server.util.ZxidUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.zookeeper.common.NetUtils.formatInetAddr; + /** * This class manages the quorum protocol. There are three states this server * can be in: @@ -213,27 +216,6 @@ public class QuorumPeer extends ZooKeeperThread implements QuorumStats.Provider } } - private static String[] splitWithLeadingHostname(String s) - throws ConfigException - { - /* Does it start with an IPv6 literal? */ - if (s.startsWith("[")) { - int i = s.indexOf("]:"); - if (i < 0) { - throw new ConfigException(s + " starts with '[' but has no matching ']:'"); - } - - String[] sa = s.substring(i + 2).split(":"); - String[] nsa = new String[sa.length + 1]; - nsa[0] = s.substring(1, i); - System.arraycopy(sa, 0, nsa, 1, sa.length); - - return nsa; - } else { - return s.split(":"); - } - } - private static final String wrongFormat = " does not have the form server_config or server_config;client_config"+ " where server_config is host:port:port or host:port:port:type and client_config is port or host:port"; @@ -241,7 +223,7 @@ public class QuorumPeer extends ZooKeeperThread implements QuorumStats.Provider // LOG.warn("sid = " + sid + " addressStr = " + addressStr); this.id = sid; String serverClientParts[] = addressStr.split(";"); - String serverParts[] = splitWithLeadingHostname(serverClientParts[0]); + String serverParts[] = ConfigUtils.getHostAndPort(serverClientParts[0]); if ((serverClientParts.length > 2) || (serverParts.length < 3) || (serverParts.length > 4)) { throw new ConfigException(addressStr + wrongFormat); @@ -249,7 +231,7 @@ public class QuorumPeer extends ZooKeeperThread implements QuorumStats.Provider if (serverClientParts.length == 2) { //LOG.warn("ClientParts: " + serverClientParts[1]); - String clientParts[] = splitWithLeadingHostname(serverClientParts[1]); + String clientParts[] = ConfigUtils.getHostAndPort(serverClientParts[1]); if (clientParts.length > 2) { throw new ConfigException(addressStr + wrongFormat); } @@ -1417,14 +1399,14 @@ public class QuorumPeer extends ZooKeeperThread implements QuorumStats.Provider if (leader != null) { for (LearnerHandler fh : leader.getLearners()) { if (fh.getSocket() != null) { - String s = fh.getSocket().getRemoteSocketAddress().toString(); + String s = formatInetAddr((InetSocketAddress)fh.getSocket().getRemoteSocketAddress()); if (leader.isLearnerSynced(fh)) s += "*"; l.add(s); } } } else if (follower != null) { - l.add(follower.sock.getRemoteSocketAddress().toString()); + l.add(formatInetAddr((InetSocketAddress)follower.sock.getRemoteSocketAddress())); } } return l.toArray(new String[0]); @@ -2115,8 +2097,8 @@ public class QuorumPeer extends ZooKeeperThread implements QuorumStats.Provider private void updateThreadName() { String plain = cnxnFactory != null ? cnxnFactory.getLocalAddress() != null ? - cnxnFactory.getLocalAddress().toString() : "disabled" : "disabled"; - String secure = secureCnxnFactory != null ? secureCnxnFactory.getLocalAddress().toString() : "disabled"; + formatInetAddr(cnxnFactory.getLocalAddress()) : "disabled" : "disabled"; + String secure = secureCnxnFactory != null ? formatInetAddr(secureCnxnFactory.getLocalAddress()) : "disabled"; setName(String.format("QuorumPeer[myid=%d](plain=%s)(secure=%s)", getId(), plain, secure)); } diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java index dc5aec2..d32806f 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java @@ -55,6 +55,8 @@ import org.apache.zookeeper.server.quorum.flexible.QuorumMaj; import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; import org.apache.zookeeper.server.util.VerifyingFileFactory; +import static org.apache.zookeeper.common.NetUtils.formatInetAddr; + @InterfaceAudience.Public public class QuorumPeerConfig { private static final Logger LOG = LoggerFactory.getLogger(QuorumPeerConfig.class); @@ -379,10 +381,10 @@ public class QuorumPeerConfig { } else if (clientPortAddress != null) { this.clientPortAddress = new InetSocketAddress( InetAddress.getByName(clientPortAddress), clientPort); - LOG.info("clientPortAddress is {}", this.clientPortAddress.toString()); + LOG.info("clientPortAddress is {}", formatInetAddr(this.clientPortAddress)); } else { this.clientPortAddress = new InetSocketAddress(clientPort); - LOG.info("clientPortAddress is {}", this.clientPortAddress.toString()); + LOG.info("clientPortAddress is {}", formatInetAddr(this.clientPortAddress)); } if (secureClientPort == 0) { @@ -393,10 +395,10 @@ public class QuorumPeerConfig { } else if (secureClientPortAddress != null) { this.secureClientPortAddress = new InetSocketAddress( InetAddress.getByName(secureClientPortAddress), secureClientPort); - LOG.info("secureClientPortAddress is {}", this.secureClientPortAddress.toString()); + LOG.info("secureClientPortAddress is {}", formatInetAddr(this.secureClientPortAddress)); } else { this.secureClientPortAddress = new InetSocketAddress(secureClientPort); - LOG.info("secureClientPortAddress is {}", this.secureClientPortAddress.toString()); + LOG.info("secureClientPortAddress is {}", formatInetAddr(this.secureClientPortAddress)); } if (this.secureClientPortAddress != null) { configureSSLAuth(); diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/util/ConfigUtils.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/util/ConfigUtils.java index 1ca37d1..4c50db6 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/util/ConfigUtils.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/util/ConfigUtils.java @@ -60,4 +60,29 @@ public class ConfigUtils { } return version + " " + sb.toString(); } + + /** + * Gets host and port by spliting server config with support for IPv6 literals + * @return String[] first element being the IP address and the next being the port + * @param s server config, server:port + */ + public static String[] getHostAndPort(String s) + throws ConfigException + { + if (s.startsWith("[")) { + int i = s.indexOf("]:"); + if (i < 0) { + throw new ConfigException(s + " starts with '[' but has no matching ']:'"); + } + + String[] sa = s.substring(i + 2).split(":"); + String[] nsa = new String[sa.length + 1]; + nsa[0] = s.substring(1, i); + System.arraycopy(sa, 0, nsa, 1, sa.length); + + return nsa; + } else { + return s.split(":"); + } + } } diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/common/NetUtilsTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/common/NetUtilsTest.java new file mode 100644 index 0000000..9887926 --- /dev/null +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/common/NetUtilsTest.java @@ -0,0 +1,55 @@ +package org.apache.zookeeper.common; + +import org.apache.zookeeper.common.NetUtils; +import org.apache.zookeeper.ZKTestCase; +import org.hamcrest.core.AnyOf; +import org.hamcrest.core.IsEqual; +import org.junit.Assert; +import org.junit.Test; +import java.net.InetSocketAddress; + +public class NetUtilsTest extends ZKTestCase { + + private Integer port = 1234; + private String v4addr = "127.0.0.1"; + private String v6addr = "[0:0:0:0:0:0:0:1]"; + private String v6addr2 = "[2600:0:0:0:0:0:0:0]"; + private String v4local = v4addr + ":" + port.toString(); + private String v6local = v6addr + ":" + port.toString(); + private String v6ext = v6addr2 + ":" + port.toString(); + + @Test + public void testFormatInetAddrGoodIpv4() { + InetSocketAddress isa = new InetSocketAddress(v4addr, port); + Assert.assertEquals("127.0.0.1:1234", NetUtils.formatInetAddr(isa)); + } + + @Test + public void testFormatInetAddrGoodIpv6Local() { + // Have to use the expanded address here, hence not using v6addr in instantiation + InetSocketAddress isa = new InetSocketAddress("::1", port); + Assert.assertEquals(v6local, NetUtils.formatInetAddr(isa)); + } + + @Test + public void testFormatInetAddrGoodIpv6Ext() { + // Have to use the expanded address here, hence not using v6addr in instantiation + InetSocketAddress isa = new InetSocketAddress("2600::", port); + Assert.assertEquals(v6ext, NetUtils.formatInetAddr(isa)); + } + + @Test + public void testFormatInetAddrGoodHostname() { + InetSocketAddress isa = new InetSocketAddress("localhost", 1234); + + Assert.assertThat(NetUtils.formatInetAddr(isa), + AnyOf.anyOf(IsEqual.equalTo(v4local), IsEqual.equalTo(v6local) + )); + } + + @Test + public void testFormatAddrUnresolved() { + InetSocketAddress isa = InetSocketAddress.createUnresolved("doesnt.exist.com", 1234); + Assert.assertEquals("doesnt.exist.com:1234", NetUtils.formatInetAddr(isa)); + } +} \ No newline at end of file diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LocalPeerBeanTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LocalPeerBeanTest.java index f2e0115..f0388bd 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LocalPeerBeanTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LocalPeerBeanTest.java @@ -60,7 +60,7 @@ public class LocalPeerBeanTest { result = remotePeerBean.getClientAddress(); String ipv4 = "0.0.0.0:" + clientPort; - String ipv6 = "0:0:0:0:0:0:0:0:" + clientPort; + String ipv6 = "[0:0:0:0:0:0:0:0]:" + clientPort; assertTrue(result.equals(ipv4) || result.equals(ipv6)); // cleanup cnxnFactory.shutdown(); diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java index 09cb985..b3e1e07 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java @@ -91,18 +91,22 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase { /** * Verify the ability to start a cluster. */ - @Test - public void testQuorum() throws Exception { + public void testQuorumInternal(String addr) throws Exception { ClientBase.setupTestEnv(); final int CLIENT_PORT_QP1 = PortAssignment.unique(); final int CLIENT_PORT_QP2 = PortAssignment.unique(); - String quorumCfgSection = - "server.1=127.0.0.1:" + PortAssignment.unique() - + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP1 - + "\nserver.2=127.0.0.1:" + PortAssignment.unique() - + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP2; + String quorumCfgSection = String.format("server.1=%1$s:%2$s:%3$s;%4$s", + addr, + PortAssignment.unique(), + PortAssignment.unique(), + CLIENT_PORT_QP1) + "\n" + + String.format("server.2=%1$s:%2$s:%3$s;%4$s", + addr, + PortAssignment.unique(), + PortAssignment.unique(), + CLIENT_PORT_QP2); MainThread q1 = new MainThread(1, CLIENT_PORT_QP1, quorumCfgSection); MainThread q2 = new MainThread(2, CLIENT_PORT_QP2, quorumCfgSection); @@ -110,10 +114,10 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase { q2.start(); Assert.assertTrue("waiting for server 1 being up", - ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP1, + ClientBase.waitForServerUp(addr + ":" + CLIENT_PORT_QP1, CONNECTION_TIMEOUT)); Assert.assertTrue("waiting for server 2 being up", - ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP2, + ClientBase.waitForServerUp(addr + ":" + CLIENT_PORT_QP2, CONNECTION_TIMEOUT)); QuorumPeer quorumPeer = q1.main.quorumPeer; @@ -125,7 +129,7 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase { "Default value of maximumSessionTimeOut is not considered", tickTime * 20, quorumPeer.getMaxSessionTimeout()); - ZooKeeper zk = new ZooKeeper("127.0.0.1:" + CLIENT_PORT_QP1, + ZooKeeper zk = new ZooKeeper(addr + ":" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT, this); waitForOne(zk, States.CONNECTED); zk.create("/foo_q1", "foobar1".getBytes(), Ids.OPEN_ACL_UNSAFE, @@ -133,7 +137,7 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase { Assert.assertEquals(new String(zk.getData("/foo_q1", null, null)), "foobar1"); zk.close(); - zk = new ZooKeeper("127.0.0.1:" + CLIENT_PORT_QP2, + zk = new ZooKeeper(addr + ":" + CLIENT_PORT_QP2, ClientBase.CONNECTION_TIMEOUT, this); waitForOne(zk, States.CONNECTED); zk.create("/foo_q2", "foobar2".getBytes(), Ids.OPEN_ACL_UNSAFE, @@ -145,14 +149,30 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase { q2.shutdown(); Assert.assertTrue("waiting for server 1 down", - ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, + ClientBase.waitForServerDown(addr + ":" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT)); Assert.assertTrue("waiting for server 2 down", - ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP2, + ClientBase.waitForServerDown(addr + ":" + CLIENT_PORT_QP2, ClientBase.CONNECTION_TIMEOUT)); } /** + * Verify the ability to start a cluster. + */ + @Test + public void testQuorum() throws Exception { + testQuorumInternal("127.0.0.1"); + } + + /** + * Verify the ability to start a cluster. IN V6!!!! + */ + @Test + public void testQuorumV6() throws Exception { + testQuorumInternal("[::1]"); + } + + /** * Test early leader abandonment. */ @Test diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/util/ConfigUtilsTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/util/ConfigUtilsTest.java new file mode 100644 index 0000000..d852d0f --- /dev/null +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/util/ConfigUtilsTest.java @@ -0,0 +1,52 @@ +/** + * 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 org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; + +public class ConfigUtilsTest { + + @Test + public void testSplitServerConfig() throws ConfigException { + String[] nsa = ConfigUtils.getHostAndPort("[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443"); + System.out.println(nsa[0]); + assertEquals(nsa[0], "2001:db8:85a3:8d3:1319:8a2e:370:7348"); + assertEquals(nsa[1], "443"); + } + + @Test + public void testSplitServerConfig2() throws ConfigException { + String[] nsa = ConfigUtils.getHostAndPort("127.0.0.1:443"); + assertEquals(nsa.length, 2, 0); + } + + @Test(expected = ConfigException.class) + public void testSplitServerConfig3() throws ConfigException { + String[] nsa = ConfigUtils.getHostAndPort("[2001:db8:85a3:8d3:1319:8a2e:370:7348"); + } + + @Test + public void testSplitServerConfig4() throws ConfigException { + String[] nsa = ConfigUtils.getHostAndPort("2001:db8:85a3:8d3:1319:8a2e:370:7348:443"); + assertFalse(nsa.length == 2); + } +}