blob: 9d27c75d25b641444c56bb25ec4be02e11738341 [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.jmeter.engine;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Collectors;
import org.apache.commons.net.util.SubnetUtils;
import org.apache.commons.net.util.SubnetUtils.SubnetInfo;
import org.junit.jupiter.api.Test;
/**
* Try to establish why some batchtestserver runs fail
*/
public class LocalHostTest {
@Test
public void testInterfaces() throws Exception {
String interfaces = Collections
.list(NetworkInterface.getNetworkInterfaces()).stream()
.map(this::ifaceWithAddresses)
.collect(Collectors.joining(", "));
perr("Interfaces: {" + interfaces + "}");
String externInterface = guessExternalIPv4Interface();
perr("Choose " + externInterface + " to talk to external services");
String localHost = getLocalHost().getHostAddress();
boolean localHostIsBound = Collections
.list(NetworkInterface.getNetworkInterfaces()).stream()
.flatMap(iface -> iface.getInterfaceAddresses().stream())
.filter(iface -> iface.getAddress().getAddress().length == 4) // hack to prevent checking IPv6
.map(this::toSubnetInfo)
.anyMatch(subnetInfo -> subnetInfo.isInRange(localHost));
assertTrue(localHostIsBound, () -> "localHost: " + localHost + " is bound to an interface");
}
private String guessExternalIPv4Interface() throws SocketException {
return Collections.list(NetworkInterface.getNetworkInterfaces()).stream()
.map(n -> Collections.list(n.getInetAddresses()))
.flatMap(ArrayList<InetAddress>::stream)
.filter(i -> !i.isLoopbackAddress())
.filter(i -> i.getAddress().length == 4)
.map(InetAddress::getHostAddress)
.findFirst()
.orElse("NO DEVICE");
}
private SubnetInfo toSubnetInfo(InterfaceAddress addr) {
return new SubnetUtils(
addr.getAddress().getHostAddress() + "/" + addr.getNetworkPrefixLength())
.getInfo();
}
private String ifaceWithAddresses(NetworkInterface iface) {
return iface + " => ["
+ iface.getInterfaceAddresses().stream()
.map(InterfaceAddress::toString)
.collect(Collectors.joining(", "))
+ "]";
}
@Test
public void testLocalHost() throws Exception {
InetAddress localHost = getLocalHost();
showAddress(localHost);
showAddress(InetAddress.getByName("localhost"));
for (InetAddress a : InetAddress.getAllByName(InetAddress.getLocalHost().getHostName())) {
perr("====================");
showAddress(a);
}
}
private InetAddress getLocalHost() throws UnknownHostException {
final String key = "java.rmi.server.hostname";
String host = System.getProperties().getProperty(key); // $NON-NLS-1$
perr(key + "=" + host);
InetAddress localHost;
if (host == null) {
localHost = InetAddress.getLocalHost();
} else {
localHost = InetAddress.getByName(host);
}
return localHost;
}
private static void showAddress(InetAddress localHost) {
perr(localHost);
perr("isSiteLocalAddress:" + localHost.isSiteLocalAddress());
perr("isAnyLocalAddress:" + localHost.isAnyLocalAddress());
perr("isLinkLocalAddress:" + localHost.isLinkLocalAddress());
perr("isLoopbackAddress:" + localHost.isLoopbackAddress());
perr("isMulticastAddress:" + localHost.isMulticastAddress());
}
private static void perr(Object s) {
System.err.println(s);
}
}