haproxy/reg-tests/checks/tcp-check_min-recv.vtc
Gaetan Rivet 1afd826ae4 MINOR: checks: add min-recv tcp-check expect option
Some expect rules cannot be satisfied due to inherent ambiguity towards
the received data: in the absence of match, the current behavior is to
be forced to wait either the end of the connection or a buffer full,
whichever comes first. Only then does the matching diagnostic is
considered  conclusive. For instance :

    tcp-check connect
    tcp-check expect !rstring "^error"
    tcp-check expect string "valid"

This check will only succeed if the connection is closed by the server before
the check timeout. Otherwise the first expect rule will wait for more data until
"^error" regex matches or the check expires.

Allow the user to explicitly define an amount of data that will be
considered enough to determine the value of the check.

This allows succeeding on negative rstring rules, as previously
in valid condition no match happened, and the matching was repeated
until the end of the connection. This could timeout the check
while no error was happening.

[Cf: I slighly updated the patch. The parameter was renamed and the value is a
signed integer to support -1 as default value to ignore the parameter.]
2020-04-27 09:39:37 +02:00

70 lines
1.9 KiB
Plaintext

varnishtest "tcp-check negative bounded regex match"
#EXCLUDE_TARGETS=freebsd,osx,generic
#REGTEST_TYPE=slow
#REQUIRE_VERSION=2.2
# This test use a negative expect rule and verify that setting a required
# minimum amount of data to match.
feature ignore_unknown_macro
syslog S1 -level notice {
recv
expect ~ "[^:\\[ ]\\[${h1_pid}\\]: Proxy be1 started."
recv
expect ~ "[^:\\[ ]\\[${h1_pid}\\]: Health check for server be1/srv1 failed, reason: Layer7 timeout.*at step 2 of tcp-check"
} -start
syslog S2 -level notice {
recv
expect ~ "[^:\\[ ]\\[${h1_pid}\\]: Proxy be2 started."
recv
expect ~ "[^:\\[ ]\\[${h1_pid}\\]: Health check for server be2/srv1 succeeded"
} -start
server s1 {
send "valid"
delay 0.2
expect_close
} -start
server s2 {
send "valid"
recv 10
send "valid"
delay 0.2
expect_close
} -start
haproxy h1 -conf {
defaults
mode tcp
timeout connect 200ms
timeout check 500ms
timeout server 5s
timeout client 5s
backend be1
log ${S1_addr}:${S1_port} len 2048 local0
option tcp-check
option log-health-checks
tcp-check connect
tcp-check expect !rstring "^error" comment "negative check"
tcp-check expect string "valid" comment "positive check"
tcp-check send "0123456789"
tcp-check expect string "valid" comment "positive check"
server srv1 ${s1_addr}:${s1_port} check inter 200ms rise 1 fall 1
backend be2
log ${S2_addr}:${S2_port} len 2048 local0
option tcp-check
option log-health-checks
tcp-check connect
tcp-check expect min-recv 5 !rstring "^error" comment "negative check"
tcp-check expect string "valid" comment "positive check"
tcp-check send "0123456789"
tcp-check expect string "valid" comment "positive check"
server srv1 ${s2_addr}:${s2_port} check inter 200ms rise 1 fall 1
} -start
syslog S1 -wait
syslog S2 -wait