/**
* Copyright 2007-2015, Kaazing Corporation. All rights reserved.
*
* 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.kaazing.k3po.pcap.converter.internal;
import org.jmock.Mockery;
import org.junit.Test;
import org.kaazing.k3po.pcap.converter.internal.author.ConversationId;
import org.kaazing.k3po.pcap.converter.internal.author.SupportedProtocol;
import org.kaazing.k3po.pcap.converter.internal.author.composer.Composer;
import org.kaazing.k3po.pcap.converter.internal.author.composer.ComposerFactory;
import org.kaazing.k3po.pcap.converter.internal.author.coordinator.TcpCoordinator;
import org.kaazing.k3po.pcap.converter.internal.author.emitter.Emitter;
import org.kaazing.k3po.pcap.converter.internal.author.emitter.EmitterFactory;
import org.kaazing.k3po.pcap.converter.internal.packet.Packet;
import org.kaazing.k3po.pcap.converter.internal.utils.PacketUtil;
public class TcpCoordinatorTest extends AbstractTcpTest {
final private static class TcpCoordinatorStub extends TcpCoordinator {
public TcpCoordinatorStub(EmitterFactory emitterFactory, ConversationId conversationId,
ComposerFactory composerFactory) {
super(emitterFactory, conversationId, composerFactory);
}
public static String clientNameStub(Packet p) {
return clientName(p);
}
public static String serverNameStub(Packet p) {
return serverName(p);
}
}
@Test
public void testCreateCoordinator() {
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
context.checking(new TcpCoordinatorExpectations() {
{
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
}
});
new TcpCoordinator(emitterFactory, conversationId, composerFactory);
context.assertIsSatisfied();
}
@Test
public void testCreateTcpClient() {
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
context.checking(new TcpCoordinatorExpectations() {
{
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
context.assertIsSatisfied();
}
@Test
public void testDistributeToSingleTcpClient() {
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
final Packet fin = PacketUtil.getTcpFinAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT, 1, 2);
context.checking(new TcpCoordinatorExpectations() {
{
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
oneOf(clientComp).emitConversation(fin);
oneOf(serverComp).emitConversation(fin);
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
cord.conversation(fin);
context.assertIsSatisfied();
}
@Test
public void testDistributeToSingleTcpClientMultlipleSynAcks() {
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
context.checking(new TcpCoordinatorExpectations() {
{
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
oneOf(clientComp).emitConversation(synAck);
oneOf(serverComp).emitConversation(synAck);
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
cord.conversation(synAck);
context.assertIsSatisfied();
}
@Test
public void testTcp2SetsOfCoordinators(){
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Composer clientComp2 = context.mock(Composer.class, "clientComp2");
final Composer serverComp2 = context.mock(Composer.class, "serverComp2");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
final Packet synAck2 = PacketUtil.getTcpSynAckPacket(SERVER_IP, CLIENT_IP, CLIENT_PORT, SERVER_PORT);
context.checking(new TcpCoordinatorExpectations() {
{
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
willCreateTcpClientComposer(composerFactory, synAck2.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck2), clientComp2);
oneOf(clientComp2).emitConversation(synAck2);
willCreateTcpServerComposer(composerFactory, synAck2.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck2), serverComp2);
oneOf(serverComp2).emitConversation(synAck2);
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
cord.conversation(synAck2);
context.assertIsSatisfied();
}
@Test
public void testIsFinishedWithAllFinished(){
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
context.checking(new TcpCoordinatorExpectations() {
{
//setup
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
allowing(clientComp).isFinished(); will(returnValue(true));
allowing(serverComp).isFinished(); will(returnValue(true));
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
assertTrue(cord.isFinished());
context.assertIsSatisfied();
}
@Test
public void testIsFinishedWithNotAllFinished(){
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
context.checking(new TcpCoordinatorExpectations() {
{
//setup
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
allowing(clientComp).isFinished(); will(returnValue(true));
allowing(serverComp).isFinished(); will(returnValue(false));
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
assertFalse(cord.isFinished());
context.assertIsSatisfied();
}
@Test
public void testIsFinishedWithAllFinishedAnd2Sets(){
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Composer clientComp2 = context.mock(Composer.class, "clientComp2");
final Composer serverComp2 = context.mock(Composer.class, "serverComp2");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
final Packet synAck2 = PacketUtil.getTcpSynAckPacket(SERVER_IP, CLIENT_IP, CLIENT_PORT, SERVER_PORT);
context.checking(new TcpCoordinatorExpectations() {
{
//setup
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
willCreateTcpClientComposer(composerFactory, synAck2.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck2), clientComp2);
oneOf(clientComp2).emitConversation(synAck2);
willCreateTcpServerComposer(composerFactory, synAck2.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck2), serverComp2);
oneOf(serverComp2).emitConversation(synAck2);
allowing(clientComp).isFinished(); will(returnValue(true));
allowing(serverComp).isFinished(); will(returnValue(true));
allowing(clientComp2).isFinished(); will(returnValue(true));
allowing(serverComp2).isFinished(); will(returnValue(true));
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
cord.startScript(synAck2);
assertTrue(cord.isFinished());
context.assertIsSatisfied();
}
@Test
public void testIsFinishedWithNotAllFinishedAnd2Sets(){
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Composer clientComp2 = context.mock(Composer.class, "clientComp2");
final Composer serverComp2 = context.mock(Composer.class, "serverComp2");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
final Packet synAck2 = PacketUtil.getTcpSynAckPacket(SERVER_IP, CLIENT_IP, CLIENT_PORT, SERVER_PORT);
context.checking(new TcpCoordinatorExpectations() {
{
//setup
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
willCreateTcpClientComposer(composerFactory, synAck2.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck2), clientComp2);
oneOf(clientComp2).emitConversation(synAck2);
willCreateTcpServerComposer(composerFactory, synAck2.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck2), serverComp2);
oneOf(serverComp2).emitConversation(synAck2);
allowing(clientComp).isFinished(); will(returnValue(true));
allowing(serverComp).isFinished(); will(returnValue(false));
allowing(clientComp2).isFinished(); will(returnValue(true));
allowing(serverComp2).isFinished(); will(returnValue(true));
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
cord.startScript(synAck2);
assertFalse(cord.isFinished());
context.assertIsSatisfied();
}
@Test
public void testWriteToFile(){
final Mockery context = new Mockery();
final EmitterFactory emitterFactory = context.mock(EmitterFactory.class);
final ConversationId conversationId = new ConversationId(CLIENT_IP, SERVER_IP, SupportedProtocol.TCP);
final ComposerFactory composerFactory = context.mock(ComposerFactory.class);
final Emitter ipEmitter1 = context.mock(Emitter.class, "emitter1");
final Emitter ipEmitter2 = context.mock(Emitter.class, "emitter2");
final Composer clientComp = context.mock(Composer.class, "clientComp");
final Composer serverComp = context.mock(Composer.class, "serverComp");
final Composer clientComp2 = context.mock(Composer.class, "clientComp2");
final Composer serverComp2 = context.mock(Composer.class, "serverComp2");
final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT);
final Packet synAck2 = PacketUtil.getTcpSynAckPacket(SERVER_IP, CLIENT_IP, CLIENT_PORT, SERVER_PORT);
context.checking(new TcpCoordinatorExpectations() {
{
//setup
willInit(emitterFactory, conversationId, composerFactory, ipEmitter1, ipEmitter2);
willCreateTcpClientComposer(composerFactory, synAck.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck), clientComp);
oneOf(clientComp).emitConversation(synAck);
willCreateTcpServerComposer(composerFactory, synAck.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck), serverComp);
oneOf(serverComp).emitConversation(synAck);
willCreateTcpClientComposer(composerFactory, synAck2.getDestIpAddr(),
TcpCoordinatorStub.clientNameStub(synAck2), clientComp2);
oneOf(clientComp2).emitConversation(synAck2);
willCreateTcpServerComposer(composerFactory, synAck2.getSrcIpAddr(),
TcpCoordinatorStub.serverNameStub(synAck2), serverComp2);
oneOf(serverComp2).emitConversation(synAck2);
allowing(clientComp).isFinished(); will(returnValue(true));
allowing(serverComp).isFinished(); will(returnValue(true));
allowing(clientComp2).isFinished(); will(returnValue(true));
allowing(serverComp2).isFinished(); will(returnValue(true));
allowing(ipEmitter1).add(with(any(String.class)));
allowing(ipEmitter2).add(with(any(String.class)));
allowing(ipEmitter1).commitToFile();
allowing(ipEmitter2).commitToFile();
atLeast(1).of(clientComp).writeToFile();
atLeast(1).of(serverComp).writeToFile();
atLeast(1).of(clientComp2).writeToFile();
atLeast(1).of(serverComp2).writeToFile();
}
});
TcpCoordinator cord = new TcpCoordinator(emitterFactory, conversationId, composerFactory);
cord.startScript(synAck);
cord.startScript(synAck2);
cord.commitToFile();
context.assertIsSatisfied();
}
}