files added
diff --git a/src/STOMP_Types.ttcn b/src/STOMP_Types.ttcn
new file mode 100644
index 0000000..d665073
--- /dev/null
+++ b/src/STOMP_Types.ttcn
@@ -0,0 +1,154 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2017 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+///////////////////////////////////////////////////////////////////////////////
+//
+// Contributors:
+// Elemer Lelik-initial implementation
+//
+//
+
+/*
+
+https://stomp.github.io/stomp-specification-1.2.html
+
+
+Augmented BNF
+
+NULL = <US-ASCII null (octet 0)>
+LF = <US-ASCII line feed (aka newline) (octet 10)>
+CR = <US-ASCII carriage return (octet 13)>
+EOL = [CR] LF
+OCTET = <any 8-bit sequence of data>
+
+frame-stream = 1*frame
+
+frame = command EOL
+ *( header EOL )
+ EOL
+ *OCTET
+ NULL
+ *( EOL )
+
+command = client-command | server-command
+
+client-command = "SEND"
+ | "SUBSCRIBE"
+ | "UNSUBSCRIBE"
+ | "BEGIN"
+ | "COMMIT"
+ | "ABORT"
+ | "ACK"
+ | "NACK"
+ | "DISCONNECT"
+ | "CONNECT"
+ | "STOMP"
+
+server-command = "CONNECTED"
+ | "MESSAGE"
+ | "RECEIPT"
+ | "ERROR"
+
+header = header-name ":" header-value
+header-name = 1*<any OCTET except CR or LF or ":">
+header-value = *<any OCTET except CR or LF or ":">
+
+*/
+
+
+module STOMP_Types {
+
+external function enc_STOMP(in STOMPFrame frame) return charstring
+with { extension "prototype(convert) encode(TEXT)" };
+external function dec_STOMP(in charstring stream) return STOMPFrame
+with { extension "prototype(convert) decode(TEXT)" };
+
+function f_enc_stomp(in STOMPFrame frame) return octetstring
+{
+ var octetstring v_os:=char2oct(enc_STOMP(frame));
+ v_os:=substr(v_os,0,lengthof(v_os)-2)&'000D0A'O;//cut @@ and add NULL EOL;
+
+ //log("v_os :",v_os)
+ return v_os
+}
+
+function f_dec_stomp(in octetstring stream) return STOMPFrame
+{
+
+ var STOMPFrame v_frame;
+ var octetstring v_os;
+ var integer v_l:=lengthof(stream);
+
+ for(var integer i:=v_l-1;i>=0;i:=i-1)
+
+ {
+
+ if(stream[i]=='00'O) {
+ v_os:=substr(stream,0,i)&'4040'O;//add @
+ }//endif
+ }//endfor
+
+ //log("v_os :",v_os)
+
+ v_frame:=dec_STOMP(oct2char(v_os));
+
+ return v_frame;
+}
+
+
+type charstring MyCharstringType ( pattern "(([\q{0,0,0,14}-9]|[;-}])#(1,))" );
+
+
+type record Header {
+ MyCharstringType header_name,
+ MyCharstringType header_value
+}with {
+ variant "SEPARATOR(':',,)"
+ variant "END('\r\n','(\r)#(0,1)\n',)" //EOL
+}
+
+
+type record of Header Headers with {
+ variant "END('\r\n','(\r)#(0,1)\n',)" //EOL
+}
+
+type record STOMPFrame {
+
+ Command command,
+ Headers headers,
+ charstring payload optional
+
+}with {
+ variant "END('@@','[\q{0,0,0,64}]#(2,2)',)"
+}
+
+type enumerated Command {
+ SEND,
+ SUBSCRIBE,
+ UNSUBSCRIBE,
+ BEGIN,
+ COMMIT,
+ ABORT,
+ ACK,
+ NACK,
+ DISCONNECT,
+ CONNECTED,
+ CONNECT,
+ STOMP,
+ MESSAGE,
+ RECEIPT,
+ ERROR
+}
+with {
+ variant "END('\r\n','(\r)#(0,1)\n',)" //EOL
+
+}
+
+}with { encode "TEXT" }
+
+
diff --git a/src/STOMP_common.ttcn b/src/STOMP_common.ttcn
new file mode 100644
index 0000000..5c88bc0
--- /dev/null
+++ b/src/STOMP_common.ttcn
@@ -0,0 +1,29 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2017 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+///////////////////////////////////////////////////////////////////////////////
+//
+// Contributors:
+// Elemer Lelik-initial implementation
+//
+//
+//This function permits extracting JSON messages from a TCP stream by calculating the message length
+//
+
+module STOMP_common
+{
+
+//-----------------------------------------------------------------------------
+//External functions
+//-----------------------------------------------------------------------------
+
+external function f_calc_STOMP_length( in octetstring data) return integer;
+
+}
+
+
diff --git a/src/STOMP_slicer.cc b/src/STOMP_slicer.cc
new file mode 100644
index 0000000..8b81427
--- /dev/null
+++ b/src/STOMP_slicer.cc
@@ -0,0 +1,55 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2017 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+///////////////////////////////////////////////////////////////////////////////
+//
+// Contributors:
+// Elemer Lelik-initial implementation
+//
+//
+//This function permits extracting JSON messages from a TCP stream by calculating the message length
+//
+
+#include "STOMP_common.hh"
+#include <ctype.h>
+#include <string.h>
+#include <iostream>
+
+namespace STOMP__common {
+//returns length of first STOMP string in the input stream, calculated from index 0, or -1 in case of unsuccessful match
+INTEGER f__calc__STOMP__length(const OCTETSTRING& data){
+ int data_length=data.lengthof();
+ const unsigned char* ptr=(const unsigned char*)data;
+
+
+ for(int i=0; i<data_length; i++){
+
+ if (ptr[i] == '\0')
+ {
+ if( (ptr[i+1] != '\n') && (ptr[i+1] != '\r') ) return i+1;
+ else {
+
+
+ for(int j=i+1; j<data_length; j++){
+
+ if ( (ptr[j+1] != '\n') && (ptr[j+1] != '\r') ) return j+1;
+
+ }//endfor
+
+
+ }//endelse
+
+ }//endif
+
+ }//endfor
+
+ return -1;
+}//endfunction
+
+}//end ns
+
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..3ed4e7d
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,187 @@
+# This Makefile was generated by the Makefile Generator
+# of the TTCN-3 Test Executor version CRL 113 200/6 R2A
+# for Elemer Lelik (ethlel@esekilxxen1844) on Tue Jun 27 13:27:38 2017
+
+# Copyright (c) 2000-2017 Ericsson Telecom AB
+
+# The following make commands are available:
+# - make, make all Builds the executable test suite.
+# - make archive Archives all source files.
+# - make check Checks the semantics of TTCN-3 and ASN.1modules.
+# - make port Generates port skeletons.
+# - make clean Removes all generated files.
+# - make compile Translates TTCN-3 and ASN.1 modules to C++.
+# - make dep Creates/updates dependency list.
+# - make executable Builds the executable test suite.
+# - make library Builds the library archive.
+# - make objects Builds the object files without linking the executable.
+#
+# Set these variables...
+#
+
+# The path of your TTCN-3 Test Executor installation:
+# Uncomment this line to override the environment variable.
+# TTCN3_DIR =
+
+# Your platform: (SOLARIS, SOLARIS8, LINUX, FREEBSD or WIN32)
+PLATFORM = LINUX
+
+# Your C++ compiler:
+# (if you change the platform, you may need to change the compiler)
+CXX = g++
+
+# Flags for the C++ preprocessor (and makedepend as well):
+CPPFLAGS = -D$(PLATFORM) -I$(TTCN3_DIR)/include
+
+# Flags for the C++ compiler:
+CXXFLAGS = -Wall
+
+# Flags for the linker:
+LDFLAGS =
+
+ifeq ($(PLATFORM), WIN32)
+# Silence linker warnings.
+LDFLAGS += -Wl,--enable-auto-import,--enable-runtime-pseudo-reloc
+endif
+
+# Utility to create library files
+AR = ar
+ARFLAGS =
+
+# Flags for the TTCN-3 and ASN.1 compiler:
+COMPILER_FLAGS = -L
+
+# Execution mode: (either ttcn3 or ttcn3-parallel)
+TTCN3_LIB = ttcn3-parallel
+
+# The path of your OpenSSL installation:
+# If you do not have your own one, leave it unchanged.
+OPENSSL_DIR = $(TTCN3_DIR)
+
+# The path of your libxml2 installation:
+# If you do not have your own one, leave it unchanged.
+XMLDIR = $(TTCN3_DIR)
+
+# Directory to store the archived source files:
+# Note: you can set any directory except ./archive
+ARCHIVE_DIR = backup
+
+#
+# You may change these variables. Add your files if necessary...
+#
+
+# TTCN-3 modules of this project:
+TTCN3_MODULES = STOMP_Types.ttcn STOMP_test.ttcn
+
+# ASN.1 modules of this project:
+ASN1_MODULES =
+
+# C++ source & header files generated from the TTCN-3 & ASN.1 modules of
+# this project:
+GENERATED_SOURCES = STOMP_Types.cc STOMP_test.cc
+GENERATED_HEADERS = STOMP_Types.hh STOMP_test.hh
+
+# C/C++ Source & header files of Test Ports, external functions and
+# other modules:
+USER_SOURCES =
+USER_HEADERS =
+
+# Object files of this project that are needed for the executable test suite:
+OBJECTS = $(GENERATED_OBJECTS) $(USER_OBJECTS)
+
+GENERATED_OBJECTS = STOMP_Types.o STOMP_test.o
+
+USER_OBJECTS =
+
+# Other files of the project (Makefile, configuration files, etc.)
+# that will be added to the archived source files:
+OTHER_FILES = Makefile
+
+# The name of the executable test suite:
+EXECUTABLE = STOMP_Types
+
+
+
+LIBRARY = lib$(EXECUTABLE).a
+
+TARGET = $(EXECUTABLE)
+
+#
+# Do not modify these unless you know what you are doing...
+# Platform specific additional libraries:
+#
+SOLARIS_LIBS = -lsocket -lnsl -lxml2 -lresolv
+SOLARIS8_LIBS = -lsocket -lnsl -lxml2 -lresolv
+LINUX_LIBS = -lxml2 -lpthread -lrt
+FREEBSD_LIBS = -lxml2
+WIN32_LIBS = -lxml2
+
+#
+# Rules for building the executable...
+#
+
+all: $(TARGET) ;
+
+executable: $(EXECUTABLE) ;
+
+library: $(LIBRARY) ;
+
+objects: $(OBJECTS) compile;
+
+$(EXECUTABLE): $(OBJECTS)
+ if $(CXX) $(LDFLAGS) -o $@ $(OBJECTS) \
+ -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \
+ -L$(OPENSSL_DIR)/lib -lcrypto \
+ -L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \
+ then : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi
+
+$(LIBRARY): $(OBJECTS)
+ $(AR) -r $(ARFLAGS) $(LIBRARY) $(OBJECTS)
+
+.cc.o .c.o:
+ $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
+
+$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile
+ @if [ ! -f $@ ]; then rm -f compile; $(MAKE) compile; fi
+
+check: $(TTCN3_MODULES) $(ASN1_MODULES)
+ $(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) \
+ $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)
+
+port: $(TTCN3_MODULES) $(ASN1_MODULES)
+ $(TTCN3_DIR)/bin/compiler -t $(COMPILER_FLAGS) \
+ $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)
+
+compile: $(TTCN3_MODULES) $(ASN1_MODULES)
+ $(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \
+ $(TTCN3_MODULES) $(ASN1_MODULES) - $?
+ touch $@
+
+clean:
+ -rm -f $(EXECUTABLE) $(LIBRARY) $(OBJECTS) $(GENERATED_HEADERS) \
+ $(GENERATED_SOURCES) compile \
+ tags *.log
+
+dep: $(GENERATED_SOURCES) $(USER_SOURCES) ;
+ makedepend $(CPPFLAGS) -DMAKEDEPEND_RUN $(GENERATED_SOURCES) $(USER_SOURCES)
+
+archive:
+ mkdir -p $(ARCHIVE_DIR)
+ tar -cvhf - $(TTCN3_MODULES) $(ASN1_MODULES) \
+ $(USER_HEADERS) $(USER_SOURCES) $(OTHER_FILES) \
+ | gzip >$(ARCHIVE_DIR)/`basename $(TARGET) .exe`-`date '+%y%m%d-%H%M'`.tgz
+
+diag:
+ $(TTCN3_DIR)/bin/compiler -v 2>&1
+ $(TTCN3_DIR)/bin/mctr_cli -v 2>&1
+ $(CXX) -v 2>&1
+ $(AR) -V 2>&1
+ @echo TTCN3_DIR=$(TTCN3_DIR)
+ @echo OPENSSL_DIR=$(OPENSSL_DIR)
+ @echo XMLDIR=$(XMLDIR)
+ @echo PLATFORM=$(PLATFORM)
+
+#
+# Add your rules here if necessary...
+#
+
diff --git a/test/STOMP_test.ttcn b/test/STOMP_test.ttcn
new file mode 100644
index 0000000..474973c
--- /dev/null
+++ b/test/STOMP_test.ttcn
@@ -0,0 +1,247 @@
+module STOMP_test
+{
+
+
+import from STOMP_Types all;
+
+
+
+
+//*******************************************************************************************
+//Templates
+
+
+template STOMPFrame t_message:=
+{
+
+ command:=MESSAGE,
+ headers:={ {header_name:="foo", header_value:="Hello"}, {header_name:="foo", header_value:="World"}},
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_send:=
+{
+
+ command:=SEND,
+ headers:={ {header_name:="destination", header_value:="/queue/a"}, {header_name:="receipt", header_value:="message-12345"}},
+ payload:="hello queue a"
+
+
+}
+
+
+template STOMPFrame t_connect:=
+{
+
+ command:=CONNECT,
+ headers:={ {header_name:="accept-version", header_value:="1.2"}, {header_name:="host", header_value:="stomp.github.org"}},
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_connected:=
+{
+
+ command:=CONNECTED,
+ headers:={ {header_name:="version", header_value:="1.2"}},
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_error:=
+{
+
+ command:=ERROR,
+ headers:={ {header_name:="version", header_value:="1.2,2.1"},{header_name:="content-type", header_value:="text/plain"} },
+ payload:="Supported protocol versions are 1.2 2.1"
+
+
+}
+
+
+template STOMPFrame t_subscribe:=
+{
+
+ command:=SUBSCRIBE,
+ headers:={ {header_name:="id", header_value:="0"},{header_name:="destination", header_value:="/queue/foo"},{header_name:="ack", header_value:="client"} },
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_unsubscribe:=
+{
+
+ command:=UNSUBSCRIBE,
+ headers:={ {header_name:="id", header_value:="0"} },
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_begin:=
+{
+
+ command:=BEGIN,
+ headers:={ {header_name:="transaction", header_value:="tx1"} },
+ payload:=omit
+
+
+}
+
+template STOMPFrame t_ack:=
+{
+
+ command:=ACK,
+ headers:={{header_name:="id", header_value:="0"}, {header_name:="transaction", header_value:="tx1"} },
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_nack:=
+{
+
+ command:=NACK,
+ headers:={{header_name:="id", header_value:="0"}, {header_name:="transaction", header_value:="tx1"} },
+ payload:=omit
+
+
+}
+
+template STOMPFrame t_commit:=
+{
+
+ command:=COMMIT,
+ headers:={ {header_name:="transaction", header_value:="tx1"} },
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_abort:=
+{
+
+ command:=ABORT,
+ headers:={ {header_name:="transaction", header_value:="tx1"} },
+ payload:=omit
+
+
+}
+
+template STOMPFrame t_disconnect:=
+{
+
+ command:=DISCONNECT,
+ headers:={ {header_name:="receipt", header_value:="77"} },
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_receipt:=
+{
+
+ command:=RECEIPT,
+ headers:={ {header_name:="receipt-id", header_value:="77"} },
+ payload:=omit
+
+
+}
+
+
+template STOMPFrame t_message1:=
+{
+
+ command:=MESSAGE,
+ headers:={ {header_name:="subscription", header_value:="0"}, {header_name:="message-id", header_value:="007"},{header_name:="destination", header_value:="/queue/a"}, {header_name:="content-type", header_value:="text/plain"}},
+ payload:="hello queue a"
+
+
+}
+
+
+
+template STOMPFrame t_error1:=
+{
+
+ command:=ERROR,
+ headers:={ {header_name:="receipt-id", header_value:="message@12345"},{header_name:="content-type", header_value:="text/plain"}, {header_name:="content-length", header_value:="171"},{header_name:="message", header_value:="malformed frame received"} },
+ payload:="The message:
+ -----
+ MESSAGE
+ destined:/queue/a
+ receipt:message@12345
+
+ Hello queue a!
+ -----
+ Did not contain a destination header, which is REQUIRED
+ for message propagation."
+
+
+}
+
+
+
+
+control {
+
+ var charstring v_char
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_message))))
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_send))))
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_connect))))
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_connected))))
+
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_error))))
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_subscribe))))
+
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_unsubscribe))))
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_begin))))
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_ack))))
+ log(f_dec_stomp(f_enc_stomp(valueof(t_nack))))
+
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_commit))))
+ log(f_dec_stomp(f_enc_stomp(valueof(t_abort))))
+
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_disconnect))))
+ log(f_dec_stomp(f_enc_stomp(valueof(t_receipt))))
+ log(f_dec_stomp(f_enc_stomp(valueof(t_message1))))
+
+ log(f_dec_stomp(f_enc_stomp(valueof(t_error1))))
+
+ v_char:="MESSAGE\nsubscription:0\nmessage-id:007\r\ndestination:/queue/a\ncontent-type:text/plain\n\r\nhello queue a@@"
+
+ log(dec_STOMP(v_char))
+
+
+
+
+
+
+}
+
+
+}
diff --git a/test/stomp.cfg b/test/stomp.cfg
new file mode 100644
index 0000000..8a260c1
--- /dev/null
+++ b/test/stomp.cfg
@@ -0,0 +1,17 @@
+[LOGGING]
+//LogFile := "myUDP.log"
+FileMask := LOG_ALL | TTCN_MATCHING
+#| TTCN_DEBUG
+ConsoleMask := TTCN_ERROR | TTCN_WARNING | TTCN_TESTCASE |
+TTCN_STATISTICS | TTCN_PORTEVENT
+LogSourceInfo := Yes
+
+[EXECUTE]
+STOMP_test.control
+
+
+
+[MAIN_CONTROLLER]
+LocalAddress := 127.0.0.1
+TCPPort := 9034
+