/**
* Copyright (C) 2012 FuseSource, Inc.
* http://fusesource.com
*
* Licensed 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.fusesource.hawtdispatch;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.SelectionKey;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import org.fusesource.hawtdispatch.internal.DispatcherConfig;
import org.fusesource.hawtdispatch.internal.util.RunnableCountDownLatch;
import org.junit.Test;
import static java.util.concurrent.TimeUnit.*;
import static junit.framework.Assert.*;
/**
*
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
*/
public class DispatchSourceTest {
@Test
public void connect() throws IOException, InterruptedException {
// Create the nio server socket...
final ServerSocketChannel channel = ServerSocketChannel.open();
channel.configureBlocking(false);
channel.socket().bind(address("0.0.0.0", 0), 10);
// Get a DISPATCHER and queue..
Dispatcher dispatcher = new DispatcherConfig().createDispatcher();
Thread.sleep(1000);
DispatchQueue accepts = dispatcher.createQueue("test");
// Create a source attached to the server socket to deal with new connectins..
DispatchSource source = dispatcher.createSource(channel, SelectionKey.OP_ACCEPT, accepts);
RunnableCountDownLatch accepted;
// Events should not be seen until the source is resumed.
accepted = acceptor(channel);
source.setEventHandler(accepted);
connect(channel);
assertFalse(accepted.await(1, SECONDS));
source.resume();
assertTrue(accepted.await(1, SECONDS));
// Since we are resumed we should get the next connect quickly..
System.out.println("start....");
accepted = acceptor(channel);
source.setEventHandler(accepted);
connect(channel);
System.out.println("waiting....");
assertTrue(accepted.await(2, SECONDS));
// Now test that events don't get fired
// once the source is canceled.
accepted = acceptor(channel);
source.setEventHandler(accepted);
source.cancel();
connect(channel);
assertFalse(accepted.await(2, SECONDS));
}
private void connect(final ServerSocketChannel channel) {
new Thread("connect") {
public void run() {
try {
Socket socket = new Socket();
socket.connect(channel.socket().getLocalSocketAddress());
socket.close();
} catch (Throwable e) {
e.printStackTrace();
}
}
}.start();
}
private RunnableCountDownLatch acceptor(final ServerSocketChannel channel) {
return new RunnableCountDownLatch(1) {
@Override
public void run() {
try {
SocketChannel socket = channel.accept();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
super.run();
}
};
}
static public InetSocketAddress address(String host, int port) throws UnknownHostException {
return new InetSocketAddress(ip(host), port);
}
static public InetAddress ip(String host) throws UnknownHostException {
return InetAddress.getByName(host);
}
}