#!/bin/bash
# released under ASL 2.0
. ${srcdir:=.}/diag.sh init
generate_conf
add_conf '
module(load="../plugins/imtcp/.libs/imtcp")
input(type="imtcp" address="127.0.0.1" port="0" listenPortFileName="'$RSYSLOG_DYNNAME'.tcpflood_port")
template(name="outfmt" type="string" string="%$!%\n")
template(name="outlocal" type="string" string="%$.%\n")

if $msg contains "msgnum" then {
  set $.ret = parse_json("{\"offsets\": [ { \"a\": 9, \"b\": 0, \"c\": \"boo\", \"d\": null },\
                                         { \"a\": 9, \"b\": 3, \"c\": null, \"d\": null },\
                                         2, 3, 4, 5, 6, 7, 8, 9 ],\
                                         \"booltest\": true,\
                                         \"int64\": 1234567890,\
                                         \"nulltest\": null,\
                                         \"double\": 12345.67890,\
                                         \"foo\": 3, \"bar\": 28 }", "\$!parsed");

	if $.ret == 0 then {
		# set up some locals
		set $!foo!bar = 3;
		set $.index = "1";
		set $.test = "a";

		# evaluate
		set $.res1 = get_property($!parsed!offsets, $.index);
		set $.res2 = get_property($!parsed!offsets[1], $.test);
		reset $.test = "bar";
		set $.res3 = get_property($!foo, $.test);
		reset $.index = 12;
		set $.res4 = get_property($!parsed!offsets, $.index);
		set $.key = "test";
		set $.res5 = get_property($., $.key);
		reset $.key = "foo";
		set $.res6 = get_property($!, $.key);
		set $.res7 = get_property($!foo, "bar");
		reset $.key = "ar";
		set $.res8 = get_property($!foo, "b" & $.key);
		set $.res9 = get_property($!foo!bar, "");
		reset $.key = "";
		set $.res10 = get_property($!foo!bar, $.key);
		set $.res11 = get_property($!parsed!booltest, "");
		reset $.key = "int64";
		set $.res12 = get_property($!parsed, $.key);
		reset $.key = "nulltest";
		set $.res13 = get_property($!parsed, $.key);
		reset $.key = "double";
		set $.res14 = get_property($!parsed, $.key);
		set $.res15 = get_property($msg, "");
		set $.res16 = get_property("string literal", "");
		reset $.index = 9;
		set $.res17 = get_property($!parsed!offsets, $.index);

		# output result
		unset $.key;
		action(type="omfile" file=`echo $RSYSLOG_OUT_LOG` template="outfmt")
		action(type="omfile" file=`echo $RSYSLOG_OUT_LOG` template="outlocal")
	}
}
'

startup
injectmsg 0 1
shutdown_when_empty
wait_shutdown

EXPECTED='{ "parsed": { "offsets": [ { "a": 9, "b": 0, "c": "boo", "d": null }, { "a": 9, "b": 3, "c": null, "d": null }, 2, 3, 4, 5, 6, 7, 8, 9 ], "booltest": true, "int64": 1234567890, "nulltest": null, "double": 12345.67890, "foo": 3, "bar": 28 }, "foo": { "bar": 3 } }
{ "ret": 0, "index": 9, "test": "bar", "res1": { "a": 9, "b": 3, "c": null, "d": null }, "res2": 9, "res3": 3, "res4": "", "res5": "bar", "res6": { "bar": 3 }, "res7": 3, "res8": 3, "res9": 3, "res10": 3, "res11": 1, "res12": 1234567890, "res13": "", "res14": 12345.678900000001, "res15": " msgnum:00000000:", "res16": "", "res17": 9 }'
cmp_exact

exit_test
