REGTESTS: add a test to ensure map-ordering is preserved
authorAurelien DARRAGON <adarragon@haproxy.com>
Mon, 8 Jan 2024 09:25:18 +0000 (10:25 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 11 Jan 2024 09:25:05 +0000 (10:25 +0100)
As shown in "BUG/MINOR: map: list-based matching potential ordering
regression", list-based matching types such as dom are affected by the
order in which elements are loaded from the map.

Since this is historical behavior and existing usages depend on it, we
add a test to prevent future regressions.

(cherry picked from commit 1088f0b969e18ee5a8fe829d2071507ddef0d05e)
Signed-off-by: Willy Tarreau <w@1wt.eu>

reg-tests/http-rules/map_ordering.map [new file with mode: 0644]
reg-tests/http-rules/map_ordering.vtc [new file with mode: 0644]

diff --git a/reg-tests/http-rules/map_ordering.map b/reg-tests/http-rules/map_ordering.map
new file mode 100644 (file)
index 0000000..dcd9529
--- /dev/null
@@ -0,0 +1,4 @@
+# These entries are used for list-based match ordering tests
+first.domain.tld first
+domain.tld domain
+second.domain.tld second
diff --git a/reg-tests/http-rules/map_ordering.vtc b/reg-tests/http-rules/map_ordering.vtc
new file mode 100644 (file)
index 0000000..40da465
--- /dev/null
@@ -0,0 +1,32 @@
+varnishtest "Test list-based matching types ordering"
+feature cmd "$HAPROXY_PROGRAM -cc 'version_atleast(2.5-dev0)'"
+feature ignore_unknown_macro
+
+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 fe1
+    bind "fd@${fe1}"
+
+    # check list ordering using map_dom (list-based match)
+    http-request return hdr dom %[req.hdr(Host),lower,map_dom(${testdir}/map_ordering.map)] if { url_beg /dom }
+} -start
+
+# Check map ordering
+client c1 -connect ${h1_fe1_sock} {
+    # first.domain.tld is above domain.tld so it should match first
+    txreq -url "/dom" -hdr "Host: first.domain.tld"
+    rxresp
+    expect resp.status == 200
+    expect resp.http.dom == "first"
+
+    # second.domain.tld is below domain.tld so domain.tld should match first
+    txreq -url "/dom" -hdr "Host: second.domain.tld"
+    rxresp
+    expect resp.status == 200
+    expect resp.http.dom == "domain"
+} -run