handover_test: implement as VTY shell

Drop the string arrays, and move the 32 handover tests to separate
script files. Instead of the peculiar implementation and instead of
cryptic commands, implement the handover test scripts as a VTY.

handover_test.c now sets up a VTY with handover testing VTY commands. It
also features the complete and unabridged VTY configuration nodes of
osmo-bsc itself. That allows dropping various ho script commands.

Before:

  static char *test_case_14[] = {
      "Handover to congested cell, if RX level is below minimum\n\n"
      "The better neighbor cell is congested, so no handover is performed.\n"
      "If the RX level of the current cell drops below minimum acceptable\n"
      "level, the handover is performed.\n",

      "create-n-bts", "2",
      "create-ms", "0", "TCH/F", "AMR",
      "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",
      "set-min-free", "1", "TCH/F", "4",
      "set-min-free", "1", "TCH/H", "4",
      "meas-rep", "0","0","1","0", "10","0", "1","0","30",
      "expect-no-chan",
      "meas-rep", "0","0","1","0", "9","0", "1","0","30",
      "expect-chan", "1", "1",
      "ack-chan",
      "expect-ho", "0", "1",
      "ho-complete",
      "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",
      "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",
  }

After:

  # Handover to congested cell, if RX level is below minimum
  # The better neighbor cell is congested, so no handover is performed.
  # If the RX level of the current cell drops below minimum acceptable
  # level, the handover is performed.

  create-n-bts 2
  set-ts-use trx 0 0 states * TCH/F - - - - - -
  network
   bts 1
    handover2 min-free-slots tch/f 4
    handover2 min-free-slots tch/h 4
  meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 30
  expect-no-chan
  meas-rep lchan 0 0 1 0 rxlev 9 rxqual 0 ta 0 neighbors 30
  expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
  expect-ts-use trx 0 0 states * - - - - - - -
  expect-ts-use trx 1 0 states * TCH/F - - - - - -

Note how osmo-bsc's stock vty config nodes seamlessly integrate in the
test steps: just enter a configuration node, modify some values, and
indenting trivially takes care of exiting nodes correctly.

Running a test manually:
	./handover_test test_0123.ho_vty

Instead of calling each test separately in testsuite.at, have a
handover_tests.sh script that picks up new tests just by presence of
files named test*.ho_vty.

Rationale:

It was considered to move handover tests to the TTCN suite, but there is
an advantage in having these C tests: they run super fast and catch bugs
even in the gerrit verification job, potentially saving a lot of time.

It is a reality that I need more of these tests, for dynamic timeslots
and TCH/F <-> TCH/H switches. The way the handover tests are written, as
arrays of strings containing cryptic fixed-argument script commands, has
been a pain to work with from the start, and now I am no longer willing
to endure that pain.

Change-Id: Ie238ebe41039d3fa44c9699937589e000883e052
This commit is contained in:
Neels Hofmeyr 2020-11-18 16:25:55 +01:00 committed by neels
parent 53866d3bf7
commit 1a3eaeff2e
39 changed files with 1419 additions and 1746 deletions

View File

@ -21,7 +21,9 @@ AM_LDFLAGS = \
$(NULL)
EXTRA_DIST = \
handover_test.ok \
handover_tests.sh \
handover_tests.ok \
$(srcdir)/test*.ho_vty \
neighbor_ident_test.ok \
neighbor_ident_test.err \
$(NULL)
@ -130,3 +132,4 @@ neighbor_ident_test_LDADD = \
.PHONY: update_exp
update_exp:
$(builddir)/neighbor_ident_test >$(srcdir)/neighbor_ident_test.ok 2>$(srcdir)/neighbor_ident_test.err
$(srcdir)/handover_tests.sh $(srcdir) $(builddir) -u

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
Test OK

View File

