/*
* Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.tcpmd5.jni;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketTimeoutException;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.tcpmd5.api.KeyAccess;
import org.opendaylight.tcpmd5.api.KeyAccessFactory;
import org.opendaylight.tcpmd5.api.KeyMapping;
import org.opendaylight.tcpmd5.jni.NativeKeyAccessFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ConnectivityNativeKeyAccessTest {
private static final Logger LOG = LoggerFactory.getLogger(ConnectivityNativeKeyAccessTest.class);
private static final byte[] KEY1 = new byte[] { 1 };
private static final byte[] KEY2 = new byte[] { 2, 3 };
private KeyAccessFactory factory;
private Thread serverThread;
private InetAddress address;
private int port;
private AtomicReference<SocketChannel> serverClient;
@Before
public void setup() throws IOException {
factory = NativeKeyAccessFactory.getInstance();
address = InetAddress.getLoopbackAddress();
serverClient = new AtomicReference<>();
final ServerSocketChannel sc = ServerSocketChannel.open();
LOG.debug("Instatiated server {}", sc);
final KeyAccess ka = factory.getKeyAccess(sc);
final KeyMapping map = new KeyMapping();
map.put(address, KEY1);
ka.setKeys(map);
LOG.debug("Server got key {}", KEY1);
sc.bind(new InetSocketAddress(address, 0));
port = ((InetSocketAddress) sc.getLocalAddress()).getPort();
LOG.debug("Server bound to port {}", port);
serverThread = new Thread(new Runnable() {
@Override
public void run() {
LOG.debug("Server thread started");
try {
SocketChannel s = sc.accept();
LOG.debug("Accepted channel {}", s);
serverClient.set(s);
} catch (IOException e) {
LOG.debug("Failed to accept connection", e);
}
}
});
serverThread.start();
}
@After
public void teardown() throws InterruptedException {
serverThread.interrupt();
serverThread.join();
}
@Test(timeout = 2000)
public void testMatchingKey() throws IOException {
try (final SocketChannel c = SocketChannel.open()) {
final KeyAccess ka = factory.getKeyAccess(c);
final KeyMapping map = new KeyMapping();
map.put(address, KEY1);
ka.setKeys(map);
c.connect(new InetSocketAddress(address, port));
assertTrue(c.isConnected());
}
}
@Test(timeout = 5000, expected = SocketTimeoutException.class)
public void testMisatchedKey() throws IOException {
try (final SocketChannel c = SocketChannel.open()) {
final KeyAccess ka = factory.getKeyAccess(c);
final KeyMapping map = new KeyMapping();
map.put(address, KEY2);
ka.setKeys(map);
c.socket().connect(new InetSocketAddress(address, port), 2000);
assertFalse(c.isConnected());
}
}
}