varnishtest "A test for the abortonclose option (H1 only)"
feature ignore_unknown_macro

# NOTE : This test may fail if too many vtest are running in parallel because
#        the port reserved for closed s1 server may be reused by another vtest

#REQUIRE_VERSION=2.2
#REGTEST_TYPE=slow

# b0 : Wait s1 was detected as DOWN to be sure it is stopped
# b1 : Don't send /c4 before /c3 was received by s2 server
# b2 : Used to receive syslog messages in the right order
# b3 : finish c3 before s2

barrier b0 cond 3 -cyclic
barrier b1 cond 2 -cyclic
barrier b2 cond 2 -cyclic
barrier b3 cond 2 -cyclic

server s1 {
} -start
server s1 -break

server s2 {
    rxreq

    # unlock c4
    barrier b1 sync

    # wait end of c3
    barrier b3 sync

    expect_close
} -start

syslog S1 -level info {
    recv alert
    expect ~ "[^:\\[ ]*\\[[0-9]*\\]: Server check/srv1 is DOWN.*"
    barrier b0 sync

    recv
    expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe1 be1_1/srv1 [0-9]*/[0-9]*/-1/-1/[0-9]* 503 .* - - SC-- .* .* \"GET /c1 HTTP/1\\.1\""
    barrier b2 sync
    recv
    expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe1 be1_2/srv1 [0-9]*/[0-9]*/-1/-1/[0-9]* 503 .* - - CC-- .* .* \"GET /c2 HTTP/1\\.1\""
    barrier b2 sync
    recv
    expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe2 be2/<NOSRV> [0-9]*/[0-9]*/-1/-1/[0-9]* 503 .* - - CQ-- .* .* \"GET /c4 HTTP/1\\.1\""
    barrier b2 sync
    recv
    expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe2 be2/srv1 [0-9]*/[0-9]*/[0-9]*/-1/[0-9]* 400 .* - - CH-- .* .* \"GET /c3 HTTP/1\\.1\""
} -start

syslog S2 -level info {
    recv alert
    expect ~ "[^:\\[ ]*\\[[0-9]*\\]: Server check/srv1 is DOWN.*"
    barrier b0 sync

    recv
    expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe1 be1/srv1 [0-9]*/[0-9]*/-1/-1/[0-9]* 503 .* - - CC-- .* .* \"GET /c5 HTTP/1\\.1\""
    barrier b2 sync
    recv
    expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe2 be2/srv1 [0-9]*/[0-9]*/-1/-1/[0-9]* 503 .* - - SC-- .* .* \"GET /c6 HTTP/1\\.1\""
} -start

haproxy h1 -conf {
    global
        # WT: limit false-positives causing "HTTP header incomplete" due to
        # idle server connections being randomly used and randomly expiring
        # under us.
        tune.idle-pool.shared off

    defaults
        mode http
        ${no-htx} option http-use-htx
        option abortonclose
        retries 3
        timeout client  10s
        timeout server  10s
        timeout connect 100ms
        timeout queue   5s

    frontend fe1
        option httplog
        log ${S1_addr}:${S1_port} local0 debug err
        bind "fd@${fe1}"
        use_backend be1_1 if { path /c1 }
        use_backend be1_2 if { path /c2 }

    frontend fe2
        option httplog
        log ${S1_addr}:${S1_port} local0 debug err
        bind "fd@${fe2}"
        use_backend be2

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

    backend be1_2
        timeout connect 1s
        retries 10
        server srv1 ${s1_addr}:${s1_port}

    backend be2
        server srv1 ${s2_addr}:${s2_port} maxconn 1

    backend check
        server srv1 ${s1_addr}:${s1_port} check
        log ${S1_addr}:${S1_port} local0 debug alert
} -start


haproxy h2 -conf {
    global
        # WT: limit false-positives causing "HTTP header incomplete" due to
        # idle server connections being randomly used and randomly expiring
        # under us.
        tune.idle-pool.shared off

    defaults
        mode http
        retries 1
        timeout client  10s
        timeout server  10s
        timeout connect 100ms
        timeout queue   5s

    frontend fe1
        option httplog
        log ${S2_addr}:${S2_port} local0 debug err
        bind "fd@${fe1}"
        use_backend be1

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

    defaults
        mode http
        option abortonclose
        retries 1
        timeout client  10s
        timeout server  10s
        timeout connect 100ms
        timeout queue   5s

    frontend fe2
        option httplog
        log ${S2_addr}:${S2_port} local0 debug err
        bind "fd@${fe2}"
        use_backend be2

    backend be2
        no option abortonclose
        server srv1 ${s1_addr}:${s1_port}

    backend check
        server srv1 ${s1_addr}:${s1_port} check
        log ${S2_addr}:${S2_port} local0 debug alert
} -start


# Wait s1 was detected as DOWN
barrier b0 sync

# No server, wait all connection retries : SC--
client  c1 -connect ${h1_fe1_sock} {
    txreq -url /c1
    rxresp
    expect resp.status == 503
} -run

# Wait c1 log entry
barrier b2 sync

# No server, abort during connections retries : CC--
client  c2 -connect ${h1_fe1_sock} {
    txreq -url /c2
} -run

# Wait c2 log entry
barrier b2 sync

# server with maxconn=1, abort waiting the server reply : CH--
client  c3 -connect ${h1_fe2_sock} {
    txreq -url /c3

    # Wait c4 log entry
    barrier b2 sync
} -start

# server with maxconn=1, abort waiting in the queue (c3 still attached) : CQ--
client  c4 -connect ${h1_fe2_sock} {
    # Wait s2 receives c3 request
    barrier b1 sync

    txreq -url /c4
    delay .2
} -run

client c3 -wait

# unlock s2
barrier b3 sync

syslog S1 -wait


# No server, abort during connections retries : CC--
# abortonclose on backend only
client  c5 -connect ${h2_fe1_sock} {
    txreq -url /c5
} -run

# Wait c5 log entry
barrier b2 sync

# No server, wait all connection retries : SC--
# abortonclose in defaults section but disabled by backend
client  c6 -connect ${h2_fe2_sock} {
    txreq -url /c6
    rxresp
    expect resp.status == 503
} -run


syslog S2 -wait
