               +---------------------------------------+
               | HAProxy regression testing with vtest |
               +---------------------------------------+


The information found in this file are a short starting guide to help you to
write VTC (Varnish Test Case) scripts (or VTC files) for haproxy regression testing.
Such VTC files are currently used to test Varnish cache application developed by
Poul-Henning Kamp. A very big thanks you to him for having helped you to add
our haproxy C modules to vtest tool. Note that vtest was formally developed for
varnish cache reg testing and was named varnishtest. vtest is an haproxy specific
version of varnishtest program which reuses the non varnish cache specific code.

A lot of general information about how to write VTC files may be found in 'man/vtc.7'
manual of varnish cache sources directory or directly on the web here:

    https://varnish-cache.org/docs/trunk/reference/vtc.html

It is *highly* recommended to read this manual before asking to haproxy ML. This
documentation only deals with the vtest support for haproxy.


vtest installation
------------------------

To use vtest you will have to download and compile the recent vtest
sources found at https://github.com/vtest/VTest.

To compile vtest:

    $ cd VTest
    $ make vtest

Note that varnishtest may be also compiled but not without the varnish cache
sources already compiled:

    $ VARNISH_SRC=<...> make varnishtest

After having compiled these sources, the vtest executable location is at the
root of the vtest sources directory.


vtest exectution
---------------------

vtest is able to search for the haproxy executable file it is supposed to
launch thanks to the PATH environment variable. To force the executable to be used by
vtest, the HAPROXY_PROGRAM environment variable for vtest may be
typically set as follows:

     $ HAPROXY_PROGRAM=~/srcs/haproxy/haproxy vtest ...

vtest program comes with interesting options. The most interesting are:

    -t  Timeout in seconds to abort the test if some launched program
    -v  By default, vtest does not dump the outputs of processus it launched
        when the test passes. With this option the outputs are dumped even
        when the test passes.
    -L  to always keep the temporary VTC directories.
    -l  to keep the temporary VTC directories only when the test fails.

About haproxy, when launched by vtest, -d option is enabled by default.


How to write VTC files
----------------------

A VTC file must start with a "varnishtest" or "vtest" command line followed by a
descriptive line enclosed by double quotes. This is not specific to the VTC files
for haproxy.

The VTC files for haproxy must also contain a "feature ignore_unknown_macro" line
if any macro is used for haproxy in this file. This is due to the fact that
vtest parser code for haproxy commands generates macros the vtest
parser code for varnish cache has no knowledge of. This line prevents vtest from
failing in such cases. As a "cli" macro automatically generated, this
"feature ignore_unknown_macro" is mandatory for each VTC file for haproxy.

To make vtest capable of testing haproxy, two new VTC commands have been
implemented: "haproxy" and "syslog". "haproxy" is used to start haproxy processus.
"syslog" is used to start syslog servers (at this time, only used by haproxy).

As haproxy cannot work without configuration file, a VTC file for haproxy must
embed the configuration files contents for the haproxy instances it declares.
This may  be done using the following intuitive syntax construction: -conf {...}.
Here -conf is an argument of "haproxy" VTC command to declare the configuration
file of the haproxy instances it also declares (see "Basic HAProxy test" VTC file
below).

As for varnish VTC files, the parser of VTC files for haproxy automatically
generates macros for the declared frontends to be reused by the clients later
in the script, so after having written the "haproxy" command sections.
The syntax "fd@${my_frontend_fd_name}" must be used to bind the frontend
listeners to localhost address and random ports (see "Environment variables"
section of haproxy documentation). This is mandatory.

Each time the haproxy command parser finds a "fd@${xyz}" string in a 'ABC'
"haproxy" command section, it generates three macros: 'ABC_xyz_addr', 'ABC_xyz_port'
and 'ABC_xyz_sock', with 'ABC_xyz_sock' being resolved as 'ABC_xyz_addr
ABC_xyz_port' typically used by clients -connect parameter.

