diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2015-10-23 12:19:01 +1300 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2015-10-23 12:19:01 +1300 |
commit | 0f1fa7f6f88435fc3fb526fe9e732f2f32172071 (patch) | |
tree | 4e73343cf9bceecebe035a6a02dc04bf13881300 /test/org/traccar/ChannelClosingTest.java | |
parent | 6ee29dddb9294bbbdf09861f87d31720a171d87b (diff) | |
parent | c45146fbb6e7d0434f9af4175a7a02e0b5dfc409 (diff) | |
download | trackermap-server-0f1fa7f6f88435fc3fb526fe9e732f2f32172071.tar.gz trackermap-server-0f1fa7f6f88435fc3fb526fe9e732f2f32172071.tar.bz2 trackermap-server-0f1fa7f6f88435fc3fb526fe9e732f2f32172071.zip |
Merge pull request #1470 from vitalidze/master
UDP stops listening after failure
Diffstat (limited to 'test/org/traccar/ChannelClosingTest.java')
-rw-r--r-- | test/org/traccar/ChannelClosingTest.java | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/test/org/traccar/ChannelClosingTest.java b/test/org/traccar/ChannelClosingTest.java new file mode 100644 index 000000000..0b138235f --- /dev/null +++ b/test/org/traccar/ChannelClosingTest.java @@ -0,0 +1,122 @@ +package org.traccar; + +import org.jboss.netty.bootstrap.ConnectionlessBootstrap; +import org.jboss.netty.bootstrap.ServerBootstrap; +import org.jboss.netty.channel.*; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.traccar.database.IdentityManager; +import org.traccar.helper.ChannelBufferTools; +import org.traccar.model.Device; +import org.traccar.protocol.GatorProtocol; +import org.traccar.protocol.GatorProtocolDecoder; + +import java.net.*; +import java.util.concurrent.CyclicBarrier; + +public class ChannelClosingTest { + + @BeforeClass + public static void init() { + Context.init(new IdentityManager() { + + private Device createDevice() { + return null; + } + + @Override + public Device getDeviceById(long id) { + return createDevice(); + } + + @Override + public Device getDeviceByUniqueId(String imei) { + return createDevice(); + } + + }); + } + + static class ExceptionWaiter implements ChannelUpstreamHandler { + final CyclicBarrier barrier = new CyclicBarrier(2); + Channel channel; + + @Override + public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception { + ctx.sendUpstream(e); + if (e instanceof ExceptionEvent) { + channel = e.getChannel(); + barrier.await(); + } + } + + void waitFor() throws Exception { + barrier.await(); + } + + Channel channel() { + return channel; + } + } + + @Test + public void testUDP() throws Exception { + final ExceptionWaiter exception = new ExceptionWaiter(); + + TrackerServer udpServer = new TrackerServer(new ConnectionlessBootstrap(), "gator") { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("objectDecoder", new GatorProtocolDecoder(new GatorProtocol())); + pipeline.addLast("exceptionWaiter", exception); + } + }; + final int PORT = 50522; + udpServer.setPort(PORT); + try { + udpServer.start(); + Assert.assertFalse(udpServer.getChannelGroup().isEmpty()); + try (DatagramSocket socket = new DatagramSocket()) { + socket.connect(InetAddress.getLocalHost(), PORT); + byte[] data = ChannelBufferTools.convertHexString("242400"); + socket.send(new DatagramPacket(data, data.length)); + } + exception.waitFor(); + Assert.assertFalse(udpServer.getChannelGroup().isEmpty()); + Assert.assertTrue(exception.channel().isBound()); + Assert.assertTrue(exception.channel().isOpen()); + } finally { + udpServer.stop(); + } + } + + @Test + public void testTCP() throws Exception { + final ExceptionWaiter exception = new ExceptionWaiter(); + TrackerServer tcpServer = new TrackerServer(new ServerBootstrap(), "gator") { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("objectDecoder", new GatorProtocolDecoder(new GatorProtocol())); + pipeline.addLast("exceptionWaiter", exception); + } + }; + final int PORT = 50522; + tcpServer.setPort(PORT); + try { + tcpServer.start(); + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(InetAddress.getLocalHost(), PORT)); + + byte[] data = ChannelBufferTools.convertHexString("242400"); + socket.getOutputStream().write(data); + + exception.waitFor(); + Assert.assertFalse(exception.channel().isBound()); + Assert.assertFalse(exception.channel().isOpen()); + Assert.assertFalse(exception.channel().isConnected()); + } + } finally { + tcpServer.stop(); + } + } +} |