<p>osmith <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-dev/+/15778">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  neels: Looks good to me, approved
  osmith: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ttcn3: run ttcn3 testsuites from osmo-dev<br><br>Build testsuite, SUT and dependencies and run everything with one<br>command. Example usage:<br><br>$ ./ttcn3/ttcn3.sh msc<br><br>So far, it works at least with:<br>hlr, mgw, msc, pcu, pcu-sns, sgsn<br><br>Change-Id: I6b4bf2743adeec1a950d5f090a690182b991cf49<br>---<br>M .gitignore<br>M README<br>A ttcn3/ttcn3.opts<br>A ttcn3/ttcn3.sh<br>A ttcn3/wrappers/fake_trx.sh<br>A ttcn3/wrappers/osmo-bts-trx-respawn.sh<br>A ttcn3/wrappers/osmo-pcu-respawn.sh<br>7 files changed, 428 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/.gitignore b/.gitignore</span><br><span>index 1cfde3d..6326775 100644</span><br><span>--- a/.gitignore</span><br><span>+++ b/.gitignore</span><br><span>@@ -14,3 +14,6 @@</span><br><span> !net/config_2g3g</span><br><span> !net/README</span><br><span> !net/fill_config.py</span><br><span style="color: hsl(120, 100%, 40%);">+ttcn3/3G+2G_ttcn3.deps</span><br><span style="color: hsl(120, 100%, 40%);">+ttcn3/out/</span><br><span style="color: hsl(120, 100%, 40%);">+ttcn3/make/</span><br><span>diff --git a/README b/README</span><br><span>index 9533d89..055f651 100644</span><br><span>--- a/README</span><br><span>+++ b/README</span><br><span>@@ -132,6 +132,26 @@</span><br><span> Find other useful scripts in src/, see src/README.</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+=== ttcn3/ttcn3.sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Clone and build all dependencies, then run a given TTCN-3 testsuite and all</span><br><span style="color: hsl(120, 100%, 40%);">+required components. This is intended to make test-cycles as short as possible,</span><br><span style="color: hsl(120, 100%, 40%);">+without any manual configuration effort and without the need to rebuild the</span><br><span style="color: hsl(120, 100%, 40%);">+entire testsuite, SUT (subject under test, e.g. osmo-mgw) and dependencies from</span><br><span style="color: hsl(120, 100%, 40%);">+scratch for each code change. Instead, ttcn3.sh will make use of osmo-dev's</span><br><span style="color: hsl(120, 100%, 40%);">+generated global makefile and only build what actually changed.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Example usage:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ./ttcn3/ttcn3.sh mgw</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Note that not all testsuites are supported at this point, see the output of</span><br><span style="color: hsl(120, 100%, 40%);">+ttcn3.sh without any argument for more information.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+More about the testsuites:</span><br><span style="color: hsl(120, 100%, 40%);">+https://osmocom.org/projects/cellular-infrastructure/wiki/Titan_TTCN3_Testsuites</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> === Troubleshooting</span><br><span> </span><br><span> When using sanitize.opts, osmo-trx is not built with the address sanitizer</span><br><span>diff --git a/ttcn3/ttcn3.opts b/ttcn3/ttcn3.opts</span><br><span>new file mode 100644</span><br><span>index 0000000..8acec2d</span><br><span>--- /dev/null</span><br><span>+++ b/ttcn3/ttcn3.opts</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-bts --enable-trx</span><br><span>diff --git a/ttcn3/ttcn3.sh b/ttcn3/ttcn3.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..4cb4344</span><br><span>--- /dev/null</span><br><span>+++ b/ttcn3/ttcn3.sh</span><br><span>@@ -0,0 +1,369 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh -e</span><br><span style="color: hsl(120, 100%, 40%);">+PROJECT="$1"</span><br><span style="color: hsl(120, 100%, 40%);">+PROJECT_UPPER="$(echo "$PROJECT" | tr '[:lower:]' '[:upper:]')"</span><br><span style="color: hsl(120, 100%, 40%);">+DIR_OSMODEV="$(readlink -f "$(dirname $0)/..")"</span><br><span style="color: hsl(120, 100%, 40%);">+DIR_MAKE="${DIR_MAKE:-${DIR_OSMODEV}/ttcn3/make}"</span><br><span style="color: hsl(120, 100%, 40%);">+DIR_OUTPUT="${DIR_OUTPUT:-${DIR_OSMODEV}/ttcn3/out}"</span><br><span style="color: hsl(120, 100%, 40%);">+JOBS="${JOBS:-9}"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+check_usage() {</span><br><span style="color: hsl(120, 100%, 40%);">+        if [ -z "$PROJECT" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "usage: $(basename $0) PROJECT"</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "example: $(basename $0) hlr"</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "known working projects: hlr, mgw, msc, pcu, pcu-sns, sgsn"</span><br><span style="color: hsl(120, 100%, 40%);">+            echo "wip: bts, bts-oml"</span><br><span style="color: hsl(120, 100%, 40%);">+            echo ""</span><br><span style="color: hsl(120, 100%, 40%);">+             echo "notes (see docker-playground.git/ttcn3-*/jenkins.sh):"</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "- bts: classic test suite with BSC for OML and trxcon+fake_trx"</span><br><span style="color: hsl(120, 100%, 40%);">+               echo "- bts-oml: OML tests (without BSC)"</span><br><span style="color: hsl(120, 100%, 40%);">+           exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Returns the name of the testsuite binary</span><br><span style="color: hsl(120, 100%, 40%);">+get_testsuite_name() {</span><br><span style="color: hsl(120, 100%, 40%);">+   case "$PROJECT" in</span><br><span style="color: hsl(120, 100%, 40%);">+          bts-*) echo "BTS_Tests" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+          mgw) echo "MGCP_Test" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+            pcu-sns) echo "PCU_Tests" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                *) echo "${PROJECT_UPPER}_Tests" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+ esac</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+get_testsuite_dir() {</span><br><span style="color: hsl(120, 100%, 40%);">+      local hacks="${DIR_OSMODEV}/src/osmo-ttcn3-hacks"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ case "$PROJECT" in</span><br><span style="color: hsl(120, 100%, 40%);">+          bts-*) echo "$hacks/bts" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+         pcu-sns) echo "$hacks/pcu" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+               *) echo "$hacks/$PROJECT" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+        esac</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+get_testsuite_config() {</span><br><span style="color: hsl(120, 100%, 40%);">+   case "$PROJECT" in</span><br><span style="color: hsl(120, 100%, 40%);">+          bts-gprs) echo "BTS_Tests_GPRS.cfg" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+              bts-oml) echo "BTS_Tests_OML.cfg" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                pcu-sns) echo "PCU_Tests_SNS.cfg" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                *) echo "$(get_testsuite_name).cfg" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+      esac</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Programs that need to be built, launched and killed. To add programs to only one of the steps, modify the appropriate</span><br><span style="color: hsl(120, 100%, 40%);">+# function below (build_osmo_programs, run_osmo_programs, kill_osmo_programs).</span><br><span style="color: hsl(120, 100%, 40%);">+get_programs() {</span><br><span style="color: hsl(120, 100%, 40%);">+  case "$PROJECT" in</span><br><span style="color: hsl(120, 100%, 40%);">+          bsc) echo "osmo-stp osmo-bsc osmo-bts-omldummy" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+          bts) echo "osmo-bsc osmo-bts-trx fake_trx.py trxcon" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+             msc) echo "osmo-stp osmo-msc" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+            pcu-sns) echo "osmo-pcu" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+         pcu) echo "osmo-pcu osmo-bsc osmo-bts-virtual virtphy" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+           sgsn) echo "osmo-stp osmo-sgsn" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+          *) echo "osmo-$PROJECT" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+  esac</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# $1: program name</span><br><span style="color: hsl(120, 100%, 40%);">+get_program_config() {</span><br><span style="color: hsl(120, 100%, 40%);">+ case "$1" in</span><br><span style="color: hsl(120, 100%, 40%);">+                fake_trx.py) ;; # no config</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo-bts-*) echo "osmo-bts.cfg" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo-pcu)</span><br><span style="color: hsl(120, 100%, 40%);">+                     if [ "$PROJECT" = "pcu-sns" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                               echo "osmo-pcu-sns.cfg"</span><br><span style="color: hsl(120, 100%, 40%);">+                     else</span><br><span style="color: hsl(120, 100%, 40%);">+                          echo "osmo-pcu.cfg"</span><br><span style="color: hsl(120, 100%, 40%);">+                 fi</span><br><span style="color: hsl(120, 100%, 40%);">+                    ;;</span><br><span style="color: hsl(120, 100%, 40%);">+            trxcon) ;; # no config</span><br><span style="color: hsl(120, 100%, 40%);">+                virtphy) ;; # no config</span><br><span style="color: hsl(120, 100%, 40%);">+               *) echo "$1.cfg" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+ esac</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Return the git repository name, which has the source for a specific program.</span><br><span style="color: hsl(120, 100%, 40%);">+# $1: program name</span><br><span style="color: hsl(120, 100%, 40%);">+get_program_repo() {</span><br><span style="color: hsl(120, 100%, 40%);">+   case "$1" in</span><br><span style="color: hsl(120, 100%, 40%);">+                fake_trx.py) echo "osmocom-bb" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo-bts-*) echo "osmo-bts" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo-stp) echo "libosmo-sccp" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+            trxcon) echo "osmocom-bb" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                virtphy) echo "osmocom-bb" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+               *) echo "$1" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+     esac</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+check_ttcn3_install() {</span><br><span style="color: hsl(120, 100%, 40%);">+    if ! command -v ttcn3_compiler > /dev/null; then</span><br><span style="color: hsl(120, 100%, 40%);">+           echo "ERROR: ttcn3_compiler is not installed."</span><br><span style="color: hsl(120, 100%, 40%);">+              echo "Install eclipse-titan from the Osmocom latest repository."</span><br><span style="color: hsl(120, 100%, 40%);">+            echo "Details: https://osmocom.org/projects/cellular-infrastructure/wiki/Titan_TTCN3_Testsuites"</span><br><span style="color: hsl(120, 100%, 40%);">+            exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+kill_osmo_programs() {</span><br><span style="color: hsl(120, 100%, 40%);">+       programs="$(get_programs)"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Kill wrappers first</span><br><span style="color: hsl(120, 100%, 40%);">+ for program in $programs; do</span><br><span style="color: hsl(120, 100%, 40%);">+          case "$program" in</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo-pcu) killall osmo-pcu-respawn.sh || true ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo-bts-trx) killall osmo-bts-trx-respawn.sh || true ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                      fake_trx.py) killall fake_trx.sh || true ;;</span><br><span style="color: hsl(120, 100%, 40%);">+           esac</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        killall $programs || true</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+setup_dir_make() {</span><br><span style="color: hsl(120, 100%, 40%);">+    cd "$DIR_OSMODEV"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ( echo "# Generated by ttcn3.sh, do not edit"</span><br><span style="color: hsl(120, 100%, 40%);">+         cat ./3G+2G.deps</span><br><span style="color: hsl(120, 100%, 40%);">+      echo</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "osmo-bts   libosmocore libosmo-abis"</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "osmo-pcu   libosmocore"</span><br><span style="color: hsl(120, 100%, 40%);">+       # just clone these, building is handled by ttcn3.sh</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "osmo-ttcn3-hacks"</span><br><span style="color: hsl(120, 100%, 40%);">+      echo "osmocom-bb") > ttcn3/3G+2G_ttcn3.deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ./gen_makefile.py ttcn3/3G+2G_ttcn3.deps default.opts iu.opts no_systemd.opts ttcn3/ttcn3.opts -I -m "$DIR_MAKE"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# $1: name of repository (e.g. osmo-ttcn3-hacks)</span><br><span style="color: hsl(120, 100%, 40%);">+clone_repo() {</span><br><span style="color: hsl(120, 100%, 40%);">+     make -C "$DIR_MAKE" ".make.${1}.clone"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Require testsuite dir, with testsuite and all program configs</span><br><span style="color: hsl(120, 100%, 40%);">+check_dir_testsuite() {</span><br><span style="color: hsl(120, 100%, 40%);">+     local program</span><br><span style="color: hsl(120, 100%, 40%);">+ local config_testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+        local dir_testsuite="$(get_testsuite_dir)"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if ! [ -d "$dir_testsuite" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "ERROR: project '$PROJECT' is invalid, resulting path not found: $dir_testsuite"</span><br><span style="color: hsl(120, 100%, 40%);">+               exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for program in $(get_programs); do</span><br><span style="color: hsl(120, 100%, 40%);">+            local config="$(get_program_config "$program")"</span><br><span style="color: hsl(120, 100%, 40%);">+           if [ -z "$config" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue</span><br><span style="color: hsl(120, 100%, 40%);">+              fi</span><br><span style="color: hsl(120, 100%, 40%);">+            config="$dir_testsuite/$config"</span><br><span style="color: hsl(120, 100%, 40%);">+             if ! [ -e "$config" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                 echo "ERROR: config not found: $config"</span><br><span style="color: hsl(120, 100%, 40%);">+                     echo "Copy it from docker-playground.git, and change IPs to 127.0.0.*."</span><br><span style="color: hsl(120, 100%, 40%);">+                     echo "Make sure that everything works, then submit a patch with the config."</span><br><span style="color: hsl(120, 100%, 40%);">+                        echo "If $program's config has a different name or is not needed at all, edit"</span><br><span style="color: hsl(120, 100%, 40%);">+                  echo "get_program_config() in ttcn3.sh."</span><br><span style="color: hsl(120, 100%, 40%);">+                    exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+                fi</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        config_testsuite="$dir_testsuite/$(get_testsuite_config)"</span><br><span style="color: hsl(120, 100%, 40%);">+   if ! [ -e "$config_testsuite" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+               echo "ERROR: testsuite config not found: $config_testsuite"</span><br><span style="color: hsl(120, 100%, 40%);">+         echo "Copy it from docker-playground.git, change the paths to be relative and submit it as patch."</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "If $program's testsuite has a different name, edit get_testsuite_name() in ttcn3.sh."</span><br><span style="color: hsl(120, 100%, 40%);">+             exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Build a program that is in the subdir of a repository (e.g. trxcon in osmocom-bb.git).</span><br><span style="color: hsl(120, 100%, 40%);">+# $1: repository</span><br><span style="color: hsl(120, 100%, 40%);">+# $2: path in the repository</span><br><span style="color: hsl(120, 100%, 40%);">+build_osmo_program_subdir() {</span><br><span style="color: hsl(120, 100%, 40%);">+      clone_repo "$1"</span><br><span style="color: hsl(120, 100%, 40%);">+     cd "$DIR_OSMODEV/src/$1/$2"</span><br><span style="color: hsl(120, 100%, 40%);">+ if ! [ -e "./configure" ] && [ -e "configure.ac" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+          autoreconf -fi</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+    if ! [ -e "Makefile" ] && [ -e "Makefile.am" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+              ./configure</span><br><span style="color: hsl(120, 100%, 40%);">+   fi</span><br><span style="color: hsl(120, 100%, 40%);">+    make -j"$JOBS"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Use osmo-dev to build a typical Osmocom program, and run a few sanity checks.</span><br><span style="color: hsl(120, 100%, 40%);">+# $1 program</span><br><span style="color: hsl(120, 100%, 40%);">+build_osmo_program_osmodev() {</span><br><span style="color: hsl(120, 100%, 40%);">+  local repo="$(get_program_repo "$program")"</span><br><span style="color: hsl(120, 100%, 40%);">+       make -C "$DIR_MAKE" "$repo"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     local path="$(command -v "$program")"</span><br><span style="color: hsl(120, 100%, 40%);">+     if [ -z "$path" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+             echo "ERROR: program was not installed to PATH: $program"</span><br><span style="color: hsl(120, 100%, 40%);">+           echo "Maybe you need to add /usr/local/bin to PATH?"</span><br><span style="color: hsl(120, 100%, 40%);">+                exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  local pathdir="$(dirname "$path")"</span><br><span style="color: hsl(120, 100%, 40%);">+        local reference="$DIR_MAKE/.make.$repo.build"</span><br><span style="color: hsl(120, 100%, 40%);">+       if [ -z "$(find "$pathdir" -name "$program" -newer "$reference")" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+             echo "ERROR: $path is outdated!"</span><br><span style="color: hsl(120, 100%, 40%);">+            echo "Maybe you need to pass a configure argument to $repo.git, so it builds and installs $program?"</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "Or the order in PATH is wrong?"</span><br><span style="color: hsl(120, 100%, 40%);">+               exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Use osmo-dev to build one Osmocom program and its dependencies</span><br><span style="color: hsl(120, 100%, 40%);">+build_osmo_programs() {</span><br><span style="color: hsl(120, 100%, 40%);">+    local program</span><br><span style="color: hsl(120, 100%, 40%);">+ for program in $(get_programs); do</span><br><span style="color: hsl(120, 100%, 40%);">+            case "$program" in</span><br><span style="color: hsl(120, 100%, 40%);">+                  fake_trx.py) clone_repo "osmocom-bb" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                     trxcon) build_osmo_program_subdir "osmocom-bb" "src/host/trxcon" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                       virtphy) build_osmo_program_subdir "osmocom-bb" "src/host/virt_phy" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                    *) build_osmo_program_osmodev "$program" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+         esac</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+build_testsuite() {</span><br><span style="color: hsl(120, 100%, 40%);">+        cd "$(get_testsuite_dir)"</span><br><span style="color: hsl(120, 100%, 40%);">+   ./gen_links.sh</span><br><span style="color: hsl(120, 100%, 40%);">+        ./regen_makefile.sh</span><br><span style="color: hsl(120, 100%, 40%);">+   make compile</span><br><span style="color: hsl(120, 100%, 40%);">+  make -j"$JOBS"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+remove_old_logs() {</span><br><span style="color: hsl(120, 100%, 40%);">+    cd "$(get_testsuite_dir)"</span><br><span style="color: hsl(120, 100%, 40%);">+   rm *.log *.merged 2> /dev/null || true</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+prepare_dir_output() {</span><br><span style="color: hsl(120, 100%, 40%);">+        local program</span><br><span style="color: hsl(120, 100%, 40%);">+ local dir_testsuite="$(get_testsuite_dir)"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        rm -r "$DIR_OUTPUT"/* 2> /dev/null || true</span><br><span style="color: hsl(120, 100%, 40%);">+       mkdir -p "$DIR_OUTPUT"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for program in $(get_programs); do</span><br><span style="color: hsl(120, 100%, 40%);">+            local config="$(get_program_config "$program")"</span><br><span style="color: hsl(120, 100%, 40%);">+           if [ -n "$config" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                   cp "$dir_testsuite/$config" "$DIR_OUTPUT"</span><br><span style="color: hsl(120, 100%, 40%);">+         fi</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# $1: log name</span><br><span style="color: hsl(120, 100%, 40%);">+# $2: command to run</span><br><span style="color: hsl(120, 100%, 40%);">+run_osmo_program() {</span><br><span style="color: hsl(120, 100%, 40%);">+ local pid</span><br><span style="color: hsl(120, 100%, 40%);">+     local log="$1"</span><br><span style="color: hsl(120, 100%, 40%);">+      shift</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       echo "Starting ($log): $@"</span><br><span style="color: hsl(120, 100%, 40%);">+  "$@" > "$log" 2>&1 &</span><br><span style="color: hsl(120, 100%, 40%);">+        pid="$!"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  sleep 0.5</span><br><span style="color: hsl(120, 100%, 40%);">+     if ! kill -0 "$pid" 2> /dev/null; then</span><br><span style="color: hsl(120, 100%, 40%);">+           echo "ERROR: failed to start: $@"</span><br><span style="color: hsl(120, 100%, 40%);">+           cat "$log"</span><br><span style="color: hsl(120, 100%, 40%);">+          exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+run_osmo_programs() {</span><br><span style="color: hsl(120, 100%, 40%);">+        local program</span><br><span style="color: hsl(120, 100%, 40%);">+ local osmocom_bb="$DIR_OSMODEV/src/osmocom-bb"</span><br><span style="color: hsl(120, 100%, 40%);">+      local wrappers="$DIR_OSMODEV/ttcn3/wrappers"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      cd "$DIR_OUTPUT"</span><br><span style="color: hsl(120, 100%, 40%);">+    for program in $(get_programs); do</span><br><span style="color: hsl(120, 100%, 40%);">+            case "$program" in</span><br><span style="color: hsl(120, 100%, 40%);">+                  fake_trx.py)</span><br><span style="color: hsl(120, 100%, 40%);">+                          run_osmo_program "fake_trx.log" \</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "$wrappers/fake_trx.sh" \</span><br><span style="color: hsl(120, 100%, 40%);">+                                   --log-level DEBUG \</span><br><span style="color: hsl(120, 100%, 40%);">+                                   -b 127.0.0.21 \</span><br><span style="color: hsl(120, 100%, 40%);">+                                       -R 127.0.0.20 \</span><br><span style="color: hsl(120, 100%, 40%);">+                                       -r 127.0.0.22</span><br><span style="color: hsl(120, 100%, 40%);">+                         ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo-bts-omldummy)</span><br><span style="color: hsl(120, 100%, 40%);">+                            for i in $(seq 0 2); do</span><br><span style="color: hsl(120, 100%, 40%);">+                                       run_osmo_program "osmo-bts-$i.log" osmo-bts-omldummy 127.0.0.1 $((i + 1234)) 1</span><br><span style="color: hsl(120, 100%, 40%);">+                              done</span><br><span style="color: hsl(120, 100%, 40%);">+                          ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo-bts-trx)</span><br><span style="color: hsl(120, 100%, 40%);">+                         run_osmo_program "$program.log" \</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "$wrappers/osmo-bts-trx-respawn.sh" -i 127.0.0.10</span><br><span style="color: hsl(120, 100%, 40%);">+                           ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo-pcu)</span><br><span style="color: hsl(120, 100%, 40%);">+                             run_osmo_program "$program.log" "$wrappers/osmo-pcu-respawn.sh" \</span><br><span style="color: hsl(120, 100%, 40%);">+                                 -c "$(get_program_config osmo-pcu)"</span><br><span style="color: hsl(120, 100%, 40%);">+                         ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                    trxcon)</span><br><span style="color: hsl(120, 100%, 40%);">+                               run_osmo_program "$program.log" \</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "$osmocom_bb/src/host/trxcon/trxcon" \</span><br><span style="color: hsl(120, 100%, 40%);">+                                      trxcon -i 127.0.0.21 \</span><br><span style="color: hsl(120, 100%, 40%);">+                                                -s /tmp/osmocom_l2</span><br><span style="color: hsl(120, 100%, 40%);">+                            ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                    virtphy)</span><br><span style="color: hsl(120, 100%, 40%);">+                              run_osmo_program "$program.log" "$osmocom_bb/src/host/virt_phy/src/virtphy" \</span><br><span style="color: hsl(120, 100%, 40%);">+                                     -s /tmp/osmocom_l2</span><br><span style="color: hsl(120, 100%, 40%);">+                            ;;</span><br><span style="color: hsl(120, 100%, 40%);">+                    *)</span><br><span style="color: hsl(120, 100%, 40%);">+                            run_osmo_program "$program.log" "$program"</span><br><span style="color: hsl(120, 100%, 40%);">+                                ;;</span><br><span style="color: hsl(120, 100%, 40%);">+            esac</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+run_testsuite() {</span><br><span style="color: hsl(120, 100%, 40%);">+  local testsuite="$(get_testsuite_name)"</span><br><span style="color: hsl(120, 100%, 40%);">+     local cfg="$(get_testsuite_config)"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       cd "$(get_testsuite_dir)"</span><br><span style="color: hsl(120, 100%, 40%);">+   ../start-testsuite.sh "$testsuite" "$cfg" 2>&1 | tee "$DIR_OUTPUT/ttcn3_stdout.log"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+collect_logs() {</span><br><span style="color: hsl(120, 100%, 40%);">+       # Merge and move logs</span><br><span style="color: hsl(120, 100%, 40%);">+ cd "$(get_testsuite_dir)"</span><br><span style="color: hsl(120, 100%, 40%);">+   ../log_merge.sh $(get_testsuite_name) --rm</span><br><span style="color: hsl(120, 100%, 40%);">+    if ! mv *.merged "$DIR_OUTPUT"; then</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "---"</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "ERROR: no logs generated! Invalid test names in $(get_testsuite_config)?"</span><br><span style="color: hsl(120, 100%, 40%);">+             echo "---"</span><br><span style="color: hsl(120, 100%, 40%);">+          exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Format logs</span><br><span style="color: hsl(120, 100%, 40%);">+ cd "$DIR_OUTPUT"</span><br><span style="color: hsl(120, 100%, 40%);">+    for log in *.merged; do</span><br><span style="color: hsl(120, 100%, 40%);">+               ttcn3_logformat -o "${log}.log" "$log"</span><br><span style="color: hsl(120, 100%, 40%);">+            rm "$log"</span><br><span style="color: hsl(120, 100%, 40%);">+   done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Print log path</span><br><span style="color: hsl(120, 100%, 40%);">+      echo "---"</span><br><span style="color: hsl(120, 100%, 40%);">+  echo "Logs: $DIR_OUTPUT"</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "---"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Tell glibc to print segfault output to stderr (OS#4212)</span><br><span style="color: hsl(120, 100%, 40%);">+export LIBC_FATAL_STDERR_=1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+check_usage</span><br><span style="color: hsl(120, 100%, 40%);">+kill_osmo_programs</span><br><span style="color: hsl(120, 100%, 40%);">+check_ttcn3_install</span><br><span style="color: hsl(120, 100%, 40%);">+setup_dir_make</span><br><span style="color: hsl(120, 100%, 40%);">+clone_repo "osmo-ttcn3-hacks"</span><br><span style="color: hsl(120, 100%, 40%);">+check_dir_testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+build_osmo_programs</span><br><span style="color: hsl(120, 100%, 40%);">+build_testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+remove_old_logs</span><br><span style="color: hsl(120, 100%, 40%);">+prepare_dir_output</span><br><span style="color: hsl(120, 100%, 40%);">+run_osmo_programs</span><br><span style="color: hsl(120, 100%, 40%);">+run_testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+kill_osmo_programs</span><br><span style="color: hsl(120, 100%, 40%);">+collect_logs</span><br><span>diff --git a/ttcn3/wrappers/fake_trx.sh b/ttcn3/wrappers/fake_trx.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..1d39573</span><br><span>--- /dev/null</span><br><span>+++ b/ttcn3/wrappers/fake_trx.sh</span><br><span>@@ -0,0 +1,23 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh -x</span><br><span style="color: hsl(120, 100%, 40%);">+# Run in a separate script, so we can kill it with "killall"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR="$(readlink -f "$(dirname $0)")"</span><br><span style="color: hsl(120, 100%, 40%);">+cd "$DIR"</span><br><span style="color: hsl(120, 100%, 40%);">+PID=""</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cleanup() {</span><br><span style="color: hsl(120, 100%, 40%);">+   echo "Caught signal, cleaning up..."</span><br><span style="color: hsl(120, 100%, 40%);">+        set -x</span><br><span style="color: hsl(120, 100%, 40%);">+        kill "$PID"</span><br><span style="color: hsl(120, 100%, 40%);">+ exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+trap cleanup "TERM"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+./osmocom-bb/src/target/trx_toolkit/fake_trx.py "$@" &</span><br><span style="color: hsl(120, 100%, 40%);">+PID="$!"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+set +x</span><br><span style="color: hsl(120, 100%, 40%);">+while true; do</span><br><span style="color: hsl(120, 100%, 40%);">+      sleep 0.1</span><br><span style="color: hsl(120, 100%, 40%);">+done</span><br><span>diff --git a/ttcn3/wrappers/osmo-bts-trx-respawn.sh b/ttcn3/wrappers/osmo-bts-trx-respawn.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..475f807</span><br><span>--- /dev/null</span><br><span>+++ b/ttcn3/wrappers/osmo-bts-trx-respawn.sh</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh -x</span><br><span style="color: hsl(120, 100%, 40%);">+# Automatically restart osmo-bts-trx while running TTCN3 tests. See docker-playground.git.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+while true; do</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo-bts-trx "$@"</span><br><span style="color: hsl(120, 100%, 40%);">+done</span><br><span>diff --git a/ttcn3/wrappers/osmo-pcu-respawn.sh b/ttcn3/wrappers/osmo-pcu-respawn.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..3ff7213</span><br><span>--- /dev/null</span><br><span>+++ b/ttcn3/wrappers/osmo-pcu-respawn.sh</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh -x</span><br><span style="color: hsl(120, 100%, 40%);">+# Automatically restart osmo-pcu while running TTCN3 tests. See docker-playground.git's osmo-pcu-master/respawn.sh.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+while true; do</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo-pcu "$@"</span><br><span style="color: hsl(120, 100%, 40%);">+done</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-dev/+/15778">change 15778</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-dev/+/15778"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-dev </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6b4bf2743adeec1a950d5f090a690182b991cf49 </div>
<div style="display:none"> Gerrit-Change-Number: 15778 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>