/*
* Copyright 2014-2016 CyberVision, Inc.
*
* 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.kaaproject.kaa.server.transports.tcp.transport;
import org.junit.Test;
import org.kaaproject.kaa.common.avro.AvroByteArrayConverter;
import org.kaaproject.kaa.common.channels.protocols.kaatcp.messages.Connect;
import org.kaaproject.kaa.common.channels.protocols.kaatcp.messages.Disconnect;
import org.kaaproject.kaa.common.channels.protocols.kaatcp.messages.Disconnect.DisconnectReason;
import org.kaaproject.kaa.common.channels.protocols.kaatcp.messages.PingRequest;
import org.kaaproject.kaa.server.transport.GenericTransportContext;
import org.kaaproject.kaa.server.transport.TransportContext;
import org.kaaproject.kaa.server.transport.TransportProperties;
import org.kaaproject.kaa.server.transport.channel.ChannelContext;
import org.kaaproject.kaa.server.transport.channel.ChannelType;
import org.kaaproject.kaa.server.transport.message.MessageHandler;
import org.kaaproject.kaa.server.transport.message.SessionDisconnectMessage;
import org.kaaproject.kaa.server.transport.message.SessionInitMessage;
import org.kaaproject.kaa.server.transport.message.SessionPingMessage;
import org.kaaproject.kaa.server.transport.session.SessionAware;
import org.kaaproject.kaa.server.transport.session.SessionInfo;
import org.kaaproject.kaa.server.transport.tcp.config.gen.AvroTcpConfig;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.Socket;
import java.util.Properties;
import java.util.UUID;
public class KaaTcpServerIT {
private static final int TIMEOUT = 10000;
private static final int TEST_PORT = 9997;
private static final String TEST_HOST = "localhost";
private static final Logger LOG = LoggerFactory.getLogger(KaaTcpServerIT.class);
@Test
public void basicKaaTcpServerTest() throws Exception {
TcpTransport transport = new TcpTransport();
try {
LOG.debug("Initializing TCP server");
final MessageHandler handler = Mockito.mock(MessageHandler.class);
GenericTransportContext context = new GenericTransportContext(new TransportContext(new TransportProperties(new Properties()),
null, new MessageHandler() {
@Override
public void process(SessionInitMessage message) {
message.onSessionCreated(new SessionInfo(UUID.randomUUID(), 1, Mockito.mock(ChannelContext.class),
ChannelType.ASYNC, null, null, null, null, 100, false));
handler.process(message);
}
@Override
public void process(SessionAware message) {
handler.process(message);
}
}), getTestConfig());
transport.init(context);
LOG.debug("Starting TCP server");
transport.start();
final Socket socket = new Socket(TEST_HOST, TEST_PORT);
Connect connect = new Connect(1, 1, new byte[0], new byte[0], new byte[0]);
socket.getOutputStream().write(connect.getFrame().array());
Mockito.verify(handler, Mockito.timeout(TIMEOUT)).process(Mockito.any(SessionInitMessage.class));
PingRequest ping = new PingRequest();
socket.getOutputStream().write(ping.getFrame().array());
Mockito.verify(handler, Mockito.timeout(TIMEOUT)).process(Mockito.any(SessionPingMessage.class));
Disconnect disconnect = new Disconnect(DisconnectReason.NONE);
socket.getOutputStream().write(disconnect.getFrame().array());
Mockito.verify(handler, Mockito.timeout(TIMEOUT)).process(Mockito.any(SessionDisconnectMessage.class));
socket.close();
} finally {
LOG.debug("Shutdown TCP server");
transport.stop();
}
}
private byte[] getTestConfig() throws IOException {
AvroTcpConfig config = new AvroTcpConfig();
config.setBindInterface(TEST_HOST);
config.setBindPort(TEST_PORT);
config.setPublicInterface(TEST_HOST);
config.setPublicPorts(Integer.toString(TEST_PORT));
AvroByteArrayConverter<AvroTcpConfig> converter = new AvroByteArrayConverter<AvroTcpConfig>(AvroTcpConfig.class);
return converter.toByteArray(config);
}
}