package org.dcache.util;
import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import static org.junit.Assert.*;
/**
* Set of tests for the NetworkInterfaceView class
* <p>
* We are somewhat limited in what we can test as NetworkInterface
* is a final class that doesn't implement any interface and there
* are no static methods for creating NetworkInterface objects other
* than those for returning information about what is available.
* <p>
* These tests will use all the interfaces of the test-machine from
* which we can create a NetworkInterfaceView snapshot as the fixture.
* Any interface that we cannot create a snapshot of is silently ignored.
* See {@link NetworkInterfaceView} for reasons why creating a snapshot
* might fail.
* <p>
* These tests are bypassed (they are not run but without reporting a
* failure) if we can't enumerate the available interfaces or if we
* can't take a snapshot of at least one interface.
*/
public class NetworkInterfaceViewTests {
List<InterfaceAndViewPair> _interfaces;
@Before
public void setUp()
{
ImmutableList.Builder<InterfaceAndViewPair> builder = ImmutableList.builder();
Enumeration<NetworkInterface> interfaces;
try {
interfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
fail("Could not enumerate interfaces");
throw new RuntimeException("Code cannot reach this point"); // work-around for Java
}
while(interfaces.hasMoreElements()) {
NetworkInterface ni = interfaces.nextElement();
try {
NetworkInterfaceView niv = new NetworkInterfaceView(ni);
builder.add(new InterfaceAndViewPair(ni, niv));
} catch( SocketException e) {
// Silently skip interfaces where no snapshot can be created.
}
}
_interfaces = builder.build();
assertTrue(_interfaces.size() > 0);
}
@Test
public void testGetDisplayName() {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertEquals(ni.getDisplayName(), niv.getDisplayName());
}
}
@Test
public void testGetHardwareAddress() throws SocketException {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertArrayEquals(ni.getHardwareAddress(), niv.getHardwareAddress());
}
}
@Test
public void testGetInetAddresses() {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
List<InetAddress> niInetAddresses = Collections.list(ni.getInetAddresses());
List<InetAddress> nivInetAddresses = Collections.list(niv.getInetAddresses());
assertEquals(niInetAddresses, nivInetAddresses);
}
}
@Test
public void testGetInterfaceAddresses() {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
List<InterfaceAddress> sourceAddresses = ni.getInterfaceAddresses();
List<NetworkInterfaceView.InterfaceAddressView> viewAddresses = niv.getInterfaceAddresses();
assertEquals(sourceAddresses.size(), viewAddresses.size());
for( int i = 0; i < sourceAddresses.size(); i++) {
InterfaceAddress source = sourceAddresses.get(i);
NetworkInterfaceView.InterfaceAddressView expected = new NetworkInterfaceView.InterfaceAddressView(source);
NetworkInterfaceView.InterfaceAddressView actual = viewAddresses.get(i);
assertEquals(expected, actual);
assertEquals(expected.toString(), actual.toString());
}
}
}
@Test
public void testGetMTU() throws SocketException {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertEquals(ni.getMTU(), niv.getMTU());
}
}
@Test
public void testGetName() {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertEquals(ni.getName(), niv.getName());
}
}
@Test
public void testGetParent() {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertNull(niv.getParent());
assertAllSubInterfacesHaveParent(niv);
}
}
@Test
public void testIsLoopback() throws SocketException {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertEquals(ni.isLoopback(), niv.isLoopback());
}
}
@Test
public void testIsPointToPoint() throws SocketException {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertEquals(ni.isPointToPoint(), niv.isPointToPoint());
}
}
@Test
public void testIsUp() throws SocketException {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertEquals(ni.isUp(), niv.isUp());
}
}
@Test
public void testIsVirtual() {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertEquals(ni.isVirtual(), niv.isVirtual());
}
}
@Test
public void testSupportsMulticast() throws SocketException {
for(InterfaceAndViewPair pair : _interfaces) {
NetworkInterface ni = pair.getNetworkInterface();
NetworkInterfaceView niv = pair.getNetworkInterfaceView();
assertEquals(ni.supportsMulticast(), niv.supportsMulticast());
}
}
private void assertAllSubInterfacesHaveParent(NetworkInterfaceView parent) {
for( NetworkInterfaceView subInterface : parent.getSubInterfaces()) {
assertEquals(parent, subInterface.getParent());
assertAllSubInterfacesHaveParent(subInterface);
}
}
/**
* A simple data class to hold a network interface and
* the corresponding NetworkInterfaceView snapshot.
*/
private static class InterfaceAndViewPair {
private final NetworkInterface _ni;
private final NetworkInterfaceView _niv;
public InterfaceAndViewPair(NetworkInterface ni, NetworkInterfaceView niv) {
_ni = ni;
_niv = niv;
}
public NetworkInterface getNetworkInterface() {
return _ni;
}
public NetworkInterfaceView getNetworkInterfaceView() {
return _niv;
}
}
}