@ -0,0 +1,33 @@
pass test0000.ho_vty
pass test0001.ho_vty
pass test0002.ho_vty
pass test0003.ho_vty
pass test0004.ho_vty
pass test0005.ho_vty
pass test0006.ho_vty
pass test0007.ho_vty
pass test0008.ho_vty
pass test0009.ho_vty
pass test0010.ho_vty
pass test0011.ho_vty
pass test0012.ho_vty
pass test0013.ho_vty
pass test0014.ho_vty
pass test0015.ho_vty
pass test0016.ho_vty
pass test0017.ho_vty
pass test0018.ho_vty
pass test0019.ho_vty
pass test0020.ho_vty
pass test0021.ho_vty
pass test0022.ho_vty
pass test0023.ho_vty
pass test0024.ho_vty
pass test0025.ho_vty
pass test0026.ho_vty
pass test0027.ho_vty
pass test0028.ho_vty
pass test0029.ho_vty
pass test0030.ho_vty
pass test0031.ho_vty
pass test0032.ho_vty

View File

@ -0,0 +1,68 @@
#!/bin/sh
set -e
tests_dir="${1:-.}"
build_dir="${2:-.}"
update="$3"
test -d "$tests_dir"
test -d "$build_dir"
if [ -n "$update" -a "x$update" != "x-u" ]; then
echo "unknown argument: $update"
exit 1
fi
one_test() {
test_path="$1"
test_name="$(basename "$test_path")"
got_out="$(mktemp "tmp.$test_name.stdout.XXXXX")"
got_err="$(mktemp "tmp.$test_name.stderr.XXXXX")"
set +e
"$build_dir"/handover_test "$test_path" > "$got_out" 2> "$got_err"
rc=$?
if [ "x$rc" = "x0" ]; then
expect_out="$test_path.ok"
expect_err="$test_path.err"
if [ "x$update" = "x-u" ]; then
cp "$got_out" "$expect_out"
cp "$got_err" "$expect_err"
else
if [ -f "$expect_out" ]; then
diff -u "$expect_out" "$got_out"
rc=$?
fi
if [ -f "$expect_err" ]; then
diff -u "$expect_err" "$got_err"
rc2=$?
fi
if [ "x$rc" = "x0" ]; then
rc=$rc2
fi
fi
fi
rm "$got_out"
rm "$got_err"
set -e
return $rc
}
results="$(mktemp "tmp.handover_test_results.XXXXX")"
for test_path in "$tests_dir"/test*.ho_vty ; do
test_name="$(basename "$test_path")"
if one_test "$test_path"; then
echo "pass $test_name" >> "$results"
else
echo "FAIL $test_name" >> "$results"
fi
done
set +e
cat "$results"
failed="$(grep FAIL "$results")"
if [ -z "$failed" -a "x$update" = "x-u" ]; then
cp "$results" "$tests_dir"/handover_tests.ok
fi
rm "$results"
if [ -n "$failed" ]; then
echo "tests failed"
exit 1
fi
exit 0

View File

@ -0,0 +1,6 @@
# Stay in better cell
# There are many neighbor cells, but only the current cell is the best cell, so no handover is performed
create-n-bts 7
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 21 18 20 23 19
expect-no-chan

View File

@ -0,0 +1,8 @@
# Handover to best better cell
# The best neighbor cell is selected
create-n-bts 7
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 20 21 18 20 23 19
expect-ho from lchan 0 0 1 0 to lchan 5 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 5 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,36 @@
# Handover and Assignment must be enabled
# This test will start with disabled assignment and handover. A
# better neighbor cell (assignment enabled) will not be selected and
# also no assignment from TCH/H to TCH/F to improve quality. There
# will be no handover nor assignment. After enabling assignment on the
# current cell, the MS will assign to TCH/F. After enabling handover
# in the current cell, but disabling in the neighbor cell, handover
# will not be performed, until it is enabled in the neighbor cell too.
network
handover 0
handover2 afs-bias rxlev 5
handover2 assignment 0
create-n-bts 2
set-ts-use trx 0 0 states * - - - - TCH/H- - -
meas-rep lchan 0 0 5 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-no-chan
network
bts 0
handover2 assignment 1
meas-rep lchan 0 0 5 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - - -
network
bts 0
handover 1
meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-no-chan
network
bts 1
handover 1
meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,16 @@
# Penalty timer must not run
# The MS will try to handover to a better cell, but this will fail.
# Even though the cell is still better, handover will not be performed
# due to penalty timer after handover failure
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-chan lchan 1 0 1 0
ack-chan
expect-ho-req lchan 0 0 1 0
ho-failed
expect-ts-use trx 0 0 states * TCH/F - - - - - -
expect-ts-use trx 1 0 states * - - - - - - -
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-no-chan

