summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorStefan Held <stefan_held@mentor.com>2015-05-19 12:37:05 +0200
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2015-06-17 08:50:37 +0200
commitabef04eac17f8ff270d1b3aa0a56bbca2a8ab195 (patch)
tree5a79c440a32598e5bb37318667be98c4798c37ff /tests
parentf243025c94ae3ac1924ac9f4c9b9b0414ccc65fe (diff)
downloadDLT-daemon-abef04eac17f8ff270d1b3aa0a56bbca2a8ab195.tar.gz
Added new filestranfer test filetransfer: send data with crc32 checksum receiver: receive data, save it at /tmp and verifiy the checksum
Signed-off-by: Stefan Held <stefan_held@mentor.com> Signed-off-by: Alexander Wenzel <Alexander.AW.Wenzel@bmw.de>
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt6
-rw-r--r--tests/dlt_test_filetransfer.c179
-rw-r--r--tests/dlt_test_receiver.c442
3 files changed, 627 insertions, 0 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 593c6c9..a7ce9aa 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -5,7 +5,13 @@ include_directories(${gtest_SOURCE_DIR}/include)
configure_file(${CMAKE_SOURCE_DIR}/tests/testfile.dlt ${PROJECT_BINARY_DIR}/tests COPYONLY)
configure_file(${CMAKE_SOURCE_DIR}/tests/testfilter.txt ${PROJECT_BINARY_DIR}/tests COPYONLY)
+find_package( ZLIB REQUIRED )
+
add_executable(gtest_dlt_common gtest_dlt_common.cpp)
add_executable(gtest_dlt_user gtest_dlt_user.cpp)
+add_executable(dlt_test_receiver dlt_test_receiver.c)
+add_executable(dlt_test_filetransfer dlt_test_filetransfer.c)
target_link_libraries(gtest_dlt_common gtest gtest_main dlt)
target_link_libraries(gtest_dlt_user gtest gtest_main dlt)
+target_link_libraries(dlt_test_receiver dlt ${ZLIB_LIBRARIES})
+target_link_libraries(dlt_test_filetransfer dlt ${ZLIB_LIBRARIES})
diff --git a/tests/dlt_test_filetransfer.c b/tests/dlt_test_filetransfer.c
new file mode 100644
index 0000000..085d90d
--- /dev/null
+++ b/tests/dlt_test_filetransfer.c
@@ -0,0 +1,179 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#include <dlt_filetransfer.h> /*Needed for transferring files with the dlt protocol*/
+#include <dlt.h> /*Needed for dlt logging*/
+#include <zlib.h>
+
+#define MAXSTRLEN 1024
+
+#define FLTR_APP_DESC "Filetransfer application"
+#define FLTR_CONTEXT_DESC "Filetransfer context"
+
+#define FLTR_APP "FLTR"
+#define FLTR_CONTEXT "FLTR"
+
+#define TIMEOUT 1
+
+//!Declare some context for the file transfer. It's not a must have to do this, but later you can set a filter on this context in the dlt viewer.
+DLT_DECLARE_CONTEXT(fileContext);
+
+/**
+ * Print usage information of tool.
+ */
+void usage()
+{
+ char version[255];
+
+ dlt_get_version(version,255);
+
+ printf("Usage: dlt-example-filetransfer [options] absolute-path-to-file\n");
+ printf("Simple filetransfer example");
+ printf("%s \n", version);
+ printf("Options:\n");
+ printf("-a apid - Set application id to apid (default: FLTR)\n");
+ printf("-c ctid - Set context id to ctid (default: FLTR)\n");
+ printf("-t ms - Timeout between file packages in ms (minimum 1 ms)\n");
+ printf("-d - Flag to delete the file after the transfer (default: false)\n");
+ printf("-i - Flag to log file infos to DLT before transfer file (default: false)\n");
+ printf("-h - This help\n");
+
+}
+
+
+//!Main program dlt-test-filestransfer starts here
+int main(int argc, char* argv[])
+{
+ //char str[MAXSTRLEN];
+ int opt, timeout;
+
+ char apid[DLT_ID_SIZE];
+ char ctid[DLT_ID_SIZE];
+
+ //char version[255];
+ int index;
+ int dflag = 0;
+ int iflag = 0;
+ char *file = 0;
+ char *tvalue = 0;
+
+ unsigned long crc = crc32(0L, Z_NULL, 0);
+ unsigned long FLENGHT = 1024*1024; // --> 1MB
+ unsigned char buffer[FLENGHT];
+ FILE *fp;
+
+ dlt_set_id(apid, FLTR_APP);
+ dlt_set_id(ctid, FLTR_CONTEXT);
+
+ while ((opt = getopt(argc, argv, "idf:t:a:c:h")) != -1)
+ {
+ switch (opt)
+ {
+ case 'd':
+ {
+ dflag = 1;
+ break;
+ }
+ case 'i':
+ {
+ iflag = 1;
+ break;
+ }
+ case 't':
+ {
+ tvalue = optarg;
+ break;
+ }
+ case 'a':
+ {
+ dlt_set_id(apid,optarg);
+ break;
+ }
+ case 'c':
+ {
+ dlt_set_id(ctid,optarg);
+ break;
+ }
+ case 'h':
+ {
+ usage();
+ break;
+ }
+ case '?':
+ {
+ if (optopt == 'a' || optopt == 'c' || optopt == 't')
+ {
+ fprintf (stderr, "Option -%c requires an argument.\n", optopt);
+ }
+ else if (isprint (optopt))
+ {
+ fprintf (stderr, "Unknown option `-%c'.\n", optopt);
+ }
+ else
+ {
+ fprintf (stderr, "Unknown option character `\\x%x'.\n",optopt);
+ }
+ /* unknown or wrong option used, show usage information and terminate */
+ usage();
+ return -1;
+ }
+ }
+ }
+
+ for (index = optind; index < argc; index++)
+ {
+ file = argv[index];
+ }
+
+ if (file == 0)
+ {
+ /* no message, show usage and terminate */
+ fprintf(stderr,"ERROR: No absolute path to file specified\n");
+ usage();
+ return -1;
+ }
+
+
+ if (tvalue)
+ {
+ timeout = atoi(tvalue);
+ }
+ else
+ {
+ timeout = TIMEOUT;
+ }
+
+ //Register the application at the dlt-daemon
+ DLT_REGISTER_APP(apid,FLTR_APP_DESC);
+
+ //Register the context of the main program at the dlt-daemon
+ DLT_REGISTER_CONTEXT(fileContext,ctid,FLTR_CONTEXT_DESC);
+
+ // create crc32 checksum
+ fp = fopen (file,"rb");
+ size_t readBytes = fread(buffer, sizeof(char), FLENGHT, fp);
+ crc = crc32(crc, buffer, readBytes);
+ fclose(fp);
+
+ // send crc32 checksum to daemon
+ DLT_LOG(fileContext,DLT_LOG_INFO, DLT_STRING("CRC"), DLT_UINT(crc), DLT_STRING(file));
+
+ //More details in corresponding methods
+ if( iflag )
+ {
+ dlt_user_log_file_infoAbout(&fileContext,file);
+ }
+
+ if( dlt_user_log_file_complete(&fileContext,file,dflag,timeout) < 0 )
+ {
+ printf("File couldn't be transferred. Please check the dlt log messages.\n");
+ }
+
+ //Unregister the context in which the file transfer happened from the dlt-daemon
+ DLT_UNREGISTER_CONTEXT(fileContext);
+ //Unregister the context of the main program from the dlt-daemon
+ DLT_UNREGISTER_APP();
+
+ return 0;
+}
diff --git a/tests/dlt_test_receiver.c b/tests/dlt_test_receiver.c
new file mode 100644
index 0000000..7c52c94
--- /dev/null
+++ b/tests/dlt_test_receiver.c
@@ -0,0 +1,442 @@
+/**
+ * @licence app begin@
+ * Copyright (C) 2012 BMW AG
+ *
+ * This file is part of GENIVI Project Dlt - Diagnostic Log and Trace console apps.
+ *
+ * Contributions are licensed to the GENIVI Alliance under one or more
+ * Contribution License Agreements.
+ *
+ * \copyright
+ * This Source Code Form is subject to the terms of the
+ * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
+ * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ *
+ * \author Alexander Wenzel <alexander.aw.wenzel@bmw.de> BMW 2011-2012
+ *
+ * \file dlt-receive.c
+ * For further information see http://www.genivi.org/.
+ * @licence end@
+ */
+
+
+/*******************************************************************************
+** **
+** SRC-MODULE: dlt-receive.cpp **
+** **
+** TARGET : linux **
+** **
+** PROJECT : DLT **
+** **
+** AUTHOR : Alexander Wenzel Alexander.AW.Wenzel@bmw.de **
+** Markus Klein **
+** **
+** PURPOSE : **
+** **
+** REMARKS : **
+** **
+** PLATFORM DEPENDANT [yes/no]: yes **
+** **
+** TO BE CHANGED BY USER [yes/no]: no **
+** **
+*******************************************************************************/
+
+/*******************************************************************************
+** Author Identity **
+********************************************************************************
+** **
+** Initials Name Company **
+** -------- ------------------------- ---------------------------------- **
+** aw Alexander Wenzel BMW **
+** mk Markus Klein Fraunhofer ESK **
+*******************************************************************************/
+
+/*******************************************************************************
+** Revision Control History **
+*******************************************************************************/
+
+/*
+ * $LastChangedRevision: 1670 $
+ * $LastChangedDate: 2011-04-08 15:12:06 +0200 (Fr, 08. Apr 2011) $
+ * $LastChangedBy$
+ Initials Date Comment
+ aw 13.01.2010 initial
+ */
+
+#include <ctype.h> /* for isprint() */
+#include <stdlib.h> /* for atoi() */
+#include <sys/stat.h> /* for S_IRUSR, S_IWUSR, S_IRGRP, S_IROTH */
+#include <fcntl.h> /* for open() */
+#include <sys/uio.h> /* for writev() */
+#include <string.h>
+
+#include "dlt_client.h"
+#include <zlib.h>
+
+#define DLT_RECEIVE_TEXTBUFSIZE 10024 /* Size of buffer for text output */
+
+#define DLT_RECEIVE_ECU_ID "RECV"
+
+/* Function prototypes */
+int dlt_receive_filetransfer_callback(DltMessage *message, void *data);
+
+typedef struct {
+ int aflag;
+ int sflag;
+ int xflag;
+ int mflag;
+ int vflag;
+ int yflag;
+ char *ovalue;
+ char *fvalue;
+ char *evalue;
+ int bvalue;
+ char ecuid[4];
+ int ohandle;
+ DltFile file;
+ DltFilter filter;
+} DltReceiveData;
+
+FILE *fp;
+
+/**
+ * Print usage information of tool.
+ */
+void usage()
+{
+ char version[255];
+
+ dlt_get_version(version,255);
+
+ printf("Usage: dlt-receive [options] hostname/serial_device_name\n");
+ printf("Receive DLT messages from DLT daemon and print or store the messages.\n");
+ printf("Use filters to filter received messages.\n");
+ printf("%s \n", version);
+ printf("Options:\n");
+ printf(" -a Print DLT messages; payload as ASCII\n");
+ printf(" -x Print DLT messages; payload as hex\n");
+ printf(" -m Print DLT messages; payload as hex and ASCII\n");
+ printf(" -s Print DLT messages; only headers\n");
+ printf(" -v Verbose mode\n");
+ printf(" -h Usage\n");
+ printf(" -y Serial device mode\n");
+ printf(" -b baudrate Serial device baudrate (Default: 115200)\n");
+ printf(" -e ecuid Set ECU ID (Default: RECV)\n");
+ printf(" -o filename Output messages in new DLT file\n");
+ printf(" -f filename Enable filtering of messages\n");
+}
+
+/**
+ * Main function of tool.
+ */
+int main(int argc, char* argv[])
+{
+ DltClient dltclient;
+ DltReceiveData dltdata;
+ int c;
+ int index;
+
+ /* Initialize dltdata */
+ dltdata.aflag = 0;
+ dltdata.sflag = 0;
+ dltdata.xflag = 0;
+ dltdata.mflag = 0;
+ dltdata.vflag = 0;
+ dltdata.yflag = 0;
+ dltdata.ovalue = 0;
+ dltdata.fvalue = 0;
+ dltdata.evalue = 0;
+ dltdata.bvalue = 0;
+ dltdata.ohandle=-1;
+
+ /* Fetch command line arguments */
+ opterr = 0;
+
+ while ((c = getopt (argc, argv, "vashyxmf:o:e:b:")) != -1)
+ switch (c)
+ {
+ case 'v':
+ {
+ dltdata.vflag = 1;
+ break;
+ }
+ case 'a':
+ {
+ dltdata.aflag = 1;
+ break;
+ }
+ case 's':
+ {
+ dltdata.sflag = 1;
+ break;
+ }
+ case 'x':
+ {
+ dltdata.xflag = 1;
+ break;
+ }
+ case 'm':
+ {
+ dltdata.mflag = 1;
+ break;
+ }
+ case 'h':
+ {
+ usage();
+ return -1;
+ }
+ case 'y':
+ {
+ dltdata.yflag = 1;
+ break;
+ }
+ case 'f':
+ {
+ dltdata.fvalue = optarg;
+ break;
+ }
+ case 'o':
+ {
+ dltdata.ovalue = optarg;
+ break;
+ }
+ case 'e':
+ {
+ dltdata.evalue = optarg;
+ break;
+ }
+ case 'b':
+ {
+ dltdata.bvalue = atoi(optarg);
+ break;
+ }
+ case '?':
+ {
+ if (optopt == 'o' || optopt == 'f')
+ {
+ fprintf (stderr, "Option -%c requires an argument.\n", optopt);
+ }
+ else if (isprint (optopt))
+ {
+ fprintf (stderr, "Unknown option `-%c'.\n", optopt);
+ }
+ else
+ {
+ fprintf (stderr, "Unknown option character `\\x%x'.\n",optopt);
+ }
+ /* unknown or wrong option used, show usage information and terminate */
+ usage();
+ return -1;
+ }
+ default:
+ {
+ abort ();
+ return -1;//for parasoft
+ }
+ }
+
+ /* Initialize DLT Client */
+ dlt_client_init(&dltclient, dltdata.vflag);
+
+ /* Register callback to be called when message was received */
+ // fp = open ....
+ dlt_client_register_message_callback(dlt_receive_filetransfer_callback);
+
+ /* Setup DLT Client structure */
+ dltclient.serial_mode = dltdata.yflag;
+
+ if (dltclient.serial_mode==0)
+ {
+ for (index = optind; index < argc; index++)
+ {
+ dltclient.servIP = argv[index];
+ }
+
+ if (dltclient.servIP == 0)
+ {
+ /* no hostname selected, show usage and terminate */
+ fprintf(stderr,"ERROR: No hostname selected\n");
+ usage();
+ dlt_client_cleanup(&dltclient,dltdata.vflag);
+ return -1;
+ }
+ }
+ else
+ {
+ for (index = optind; index < argc; index++)
+ {
+ dltclient.serialDevice = argv[index];
+ }
+
+ if (dltclient.serialDevice == 0)
+ {
+ /* no serial device name selected, show usage and terminate */
+ fprintf(stderr,"ERROR: No serial device name specified\n");
+ usage();
+ return -1;
+ }
+
+ dlt_client_setbaudrate(&dltclient,dltdata.bvalue);
+ }
+
+ /* initialise structure to use DLT file */
+ dlt_file_init(&(dltdata.file),dltdata.vflag);
+
+ /* first parse filter file if filter parameter is used */
+ dlt_filter_init(&(dltdata.filter),dltdata.vflag);
+
+ if (dltdata.fvalue)
+ {
+ if (dlt_filter_load(&(dltdata.filter),dltdata.fvalue,dltdata.vflag)<0)
+ {
+ dlt_file_free(&(dltdata.file),dltdata.vflag);
+ return -1;
+ }
+
+ dlt_file_set_filter(&(dltdata.file),&(dltdata.filter),dltdata.vflag);
+ }
+
+ /* open DLT output file */
+ if (dltdata.ovalue)
+ {
+ dltdata.ohandle = open(dltdata.ovalue,O_WRONLY|O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); /* mode: wb */
+
+ if (dltdata.ohandle == -1)
+ {
+ dlt_file_free(&(dltdata.file),dltdata.vflag);
+ fprintf(stderr,"ERROR: Output file %s cannot be opened!\n",dltdata.ovalue);
+ return -1;
+ }
+ }
+
+ if (dltdata.evalue)
+ {
+ dlt_set_id(dltdata.ecuid,dltdata.evalue);
+ }
+ else
+ {
+ dlt_set_id(dltdata.ecuid,DLT_RECEIVE_ECU_ID);
+ }
+
+ /* Connect to TCP socket or open serial device */
+ if (dlt_client_connect(&dltclient, dltdata.vflag)!=-1)
+ {
+
+ /* Dlt Client Main Loop */
+ dlt_client_main_loop(&dltclient, &dltdata, dltdata.vflag);
+
+ /* Dlt Client Cleanup */
+ dlt_client_cleanup(&dltclient,dltdata.vflag);
+ }
+
+ /* dlt-receive cleanup */
+ if (dltdata.ovalue)
+ {
+ close(dltdata.ohandle);
+ }
+
+ dlt_file_free(&(dltdata.file),dltdata.vflag);
+
+ dlt_filter_free(&(dltdata.filter),dltdata.vflag);
+
+ return 0;
+}
+
+int dlt_receive_filetransfer_callback(DltMessage *message, void *data)
+{
+ DltReceiveData *dltdata;
+ static char text[DLT_RECEIVE_TEXTBUFSIZE];
+
+ static char crc[11];
+ char filename[255];
+ unsigned long FLENGTH = 1024*1024; // --> 1MB
+
+
+ struct iovec iov[2];
+ int bytes_written;
+
+ if ((message==0) || (data==0))
+ {
+ return -1;
+ }
+
+ dltdata = (DltReceiveData*)data;
+
+ dlt_message_payload(message,text,DLT_RECEIVE_TEXTBUFSIZE,DLT_OUTPUT_ASCII,dltdata->vflag);
+ printf("[%s]\n",text);
+
+ // 1st get the crc to check the received data
+ if( strncmp(text, "CRC", 3) == 0)
+ {
+ char *tmpFilename;
+ strncpy(crc, text + 4, 10);
+ crc[10] = '\0';
+ tmpFilename = strrchr(text, '/') + 1;
+ // create file for each received file, as named as crc value
+ snprintf(filename, 255, "/tmp/%s", tmpFilename);
+ fp = fopen(filename, "w+");
+ }
+
+ // 3rd create crc and verify on finish
+ if( strncmp(text, "FLFI", 4) == 0)
+ {
+ unsigned long crcnew = crc32(0L, Z_NULL, 0);
+ unsigned char buffer[FLENGTH];
+ fseek(fp, SEEK_SET, 0);
+ size_t readBytes = fread(buffer, sizeof(char), FLENGTH, fp);
+ crcnew = crc32(crcnew, buffer, readBytes);
+
+ if( (unsigned) atol(crc) == crcnew)
+ printf("FILETRANSFER SUCCESSFULL");
+ else
+ printf("ERROR ON FILETRANSFER");
+ fclose(fp);
+ }
+
+ // 2nd check if incomming data are filetransfer data
+ if( strncmp(text, "FLDA", 4) == 0)
+ {
+ // truncate beginning of data stream ( FLDA, File identifier and package number)
+ char *position = strchr(text, 32); // search for space
+ snprintf(text, DLT_RECEIVE_TEXTBUFSIZE, position+1);
+ position = strchr(text, 32);
+ snprintf(text, DLT_RECEIVE_TEXTBUFSIZE, position+1);
+ position = strchr(text, 32);
+ snprintf(text, DLT_RECEIVE_TEXTBUFSIZE, position+1);
+
+ // truncate ending of data stream ( FLDA )
+ int len = strlen(text);
+ text[len - 4] = '\0';
+ printf("## [%s]\n", text);
+ // hex to ascii and store at /tmp
+ char tmp[3];
+ int i;
+ for(i = 0;i< (int) strlen(text); i = i+3)
+ {
+ tmp[0] = text[i];
+ tmp[1] = text[i+1];
+ tmp[2] = '\0';
+ unsigned long h = strtoul(tmp, NULL, 16);
+ fprintf(fp, "%c", (int) h);
+ }
+ }
+
+ /* if file output enabled write message */
+ if (dltdata->ovalue)
+ {
+ iov[0].iov_base = message->headerbuffer;
+ iov[0].iov_len = message->headersize;
+ iov[1].iov_base = message->databuffer;
+ iov[1].iov_len = message->datasize;
+
+ bytes_written = writev(dltdata->ohandle, iov, 2);
+
+ if (0 > bytes_written){
+ printf("dlt_receive_message_callback: writev(dltdata->ohandle, iov, 2); returned an error!" );
+ return -1;
+ }
+ }
+
+ return 0;
+}