diff --git a/include/villas/nodes/file.h b/include/villas/nodes/file.h index f07e1d905..3b308b888 100644 --- a/include/villas/nodes/file.h +++ b/include/villas/nodes/file.h @@ -50,6 +50,8 @@ struct file { char *uri; /**< Real file name. */ } read, write; + + int flush; /**< Flush / upload file contents after each write. */ enum read_epoch_mode { FILE_EPOCH_DIRECT, diff --git a/lib/advio.c b/lib/advio.c index df81d3ab9..33f6441e6 100644 --- a/lib/advio.c +++ b/lib/advio.c @@ -41,19 +41,36 @@ static int advio_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp) { - char *nl; + const char *text; switch (type) { case CURLINFO_TEXT: - nl = strchr(data, '\n'); - if (nl) - *nl = 0; - - debug(LOG_ADVIO | 10, "%s", data); + text = "info"; + break; + case CURLINFO_HEADER_OUT: + text = "send header"; + break; + case CURLINFO_DATA_OUT: + text = "send data"; + break; + case CURLINFO_HEADER_IN: + text = "recv header"; + break; + case CURLINFO_DATA_IN: + text = "recv data"; + break; + case CURLINFO_SSL_DATA_IN: + text = "recv SSL data"; + break; + case CURLINFO_SSL_DATA_OUT: + text = "send SSL data"; + break; default: /* in case a new one is introduced to shock us */ return 0; } - + + debug(LOG_ADVIO | 5, "CURL: %s: %.*s", text, (int) size-1, data); + return 0; } @@ -333,9 +350,9 @@ int aupload(AFILE *af, int resume) curl_easy_getinfo(af->curl, CURLINFO_TOTAL_TIME, &total_time); char *total_bytes_human = advio_human_size(total_bytes, buf[0], sizeof(buf[0])); - char *total_time_human = advio_human_time(total_time, buf[1], sizeof(buf[1])); + char *total_time_human = advio_human_time(total_time, buf[1], sizeof(buf[1])); - info("Finished uploaded of %s in %s", total_bytes_human, total_time_human); + info("Finished upload of %s in %s", total_bytes_human, total_time_human); af->uploaded += total_bytes; @@ -376,7 +393,7 @@ int adownload(AFILE *af, int resume) curl_easy_getinfo(af->curl, CURLINFO_TOTAL_TIME, &total_time); char *total_bytes_human = advio_human_size(total_bytes, buf[0], sizeof(buf[0])); - char *total_time_human = advio_human_time(total_time, buf[1], sizeof(buf[1])); + char *total_time_human = advio_human_time(total_time, buf[1], sizeof(buf[1])); info("Finished download of %s in %s", total_bytes_human, total_time_human); @@ -386,7 +403,7 @@ int adownload(AFILE *af, int resume) res = curl_easy_getinfo(af->curl, CURLINFO_RESPONSE_CODE, &code); if (res) return -1; - + switch (code) { case 0: case 200: goto exist; @@ -408,7 +425,7 @@ int adownload(AFILE *af, int resume) return -1; default: - error("ADVIO: Failed to fetch file: %s: %s", af->uri, curl_easy_strerror(res)); + error("ADVIO: Failed to download file: %s: %s", af->uri, curl_easy_strerror(res)); return -1; } diff --git a/lib/log_config.c b/lib/log_config.c index 1d00cf256..7dd6278ba 100644 --- a/lib/log_config.c +++ b/lib/log_config.c @@ -30,16 +30,20 @@ int log_parse(struct log *l, config_setting_t *cfg) { - const char *facilities; + const char *fac, *pth; + int lvl; if (!config_setting_is_group(cfg)) cerror(cfg, "Setting 'log' must be a group."); - config_setting_lookup_int(cfg, "level", &l->level); - config_setting_lookup_string(cfg, "file", &l->path); + if (config_setting_lookup_int(cfg, "level", &lvl)) + l->level = lvl; - if (config_setting_lookup_string(cfg, "facilities", &facilities)) - log_set_facility_expression(l, facilities); + if (config_setting_lookup_string(cfg, "file", &pth)) + l->path = pth; + + if (config_setting_lookup_string(cfg, "facilities", &fac)) + log_set_facility_expression(l, fac); l->state = STATE_PARSED; diff --git a/lib/node.c b/lib/node.c index 884393f49..6ff8a666b 100644 --- a/lib/node.c +++ b/lib/node.c @@ -157,7 +157,7 @@ int node_destroy(struct node *n) int node_read(struct node *n, struct sample *smps[], unsigned cnt) { - int nread = 0; + int readd, nread = 0; if (!n->_vt->read) return -1; @@ -165,11 +165,14 @@ int node_read(struct node *n, struct sample *smps[], unsigned cnt) /* Send in parts if vector not supported */ if (n->_vt->vectorize > 0 && n->_vt->vectorize < cnt) { while (cnt - nread > 0) { - nread += n->_vt->read(n, &smps[nread], MIN(cnt - nread, n->_vt->vectorize)); + readd = n->_vt->read(n, &smps[nread], MIN(cnt - nread, n->_vt->vectorize)); + nread += readd; + debug(LOG_NODES | 5, "Received %u samples from node %s", readd, node_name(n)); } } else { nread = n->_vt->read(n, smps, cnt); + debug(LOG_NODES | 5, "Received %u samples from node %s", nread, node_name(n)); } for (int i = 0; i < nread; i++) @@ -180,18 +183,22 @@ int node_read(struct node *n, struct sample *smps[], unsigned cnt) int node_write(struct node *n, struct sample *smps[], unsigned cnt) { - int nsent = 0; + int sent, nsent = 0; if (!n->_vt->write) return -1; /* Send in parts if vector not supported */ if (n->_vt->vectorize > 0 && n->_vt->vectorize < cnt) { - while (cnt - nsent > 0) - nsent += n->_vt->write(n, &smps[nsent], MIN(cnt - nsent, n->_vt->vectorize)); + while (cnt - nsent > 0) { + sent = n->_vt->write(n, &smps[nsent], MIN(cnt - nsent, n->_vt->vectorize)); + nsent += sent; + debug(LOG_NODES | 5, "Sent %u samples to node %s", sent, node_name(n)); + } } else { nsent = n->_vt->write(n, smps, cnt); + debug(LOG_NODES | 5, "Sent %u samples to node %s", nsent, node_name(n)); } return nsent; diff --git a/lib/nodes/file.c b/lib/nodes/file.c index eb372e413..b0136629f 100644 --- a/lib/nodes/file.c +++ b/lib/nodes/file.c @@ -119,6 +119,9 @@ int file_parse(struct node *n, config_setting_t *cfg) if (cfg_out) { if (file_parse_direction(cfg_out, f, FILE_WRITE)) cerror(cfg_out, "Failed to parse output file for node %s", node_name(n)); + + if (!config_setting_lookup_bool(cfg_out, "flush", &f->flush)) + f->flush = 0; } cfg_in = config_setting_get_member(cfg, "in"); @@ -259,12 +262,12 @@ int file_start(struct node *n) if (f->read_timer < 0) serror("Failed to create timer"); - /* Get timestamp of first line */ - struct sample s; - arewind(f->read.handle); - + + /* Get timestamp of first line */ if (f->read_epoch_mode != FILE_EPOCH_ORIGINAL) { + struct sample s; + ret = sample_io_villas_fscan(f->read.handle->file, &s, NULL); if (ret < 0) error("Failed to read first timestamp of node %s", node_name(n)); @@ -292,9 +295,6 @@ int file_stop(struct node *n) { struct file *f = n->_vd; - free(f->read.uri); - free(f->write.uri); - if (f->read_timer) close(f->read_timer); if (f->read.handle) @@ -302,6 +302,9 @@ int file_stop(struct node *n) if (f->write.handle) afclose(f->write.handle); + free(f->read.uri); + free(f->write.uri); + return 0; } @@ -374,7 +377,9 @@ int file_write(struct node *n, struct sample *smps[], unsigned cnt) assert(cnt == 1); sample_io_villas_fprint(f->write.handle->file, s, SAMPLE_IO_ALL & ~SAMPLE_IO_OFFSET); - afflush(f->write.handle); + + if (f->flush) + afflush(f->write.handle); return 1; } diff --git a/lib/utils.c b/lib/utils.c index 27232d0a8..08e451f51 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -309,6 +309,7 @@ void signals_init(void (*cb)(int signal, siginfo_t *sinfo, void *ctx)) sigemptyset(&sa_quit.sa_mask); sigaction(SIGINT, &sa_quit, NULL); sigaction(SIGTERM, &sa_quit, NULL); + sigaction(SIGALRM, &sa_quit, NULL); struct sigaction sa_chld = { .sa_flags = 0, diff --git a/src/pipe.c b/src/pipe.c index eb93e5428..acaa4daeb 100644 --- a/src/pipe.c +++ b/src/pipe.c @@ -49,24 +49,25 @@ struct dir { struct pool pool; pthread_t thread; bool enabled; - bool started; + int limit; } sendd, recvv; -bool reverse = false; - struct node *node; pthread_t ptid; /**< Parent thread id */ static void quit(int signal, siginfo_t *sinfo, void *ctx) { - if (recvv.started) { + if (signal == SIGALRM) + info("Reached timeout. Terminating..."); + + if (recvv.enabled) { pthread_cancel(recvv.thread); pthread_join(recvv.thread, NULL); pool_destroy(&recvv.pool); } - if (sendd.started) { + if (sendd.enabled) { pthread_cancel(sendd.thread); pthread_join(sendd.thread, NULL); pool_destroy(&sendd.pool); @@ -93,23 +94,19 @@ static void usage() printf(" -d LVL set debug log level to LVL\n"); printf(" -x swap read / write endpoints\n"); printf(" -s only read data from stdin and send it to node\n"); - printf(" -r only read data from node and write it to stdout\n\n"); + printf(" -r only read data from node and write it to stdout\n"); + printf(". -t NUM terminate after NUM seconds\n"); + printf(" -L NUM terminate after NUM samples sent\n"); + printf(" -l NUM terminate after NUM samples received\n\n"); print_copyright(); - - exit(EXIT_FAILURE); } static void * send_loop(void *ctx) { - int ret; + int ret, cnt = 0; struct sample *smps[node->vectorize]; - if (!sendd.enabled) - return NULL; - - sendd.started = true; - /* Initialize memory */ ret = pool_init(&sendd.pool, LOG2_CEIL(node->vectorize), SAMPLE_LEN(DEFAULT_SAMPLELEN), &memtype_hugepage); if (ret < 0) @@ -124,11 +121,14 @@ static void * send_loop(void *ctx) for (len = 0; len < node->vectorize; len++) { struct sample *s = smps[len]; int reason; + + if (sendd.limit > 0 && cnt >= sendd.limit) + break; retry: reason = sample_io_villas_fscan(stdin, s, NULL); if (reason < 0) { if (feof(stdin)) - goto exit; + goto leave; else { warn("Skipped invalid message message: reason=%d", reason); goto retry; @@ -136,27 +136,33 @@ retry: reason = sample_io_villas_fscan(stdin, s, NULL); } } - node_write(node, smps, len); + cnt += node_write(node, smps, len); + + if (sendd.limit > 0 && cnt >= sendd.limit) + goto leave2; + pthread_testcancel(); } - /* We reached EOF on stdin here. Lets kill the process */ -exit: info("Reached end-of-file. Terminating..."); +leave2: info("Reached send limit. Terminating..."); pthread_kill(ptid, SIGINT); return NULL; + + /* We reached EOF on stdin here. Lets kill the process */ +leave: if (recvv.limit < 0) { + info("Reached end-of-file. Terminating..."); + pthread_kill(ptid, SIGINT); + } + + return NULL; } static void * recv_loop(void *ctx) { - int ret; + int ret, cnt = 0; struct sample *smps[node->vectorize]; - if (!recvv.enabled) - return NULL; - - recvv.started = true; - /* Initialize memory */ ret = pool_init(&recvv.pool, LOG2_CEIL(node->vectorize), SAMPLE_LEN(DEFAULT_SAMPLELEN), &memtype_hugepage); if (ret < 0) @@ -173,6 +179,7 @@ static void * recv_loop(void *ctx) for (;;) { int recv = node_read(node, smps, node->vectorize); struct timespec now = time_now(); + for (int i = 0; i < recv; i++) { struct sample *s = smps[i]; @@ -182,24 +189,37 @@ static void * recv_loop(void *ctx) sample_io_villas_fprint(stdout, s, SAMPLE_IO_ALL); fflush(stdout); } + + cnt += recv; + if (recvv.limit > 0 && cnt >= recvv.limit) + goto leave; + pthread_testcancel(); } +leave: info("Reached receive limit. Terminating..."); + pthread_kill(ptid, SIGINT); + return NULL; + return NULL; } int main(int argc, char *argv[]) { int ret, level = V; - char c; + + bool reverse = false; + double timeout = 0; + + sendd = recvv = (struct dir) { + .enabled = true, + .limit = -1 + }; ptid = pthread_self(); - - /* Default values */ - sendd.enabled = true; - recvv.enabled = true; - - while ((c = getopt(argc, argv, "hxrsd:")) != -1) { + + char c, *endptr; + while ((c = getopt(argc, argv, "hxrsd:l:L:t:")) != -1) { switch (c) { case 'x': reverse = true; @@ -211,13 +231,28 @@ int main(int argc, char *argv[]) sendd.enabled = false; // receive only break; case 'd': - level = atoi(optarg); - break; + level = strtoul(optarg, &endptr, 10); + goto check; + case 'l': + recvv.limit = strtoul(optarg, &endptr, 10); + goto check; + case 'L': + sendd.limit = strtoul(optarg, &endptr, 10); + goto check; + case 't': + timeout = strtod(optarg, &endptr); + goto check; case 'h': case '?': usage(); exit(c == '?' ? EXIT_FAILURE : EXIT_SUCCESS); } + + continue; + +check: if (optarg == endptr) + error("Failed to parse parse option argument '-%c %s'", c, optarg); + } if (argc != optind + 2) { @@ -264,11 +299,16 @@ int main(int argc, char *argv[]) error("Failed to start node: %s", node_name(node)); /* Start threads */ - pthread_create(&recvv.thread, NULL, recv_loop, NULL); - pthread_create(&sendd.thread, NULL, send_loop, NULL); + if (recvv.enabled) + pthread_create(&recvv.thread, NULL, recv_loop, NULL); + + if (sendd.enabled) + pthread_create(&sendd.thread, NULL, send_loop, NULL); + + ualarm(timeout * 1e6, 0); for (;;) - sleep(1); + pause(); return 0; } diff --git a/tests/integration-tests.sh b/tests/integration-tests.sh index b6f30ecc7..e1c5e4d2e 100755 --- a/tests/integration-tests.sh +++ b/tests/integration-tests.sh @@ -33,11 +33,11 @@ export PATH=${BUILDDIR}:${PATH} # Default values VERBOSE=0 FILTER='*' - -export NUM_SAMPLES=100 +NUM_SAMPLES=100 +TIMEOUT=1m # Parse command line arguments -while getopts ":f:v" OPT; do +while getopts ":f:l:t:v" OPT; do case ${OPT} in f) FILTER=${OPTARG} @@ -45,6 +45,12 @@ while getopts ":f:v" OPT; do v) VERBOSE=1 ;; + l) + NUM_SAMPLES=${OPTARG} + ;; + t) + TIMEOUT=${OPTARG} + ;; \?) echo "Invalid option: -${OPTARG}" >&2 ;; @@ -55,13 +61,18 @@ while getopts ":f:v" OPT; do esac done +export VERBOSE +export NUM_SAMPLES + TESTS=${SRCDIR}/tests/integration/${FILTER}.sh # Preperations mkdir -p ${LOGDIR} -NUM_PASS=0 -NUM_FAIL=0 +PASSED=0 +FAILED=0 +SKIPPED=0 +TIMEDOUT=0 # Preamble echo -e "Starting integration tests for VILLASnode/fpga:\n" @@ -71,32 +82,40 @@ for TEST in ${TESTS}; do # Run test if (( ${VERBOSE} == 0 )); then - ${TEST} &> ${LOGDIR}/${TESTNAME}.log + timeout ${TIMEOUT} ${TEST} &> ${LOGDIR}/${TESTNAME}.log else - ${TEST} + timeout ${TIMEOUT} ${TEST} fi - RC=$? case $RC in 0) echo -e "\e[32m[Pass] \e[39m ${TESTNAME}" - NUM_PASS=$((${NUM_PASS} + 1)) + PASSED=$((${PASSED} + 1)) ;; 99) echo -e "\e[93m[Skip] \e[39m ${TESTNAME}" - NUM_SKIP=$((${NUM_SKIP} + 1)) + SKIPPED=$((${SKIPPED} + 1)) + ;; + 124) + echo -e "\e[33m[Time] \e[39m ${TESTNAME}" + TIMEDOUT=$((${TIMEDOUT} + 1)) + FAILED=$((${FAILED} + 1)) ;; *) echo -e "\e[31m[Fail] \e[39m ${TESTNAME} with code $RC" - NUM_FAIL=$((${NUM_FAIL} + 1)) + FAILED=$((${FAILED} + 1)) ;; esac + + TOTAL=$((${TOTAL} + 1)) done # Show summary -if (( ${NUM_FAIL} > 0 )); then - echo -e "\nSummary: ${NUM_FAIL} of $((${NUM_FAIL} + ${NUM_PASS})) tests failed." +if (( ${FAILED} > 0 )); then + echo -e "\nSummary: ${FAILED} of ${TOTAL} tests failed." + echo -e " Timedout: ${TIMEDOUT}" + echo -e " Skipped: ${SKIPPED}" exit 1 else echo -e "\nSummary: all tests passed!" diff --git a/tests/integration/hook-shift_ts.sh b/tests/integration/hook-shift_ts.sh index 503d17da0..03aacf002 100755 --- a/tests/integration/hook-shift_ts.sh +++ b/tests/integration/hook-shift_ts.sh @@ -24,10 +24,12 @@ STATS_FILE=$(mktemp) +NUM_SAMPLES=${NUM_SAMPLES:-10} + OFFSET=-10 EPSILON=0.05 -villas-signal sine -l 10 -r 10 | villas-hook shift_ts offset=${OFFSET} | villas-hook stats format=\"json\" output=\"${STATS_FILE}\" > /dev/null +villas-signal random -l ${NUM_SAMPLES} -r 10 | villas-hook shift_ts offset=${OFFSET} | villas-hook stats format=\"json\" output=\"${STATS_FILE}\" > /dev/null jq .owd ${STATS_FILE} diff --git a/tests/integration/node-loopback-socket.sh b/tests/integration/node-loopback-socket.sh index 01472c547..a2ca9f70c 100755 --- a/tests/integration/node-loopback-socket.sh +++ b/tests/integration/node-loopback-socket.sh @@ -26,15 +26,7 @@ CONFIG_FILE=$(mktemp) INPUT_FILE=$(mktemp) OUTPUT_FILE=$(mktemp) -function prefix() { - case $1 in - node) P=$'\\\e[36mnode\\\e[39m: ' ;; - pipe) P=$'\\\e[93mpipe\\\e[39m: ' ;; - cmp) P=$'\\\e[35mcmp\\\e[39m: ' ;; - esac - - sed -e "s/^/$P/" -} +NUM_SAMPLES=${NUM_SAMPLES:-10} cat > ${CONFIG_FILE} < ${INPUT_FILE} +villas-signal random -l ${NUM_SAMPLES} -n > ${INPUT_FILE} # Start node -villas-node ${CONFIG_FILE} 2>&1 | prefix node & +villas-node ${CONFIG_FILE} & # Wait for node to complete init sleep 1 # Send / Receive data to node -(villas-pipe ${CONFIG_FILE} node2 > ${OUTPUT_FILE} < <(cat ${INPUT_FILE}; sleep 1; echo -n)) 2>&1 | prefix pipe +villas-pipe -l ${NUM_SAMPLES} ${CONFIG_FILE} node2 > ${OUTPUT_FILE} < ${INPUT_FILE} + +# Wait for node to handle samples +sleep 1 # Stop node kill %1 # Compare data -villas-test-cmp ${INPUT_FILE} ${OUTPUT_FILE} 2>&1 | prefix cmp -RC=${PIPESTATUS[0]} +villas-test-cmp ${INPUT_FILE} ${OUTPUT_FILE} +RC=$? rm ${CONFIG_FILE} ${INPUT_FILE} ${OUTPUT_FILE} diff --git a/tests/integration/pipe-file-advio.sh b/tests/integration/pipe-file-advio.sh index 75c177aa1..97b1885d7 100755 --- a/tests/integration/pipe-file-advio.sh +++ b/tests/integration/pipe-file-advio.sh @@ -26,6 +26,8 @@ CONFIG_FILE=$(mktemp) INPUT_FILE=$(mktemp) OUTPUT_FILE=$(mktemp) +NUM_SAMPLES=${NUM_SAMPLES:-10} + URI=https://1Nrd46fZX8HbggT:badpass@rwth-aachen.sciebo.de/public.php/webdav/node/tests/pipe cat > ${CONFIG_FILE} < ${INPUT_FILE} +# Delete old file +curl -X DELETE ${URI} + +villas-signal random -n -l ${NUM_SAMPLES} > ${INPUT_FILE} villas-pipe -s ${CONFIG_FILE} remote_file_out < ${INPUT_FILE} villas-pipe -r ${CONFIG_FILE} remote_file_in > ${OUTPUT_FILE} -villas-test-cmp -j ${INPUT_FILE} ${OUTPUT_FILE} +villas-test-cmp ${INPUT_FILE} ${OUTPUT_FILE} RC=$? rm -f ${CONFIG_FILE} ${INPUT_FILE} ${OUTPUT_FILE} diff --git a/tests/integration/pipe-loopback-file.sh b/tests/integration/pipe-loopback-file.sh index f2a1922e9..f8c63e752 100755 --- a/tests/integration/pipe-loopback-file.sh +++ b/tests/integration/pipe-loopback-file.sh @@ -27,6 +27,8 @@ INPUT_FILE=$(mktemp) OUTPUT_FILE=$(mktemp) NODE_FILE=$(mktemp) +NUM_SAMPLES=${NUM_SAMPLES:-10} + cat > ${CONFIG_FILE} << EOF nodes = { node1 = { @@ -42,16 +44,17 @@ nodes = { out = { uri = "${NODE_FILE}" mode = "w+" + flush = true /* we need to flush / upload the new samples continously for a loopback */ } } } EOF # Generate test data -villas-signal random -l 10 -n > ${INPUT_FILE} +villas-signal random -l ${NUM_SAMPLES} -n > ${INPUT_FILE} # We delay EOF of the INPUT_FILE by 1 second in order to wait for incoming data to be received -villas-pipe ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < <(cat ${INPUT_FILE}; sleep 0.5; echo -n) +villas-pipe -l ${NUM_SAMPLES} ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < ${INPUT_FILE} # Comapre data villas-test-cmp ${INPUT_FILE} ${OUTPUT_FILE} diff --git a/tests/integration/pipe-loopback-multicast.sh b/tests/integration/pipe-loopback-multicast.sh index 94ad637ee..91339e168 100755 --- a/tests/integration/pipe-loopback-multicast.sh +++ b/tests/integration/pipe-loopback-multicast.sh @@ -26,6 +26,8 @@ CONFIG_FILE=$(mktemp) INPUT_FILE=$(mktemp) OUTPUT_FILE=$(mktemp) +NUM_SAMPLES=${NUM_SAMPLES:-10} + cat > ${CONFIG_FILE} << EOF nodes = { node1 = { @@ -46,10 +48,10 @@ nodes = { EOF # Generate test data -villas-signal random -l 10 -n > ${INPUT_FILE} +villas-signal random -l ${NUM_SAMPLES} -n > ${INPUT_FILE} # We delay EOF of the INPUT_FILE by 1 second in order to wait for incoming data to be received -villas-pipe ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < <(sleep 0.5; cat ${INPUT_FILE}; sleep 0.5; echo -n) +villas-pipe -l ${NUM_SAMPLES} ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < ${INPUT_FILE} # Comapre data villas-test-cmp ${INPUT_FILE} ${OUTPUT_FILE} diff --git a/tests/integration/pipe-loopback-nanomsg.sh b/tests/integration/pipe-loopback-nanomsg.sh index 555ce2eb8..c63be12d1 100755 --- a/tests/integration/pipe-loopback-nanomsg.sh +++ b/tests/integration/pipe-loopback-nanomsg.sh @@ -26,6 +26,8 @@ CONFIG_FILE=$(mktemp) INPUT_FILE=$(mktemp) OUTPUT_FILE=$(mktemp) +NUM_SAMPLES=${NUM_SAMPLES:-10} + cat > ${CONFIG_FILE} << EOF nodes = { node1 = { @@ -38,10 +40,10 @@ nodes = { EOF # Generate test data -villas-signal random -l 10 -n > ${INPUT_FILE} +villas-signal random -l ${NUM_SAMPLES} -n > ${INPUT_FILE} # We delay EOF of the INPUT_FILE by 1 second in order to wait for incoming data to be received -villas-pipe ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < <(sleep 0.5; cat ${INPUT_FILE}; sleep 0.5; echo -n) +villas-pipe -l ${NUM_SAMPLES} ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < ${INPUT_FILE} cat ${INPUT_FILE} echo diff --git a/tests/integration/pipe-loopback-shmem.sh b/tests/integration/pipe-loopback-shmem.sh index 81db13082..d0cada19c 100755 --- a/tests/integration/pipe-loopback-shmem.sh +++ b/tests/integration/pipe-loopback-shmem.sh @@ -26,35 +26,41 @@ CONFIG_FILE=$(mktemp) INPUT_FILE=$(mktemp) OUTPUT_FILE=$(mktemp) +NUM_SAMPLES=${NUM_SAMPLES:-10} + +for SAMPLELEN in 1 10 100; do for POLLING in true false; do -for VECTORIZE in 1 5 20; do +for VECTORIZE in 1 5 25; do cat > ${CONFIG_FILE} << EOF +logging = { + level = 2 +} nodes = { node1 = { type = "shmem"; out_name = "/villas-test"; in_name = "/villas-test"; - samplelen = 4; - queuelen = 32; + samplelen = ${SAMPLELEN}; + queuelen = 1024, polling = ${POLLING}; - vectorize = ${VECTORIZE} + vectorize = ${VECTORIZE}; } } EOF # Generate test data -villas-signal random -l 20 -n > ${INPUT_FILE} +villas-signal random -l ${NUM_SAMPLES} -v ${SAMPLELEN} -n > ${INPUT_FILE} # We delay EOF of the INPUT_FILE by 1 second in order to wait for incoming data to be received -villas-pipe ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < <(cat ${INPUT_FILE}; sleep 1; echo -n) +villas-pipe -l ${NUM_SAMPLES} ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < ${INPUT_FILE} # Comapre data villas-test-cmp ${INPUT_FILE} ${OUTPUT_FILE} RC=$? if (( ${RC} != 0 )); then - echo "=========== Sub-test failed for: polling=${POLLING}, vecotrize=${VECTORIZE}" + echo "=========== Sub-test failed for: polling=${POLLING}, vectorize=${VECTORIZE}, samplelen=${SAMPLELEN}" cat ${CONFIG_FILE} echo cat ${INPUT_FILE} @@ -62,10 +68,10 @@ if (( ${RC} != 0 )); then cat ${OUTPUT_FILE} exit ${RC} else - echo "=========== Sub-test succeeded for: polling=${POLLING}, vecotrize=${VECTORIZE}" + echo "=========== Sub-test succeeded for: polling=${POLLING}, vectorize=${VECTORIZE}, samplelen=${SAMPLELEN}" fi -done; done +done; done; done rm ${OUTPUT_FILE} ${INPUT_FILE} ${CONFIG_FILE} diff --git a/tests/integration/pipe-loopback-socket.sh b/tests/integration/pipe-loopback-socket.sh index c68804314..2df6c163f 100755 --- a/tests/integration/pipe-loopback-socket.sh +++ b/tests/integration/pipe-loopback-socket.sh @@ -27,8 +27,10 @@ INPUT_FILE=$(mktemp) OUTPUT_FILE=$(mktemp) THEORIES=$(mktemp) +NUM_SAMPLES=${NUM_SAMPLES:-10} + # Generate test data -villas-signal random -l 10 -n > ${INPUT_FILE} +villas-signal random -l ${NUM_SAMPLES} -n > ${INPUT_FILE} for LAYER in udp ip eth; do for HEADER in none default; do @@ -72,7 +74,7 @@ nodes = { EOF # We delay EOF of the INPUT_FILE by 1 second in order to wait for incoming data to be received -villas-pipe ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < <(cat ${INPUT_FILE}; sleep 1; echo -n) +villas-pipe -l ${NUM_SAMPLES} ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < ${INPUT_FILE} # Compare data villas-test-cmp ${INPUT_FILE} ${OUTPUT_FILE} diff --git a/tests/integration/pipe-loopback-zeromq.sh b/tests/integration/pipe-loopback-zeromq.sh index 594b060bf..448077ae7 100755 --- a/tests/integration/pipe-loopback-zeromq.sh +++ b/tests/integration/pipe-loopback-zeromq.sh @@ -26,6 +26,8 @@ CONFIG_FILE=$(mktemp) INPUT_FILE=$(mktemp) OUTPUT_FILE=$(mktemp) +NUM_SAMPLES=${NUM_SAMPLES:-10} + cat > ${CONFIG_FILE} << EOF nodes = { node1 = { @@ -39,10 +41,10 @@ nodes = { EOF # Generate test data -villas-signal random -l 10 -n > ${INPUT_FILE} +villas-signal random -l ${NUM_SAMPLES} -n > ${INPUT_FILE} # We delay EOF of the INPUT_FILE by 1 second in order to wait for incoming data to be received -villas-pipe ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < <(sleep 0.5; cat ${INPUT_FILE}; sleep 0.5; echo -n) +villas-pipe -l ${NUM_SAMPLES} ${CONFIG_FILE} node1 > ${OUTPUT_FILE} < ${INPUT_FILE} # Comapre data villas-test-cmp ${INPUT_FILE} ${OUTPUT_FILE}