View File

@ -0,0 +1,20 @@
# TCH/H keeping with HR codec
# The MS is using half rate V1 codec, but the better cell is congested
# at TCH/H slots. As the congestion is removed, the handover takes
# place.
create-n-bts 2
network
bts 1
handover2 min-free-slots tch/h 4
codec tch/h HR
set-ts-use trx 0 0 states * - - - - TCH/H- - -
meas-rep lchan 0 0 5 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-no-chan
network
bts 1
handover2 min-free-slots tch/h 3
meas-rep lchan 0 0 5 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 5 0 to lchan 1 0 5 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * - - - - TCH/H- - -

View File

@ -0,0 +1,21 @@
# TCH/F keeping with FR codec
# The MS is using full rate V1 codec, but the better cell is congested
# at TCH/F slots. As the congestion is removed, the handover takes
# place.
create-n-bts 2
network
bts 1
handover2 min-free-slots tch/f 4
codec tch/f FR
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-no-chan
network
bts 1
handover2 min-free-slots tch/f 3
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,21 @@
# TCH/F keeping with EFR codec
# The MS is using full rate V2 codec, but the better cell is congested
# at TCH/F slots. As the congestion is removed, the handover takes
# place.
create-n-bts 2
network
bts 1
handover2 min-free-slots tch/f 4
codec tch/f EFR
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-no-chan
network
bts 1
handover2 min-free-slots tch/f 3
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,14 @@
# TCH/F to TCH/H changing with AMR codec
# The MS is using AMR V3 codec, the better cell is congested at TCH/F
# slots. The handover is performed to non-congested TCH/H slots.
create-n-bts 2
network
bts 1
handover2 min-free-slots tch/f 4
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 5 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * - - - - TCH/H- - -

View File

@ -0,0 +1,9 @@
# No handover to a cell with no slots available
# If no slot is available, no handover is performed
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
set-ts-use trx 1 0 states * TCH/F TCH/F TCH/F TCH/F TCH/HH TCH/HH -
meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-no-chan

View File

@ -0,0 +1,16 @@
# No more parallel handovers, if max_unsync_ho is defined
# There are three mobiles that want to handover, but only two can do
# it at a time, because the maximum number is limited to two.
create-n-bts 2
network
bts 1
handover2 max-handovers 2
set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - - - -
meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-chan lchan 1 0 1 0
meas-rep lchan 0 0 2 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-chan lchan 1 0 2 0
meas-rep lchan 0 0 3 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-no-chan

View File

@ -0,0 +1,13 @@
# Hysteresis
# If neighbor cell is better, handover is only performed if the
# amount of improvement is greater or equal hyteresis
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 27 rxqual 0 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 26 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,20 @@
# No Hysteresis and minimum RX level
# If current cell's RX level is below mimium level, handover must be
# performed, no matter of the hysteresis. First do not perform
# handover to better neighbor cell, because the hysteresis is not
# met. Second do not perform handover because better neighbor cell is
# below minimum RX level. Third perform handover because current cell
# is below minimum RX level, even if the better neighbor cell (minimum
# RX level reached) does not meet the hysteresis.
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 11
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 8 rxqual 0 ta 0 neighbors 9
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 9 rxqual 0 ta 0 neighbors 10
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,21 @@
# No handover to congested cell
# The better neighbor cell is congested, so no handover is performed.
# After the congestion is over, handover will be performed.
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
network
bts 1
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-no-chan
network
bts 1
handover2 min-free-slots tch/f 3
handover2 min-free-slots tch/h 3
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,24 @@
# Handover to balance congestion
# The current and the better cell are congested, so no handover is
# performed. This is because handover would congest the neighbor cell
# more. After congestion rises in the current cell, the handover is
# performed to balance congestion
create-n-bts 2
create-ms bts 0 TCH/F AMR
expect-ts-use trx 0 0 states * TCH/F - - - - - -
network
bts 0
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
bts 1
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-no-chan
set-ts-use trx 0 0 states * TCH/F TCH/F - - - - -
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - TCH/F - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,18 @@
# Handover to congested cell, if RX level is below minimum
# The better neighbor cell is congested, so no handover is performed.
# If the RX level of the current cell drops below minimum acceptable
# level, the handover is performed.
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
network
bts 1
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 9 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,37 @@
# Handover to cell with worse RXLEV, if RXQUAL is below minimum
# The neighbor cell has worse RXLEV, so no handover is performed.
# If the RXQUAL of the current cell drops below minimum acceptable
# level, the handover is performed. It is also required that 10
# reports are received, before RXQUAL is checked.
#
# (See also test 28, which tests for RXQUAL triggering HO to congested cell.)
#
# TODO: bad RXQUAL may want to prefer assignment within the same cell to avoid interference.
# See Performance Enhancements in a Frequency Hopping GSM Network (Nielsen Wigard 2002), Chapter
# 2.1.1, "Interference" in the list of triggers on p.157.
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,21 @@
# Handover due to maximum TA exceeded
# The MS in the current (best) cell has reached maximum allowed timing
# advance. No handover is performed until the timing advance exceeds
# it. The originating cell is still the best, but no handover is
# performed back to that cell, because the penalty timer (due to
# maximum allowed timing advance) is running.
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
network
bts 0
handover2 maximum distance 5
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 5 neighbors 20
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 6 neighbors 20
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -
meas-rep lchan 1 0 1 0 rxlev 20 rxqual 0 ta 6 neighbors 30
expect-no-chan

