]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
REGTESTS: add a test for "filter-sequence" directive
authorAurelien DARRAGON <adarragon@haproxy.com>
Fri, 3 Apr 2026 08:51:01 +0000 (10:51 +0200)
committerAurelien DARRAGON <adarragon@haproxy.com>
Fri, 3 Apr 2026 10:10:32 +0000 (12:10 +0200)
We add a reg-test, filter_sequence.vtc, with associated lua file
dummy_filters.lua to cover the "filter-sequence" directive and
ensure it is working as expected, both for request and responses
paths.

This regtest will only be effective starting with 3.4-dev0

reg-tests/filters/dummy_filters.lua [new file with mode: 0644]
reg-tests/filters/filter_sequence.vtc [new file with mode: 0644]

diff --git a/reg-tests/filters/dummy_filters.lua b/reg-tests/filters/dummy_filters.lua
new file mode 100644 (file)
index 0000000..af0e594
--- /dev/null
@@ -0,0 +1,46 @@
+FilterA = {}
+FilterA.id = "A filter"
+FilterA.flags = filter.FLT_CFG_FL_HTX
+FilterA.__index =  FilterA
+
+function FilterA:new()
+       local filter = {}
+       setmetatable(filter, FilterA)
+       return filter
+end
+
+function FilterA:start_analyze(txn, chn)
+       if chn:is_resp() then
+               core.Info("FilterA.resp")
+       else
+               core.Info("FilterA.req")
+       end
+end
+
+core.register_filter("FilterA", FilterA, function(flt, args)
+       return flt
+end)
+
+FilterB = {}
+FilterB.id = "A filter"
+FilterB.flags = filter.FLT_CFG_FL_HTX
+FilterB.__index =  FilterB
+
+function FilterB:new()
+       local filter = {}
+       setmetatable(filter, FilterB)
+       return filter
+end
+
+function FilterB:start_analyze(txn, chn)
+       if chn:is_resp() then
+               core.Info("FilterB.resp")
+       else
+               core.Info("FilterB.req")
+       end
+
+end
+
+core.register_filter("FilterB", FilterB, function(flt,args)
+       return flt
+end)
diff --git a/reg-tests/filters/filter_sequence.vtc b/reg-tests/filters/filter_sequence.vtc
new file mode 100644 (file)
index 0000000..22e0c92
--- /dev/null
@@ -0,0 +1,86 @@
+varnishtest "Test filter-sequence feature"
+
+feature cmd "$HAPROXY_PROGRAM -cc 'version_atleast(3.4-dev0)'"
+feature ignore_unknown_macro
+#REQUIRE_OPTIONS=LUA
+
+barrier b1 cond 2 -cyclic
+
+server s1 {
+    rxreq
+    txresp
+} -repeat 2 -start
+
+syslog Slg1 -level info {
+    recv
+    expect ~ ".* haproxy ${h1_pid} .* FilterA.req"
+    recv
+    expect ~ ".* haproxy ${h1_pid} .* FilterB.req"
+    recv
+    expect ~ ".* haproxy ${h1_pid} .* FilterA.resp"
+    recv
+    expect ~ ".* haproxy ${h1_pid} .* FilterB.resp"
+
+    barrier b1 sync
+
+    recv
+    expect ~ ".* haproxy ${h1_pid} .* FilterB.req"
+    recv
+    expect ~ ".* haproxy ${h1_pid} .* FilterA.req"
+    recv
+    expect ~ ".* haproxy ${h1_pid} .* FilterB.resp"
+} -start
+
+haproxy h1 -conf {
+    global
+       tune.lua.bool-sample-conversion normal
+       lua-load ${testdir}/dummy_filters.lua
+       log udp@${Slg1_addr}:${Slg1_port} format rfc5424 local0
+
+     defaults
+       timeout connect "${HAPROXY_TEST_TIMEOUT-5s}"
+       timeout client  "${HAPROXY_TEST_TIMEOUT-5s}"
+       timeout server  "${HAPROXY_TEST_TIMEOUT-5s}"
+
+    listen fe1
+        mode http
+       filter lua.FilterA
+       filter lua.FilterB
+
+        bind "fd@${fe1}"
+
+       # test normal sequence (inherited from filter ordering)
+
+       server app1 ${s1_addr}:${s1_port}
+
+    listen fe2
+        mode http
+       filter lua.FilterA
+       filter lua.FilterB
+
+       # test forced filter-sequence on request
+       filter-sequence request lua.FilterB,lua.FilterA
+       # ignore filterA on response
+       filter-sequence response lua.FilterB
+
+        bind "fd@${fe2}"
+
+       server app1 ${s1_addr}:${s1_port}
+} -start
+
+client c0 -connect ${h1_fe1_sock} {
+    txreq -url "/"
+    rxresp
+    expect resp.status == 200
+} -start -wait
+
+# Wait matching log messages
+barrier b1 sync
+
+client c1 -connect ${h1_fe2_sock} {
+    txreq -url "/"
+    rxresp
+    expect resp.status == 200
+} -start -wait
+
+syslog Slg1 -wait