blob: 04faa674c686a3f25fe9b7a9f13986d9de646902 [file] [log] [blame]
/*
* 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.flink.util;
import org.junit.Assert;
import org.junit.Test;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import static org.hamcrest.core.IsCollectionContaining.hasItems;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
* Tests for the {@link NetUtils}.
*/
public class NetUtilsTest {
@Test
public void testIPv4toURL() {
try {
final String addressString = "192.168.0.1";
InetAddress address = InetAddress.getByName(addressString);
assertEquals(addressString, NetUtils.ipAddressToUrlString(address));
}
catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testIPv6toURL() {
try {
final String addressString = "2001:01db8:00:0:00:ff00:42:8329";
final String normalizedAddress = "[2001:1db8::ff00:42:8329]";
InetAddress address = InetAddress.getByName(addressString);
assertEquals(normalizedAddress, NetUtils.ipAddressToUrlString(address));
}
catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testIPv4URLEncoding() {
try {
final String addressString = "10.244.243.12";
final int port = 23453;
InetAddress address = InetAddress.getByName(addressString);
InetSocketAddress socketAddress = new InetSocketAddress(address, port);
assertEquals(addressString, NetUtils.ipAddressToUrlString(address));
assertEquals(addressString + ':' + port, NetUtils.ipAddressAndPortToUrlString(address, port));
assertEquals(addressString + ':' + port, NetUtils.socketAddressToUrlString(socketAddress));
}
catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testIPv6URLEncoding() {
try {
final String addressString = "2001:db8:10:11:12:ff00:42:8329";
final String bracketedAddressString = '[' + addressString + ']';
final int port = 23453;
InetAddress address = InetAddress.getByName(addressString);
InetSocketAddress socketAddress = new InetSocketAddress(address, port);
assertEquals(bracketedAddressString, NetUtils.ipAddressToUrlString(address));
assertEquals(bracketedAddressString + ':' + port, NetUtils.ipAddressAndPortToUrlString(address, port));
assertEquals(bracketedAddressString + ':' + port, NetUtils.socketAddressToUrlString(socketAddress));
}
catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testFreePortRangeUtility() {
// inspired by Hadoop's example for "yarn.app.mapreduce.am.job.client.port-range"
String rangeDefinition = "50000-50050, 50100-50200,51234 "; // this also contains some whitespaces
Iterator<Integer> portsIter = NetUtils.getPortRangeFromString(rangeDefinition);
Set<Integer> ports = new HashSet<>();
while (portsIter.hasNext()) {
Assert.assertTrue("Duplicate element", ports.add(portsIter.next()));
}
Assert.assertEquals(51 + 101 + 1, ports.size());
// check first range
Assert.assertThat(ports, hasItems(50000, 50001, 50002, 50050));
// check second range and last point
Assert.assertThat(ports, hasItems(50100, 50101, 50110, 50200, 51234));
// check that only ranges are included
Assert.assertThat(ports, not(hasItems(50051, 50052, 1337, 50201, 49999, 50099)));
// test single port "range":
portsIter = NetUtils.getPortRangeFromString(" 51234");
Assert.assertTrue(portsIter.hasNext());
Assert.assertEquals(51234, (int) portsIter.next());
Assert.assertFalse(portsIter.hasNext());
// test port list
portsIter = NetUtils.getPortRangeFromString("5,1,2,3,4");
Assert.assertTrue(portsIter.hasNext());
Assert.assertEquals(5, (int) portsIter.next());
Assert.assertEquals(1, (int) portsIter.next());
Assert.assertEquals(2, (int) portsIter.next());
Assert.assertEquals(3, (int) portsIter.next());
Assert.assertEquals(4, (int) portsIter.next());
Assert.assertFalse(portsIter.hasNext());
Throwable error = null;
// try some wrong values: String
try {
NetUtils.getPortRangeFromString("localhost");
} catch (Throwable t) {
error = t;
}
Assert.assertTrue(error instanceof NumberFormatException);
error = null;
// incomplete range
try {
NetUtils.getPortRangeFromString("5-");
} catch (Throwable t) {
error = t;
}
Assert.assertTrue(error instanceof NumberFormatException);
error = null;
// incomplete range
try {
NetUtils.getPortRangeFromString("-5");
} catch (Throwable t) {
error = t;
}
Assert.assertTrue(error instanceof NumberFormatException);
error = null;
// empty range
try {
NetUtils.getPortRangeFromString(",5");
} catch (Throwable t) {
error = t;
}
Assert.assertTrue(error instanceof NumberFormatException);
}
@Test
public void testFormatAddress() throws UnknownHostException {
{
// IPv4
String host = "1.2.3.4";
int port = 42;
Assert.assertEquals(host + ":" + port, NetUtils.unresolvedHostAndPortToNormalizedString(host, port));
}
{
// IPv6
String host = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
int port = 42;
Assert.assertEquals("[2001:db8:85a3::8a2e:370:7334]:" + port, NetUtils.unresolvedHostAndPortToNormalizedString(host, port));
}
{
// Hostnames
String host = "somerandomhostname";
int port = 99;
Assert.assertEquals(host + ":" + port, NetUtils.unresolvedHostAndPortToNormalizedString(host, port));
}
{
// Whitespace
String host = " somerandomhostname ";
int port = 99;
Assert.assertEquals(host.trim() + ":" + port, NetUtils.unresolvedHostAndPortToNormalizedString(host, port));
}
{
// Illegal hostnames
String host = "illegalhost.";
int port = 42;
try {
NetUtils.unresolvedHostAndPortToNormalizedString(host, port);
fail();
} catch (Exception ignored) {}
// Illegal hostnames
host = "illegalhost:fasf";
try {
NetUtils.unresolvedHostAndPortToNormalizedString(host, port);
fail();
} catch (Exception ignored) {}
}
{
// Illegal port ranges
String host = "1.2.3.4";
int port = -1;
try {
NetUtils.unresolvedHostAndPortToNormalizedString(host, port);
fail();
} catch (Exception ignored) {}
}
{
// lower case conversion of hostnames
String host = "CamelCaseHostName";
int port = 99;
Assert.assertEquals(host.toLowerCase() + ":" + port, NetUtils.unresolvedHostAndPortToNormalizedString(host, port));
}
}
}