Each haproxy instance works in their own temporary working directories located
at '/tmp/vtc.<varnitest PID>.XXXXXXXX/<haproxy_instance_name>' (with XXXXXXXX
a random 8 digits hexadecimal integer. This is in this temporary directory that
the configuration file is temporarily written.

A 'stats.sock' UNIX socket is also created in this directory. There is no need
to declare such stats sockets in the -conf {...} section. The name of the parent
directory of the haproxy instances working directories is stored in 'tmpdir'. In
fact this is the working directory of the current vtest processus.

There also exists 'testdir' macro which is the parent directory of the VTC file.
It may be useful to use other files located in the same directory than the current
VTC file.



VTC file examples
-----------------

The following first VTC file is a real regression test case file for a bug which has
been fixed by 84c844e commit. We declare a basic configuration for a 'h1' haproxy
instance.

    varnishtest "SPOE bug: missing configuration file"

    #commit 84c844eb12b250aa86f2aadaff77c42dfc3cb619
    #Author: Christopher Faulet <cfaulet@haproxy.com>
    #Date:   Fri Mar 23 14:37:14 2018 +0100

    #   BUG/MINOR: spoe: Initialize variables used during conf parsing before any check

    #   Some initializations must be done at the beginning of parse_spoe_flt to avoid
    #   segmentaion fault when first errors are catched, when the "filter spoe" line is
    #   parsed.

    haproxy h1 -conf-BAD {} {
      defaults
          timeout connect 5000ms
          timeout client 50000ms
          timeout server 50000ms

      frontend my-front
          filter spoe
    }


-conf-BAD haproxy command argument is used. Its role it to launch haproxy with
-c option (configuration file checking) and check that 'h1' exit(3) with 1 as
status. Here is the output when running this VTC file:


    **** top   0.0 extmacro def pwd=/home/fred/src/haproxy
    **** top   0.0 extmacro def localhost=127.0.0.1
    **** top   0.0 extmacro def bad_backend=127.0.0.1 39564
    **** top   0.0 extmacro def bad_ip=192.0.2.255
    **** top   0.0 macro def testdir=//home/fred/src/varnish-cache-haproxy
    **** top   0.0 macro def tmpdir=/tmp/vtc.6377.64329194
    *    top   0.0 TEST /home/fred/src/varnish-cache-haproxy/spoe_bug.vtc starting
    **   top   0.0 === varnishtest "SPOE bug: missing configuration file"
    *    top   0.0 TEST SPOE bug: missing configuration file
    **   top   0.0 === haproxy h1 -conf-BAD {} {
    **** h1    0.0 conf|    global
    **** h1    0.0 conf|\tstats socket /tmp/vtc.6377.64329194/h1/stats.sock level admin mode 600
    **** h1    0.0 conf|
    **** h1    0.0 conf|\tdefaults
    **** h1    0.0 conf|        timeout connect 5000ms
    **** h1    0.0 conf|        timeout client 50000ms
    **** h1    0.0 conf|        timeout server 50000ms
    **** h1    0.0 conf|
    **** h1    0.0 conf|\tfrontend my-front
    **** h1    0.0 conf|\t\tfilter spoe
    **** h1    0.0 conf|
    **   h1    0.0 haproxy_start
    **** h1    0.0 opt_worker 0 opt_daemon 0 opt_check_mode 1
    **** h1    0.0 argv|exec /home/fred/src/haproxy/haproxy -c  -f /tmp/vtc.6377.64329194/h1/cfg
    **** h1    0.0 XXX 5 @277
    ***  h1    0.0 PID: 6395
    **** h1    0.0 macro def h1_pid=6395
    **** h1    0.0 macro def h1_name=/tmp/vtc.6377.64329194/h1
    **   h1    0.0 Wait
    **   h1    0.0 Stop HAproxy pid=6395
    **** h1    0.0 STDOUT poll 0x10
    **   h1    0.0 WAIT4 pid=6395 status=0x008b (user 0.000000 sys 0.000000)
    *    h1    0.0 Expected exit: 0x1 signal: 0 core: 0
    ---- h1    0.0 Bad exit status: 0x008b exit 0x0 signal 11 core 128
    *    top   0.0 RESETTING after /home/fred/src/varnish-cache-haproxy/spoe_bug.vtc
    **   h1    0.0 Reset and free h1 haproxy 6395
    **   h1    0.0 Wait
    ---- h1    0.0 Assert error in haproxy_wait(), vtc_haproxy.c line 326:  Condition(*(&h->fds[1]) >= 0) not true.

    *    top   0.0 failure during reset
    #    top  TEST /home/fred/src/varnish-cache-haproxy/spoe_bug.vtc FAILED (0.008) exit=2


'h1' exited with (128 + 11) status and a core file was produced in
/tmp/vtc.6377.64329194/h1 directory.
With the patch provided by 84c844e commit, varnishtest makes this VTC file pass
as expected (verbose mode execution):

    **** top   0.0 extmacro def pwd=/home/fred/src/haproxy
    **** top   0.0 extmacro def localhost=127.0.0.1
    **** top   0.0 extmacro def bad_backend=127.0.0.1 42264
    **** top   0.0 extmacro def bad_ip=192.0.2.255
    **** top   0.0 macro def testdir=//home/fred/src/varnish-cache-haproxy
    **** top   0.0 macro def tmpdir=/tmp/vtc.25540.59b6ec5d
    *    top   0.0 TEST /home/fred/src/varnish-cache-haproxy/spoe_bug.vtc starting
    **   top   0.0 === varnishtest "SPOE bug: missing configuration file"
    *    top   0.0 TEST SPOE bug: missing configuration file
    **   top   0.0 === haproxy h1 -conf-BAD {} {
    **** h1    0.0 conf|    global
    **** h1    0.0 conf|\tstats socket /tmp/vtc.25540.59b6ec5d/h1/stats.sock level admin mode 600
    **** h1    0.0 conf|
    **** h1    0.0 conf|\tdefaults
    **** h1    0.0 conf|        timeout connect 5000ms
    **** h1    0.0 conf|        timeout client 50000ms
    **** h1    0.0 conf|        timeout server 50000ms
    **** h1    0.0 conf|
    **** h1    0.0 conf|\tfrontend my-front
    **** h1    0.0 conf|\t\tfilter spoe
    **** h1    0.0 conf|
    **   h1    0.0 haproxy_start
    **** h1    0.0 opt_worker 0 opt_daemon 0 opt_check_mode 1
    **** h1    0.0 argv|exec /home/fred/src/haproxy/haproxy -c  -f /tmp/vtc.25540.59b6ec5d/h1/cfg
    **** h1    0.0 XXX 5 @277
    ***  h1    0.0 PID: 25558
    **** h1    0.0 macro def h1_pid=25558
    **** h1    0.0 macro def h1_name=/tmp/vtc.25540.59b6ec5d/h1
    **   h1    0.0 Wait
    **   h1    0.0 Stop HAproxy pid=25558
    ***  h1    0.0 debug|[ALERT] 157/135318 (25558) : parsing [/tmp/vtc.25540.59b6ec5d/h1/cfg:10] : 'filter' : ''spoe' : missing config file'
    ***  h1    0.0 debug|[ALERT] 157/135318 (25558) : Error(s) found in configuration file : /tmp/vtc.25540.59b6ec5d/h1/cfg
    ***  h1    0.0 debug|[ALERT] 157/135318 (25558) : Fatal errors found in configuration.
    **** h1    0.0 STDOUT poll 0x10
    **   h1    0.0 WAIT4 pid=25558 status=0x0100 (user 0.000000 sys 0.000000)
    **   h1    0.0 Found expected ''
    *    top   0.0 RESETTING after /home/fred/src/varnish-cache-haproxy/spoe_bug.vtc
    **   h1    0.0 Reset and free h1 haproxy -1
    *    top   0.0 TEST /home/fred/src/varnish-cache-haproxy/spoe_bug.vtc completed
    #    top  TEST /home/fred/src/varnish-cache-haproxy/spoe_bug.vtc passed (0.004)


The following VTC file does almost nothing except running a shell to list
the contents of 'tmpdir' directory after having launched a haproxy instance
and 's1' HTTP server. This shell also prints the content of 'cfg' 'h1' configuration
file.

    varnishtest "List the contents of 'tmpdir'"
    feature ignore_unknown_macro

    server s1 {
    } -start

    haproxy h1 -conf {
      defaults
          mode http
          timeout connect 5s
          timeout server  30s
          timeout client  30s

      backend be1
          server srv1 ${s1_addr}:${s1_port}

      frontend http1
          use_backend be1
          bind "fd@${my_frontend_fd}"
    } -start

    shell {
      echo "${tmpdir} working directory content:"
      ls -lR ${tmpdir}
      cat ${tmpdir}/h1/cfg
    }

We give only the output of the shell to illustrate this example:

    .
    .
    .
    **   top   0.0 === shell {
    **** top   0.0 shell_cmd|exec 2>&1 ;
    **** top   0.0 shell_cmd|  echo "tmpdir: /tmp/vtc.32092.479d521e"
    **** top   0.0 shell_cmd|  ls -lR /tmp/vtc.32092.479d521e
    **** top   0.0 shell_cmd|  cat /tmp/vtc.32092.479d521e/h1/cfg
    .
    .
    .
    **** top   0.0 shell_out|/tmp/vtc.3808.448cbfe0 working directory content:
    **** top   0.0 shell_out|/tmp/vtc.32092.479d521e:
    **** top   0.0 shell_out|total 8
    **** top   0.0 shell_out|drwxr-xr-x 2  users 4096 Jun  7 11:09 h1
    **** top   0.0 shell_out|-rw-r--r-- 1 me users   84 Jun  7 11:09 INFO
    **** top   0.0 shell_out|
    **** top   0.0 shell_out|/tmp/vtc.32092.479d521e/h1:
    **** top   0.0 shell_out|total 4
    **** top   0.0 shell_out|-rw-r----- 1 fred users 339 Jun  7 11:09 cfg
    **** top   0.0 shell_out|srw------- 1 fred users   0 Jun  7 11:09 stats.sock
    **** top   0.0 shell_out|    global
    **** top   0.0 shell_out|\tstats socket /tmp/vtc.32092.479d521e/h1/stats.sock level admin mode 600
    **** top   0.0 shell_out|
    **** top   0.0 shell_out|  defaults
    **** top   0.0 shell_out|      mode   http
    **** top   0.0 shell_out|      timeout connect         5s
    **** top   0.0 shell_out|      timeout server          30s
    **** top   0.0 shell_out|      timeout client          30s
    **** top   0.0 shell_out|
    **** top   0.0 shell_out|  backend be1
    **** top   0.0 shell_out|      server srv1 127.0.0.1:36984
    **** top   0.0 shell_out|
    **** top   0.0 shell_out|  frontend http1
    **** top   0.0 shell_out|      use_backend be1
    **** top   0.0 shell_out|      bind "fd@${my_frontend_fd}"
    **** top   0.0 shell_status = 0x0000


The following example illustrate how to run a basic HTTP transaction between 'c1'
client and 's1' server with 'http1' as haproxy frontend. This frontend listen
on TCP socket with 'my_frontend_fd' as file descriptor.

    # Mandatory line
    varnishtest "Basic HAproxy test"

    # As some macros for haproxy are used in this file, this line is mandatory.
    feature ignore_unknown_macro

    server s1 {
      rxreq
      txresp -body "s1 >>> Hello world!"
    } -start

    haproxy h1 -conf {
      # Configuration file of 'h1' haproxy instance.
      defaults
        mode   http
        timeout connect         5s
        timeout server          30s
        timeout client          30s

      backend be1
        # declare 'srv1' server to point to 's1' server instance declare above.
        server srv1 ${s1_addr}:${s1_port}

      frontend http1
        use_backend be1
        bind "fd@${my_frontend_fd}"
    } -start

    client c1 -connect ${h1_my_frontend_fd_sock} {
      txreq -url "/"
      rxresp
      expect resp.status == 200
      expect resp.body == "s1 >>> Hello world!"
    } -run


It is possible to shorten the previous VTC file haproxy command section as follows:

    haproxy h1 -conf {
      # Configuration file of 'h1' haproxy instance.
      defaults
        mode   http
        timeout connect         5s
        timeout server          30s
        timeout client          30s
	}

In this latter example, "backend" and "frontend" sections are automatically
generated depending on the declarations of server instances.


Another interesting real regression test case is the following: we declare one
server 's1', a syslog server 'Slg_1' and a basic haproxy configuration for 'h1'
haproxy instance. Here we want to check that the syslog message are correctly
formatted thanks to "expect" "syslog" command (see syslog Slg_1 {...} command)
below.

    varnishtest "Wrong ip/port logging"
    feature ignore_unknown_macro

    #commit d02286d6c866e5c0a7eb6fbb127fa57f3becaf16
    #Author: Willy Tarreau <w@1wt.eu>
    #Date:   Fri Jun 23 11:23:43 2017 +0200
    #
    #    BUG/MINOR: log: pin the front connection when front ip/ports are logged
    #
    #    Mathias Weiersmueller reported an interesting issue with logs which Lukas
    #    diagnosed as dating back from commit 9b061e332 (1.5-dev9). When front
    #    connection information (ip, port) are logged in TCP mode and the log is
    #    emitted at the end of the connection (eg: because %B or any log tag
    #    requiring LW_BYTES is set), the log is emitted after the connection is
    #    closed, so the address and ports cannot be retrieved anymore.
    #
    #    It could be argued that we'd make a special case of these to immediately
    #    retrieve the source and destination addresses from the connection, but it
    #    seems cleaner to simply pin the front connection, marking it "tracked" by
    #    adding the LW_XPRT flag to mention that we'll need some of these elements
    #    at the last moment. Only LW_FRTIP and LW_CLIP are affected. Note that after
    #    this change, LW_FRTIP could simply be removed as it's not used anywhere.

    #    Note that the problem doesn't happen when using %[src] or %[dst] since
    #    all sample expressions set LW_XPRT.


    server s1 {
        rxreq
        txresp
    } -start

    syslog Slg_1 -level notice {
        recv
        recv
        recv info
        expect ~ \"dip\":\"${h1_fe_1_addr}\",\"dport\":\"${h1_fe_1_port}.*\"ts\":\"cD\",\"
    } -start

    haproxy h1 -conf {
        global
            log ${Slg_1_addr}:${Slg_1_port} local0

    defaults
        log global
        timeout connect 3000
        timeout client 5
        timeout server  10000

    frontend fe1
        bind "fd@${fe_1}"
        mode tcp
        log-format {\"dip\":\"%fi\",\"dport\":\"%fp\",\"c_ip\":\"%ci\",\"c_port\":\"%cp\",\"fe_name\":\"%ft\",\"be_name\":\"%b\",\"s_name\":\"%s\",\"ts\":\"%ts\",\"bytes_read\":\"%B\"}
        default_backend    be_app

    backend be_app
        server app1 ${s1_addr}:${s1_port} check
    } -start

    client c1 -connect ${h1_fe_1_sock} {
        txreq -url "/"
        delay 0.02
    } -run

    syslog Slg_1 -wait


Here is the output produced by varnishtest with the latter VTC file:

    **** top   0.0 extmacro def pwd=/home/fred/src/haproxy
    **** top   0.0 extmacro def localhost=127.0.0.1
    **** top   0.0 extmacro def bad_backend=127.0.0.1 40386
    **** top   0.0 extmacro def bad_ip=192.0.2.255
    **** top   0.0 macro def testdir=//home/fred/src/varnish-cache-haproxy
    **** top   0.0 macro def tmpdir=/tmp/vtc.15752.560ca66b
    *    top   0.0 TEST /home/fred/src/varnish-cache-haproxy/d02286d.vtc starting
    **   top   0.0 === varnishtest "HAPEE bug 2788"
    *    top   0.0 TEST HAPEE bug 2788
    **   top   0.0 === feature ignore_unknown_macro
    **   top   0.0 === server s1 {
    **   s1    0.0 Starting server
    **** s1    0.0 macro def s1_addr=127.0.0.1
    **** s1    0.0 macro def s1_port=35564
    **** s1    0.0 macro def s1_sock=127.0.0.1 35564
    *    s1    0.0 Listen on 127.0.0.1 35564
    **   top   0.0 === syslog Slg_1 -level notice {
    **   Slg_1  0.0 Starting syslog server
    **   s1    0.0 Started on 127.0.0.1 35564
    **** Slg_1  0.0 macro def Slg_1_addr=127.0.0.1
    **** Slg_1  0.0 macro def Slg_1_port=33012
    **** Slg_1  0.0 macro def Slg_1_sock=127.0.0.1 33012
    *    Slg_1  0.0 Bound on 127.0.0.1 33012
    **   top   0.0 === haproxy h1 -conf {
    **   Slg_1  0.0 Started on 127.0.0.1 33012 (level: 5)
    **   Slg_1  0.0 === recv
    **** h1    0.0 macro def h1_fe_1_sock=::1 51782
    **** h1    0.0 macro def h1_fe_1_addr=::1
    **** h1    0.0 macro def h1_fe_1_port=51782
    **** h1    0.0 setenv(fe_1, 7)
    **** h1    0.0 conf|    global
    **** h1    0.0 conf|\tstats socket /tmp/vtc.15752.560ca66b/h1/stats.sock level admin mode 600
    **** h1    0.0 conf|
    **** h1    0.0 conf|    global
    **** h1    0.0 conf|        log 127.0.0.1:33012 local0
    **** h1    0.0 conf|
    **** h1    0.0 conf|    defaults
    **** h1    0.0 conf|        log global
    **** h1    0.0 conf|        timeout connect 3000
    **** h1    0.0 conf|        timeout client 5
    **** h1    0.0 conf|        timeout server  10000
    **** h1    0.0 conf|
    **** h1    0.0 conf|    frontend fe1
    **** h1    0.0 conf|        bind "fd@${fe_1}"
    **** h1    0.0 conf|        mode tcp
    **** h1    0.0 conf|        log-format {\"dip\":\"%fi\",\"dport\":\"%fp\",\"c_ip\":\"%ci\",\"c_port\":\"%cp\",\"fe_name\":\"%ft\",\"be_name\":\"%b\",\"s_name\":\"%s\",\"ts\":\"%ts\",\"bytes_read\":\"%B\"}
    **** h1    0.0 conf|        default_backend    be_app
    **** h1    0.0 conf|
    **** h1    0.0 conf|    backend be_app
    **** h1    0.0 conf|        server app1 127.0.0.1:35564 check
    **   h1    0.0 haproxy_start
    **** h1    0.0 opt_worker 0 opt_daemon 0 opt_check_mode 0
    **** h1    0.0 argv|exec /home/fred/src/haproxy/haproxy -d  -f /tmp/vtc.15752.560ca66b/h1/cfg
    **** h1    0.0 XXX 9 @277
    ***  h1    0.0 PID: 15787
    **** h1    0.0 macro def h1_pid=15787
    **** h1    0.0 macro def h1_name=/tmp/vtc.15752.560ca66b/h1
    **   top   0.0 === client c1 -connect ${h1_fe_1_sock} {
    **   c1    0.0 Starting client
    **   c1    0.0 Waiting for client
    ***  c1    0.0 Connect to ::1 51782
    ***  c1    0.0 connected fd 8 from ::1 46962 to ::1 51782
    **   c1    0.0 === txreq -url "/"
    **** c1    0.0 txreq|GET / HTTP/1.1\r
    **** c1    0.0 txreq|Host: 127.0.0.1\r
    **** c1    0.0 txreq|\r
    **   c1    0.0 === delay 0.02
    ***  c1    0.0 delaying 0.02 second(s)
    ***  h1    0.0 debug|Note: setting global.maxconn to 2000.
    ***  h1    0.0 debug|Available polling systems :
    ***  h1    0.0 debug|      epoll :
    ***  h1    0.0 debug|pref=300,
    ***  h1    0.0 debug| test result OK
    ***  h1    0.0 debug|       poll : pref=200,  test result OK
    ***  h1    0.0 debug|     select :
    ***  h1    0.0 debug|pref=150,  test result FAILED
    ***  h1    0.0 debug|Total: 3 (2 usable), will use epoll.
    ***  h1    0.0 debug|
    ***  h1    0.0 debug|Available filters :
    ***  h1    0.0 debug|\t[SPOE] spoe
    ***  h1    0.0 debug|\t[COMP] compression
    ***  h1    0.0 debug|\t[TRACE] trace
    **** Slg_1  0.0 syslog|<133>Jun  7 14:12:51 haproxy[15787]: Proxy fe1 started.
    **   Slg_1  0.0 === recv
    **** Slg_1  0.0 syslog|<133>Jun  7 14:12:51 haproxy[15787]: Proxy be_app started.
    **   Slg_1  0.0 === recv info
    ***  h1    0.0 debug|00000000:fe1.accept(0007)=000a from [::1:46962]
    ***  s1    0.0 accepted fd 6 127.0.0.1 56770
    **   s1    0.0 === rxreq
    **** s1    0.0 rxhdr|GET / HTTP/1.1\r
    **** s1    0.0 rxhdr|Host: 127.0.0.1\r
    **** s1    0.0 rxhdr|\r
    **** s1    0.0 rxhdrlen = 35
    **** s1    0.0 http[ 0] |GET
    **** s1    0.0 http[ 1] |/
    **** s1    0.0 http[ 2] |HTTP/1.1
    **** s1    0.0 http[ 3] |Host: 127.0.0.1
    **** s1    0.0 bodylen = 0
    **   s1    0.0 === txresp
    **** s1    0.0 txresp|HTTP/1.1 200 OK\r
    **** s1    0.0 txresp|Content-Length: 0\r
    **** s1    0.0 txresp|\r
    ***  s1    0.0 shutting fd 6
    **   s1    0.0 Ending
    ***  h1    0.0 debug|00000000:be_app.srvcls[000a:000c]
    ***  h1    0.0 debug|00000000:be_app.clicls[000a:000c]
    ***  h1    0.0 debug|00000000:be_app.closed[000a:000c]
    **** Slg_1  0.0 syslog|<134>Jun  7 14:12:51 haproxy[15787]: {"dip":"","dport":"0","c_ip":"::1","c_port":"46962","fe_name":"fe1","be_name":"be_app","s_name":"app1","ts":"cD","bytes_read":"38"}
    **   Slg_1  0.0 === expect ~ \"dip\":\"${h1_fe_1_addr}\",\"dport\":\"${h1_fe_1_p...
    ---- Slg_1  0.0 EXPECT FAILED ~ "\"dip\":\"::1\",\"dport\":\"51782.*\"ts\":\"cD\",\""
    ***  c1    0.0 closing fd 8
    **   c1    0.0 Ending
    *    top   0.0 RESETTING after /home/fred/src/varnish-cache-haproxy/d02286d.vtc
    **   h1    0.0 Reset and free h1 haproxy 15787
    **   h1    0.0 Wait
    **   h1    0.0 Stop HAproxy pid=15787
    **** h1    0.0 Kill(2)=0: Success
    **** h1    0.0 STDOUT poll 0x10
    **   h1    0.1 WAIT4 pid=15787 status=0x0002 (user 0.000000 sys 0.004000)
    **   s1    0.1 Waiting for server (4/-1)
    **   Slg_1  0.1 Waiting for syslog server (5)
    *    top   0.1 TEST /home/fred/src/varnish-cache-haproxy/d02286d.vtc FAILED
    #    top  TEST /home/fred/src/varnish-cache-haproxy/d02286d.vtc FAILED (0.131) exit=2

This test does not pass without the bug fix of d02286d commit. Indeed the third syslog
message received by 'Slg_1' syslog server does not match the regular expression
of the "syslog" "expect" command:

    expect ~ \"dip\":\"${h1_fe_1_addr}\",\"dport\":\"${h1_fe_1_port}.*\"ts\":\"cD\",\"

(the IP address and port are missing), contrary to what happens with the correct bug fix:

    **** top   0.0 extmacro def pwd=/home/fred/src/haproxy
    **** top   0.0 extmacro def localhost=127.0.0.1
    **** top   0.0 extmacro def bad_backend=127.0.0.1 37284
    **** top   0.0 extmacro def bad_ip=192.0.2.255
    **** top   0.0 macro def testdir=//home/fred/src/varnish-cache-haproxy
    **** top   0.0 macro def tmpdir=/tmp/vtc.12696.186b28b0
    *    top   0.0 TEST /home/fred/src/varnish-cache-haproxy/d02286d.vtc starting
    **   top   0.0 === varnishtest "HAPEE bug 2788"
    *    top   0.0 TEST HAPEE bug 2788
    **   top   0.0 === feature ignore_unknown_macro
    **   top   0.0 === server s1 {
    **   s1    0.0 Starting server
    **** s1    0.0 macro def s1_addr=127.0.0.1
    **** s1    0.0 macro def s1_port=53384
    **** s1    0.0 macro def s1_sock=127.0.0.1 53384
    *    s1    0.0 Listen on 127.0.0.1 53384
    **   top   0.0 === syslog Slg_1 -level notice {
    **   Slg_1  0.0 Starting syslog server
    **** Slg_1  0.0 macro def Slg_1_addr=127.0.0.1
    **   s1    0.0 Started on 127.0.0.1 53384
    **** Slg_1  0.0 macro def Slg_1_port=36195
    **** Slg_1  0.0 macro def Slg_1_sock=127.0.0.1 36195
    *    Slg_1  0.0 Bound on 127.0.0.1 36195
    **   top   0.0 === haproxy h1 -conf {
    **   Slg_1  0.0 Started on 127.0.0.1 36195 (level: 5)
    **   Slg_1  0.0 === recv
    **** h1    0.0 macro def h1_fe_1_sock=::1 39264
    **** h1    0.0 macro def h1_fe_1_addr=::1
    **** h1    0.0 macro def h1_fe_1_port=39264
    **** h1    0.0 setenv(fe_1, 7)
    **** h1    0.0 conf|    global
    **** h1    0.0 conf|\tstats socket /tmp/vtc.12696.186b28b0/h1/stats.sock level admin mode 600
    **** h1    0.0 conf|
    **** h1    0.0 conf|    global
    **** h1    0.0 conf|        log 127.0.0.1:36195 local0
    **** h1    0.0 conf|
    **** h1    0.0 conf|    defaults
    **** h1    0.0 conf|        log global
    **** h1    0.0 conf|        timeout connect 3000
    **** h1    0.0 conf|        timeout client 5
    **** h1    0.0 conf|        timeout server  10000
    **** h1    0.0 conf|
    **** h1    0.0 conf|    frontend fe1
    **** h1    0.0 conf|        bind "fd@${fe_1}"
    **** h1    0.0 conf|        mode tcp
    **** h1    0.0 conf|        log-format {\"dip\":\"%fi\",\"dport\":\"%fp\",\"c_ip\":\"%ci\",\"c_port\":\"%cp\",\"fe_name\":\"%ft\",\"be_name\":\"%b\",\"s_name\":\"%s\",\"ts\":\"%ts\",\"bytes_read\":\"%B\"}
    **** h1    0.0 conf|        default_backend    be_app
    **** h1    0.0 conf|
    **** h1    0.0 conf|    backend be_app
    **** h1    0.0 conf|        server app1 127.0.0.1:53384 check
    **   h1    0.0 haproxy_start
    **** h1    0.0 opt_worker 0 opt_daemon 0 opt_check_mode 0
    **** h1    0.0 argv|exec /home/fred/src/haproxy/haproxy -d  -f /tmp/vtc.12696.186b28b0/h1/cfg
    **** h1    0.0 XXX 9 @277
    ***  h1    0.0 PID: 12728
    **** h1    0.0 macro def h1_pid=12728
    **** h1    0.0 macro def h1_name=/tmp/vtc.12696.186b28b0/h1
    **   top   0.0 === client c1 -connect ${h1_fe_1_sock} {
    **   c1    0.0 Starting client
    **   c1    0.0 Waiting for client
    ***  c1    0.0 Connect to ::1 39264
    ***  c1    0.0 connected fd 8 from ::1 41245 to ::1 39264
    **   c1    0.0 === txreq -url "/"
    **** c1    0.0 txreq|GET / HTTP/1.1\r
    **** c1    0.0 txreq|Host: 127.0.0.1\r
    **** c1    0.0 txreq|\r
    **   c1    0.0 === delay 0.02
    ***  c1    0.0 delaying 0.02 second(s)
    ***  h1    0.0 debug|Note: setting global.maxconn to 2000.
    ***  h1    0.0 debug|Available polling systems :
    ***  h1    0.0 debug|      epoll : pref=300,
    ***  h1    0.0 debug| test result OK
    ***  h1    0.0 debug|       poll : pref=200,  test result OK
    ***  h1    0.0 debug|     select : pref=150,  test result FAILED
    ***  h1    0.0 debug|Total: 3 (2 usable), will use epoll.
    ***  h1    0.0 debug|
    ***  h1    0.0 debug|Available filters :
    ***  h1    0.0 debug|\t[SPOE] spoe
    ***  h1    0.0 debug|\t[COMP] compression
    ***  h1    0.0 debug|\t[TRACE] trace
    ***  h1    0.0 debug|Using epoll() as the polling mechanism.
    **** Slg_1  0.0 syslog|<133>Jun  7 14:10:18 haproxy[12728]: Proxy fe1 started.
    **   Slg_1  0.0 === recv
    **** Slg_1  0.0 syslog|<133>Jun  7 14:10:18 haproxy[12728]: Proxy be_app started.
    **   Slg_1  0.0 === recv info
    ***  h1    0.0 debug|00000000:fe1.accept(0007)=000c from [::1:41245] ALPN=<none>
    ***  s1    0.0 accepted fd 6 127.0.0.1 49946
    **   s1    0.0 === rxreq
    **** s1    0.0 rxhdr|GET / HTTP/1.1\r
    **** s1    0.0 rxhdr|Host: 127.0.0.1\r
    **** s1    0.0 rxhdr|\r
    **** s1    0.0 rxhdrlen = 35
    **** s1    0.0 http[ 0] |GET
    **** s1    0.0 http[ 1] |/
    **** s1    0.0 http[ 2] |HTTP/1.1
    **** s1    0.0 http[ 3] |Host: 127.0.0.1
    **** s1    0.0 bodylen = 0
    **   s1    0.0 === txresp
    **** s1    0.0 txresp|HTTP/1.1 200 OK\r
    **** s1    0.0 txresp|Content-Length: 0\r
    **** s1    0.0 txresp|\r
    ***  s1    0.0 shutting fd 6
    **   s1    0.0 Ending
    ***  h1    0.0 debug|00000000:be_app.srvcls[000c:adfd]
    ***  h1    0.0 debug|00000000:be_app.clicls[000c:adfd]
    ***  h1    0.0 debug|00000000:be_app.closed[000c:adfd]
    **** Slg_1  0.0 syslog|<134>Jun  7 14:10:18 haproxy[12728]: {"dip":"::1","dport":"39264","c_ip":"::1","c_port":"41245","fe_name":"fe1","be_name":"be_app","s_name":"app1","ts":"cD","bytes_read":"38"}
    **   Slg_1  0.0 === expect ~ \"dip\":\"${h1_fe_1_addr}\",\"dport\":\"${h1_fe_1_p...
    **** Slg_1  0.0 EXPECT MATCH ~ "\"dip\":\"::1\",\"dport\":\"39264.*\"ts\":\"cD\",\""
    ***  Slg_1  0.0 shutting fd 5
    **   Slg_1  0.0 Ending
    ***  c1    0.0 closing fd 8
    **   c1    0.0 Ending
    **   top   0.0 === syslog Slg_1 -wait
    **   Slg_1  0.0 Waiting for syslog server (-1)
    *    top   0.0 RESETTING after /home/fred/src/varnish-cache-haproxy/d02286d.vtc
    **   h1    0.0 Reset and free h1 haproxy 12728
    **   h1    0.0 Wait
    **   h1    0.0 Stop HAproxy pid=12728
    **** h1    0.0 Kill(2)=0: Success
    **** h1    0.0 STDOUT poll 0x10
    **   h1    0.1 WAIT4 pid=12728 status=0x0002 (user 0.000000 sys 0.004000)
    **   s1    0.1 Waiting for server (4/-1)
    *    top   0.1 TEST /home/fred/src/varnish-cache-haproxy/d02286d.vtc completed
    #    top  TEST /home/fred/src/varnish-cache-haproxy/d02286d.vtc passed (0.128)

In this latter execution the third syslog message is correct:

    **** Slg_1  0.0 syslog|<134>Jun  7 14:10:18 haproxy[12728]: {"dip":"::1","dport":"39264","c_ip":"::1","c_port":"41245","fe_name":"fe1","be_name":"be_app","s_name":"app1","ts":"cD","bytes_read":"38"}