View File

@ -0,0 +1,34 @@
# Congestion check: No congestion
# Three cells have different number of used slots, but there is no
# congestion in any of these cells. No handover is performed.
create-n-bts 3
network
bts 0
handover2 min-free-slots tch/f 2
handover2 min-free-slots tch/h 2
bts 1
handover2 min-free-slots tch/f 2
handover2 min-free-slots tch/h 2
bts 2
handover2 min-free-slots tch/f 2
handover2 min-free-slots tch/h 2
set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH - -
set-ts-use trx 1 0 states * TCH/F - - - TCH/H- - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 0 0 5 1 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 1 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
congestion-check
expect-no-chan
expect-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH - -
expect-ts-use trx 1 0 states * TCH/F - - - TCH/H- - -

View File

@ -0,0 +1,39 @@
# Congestion check: One out of three cells is congested
# Three cells have different number of used slots, but there is
# congestion at TCH/F in the first cell. Handover is performed with
# the best candidate.
create-n-bts 3
network
bts 0
handover2 min-free-slots tch/f 2
handover2 min-free-slots tch/h 2
bts 1
handover2 min-free-slots tch/f 2
handover2 min-free-slots tch/h 2
bts 2
handover2 min-free-slots tch/f 2
handover2 min-free-slots tch/h 2
set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - TCH/HH - -
set-ts-use trx 1 0 states * TCH/F - - - TCH/H- - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0 neighbors 21 1 20
expect-no-chan
meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 0 0 5 1 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
meas-rep lchan 1 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20
expect-no-chan
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - TCH/HH - -
expect-ts-use trx 1 0 states * TCH/F - - - TCH/H- - -
congestion-check
expect-ho from lchan 0 0 3 0 to lchan 1 0 2 0
expect-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH - -
expect-ts-use trx 1 0 states * TCH/F TCH/F - - TCH/H- - -

View File

@ -0,0 +1,26 @@
# Congestion check: Balancing over congested cells
# Two cells are congested, but the second cell is less congested.
# Handover is performed to solve the congestion.
create-n-bts 2
network
bts 0
handover2 min-free-slots tch/f 4
bts 1
handover2 min-free-slots tch/f 4
codec tch/f FR
set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - - - -
set-ts-use trx 1 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20
expect-no-chan
meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 21
expect-no-chan
meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0 neighbors 20
expect-no-chan
meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20
expect-no-chan
congestion-check
expect-ho from lchan 0 0 2 0 to lchan 1 0 2 0
expect-ts-use trx 0 0 states * TCH/F - TCH/F - - - -
expect-ts-use trx 1 0 states * TCH/F TCH/F - - - - -

View File

@ -0,0 +1,19 @@
# Congestion check: Solving congestion by handover TCH/F -> TCH/H
# Two BTS, one MS in the first congested BTS must handover to
# non-congested TCH/H of second BTS, in order to solve congestion
create-n-bts 2
network
bts 0
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
bts 1
handover2 min-free-slots tch/f 4
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 30
expect-no-chan
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 1 0 5 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * - - - - TCH/H- - -

