[master] dcdb250 Add a setenv command to varnishtest

Dag Haavi Finstad daghf at varnish-software.com
Mon Feb 27 10:27:05 CET 2017


commit dcdb2504e5c0607022328ef21eaebebe89c33e41
Author: Dag Haavi Finstad <daghf at varnish-software.com>
Date:   Fri Feb 17 16:34:13 2017 +0100

    Add a setenv command to varnishtest
    
    This lets you set or change environment variables in a test case.
    
    Usage is
    
        setenv FOO "bar baz"
    
    The above will set the environment variable $FOO to the value
    provided. There is also an ``-ifunset`` argument which will only set the
    value if the the environment variable does not already exist:
    
        setenv -ifunset FOO quux
    
    The ifunset argument corresponds to passing zero as the third argument
    to setenv(3).

diff --git a/bin/varnishtest/tests/m00028.vtc b/bin/varnishtest/tests/m00028.vtc
new file mode 100644
index 0000000..8d6c1a0
--- /dev/null
+++ b/bin/varnishtest/tests/m00028.vtc
@@ -0,0 +1,73 @@
+varnishtest "Test setenv"
+
+setenv FOO "BAR BAZ"
+
+varnish v1 -vcl {
+	import std from "${topbuild}/lib/libvmod_std/.libs/";
+
+	backend dummy { .host = "${bad_ip}"; .port = "9080"; }
+
+	sub vcl_recv {
+		return(synth(200));
+	}
+
+	sub vcl_synth {
+		set resp.http.X-FOO = std.getenv("FOO");
+	}
+} -start
+
+client c1 {
+	txreq
+	rxresp
+	expect resp.http.X-FOO == "BAR BAZ"
+} -run
+
+varnish v1 -stop
+
+setenv -ifunset FOO QUUX
+
+varnish v2 -vcl {
+	import std from "${topbuild}/lib/libvmod_std/.libs/";
+
+	backend dummy { .host = "${bad_ip}"; .port = "9080"; }
+
+	sub vcl_recv {
+		return(synth(200));
+	}
+
+	sub vcl_synth {
+		set resp.http.X-FOO = std.getenv("FOO");
+	}
+} -start
+
+client c2 -connect ${v2_sock} {
+	txreq
+	rxresp
+	expect resp.http.X-FOO == "BAR BAZ"
+} -run
+
+varnish v2 -stop
+
+setenv FOO QUUX
+
+varnish v3 -vcl {
+	import std from "${topbuild}/lib/libvmod_std/.libs/";
+
+	backend dummy { .host = "${bad_ip}"; .port = "9080"; }
+
+	sub vcl_recv {
+		return(synth(200));
+	}
+
+	sub vcl_synth {
+		set resp.http.X-FOO = std.getenv("FOO");
+	}
+} -start
+
+client c3 -connect ${v3_sock} {
+	txreq
+	rxresp
+	expect resp.http.X-FOO == "QUUX"
+} -run
+
+varnish v2 -stop
diff --git a/bin/varnishtest/vtc.c b/bin/varnishtest/vtc.c
index 7ec5caf..cf5e051 100644
--- a/bin/varnishtest/vtc.c
+++ b/bin/varnishtest/vtc.c
@@ -594,6 +594,47 @@ cmd_err_shell(CMD_ARGS)
 	cmd_shell_engine(vl, -1, av[2], av[1], NULL);
 }
 
+/* SECTION: setenv setenv
+ *
+ * Set or change an environment variable::
+ *
+ *         setenv FOO "bar baz"
+ *
+ * The above will set the environment variable $FOO to the value
+ * provided. There is also an ``-ifunset`` argument which will only
+ * set the value if the the environment variable does not already
+ * exist::
+ *
+ *        setenv -ifunset FOO quux
+ */
+static void
+cmd_setenv(CMD_ARGS)
+{
+	int r;
+	int force;
+
+	(void)priv;
+	(void)cmd;
+
+	if (av == NULL)
+		return;
+	AN(av[1]);
+	AN(av[2]);
+
+	force = 1;
+	if (strcmp("-ifunset", av[1]) == 0) {
+		force = 0;
+		av++;
+		AN(av[2]);
+	}
+	if (av[3] != NULL)
+		vtc_log(vl, 0, "CMD setenv: Unexpected argument '%s'", av[3]);
+	r = setenv(av[1], av[2], force);
+	if (r != 0)
+		vtc_log(vl, 0, "CMD setenv %s=\"%s\" failed: %s",
+		    av[1], av[2], strerror(errno));
+}
+
 /* SECTION: delay delay
  *
  * Sleep for the number of seconds specified in the argument. The number
@@ -744,6 +785,7 @@ static const struct cmds cmds[] = {
 	CMD(feature)
 	CMD(logexpect)
 	CMD(process)
+	CMD(setenv)
 #undef CMD
 	{ NULL, NULL }
 };



More information about the varnish-commit mailing list