#!/usr/bin/env bash
# ==========================================================================
#         _   _      _   ____            __ __  __      _
#        | \ | | ___| |_|  _ \ ___ _ __ / _|  \/  | ___| |_ ___ _ __
#        |  \| |/ _ \ __| |_) / _ \ '__| |_| |\/| |/ _ \ __/ _ \ '__|
#        | |\  |  __/ |_|  __/  __/ |  |  _| |  | |  __/ ||  __/ |
#        |_| \_|\___|\__|_|   \___|_|  |_| |_|  |_|\___|\__\___|_|
#
#                  NetPerfMeter -- Network Performance Meter
#                 Copyright (C) 2009-2026 by Thomas Dreibholz
# ==========================================================================
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact:  dreibh@simula.no
# Homepage: https://www.nntb.no/~dreibh/netperfmeter/

# Bash options:
set -eu

# ====== Handle arguments ===================================================
if [ $# -lt 2 ] ; then
   echo >&2 "Usage: $0 server:port [processes]"
   exit 1
fi
SERVER="$(echo "$1" | sed -s 's/:.*$//g')"
PORT="$(echo "$1" | sed -s 's/^.*://g')"
if [[ ! "${PORT}" =~ ^[0-9]+$ ]] ; then
   echo >&2 "ERROR: Invalid port ${PORT}!"
   exit 1
fi

if [ "$2" != "" ] ; then
   procs="$2"
else
   procs=16
fi

RUNTIME=5
SLEEP=3

mkdir -p stresstest-output
rm -f stresstest-output/*
(
n=0
while true ; do

   # ====== Test #1 =========================================================
   n=$((n+1))
   label="$(printf "S%08u" "${n}")"
   echo "\
random-sleep 0 ${SLEEP} && ./netperfmeter ${SERVER}:${PORT} \
-control-over-tcp \
-config=stresstest-output/${label}.config \
-vector=stresstest-output/${label}.vec.bz2 \
-scalar=stresstest-output/${label}.sca.bz2 \
-logfile=stresstest-output/${label}.log \
-loglevel=0 \
-udp const10:const1400:const10:const1400 \
-runtime=${RUNTIME}"

# -tcp const80:const10000:const80:const10000 \
# -sctp const20:const10000:const20:const10000 const20:const10000:const20:const10000 \
# -dccp const80:const1400:const80:const1400 \

done
) | parallel -j"${procs}"