View File

@ -0,0 +1,20 @@
# Congestion check: Balancing congestion by handover TCH/F -> TCH/H
# Two BTS, one MS in the first congested BTS must handover to
# less-congested TCH/H of second BTS, in order to balance congestion
create-n-bts 2
network
bts 0
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
bts 1
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/H- - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 30
expect-no-chan
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - TCH/F - - TCH/H- - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,19 @@
# Congestion check: Upgrading worst candidate from TCH/H -> TCH/F
# There is only one BTS. The TCH/H slots are congested. Since
# assignment is performed to less-congested TCH/F, the candidate with
# the worst RX level is chosen.
create-n-bts 1
network
bts 0
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
set-ts-use trx 0 0 states * - - - - TCH/HH TCH/H- -
meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0
meas-rep lchan 0 0 5 1 rxlev 34 rxqual 0 ta 0
meas-rep lchan 0 0 6 0 rxlev 20 rxqual 0 ta 0
expect-no-chan
congestion-check
expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - TCH/HH - -

View File

@ -0,0 +1,72 @@
# Story: 'A neighbor is your friend'
create-n-bts 3
# Andreas is driving along the coast, on a sunny june afternoon.
# Suddenly he is getting a call from his friend and neighbor Axel.
#
# What happens: Two MS are created, #0 for Axel, #1 for Andreas.
# Axel:
create-ms bts 2 TCH/F AMR
# andreas:
create-ms bts 0 TCH/F AMR
expect-ts-use trx 0 0 states * TCH/F - - - - - -
expect-ts-use trx 1 0 states * - - - - - - -
expect-ts-use trx 2 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-no-chan
# Axel asks Andreas if he would like to join them for a barbecue.
# Axel's house is right in the neighborhood and the weather is fine.
# Andreas agrees, so he drives to a close store to buy some barbecue
# skewers.
#
# What happens: While driving, a different cell (mounted atop the
# store) becomes better.
# drive to bts 1:
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 35
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -
expect-ts-use trx 2 0 states * TCH/F - - - - - -
# While Andreas is walking into the store, Axel asks, if he could also
# bring some beer. Andreas has problems understanding him: "I have a
# bad reception here. The cell tower is right atop the store, but poor
# coverage inside. Can you repeat please?"
#
# What happens: Inside the store the close cell is so bad, that
# handover back to the previous cell is required.
# bts 1 becomes bad, so bts 0 helps out:
meas-rep lchan 1 0 1 0 rxlev 5 rxqual 0 ta 0 neighbors 20
expect-ho from lchan 1 0 1 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - - -
expect-ts-use trx 1 0 states * - - - - - - -
expect-ts-use trx 2 0 states * TCH/F - - - - - -
# After Andreas bought skewers and beer, he leaves the store.
#
# What happens: Outside the store the close cell is better again, so
# handover back to the that cell is performed.
# bts 1 becomes better again:
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 35
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -
expect-ts-use trx 2 0 states * TCH/F - - - - - -
# bts 2 becomes better:
# Andreas drives down to the lake where Axel's house is.
#
# What happens: There is a small cell at Axel's house, which becomes
# better, because the current cell has no good comverage at the lake.
meas-rep lchan 1 0 1 0 rxlev 14 rxqual 0 ta 0 neighbors 2 63
expect-ho from lchan 1 0 1 0 to lchan 2 0 2 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * - - - - - - -
expect-ts-use trx 2 0 states * TCH/F TCH/F - - - - -
# Andreas wonders why he still has good radio coverage: "Last time it
# was so bad". Axel says: "I installed a pico cell in my house,
# now we can use our mobile phones down here at the lake."

View File

