---
 bin/varnishtest/tests/m00022.vtc | 55 ++++++++++++++++++++++++++++++++++++++++
 lib/libvmod_debug/vmod.vcc       |  4 +++
 lib/libvmod_debug/vmod_debug.c   | 16 ++++++++++++
 3 files changed, 75 insertions(+)
 create mode 100644 bin/varnishtest/tests/m00022.vtc

diff --git a/bin/varnishtest/tests/m00022.vtc b/bin/varnishtest/tests/m00022.vtc
new file mode 100644
index 0000000..0fd318d
--- /dev/null
+++ b/bin/varnishtest/tests/m00022.vtc
@@ -0,0 +1,55 @@
+varnishtest "VCL initialization failures from VCL/vmod"
+
+server s1 {
+} -start
+
+# Doing debug.failinit(1) will cause the debug vmod to return failure
+# from it's init routine in subsequent initializations. Start varnish
+# with a VCL that lets us set failinit later.
+varnish v1 -vcl {
+       backend default {
+               .host = "${s1_addr}";
+               .port = "${s1_port}";
+       }
+
+       import ${vmod_debug};
+
+       sub vcl_recv {
+               if (req.url == "/failinit") {
+                       debug.set_failinit(1);
+                       return (synth (200, "Failing"));
+               } else {
+                       return (synth (404));
+               }
+       }
+} -start
+
+# Check that we can fail the VCL load in vcl_init
+varnish v1 -errvcl "vcl_init{} failed" {
+       backend default {
+               .host = "${s1_addr}";
+               .port = "${s1_port}";
+       }
+
+       sub vcl_init {
+               return (fail);
+       }
+}
+
+# Make vmod_debug fail on next vmod init
+client c1 {
+       txreq -url /failinit
+       rxresp
+       expect resp.status == 200
+       expect resp.msg == "Failing"
+} -run
+
+# Check that init failures from vmods are caught
+varnish v1 -errvcl {failinit=1} {
+       backend default {
+               .host = "${s1_addr}";
+               .port = "${s1_port}";
+       }
+
+       import ${vmod_debug};
+}
diff --git a/lib/libvmod_debug/vmod.vcc b/lib/libvmod_debug/vmod.vcc
index 434ee78..cbd89a8 100644
--- a/lib/libvmod_debug/vmod.vcc
+++ b/lib/libvmod_debug/vmod.vcc
@@ -39,6 +39,10 @@ $Function VOID panic(STRING_LIST)
 
 Don't.
 
+$Function VOID set_failinit(INT)
+
+If set non-zero, the vmod initialization function will return failure.
+
 $Function STRING author(ENUM { phk, des, kristian, mithrandir } person="phk")
 
 Test function for ENUM arguments
diff --git a/lib/libvmod_debug/vmod_debug.c b/lib/libvmod_debug/vmod_debug.c
index 38a8f68..519f0cd 100644
--- a/lib/libvmod_debug/vmod_debug.c
+++ b/lib/libvmod_debug/vmod_debug.c
@@ -43,6 +43,8 @@ struct priv_vcl {
        uintptr_t               exp_cb;
 };
 
+static int failinit = 0;
+
 VCL_VOID __match_proto__(td_debug_panic)
 vmod_panic(VRT_CTX, const char *str, ...)
 {
@@ -56,6 +58,14 @@ vmod_panic(VRT_CTX, const char *str, ...)
        VAS_Fail("VCL", "", 0, b, VAS_VCL);
 }
 
+VCL_VOID __match_proto__(td_debug_set_initfail)
+vmod_set_failinit(VRT_CTX, VCL_INT val)
+{
+
+       (void)ctx;
+       failinit = val;
+}
+
 VCL_STRING __match_proto__(td_debug_author)
 vmod_author(VRT_CTX, VCL_ENUM id)
 {
@@ -249,5 +259,11 @@ init_function(VRT_CTX, struct vmod_priv *priv)
        AN(priv_vcl->foo);
        priv->priv = priv_vcl;
        priv->free = priv_vcl_free;
+
+       if (failinit) {
+               VRT_cliout(ctx, "vmod_debug:init:failinit=%u:", failinit);
+               return (1);
+       }
+
        return (0);
 }
-- 
2.1.4


_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to