haproxy/reg-tests/compression/basic.vtc
Willy Tarreau f673923629 REGTESTS: extend the default I/O timeouts and make them overridable
With the CI occasionally slowing down, we're starting to see again some
spurious failures despite the long 1-second timeouts. This reports false
positives that are disturbing and doesn't provide as much value as this
could. However at this delay it already becomes a pain for developers
to wait for the tests to complete.

This commit adds support for the new environment variable
HAPROXY_TEST_TIMEOUT that will allow anyone to modify the connect,
client and server timeouts. It was set to 5 seconds by default, which
should be plenty for quite some time in the CI. All relevant values
that were 200ms or above were replaced by this one. A few larger
values were left as they are special. One test for the set-timeout
action that used to rely on a fixed 1-sec value was extended to a
fixed 5-sec, as the timeout is normally not reached, but it needs
to be known to compare the old and new values.
2021-11-18 17:57:11 +01:00

379 lines
11 KiB
Plaintext

varnishtest "Basic compression test"
#REQUIRE_VERSION=1.9
#REQUIRE_OPTION=ZLIB|SLZ
feature ignore_unknown_macro
server s1 {
# client c1 - request 1
rxreq
expect req.url == "/c1.1"
expect req.http.accept-encoding == "<undef>"
txresp \
-hdr "Content-Type: text/plain" \
-bodylen 100
# client c1 - request 2
rxreq
expect req.url == "/c1.2"
expect req.http.user-agent == "Mozilla/4"
expect req.http.accept-encoding == "gzip"
txresp \
-hdr "Content-Type: text/plain" \
-bodylen 100
# client c1 - request 3
rxreq
expect req.url == "/c1.3"
expect req.proto == "HTTP/1.0"
expect req.http.accept-encoding == "gzip"
txresp -bodylen 100
# client c1 - request 4
rxreq
expect req.url == "/c1.4"
expect req.http.accept-encoding == "gzip"
txresp \
-proto "HTTP/1.0" \
-hdr "Connection: keep-alive" \
-hdr "Content-Type: text/plain" \
-bodylen 100
# client c1 - request 5
rxreq
expect req.url == "/c1.5"
expect req.method == "HEAD"
expect req.http.accept-encoding == "gzip"
txresp -nolen \
-hdr "Content-Length: 100" \
-hdr "Content-Type: text/plain" \
# client c1 - request 6
rxreq
expect req.url == "/c1.6"
expect req.http.accept-encoding == "gzip"
txresp \
-status 400 \
-hdr "Content-Type: text/plain" \
-bodylen 100
# client c1 - request 7
rxreq
expect req.url == "/c1.7"
expect req.http.accept-encoding == "gzip"
txresp \
-hdr "Content-Type: text/plain" \
-hdr "Content-Encoding: something" \
-body "FOO"
# client c1 - request 8
rxreq
expect req.url == "/c1.8"
expect req.http.accept-encoding == "gzip"
txresp \
-hdr "Content-Type: text/plain" \
-hdr "Cache-Control: no-transform" \
-bodylen 100
# client c1 - request 9
rxreq
expect req.url == "/c1.9"
expect req.http.accept-encoding == "gzip"
txresp \
-hdr "Content-Type: text/css" \
-bodylen 100
# client c1 - request 10
rxreq
expect req.url == "/c1.10"
expect req.http.accept-encoding == "gzip"
txresp \
-hdr "Content-Type: multipart/mixed; boundary=\"aaa\"" \
-bodylen 100
# Close the connection with HAProxy and wait for a new one
# (C1 has finished and C2 will start)
accept
# client c2 - request 1
rxreq
expect req.url == "/c2.1"
expect req.http.accept-encoding == "gzip"
txresp \
-hdr "Content-Type: text/plain" \
-bodylen 100
# client c2 - request 2
rxreq
expect req.url == "/c2.2"
expect req.http.accept-encoding == "gzip"
txresp -nolen \
-hdr "Content-Type: text/plain" \
-hdr "Transfer-Encoding: chunked"
chunkedlen 1
chunkedlen 1
chunkedlen 2
chunkedlen 3
chunkedlen 5
chunkedlen 8
chunkedlen 13
chunkedlen 21
chunkedlen 34
chunkedlen 55
chunkedlen 89
chunkedlen 144
chunkedlen 233
chunkedlen 0
# Close the connection with HAProxy and wait for a new one
# (C2 has finished and C3 will start)
accept
# client c3 - request 1
rxreq
expect req.url == "/c3.1"
expect req.http.accept-encoding == "<undef>"
txresp \
-hdr "Content-Type: text/plain" \
-bodylen 50000
# client c3 - request 2
rxreq
expect req.url == "/c3.2"
expect req.http.accept-encoding == "<undef>"
txresp -nolen \
-hdr "Content-Type: text/plain" \
-hdr "Transfer-Encoding: chunked"
chunkedlen 1000
chunkedlen 1000
chunkedlen 1000
chunkedlen 1000
chunkedlen 1000
chunkedlen 5000
chunkedlen 10000
chunkedlen 30000
chunkedlen 0
# Close the connection with HAProxy and wait for a new one
# (C3 has finished and C4 will start)
accept
# client c4 - request 1
rxreq
expect req.url == "/c4.1"
expect req.http.accept-encoding == "<undef>"
txresp \
-hdr "Content-Type: text/plain" \
-bodylen 100
# client c4 - request 2
rxreq
expect req.url == "/c4.2"
expect req.http.accept-encoding == "<undef>"
txresp \
-hdr "Content-Type: text/plain" \
-bodylen 100
} -start
haproxy h1 -conf {
defaults
mode http
timeout connect "${HAPROXY_TEST_TIMEOUT-5s}"
timeout client "${HAPROXY_TEST_TIMEOUT-5s}"
timeout server "${HAPROXY_TEST_TIMEOUT-5s}"
frontend fe-gzip
bind "fd@${fe_gzip}"
default_backend be-gzip
frontend fe-identity
bind "fd@${fe_identity}"
default_backend be-identity
frontend fe-gzip-deflate
bind "fd@${fe_gzip_deflate}"
default_backend be-gzip-defalte
backend be-gzip
compression algo gzip
compression type text/html text/plain
server www ${s1_addr}:${s1_port}
backend be-identity
compression algo identity
server www ${s1_addr}:${s1_port}
backend be-gzip-defalte
compression algo gzip deflate
compression offload
server www ${s1_addr}:${s1_port}
} -start
# No compression expected because not supported by the client or because
# something in the request or response headers forbids it.
client c1 -connect ${h1_fe_gzip_sock} {
# 1. no "Accept-Encoding header"
txreq -url "/c1.1"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
expect resp.bodylen == 100
# 2. Buggy User-Agent
txreq -url "/c1.2" \
-hdr "Accept-Encoding: gzip" \
-hdr "User-Agent: Mozilla/4"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
expect resp.bodylen == 100
# 3. HTTP/1.0 request
txreq -url "/c1.3" \
-proto "HTTP/1.0" \
-hdr "Accept-Encoding: gzip" \
-hdr "Connection: keep-alive"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
expect resp.bodylen == 100
# 4. HTTP/1.0 response
txreq -url "/c1.4" \
-hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.proto == "HTTP/1.0"
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
expect resp.bodylen == 100
# 5. HEAD method
txreq -req "HEAD" -url "/c1.5" \
-hdr "Accept-Encoding: gzip"
rxresp -no_obj
expect resp.status == 200
expect resp.http.content-length == "100"
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
# 6. Response status code != 20[0-3]
txreq -url "/c1.6" \
-hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 400
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
expect resp.bodylen == 100
# 7. Response alerady compressed by the server (with "Accept-Encoding")
txreq -url "/c1.7" \
-hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "something"
expect resp.http.transfer-encoding == "<undef>"
expect resp.bodylen == 3
expect resp.body == "FOO"
# 8. Response with "Cache-Control: no-transform"
txreq -url "/c1.8" \
-hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
expect resp.http.cache-control == "no-transform"
expect resp.bodylen == 100
# 9. Response with uncompressable content-type
txreq -url "/c1.9" \
-hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
expect resp.http.content-type == "text/css"
expect resp.bodylen == 100
# 10. Response with uncompressable content-type
txreq -url "/c1.10" \
-hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "<undef>"
expect resp.http.content-type == "multipart/mixed; boundary=\"aaa\""
expect resp.bodylen == 100
} -run
# GZIP Compression expected (small body)
client c2 -connect ${h1_fe_gzip_sock} {
# 1. response from the server with a small body with a C-L
txreq -url "/c2.1" \
-hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.http.transfer-encoding == "chunked"
gunzip
expect resp.bodylen == 100
# 2. response from the server with a small chunked body
txreq -url "/c2.2" \
-hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.http.transfer-encoding == "chunked"
gunzip
expect resp.bodylen == 609
} -run
# Identity compression expect (Huge body)
# Identity is used because of a limitation of vtest (the uncompressed body size
# must be lower than 10 times of the compressed one)
client c3 -connect ${h1_fe_identity_sock} {
# 1. response from the server with a huge body with a C-L
txreq -url "/c3.1"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "chunked"
expect resp.bodylen == 50000
# 2. response from the server with a huge chunked body
txreq -url "/c3.2"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.http.transfer-encoding == "chunked"
expect resp.bodylen == 50000
} -run
# Compression expected with priority
client c4 -connect ${h1_fe_gzip_deflate_sock} {
# 1. response from the server with a small body with a C-L
txreq -url "/c4.1" \
-hdr "Accept-Encoding: *;q=0, gzip;q=0.750, deflate;q=0.500"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.http.transfer-encoding == "chunked"
# 2. response from the server with a small body with a C-L
txreq -url "/c4.2" \
-hdr "Accept-Encoding: *;q=0, gzip;q=0.500, deflate;q=0.750"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "deflate"
expect resp.http.transfer-encoding == "chunked"
} -run