/** * 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 java.util.LinkedList; import java.util.List; import org.junit.Test; import org.kaazing.k3po.pcap.converter.internal.author.composer.TcpClientComposer; 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.author.emitter.EmitterFactoryImpl; import org.kaazing.k3po.pcap.converter.internal.author.emitter.OutputType; import org.kaazing.k3po.pcap.converter.internal.packet.Packet; import org.kaazing.k3po.pcap.converter.internal.utils.PacketUtil; import org.kaazing.k3po.pcap.converter.internal.utils.ScriptTestUtil; import org.kaazing.k3po.pcap.converter.internal.utils.Util; public class TcpClientComposerSingleScriptTest extends AbstractTcpTest { private final EmitterFactory emitterFactory = new EmitterFactoryImpl(); private TcpClientComposer getComposerWithOpenConnection() { final Emitter emitter = emitterFactory.getRptScriptEmitter(OutputType.TCP_CLIENT_COMPOSER, "testSynAck"); final TcpClientComposer composer = new TcpClientComposer(emitterFactory, emitter, CLIENT_IP); final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT); final Packet ackToSynAck = PacketUtil.getTcpAckPacket(SERVER_IP, CLIENT_IP, SERVER_PORT, CLIENT_PORT); composer.emitConversation(synAck); composer.emitConversation(ackToSynAck); return composer; } @Test public void testFirstPacket() { final Emitter emitter = emitterFactory.getRptScriptEmitter(OutputType.TCP_CLIENT_COMPOSER, "testSynAck"); final TcpClientComposer composer = new TcpClientComposer(emitterFactory, emitter, CLIENT_IP); final Packet synAck = PacketUtil.getTcpSynAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT); composer.emitConversation(synAck); assertTrue(ScriptTestUtil.scriptHasNonCommentLineContainingLineAndNoOtherCommandsInScript(composer.getScript(), "connect tcp://" + SERVER_IP + ":" + SERVER_PORT)); } @Test public void testFirstPacketAndConnect() { final TcpClientComposer composer = getComposerWithOpenConnection(); final List<String> expectedScript = new LinkedList<>(); expectedScript.add("connect tcp://" + SERVER_IP + ":" + SERVER_PORT); expectedScript.add("connected"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(composer.getScript(), expectedScript)); } @Test public void testClientReadData(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(toClientPayloadPacket); expectedScript.add(payloadScriptRead); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClientReadAsciiData(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(toClientAsciiPayloadPacket); expectedScript.add(asciiPayloadScriptRead); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClientAvoidDuplicateReadData(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(toClientPayloadPacket); composer.emitConversation(toClientPayloadPacket); expectedScript.add(payloadScriptRead); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClientAvoidDuplicateReadAsciiData(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(toClientAsciiPayloadPacket); composer.emitConversation(toClientAsciiPayloadPacket); expectedScript.add(asciiPayloadScriptRead); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClientWriteData(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(toServerPayloadPacket); expectedScript.add(payloadScriptWrite); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClientWriteAsciiData(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(toServerAsciiPayloadPacket); expectedScript.add(asciiPayloadScriptWrite); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClientAvoidDuplicateWriteData(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(toServerPayloadPacket); composer.emitConversation(toServerPayloadPacket); expectedScript.add(payloadScriptWrite); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClientAvoidDuplicateWriteAsciiData(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(toServerAsciiPayloadPacket); composer.emitConversation(toServerAsciiPayloadPacket); expectedScript.add(asciiPayloadScriptWrite); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testCloseRead() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final long initialFinSeqNum = 01L; final long initialFinAckNum = 101L; final Packet finPacket = PacketUtil.getTcpFinPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT, initialFinSeqNum, initialFinAckNum); final long responseFinSeqNum = 201L; final long resonseFinAckNum = initialFinSeqNum + 1L; final Packet ackPacket = PacketUtil.getTcpAckPacket(SERVER_IP, CLIENT_IP, SERVER_PORT, CLIENT_PORT, responseFinSeqNum, resonseFinAckNum); composer.emitConversation(finPacket); composer.emitConversation(ackPacket); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_READ); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testCloseWrite() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final long initialFinSeqNum = 01L; final long initialFinAckNum = 101L; final Packet finPacket = PacketUtil.getTcpFinPacket(SERVER_IP, CLIENT_IP, SERVER_PORT, CLIENT_PORT, initialFinSeqNum, initialFinAckNum); final long responseFinSeqNum = 201L; final long resonseFinAckNum = initialFinSeqNum + 1L; final Packet ackPacket = PacketUtil.getTcpAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT, responseFinSeqNum, resonseFinAckNum); composer.emitConversation(finPacket); composer.emitConversation(ackPacket); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_WRITE); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClosing3WayHandshakeCloseInitedByClient() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final long initialFinSeqNum = 01L; final long initialFinAckNum = 101L; final Packet finPacket = PacketUtil.getTcpFinPacket(SERVER_IP, CLIENT_IP, SERVER_PORT, CLIENT_PORT, initialFinSeqNum, initialFinAckNum); final long responseFinSeqNum = 201L; final long resonseFinAckNum = initialFinSeqNum + 1L; final Packet finAckPacket = PacketUtil.getTcpFinAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT, responseFinSeqNum, resonseFinAckNum); final long responseAckSeqNum = 02L; final long responseAckAckNum = responseFinSeqNum + 1L; final Packet ackPacket = PacketUtil.getTcpAckPacket(SERVER_IP, CLIENT_IP, SERVER_PORT, CLIENT_PORT, responseAckSeqNum, responseAckAckNum); composer.emitConversation(finPacket); composer.emitConversation(finAckPacket); composer.emitConversation(ackPacket); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add(Util.CLOSE_READ); expectedScript.add("close"); expectedScript.add("closed"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClosing3WayHandshakeCloseInitedByServer() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final long initialFinSeqNum = 01L; final long initialFinAckNum = 101L; final Packet finPacket = PacketUtil.getTcpFinPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT, initialFinSeqNum, initialFinAckNum); final long responseFinSeqNum = 201L; final long resonseFinAckNum = initialFinSeqNum + 1L; final Packet finAckPacket = PacketUtil.getTcpFinAckPacket(SERVER_IP, CLIENT_IP, SERVER_PORT, CLIENT_PORT, responseFinSeqNum, resonseFinAckNum); final long responseAckSeqNum = 02L; final long responseAckAckNum = responseFinSeqNum + 1L; final Packet ackPacket = PacketUtil.getTcpAckPacket(CLIENT_IP, SERVER_IP, CLIENT_PORT, SERVER_PORT, responseAckSeqNum, responseAckAckNum); composer.emitConversation(finPacket); composer.emitConversation(finAckPacket); composer.emitConversation(ackPacket); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_READ); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add("close"); expectedScript.add("closed"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClosing2WayHandshakeCloseInitedByClient() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(SERVER_ACK_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add(Util.CLOSE_READ); expectedScript.add("close"); expectedScript.add("closed"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClosing2WayHandshakeCloseInitedByClientReverseAck() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); composer.emitConversation(SERVER_ACK_PACKET); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_READ); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add("close"); expectedScript.add("closed"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClosing2WayHandshakeServerInnitedClose() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); composer.emitConversation(SERVER_ACK_PACKET); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_READ); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add("close"); expectedScript.add("closed"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClosing2WayHandshakeCloseInnitedServerReverseAck() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(SERVER_ACK_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add(Util.CLOSE_READ); expectedScript.add("close"); expectedScript.add("closed"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClosing4WayHandshakeCloseInittedByServer() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(SERVER_ACK_PACKET); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_READ); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add("closed"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testClosing4WayHandshakeCloseInittedByClient() { TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(SERVER_ACK_PACKET); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); final String testScript = composer.getScript().substring(preTestScript.length()); final List<String> expectedScript = new LinkedList<>(); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add(Util.CLOSE_READ); expectedScript.add("close"); expectedScript.add("closed"); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testWriteWhileReadClosed(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); composer.emitConversation(toServerPayloadPacket); expectedScript.add(Util.CLOSE_READ); expectedScript.add(payloadScriptWrite); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testWriteWhileReadClosedAndThenClose(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); composer.emitConversation(toServerPayloadPacket); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(SERVER_ACK_PACKET); expectedScript.add(Util.CLOSE_READ); expectedScript.add(payloadScriptWrite); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add("closed"); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testReadWhileWriteClosed(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(SERVER_ACK_PACKET); composer.emitConversation(toClientPayloadPacket); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add(payloadScriptRead); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } @Test public void testReadWhileWriteClosedAndThenClose(){ TcpClientComposer composer = getComposerWithOpenConnection(); final String preTestScript = composer.getScript(); final List<String> expectedScript = new LinkedList<>(); composer.emitConversation(CLIENT_FIN_PACKET); composer.emitConversation(SERVER_ACK_PACKET); composer.emitConversation(toClientPayloadPacket); composer.emitConversation(SERVER_FIN_PACKET); composer.emitConversation(CLIENT_ACK_PACKET); expectedScript.add(Util.CLOSE_WRITE); expectedScript.add(payloadScriptRead); expectedScript.add(Util.CLOSE_READ); expectedScript.add("close"); expectedScript.add("closed"); final String testScript = composer.getScript().substring(preTestScript.length()); assertTrue(ScriptTestUtil.scriptIsInstanceOfScript(testScript, expectedScript)); } }