@ -0,0 +1,46 @@
# No (or not enough) measurements for handover
# Do not solve congestion in cell, because there is no measurement.
# As soon as enough measurements available (1 in our case), perform
# handover. Afterwards the old cell becomes congested and the new
# cell is not. Do not perform handover until new measurements are
# received.
#
# two cells, first in congested, but no handover:
create-n-bts 2
network
bts 0
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
set-ts-use trx 0 0 states * TCH/F - - - - - -
congestion-check
expect-no-chan
expect-ts-use trx 0 0 states * TCH/F - - - - - -
# send measurement and trigger congestion check:
meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 20
expect-no-chan
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -
# congest the first cell and remove congestion from second cell:
network
bts 0
handover2 min-free-slots tch/f 0
handover2 min-free-slots tch/h 0
bts 1
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
# no handover until measurements applied:
congestion-check
expect-no-chan
meas-rep lchan 1 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 20
expect-no-chan
congestion-check
expect-ho from lchan 1 0 1 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - - -
expect-ts-use trx 1 0 states * - - - - - - -

View File

@ -0,0 +1,10 @@
# Stay in better cell
# There are many neighbor cells, but only the current cell is the best
# cell, so no handover is performed
create-n-bts 7
create-ms bts 0 TCH/F AMR
expect-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 21 18 20 23 19
expect-no-chan

View File

@ -0,0 +1,10 @@
# Handover to best better cell
# The best neighbor cell is selected
create-n-bts 7
set-ts-use trx 0 0 states * TCH/F - - - - - -
meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 20 21 18 20 23 19
expect-ho from lchan 0 0 1 0 to lchan 5 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 5 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,27 @@
# Congestion check: Upgrading worst candidate from TCH/H -> TCH/F
# There is only one BTS. The TCH/H slots are congested. Since
# assignment is performed to less-congested TCH/F, the candidate with
# the worst RX level is chosen. (So far like test 22.)
# After that, trigger more congestion checks to ensure stability.
create-n-bts 1
network
bts 0
handover2 min-free-slots tch/f 2
handover2 min-free-slots tch/h 4
set-ts-use trx 0 0 states * - - - - TCH/HH TCH/H- -
meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0
meas-rep lchan 0 0 5 1 rxlev 34 rxqual 0 ta 0
meas-rep lchan 0 0 6 0 rxlev 20 rxqual 0 ta 0
expect-no-chan
congestion-check
expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - TCH/HH - -
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 2 0
expect-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/-H - -
congestion-check
expect-no-chan
congestion-check
expect-no-chan

View File

@ -0,0 +1,35 @@
# Handover to congested cell, if RX quality is below minimum
# The better neighbor cell is congested, so no handover is performed.
# If the RX quality of the current cell drops below minimum acceptable
# level, the handover is performed. It is also required that 10
# resports are received, before RX quality is checked.
create-n-bts 2
set-ts-use trx 0 0 states * TCH/F - - - - - -
network
bts 1
handover2 min-free-slots tch/f 4
handover2 min-free-slots tch/h 4
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-no-chan
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40
expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - -
expect-ts-use trx 1 0 states * TCH/F - - - - - -

View File

@ -0,0 +1,15 @@
# Congestion check: Balancing congestion by handover TCH/F -> TCH/H
# One BTS, and TCH/F are considered congested, TCH/H are not.
create-n-bts 1
network
bts 0
handover2 min-free-slots tch/f 3
handover2 min-free-slots tch/h 0
set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/H- - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 30
expect-no-chan
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 5 1
expect-ts-use trx 0 0 states * - TCH/F - - TCH/HH - -

View File

@ -0,0 +1,81 @@
# Congestion check: Balancing congestion by handover TCH/F -> TCH/H
# With dynamic timeslots.
# As soon as only one TCH/F is left, there should be HO to a dyn TS.
create-bts trx-count 1 timeslots c+s4 TCH/F TCH/F TCH/F dyn dyn dyn PDCH
network
bts 0
handover2 min-free-slots tch/f 2
handover2 min-free-slots tch/h 0
handover2 assignment 1
set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch pdch pdch
# (there must be at leas one measurement report on each lchan for congestion check to work)
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30
meas-rep lchan 0 0 2 0 rxlev 40 rxqual 0 ta 0 neighbors 30
meas-rep lchan 0 0 3 0 rxlev 40 rxqual 0 ta 0 neighbors 30
meas-rep lchan 0 0 4 0 rxlev 40 rxqual 0 ta 0 neighbors 30
congestion-check
expect-no-chan
create-ms bts 0 TCH/F AMR
meas-rep lchan 0 0 5 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F TCH/F pdch pdch
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 6 0
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch TCH/H- pdch
congestion-check
expect-ho from lchan 0 0 4 0 to lchan 0 0 6 1
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch pdch TCH/HH pdch
congestion-check
expect-no-chan
create-ms bts 0 TCH/F AMR
meas-rep lchan 0 0 4 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch TCH/HH pdch
congestion-check
expect-ho from lchan 0 0 4 0 to lchan 0 0 5 0
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch TCH/H- TCH/HH pdch
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 5 1
expect-ts-use trx 0 0 states * - TCH/F TCH/F pdch TCH/HH TCH/HH pdch
congestion-check
expect-no-chan
create-ms bts 0 TCH/F AMR
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch TCH/HH TCH/HH pdch
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 4 0
expect-ts-use trx 0 0 states * - TCH/F TCH/F TCH/H- TCH/HH TCH/HH pdch
congestion-check
expect-ho from lchan 0 0 2 0 to lchan 0 0 4 1
expect-ts-use trx 0 0 states * - - TCH/F TCH/HH TCH/HH TCH/HH pdch
congestion-check
expect-no-chan
create-ms bts 0 TCH/F AMR
meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-ts-use trx 0 0 states * TCH/F - TCH/F TCH/HH TCH/HH TCH/HH pdch
congestion-check
expect-no-chan
create-ms bts 0 TCH/F AMR
meas-rep lchan 0 0 2 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/HH TCH/HH TCH/HH pdch
congestion-check
expect-no-chan

View File

@ -0,0 +1,7 @@
# assign new MS: re-use half used TCH/H to avoid switching more dyn TS to TCH/H
create-bts trx-count 1 timeslots c+s4 TCH/F TCH/F TCH/F dyn dyn dyn PDCH
set-ts-use trx 0 0 states * - - - pdch TCH/H- pdch pdch
create-ms bts 0 TCH/H AMR
expect-ts-use trx 0 0 states * - - - pdch TCH/HH pdch pdch

View File

@ -0,0 +1,15 @@
# Congestion check: favor moving a TCH/H that frees a half-used dyn TS completely
create-bts trx-count 1 timeslots c+s4 dyn dyn dyn dyn dyn - -
set-ts-use trx 0 0 states * pdch TCH/HH TCH/H- TCH/HH pdch - -
meas-rep lchan 0 0 2 1 rxlev 30 rxqual 0 ta 0
meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0
meas-rep lchan 0 0 4 0 rxlev 30 rxqual 0 ta 0
meas-rep lchan 0 0 4 1 rxlev 30 rxqual 0 ta 0
# pick one to move:
network
bts 0
handover2 min-free-slots tch/h 6
congestion-check
expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F TCH/HH pdch TCH/HH pdch - -

View File

@ -51,200 +51,8 @@ cat $abs_srcdir/handover/neighbor_ident_test.err > experr
AT_CHECK([$abs_top_builddir/tests/handover/neighbor_ident_test], [], [expout], [experr])
AT_CLEANUP
AT_SETUP([handover test 0])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 0], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 1])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 1], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 2])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 2], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 3])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 3], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 4])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 4], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 5])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 5], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 6])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 6], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 7])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 7], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 8])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 8], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 9])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 9], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 10])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 10], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 11])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 11], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 12])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 12], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 13])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 13], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 14])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 14], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 15])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 15], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 16])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 16], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 17])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 17], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 18])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 18], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 19])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 19], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 20])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 20], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 21])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 21], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 22])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 22], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 23])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 23], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 24])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 24], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 25])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 25], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 26])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 26], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 27])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 27], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 28])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 28], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 29])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 29], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 30])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 30], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 31])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 31], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([handover test 32])
AT_KEYWORDS([handover])
cat $abs_srcdir/handover/handover_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/handover/handover_test 32], [], [expout], [ignore])
AT_SETUP([handover_tests])
AT_KEYWORDS([handover_tests])
cat $abs_srcdir/handover/handover_tests.ok > expout
AT_CHECK([$abs_srcdir/handover/handover_tests.sh $abs_srcdir/handover $abs_builddir/handover], [], [expout], [ignore])
AT_CLEANUP