From 7d6c8d7224dbe7eaac16b59403e05e5267241aeb Mon Sep 17 00:00:00 2001 From: Arne Welzel Date: Wed, 30 Aug 2023 20:34:38 +0200 Subject: [PATCH] testing/btest: Un-deferred record initalization tests These baselines should align with what Zeek 5.2 or before did. --- .../Baseline/core.record-field-defer-2/output | 9 + .../Baseline/core.record-field-defer-3/output | 8 + .../Baseline/core.record-field-defer-4/output | 11 ++ .../output | 14 ++ .../core.record-field-defer-parse-time/output | 8 + .../core.record-field-defer-table-2/output | 13 ++ .../core.record-field-defer-table-3/output | 13 ++ .../core.record-field-defer-table/output | 13 ++ .../Baseline/core.record-field-defer/output | 8 + .../record-field-defer-parse-time-nested.zeek | 50 +++++ .../core/record-field-defer-parse-time.zeek | 31 ++++ .../btest/core/record-field-defer-table.zeek | 115 ++++++++++++ testing/btest/core/record-field-defer.zeek | 175 ++++++++++++++++++ 13 files changed, 468 insertions(+) create mode 100644 testing/btest/Baseline/core.record-field-defer-2/output create mode 100644 testing/btest/Baseline/core.record-field-defer-3/output create mode 100644 testing/btest/Baseline/core.record-field-defer-4/output create mode 100644 testing/btest/Baseline/core.record-field-defer-parse-time-nested/output create mode 100644 testing/btest/Baseline/core.record-field-defer-parse-time/output create mode 100644 testing/btest/Baseline/core.record-field-defer-table-2/output create mode 100644 testing/btest/Baseline/core.record-field-defer-table-3/output create mode 100644 testing/btest/Baseline/core.record-field-defer-table/output create mode 100644 testing/btest/Baseline/core.record-field-defer/output create mode 100644 testing/btest/core/record-field-defer-parse-time-nested.zeek create mode 100644 testing/btest/core/record-field-defer-parse-time.zeek create mode 100644 testing/btest/core/record-field-defer-table.zeek create mode 100644 testing/btest/core/record-field-defer.zeek diff --git a/testing/btest/Baseline/core.record-field-defer-2/output b/testing/btest/Baseline/core.record-field-defer-2/output new file mode 100644 index 0000000000..4b67cde896 --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer-2/output @@ -0,0 +1,9 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, new_connection, CHhAvVGS1DHFjwGM9, 1362692526.869344 +1, my_network_time() called, 1362692526.869344 +2, my_network_time() called, 1362692526.869344 +3, my_network_time() called, 1362692526.869344 +3, new_connection done +3, connection_state_remove, CHhAvVGS1DHFjwGM9, 1362692527.080972 +3, state, CHhAvVGS1DHFjwGM9, [ts=1362692526.869344, inner=[ts=1362692526.869344, ts_other=1362692526.869344]] +3, connection_state_remove done diff --git a/testing/btest/Baseline/core.record-field-defer-3/output b/testing/btest/Baseline/core.record-field-defer-3/output new file mode 100644 index 0000000000..ff2f6a885c --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer-3/output @@ -0,0 +1,8 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, new_connection, CHhAvVGS1DHFjwGM9, 1362692526.869344 +1, my_network_time() called, 1362692526.869344 +2, my_network_time() called, 1362692526.869344 +2, new_connection done +2, connection_state_remove, CHhAvVGS1DHFjwGM9, 1362692527.080972 +2, state, CHhAvVGS1DHFjwGM9, [ts=1362692526.869344, inner=[ts=1362692526.869344]] +2, connection_state_remove done diff --git a/testing/btest/Baseline/core.record-field-defer-4/output b/testing/btest/Baseline/core.record-field-defer-4/output new file mode 100644 index 0000000000..f33a29d323 --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer-4/output @@ -0,0 +1,11 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, new_connection, CHhAvVGS1DHFjwGM9, 1362692526.869344 +1, my_network_time() called, 1362692526.869344 +2, my_network_time() called, 1362692526.869344 +3, my_network_time() called, 1362692526.869344 +4, my_network_time() called, 1362692526.869344 +5, my_network_time() called, 1362692526.869344 +5, new_connection done +5, connection_state_remove, CHhAvVGS1DHFjwGM9, 1362692527.080972 +5, state, CHhAvVGS1DHFjwGM9, [ts=1362692526.869344, inner=[ts=1362692526.869344, ts_other=1362692526.869344], inner_other=[ts=1362692526.869344, ts_other=1362692526.869344]] +5, connection_state_remove done diff --git a/testing/btest/Baseline/core.record-field-defer-parse-time-nested/output b/testing/btest/Baseline/core.record-field-defer-parse-time-nested/output new file mode 100644 index 0000000000..de2d2ca2cb --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer-parse-time-nested/output @@ -0,0 +1,14 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, my_seq() +1, my_seq() +2, my_seq() +3, my_seq() +4, my_seq() +5, my_seq() +6, my_seq() +7, my_seq() +8, printing +8, s1, [seq=1, inner=[inner_most=[seq=3], seq=7]] +8, s2, [seq=2, inner=[inner_most=[seq=4], seq=8]] +8, os1, [inner_most=[seq=5]] +8, os2, [inner_most=[seq=6]] diff --git a/testing/btest/Baseline/core.record-field-defer-parse-time/output b/testing/btest/Baseline/core.record-field-defer-parse-time/output new file mode 100644 index 0000000000..1f3516eacb --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer-parse-time/output @@ -0,0 +1,8 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, my_seq() +1, my_seq() +2, my_seq() +3, my_seq() +4, printing +4, s1, [seq=1, inner=[seq=3]] +4, s2, [seq=2, inner=[seq=4]] diff --git a/testing/btest/Baseline/core.record-field-defer-table-2/output b/testing/btest/Baseline/core.record-field-defer-table-2/output new file mode 100644 index 0000000000..f13a92c173 --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer-table-2/output @@ -0,0 +1,13 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, my_seq() +1, my_seq() +2, my_seq() +3, my_seq() +4, printing +4, s1, [seq=1, inner=[seq=3]] +4, s2, [seq=2, inner=[seq=4]] +4, tbl, { +[[seq=2, inner=[seq=4]]] = [seq=2, inner=[seq=4]], +[[seq=1, inner=[seq=3]]] = [seq=1, inner=[seq=3]] +} +4, done diff --git a/testing/btest/Baseline/core.record-field-defer-table-3/output b/testing/btest/Baseline/core.record-field-defer-table-3/output new file mode 100644 index 0000000000..0deb63dc6a --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer-table-3/output @@ -0,0 +1,13 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, my_seq() +1, my_seq() +2, my_seq() +3, my_seq() +4, printing +4, s1, [seq=1, inner=[seq=2]] +4, s2, [seq=3, inner=[seq=4]] +4, tbl, { +[[seq=1, inner=[seq=2]]] = [seq=1, inner=[seq=2]], +[[seq=3, inner=[seq=4]]] = [seq=3, inner=[seq=4]] +} +4, done diff --git a/testing/btest/Baseline/core.record-field-defer-table/output b/testing/btest/Baseline/core.record-field-defer-table/output new file mode 100644 index 0000000000..0deb63dc6a --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer-table/output @@ -0,0 +1,13 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, my_seq() +1, my_seq() +2, my_seq() +3, my_seq() +4, printing +4, s1, [seq=1, inner=[seq=2]] +4, s2, [seq=3, inner=[seq=4]] +4, tbl, { +[[seq=1, inner=[seq=2]]] = [seq=1, inner=[seq=2]], +[[seq=3, inner=[seq=4]]] = [seq=3, inner=[seq=4]] +} +4, done diff --git a/testing/btest/Baseline/core.record-field-defer/output b/testing/btest/Baseline/core.record-field-defer/output new file mode 100644 index 0000000000..ff2f6a885c --- /dev/null +++ b/testing/btest/Baseline/core.record-field-defer/output @@ -0,0 +1,8 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, new_connection, CHhAvVGS1DHFjwGM9, 1362692526.869344 +1, my_network_time() called, 1362692526.869344 +2, my_network_time() called, 1362692526.869344 +2, new_connection done +2, connection_state_remove, CHhAvVGS1DHFjwGM9, 1362692527.080972 +2, state, CHhAvVGS1DHFjwGM9, [ts=1362692526.869344, inner=[ts=1362692526.869344]] +2, connection_state_remove done diff --git a/testing/btest/core/record-field-defer-parse-time-nested.zeek b/testing/btest/core/record-field-defer-parse-time-nested.zeek new file mode 100644 index 0000000000..d079f0bd60 --- /dev/null +++ b/testing/btest/core/record-field-defer-parse-time-nested.zeek @@ -0,0 +1,50 @@ +# @TEST-DOC: Test deferred initialization behavior for nested records and redef. +# @TEST-EXEC: zeek -b %INPUT >output +# @TEST-EXEC: TEST_DIF_CANONIFIER= btest-diff output + +module Test; + +global seq = 0; + +function my_seq(): count { + print seq, "my_seq()"; + return ++seq; +} + +type InnerMost: record { }; + +type Inner: record { + inner_most: InnerMost; +}; + +type State: record { + seq: count &default=my_seq(); + inner: Inner; +}; + +type OtherState: record { + inner_most: InnerMost; +}; + +# s1$seq and s2$seq receive 1, 2 +global s1 = State(); +global s2 = State(); +global os1 = OtherState(); +global os2 = OtherState(); + +# This uses up seq 3,4,5,6 for nested InnerMost in s1,s2,os1,os2. +redef record InnerMost += { + seq: count &default=my_seq(); +}; + +# This uses seq 7, 8 for s1 and s2. +redef record Inner += { + seq: count &default=my_seq(); +}; + +print seq, "printing"; + +print seq, "s1", s1; +print seq, "s2", s2; +print seq, "os1", os1; +print seq, "os2", os2; diff --git a/testing/btest/core/record-field-defer-parse-time.zeek b/testing/btest/core/record-field-defer-parse-time.zeek new file mode 100644 index 0000000000..36d3647bd7 --- /dev/null +++ b/testing/btest/core/record-field-defer-parse-time.zeek @@ -0,0 +1,31 @@ +# @TEST-DOC: Test deferred initialization behavior at parse time. +# @TEST-EXEC: zeek -b %INPUT >output +# @TEST-EXEC: TEST_DIF_CANONIFIER= btest-diff output + +module Test; + +global seq = 0; + +function my_seq(): count { + print seq, "my_seq()"; + return ++seq; +} + +type Inner: record { }; + +type State: record { + seq: count &default=my_seq(); + inner: Inner; +}; + +global s1 = State(); +global s2 = State(); + +redef record Inner += { + seq: count &default=my_seq(); +}; + +print seq, "printing"; + +print seq, "s1", s1; +print seq, "s2", s2; diff --git a/testing/btest/core/record-field-defer-table.zeek b/testing/btest/core/record-field-defer-table.zeek new file mode 100644 index 0000000000..544fe55ad0 --- /dev/null +++ b/testing/btest/core/record-field-defer-table.zeek @@ -0,0 +1,115 @@ +# @TEST-DOC: Test deferred initialization behavior at parse time placing records into tables. +# @TEST-EXEC: zeek -b %INPUT >output +# @TEST-EXEC: TEST_DIF_CANONIFIER= btest-diff output + +module Test; + +global seq = 0; + +function my_seq(): count { + print seq, "my_seq()"; + return ++seq; +} + +type Inner: record { }; + +type State: record { + seq: count &default=my_seq(); + inner: Inner; +}; + +redef record Inner += { + seq: count &default=my_seq(); +}; + +global tbl: table[State] of State; + +global s1 = State(); +global s2 = State(); + +tbl[s1] = s1; +tbl[s2] = s2; + +print seq, "printing"; +print seq, "s1", s1; +print seq, "s2", s2; +print seq, "tbl", tbl; +print seq, "done"; + +# @TEST-START-NEXT + +# Same as before, but redef after creating globals. +# +# +module Test; + +global seq = 0; + +function my_seq(): count { + print seq, "my_seq()"; + return ++seq; +} + +type Inner: record { }; + +type State: record { + seq: count &default=my_seq(); + inner: Inner; +}; + +global tbl: table[State] of State; + +global s1 = State(); +global s2 = State(); + +redef record Inner += { + seq: count &default=my_seq(); +}; + +tbl[s1] = s1; +tbl[s2] = s2; + +print seq, "printing"; +print seq, "s1", s1; +print seq, "s2", s2; +print seq, "tbl", tbl; +print seq, "done"; + +# @TEST-START-NEXT + +# Same as before, but in zeek_init() with locals. +# +# +module Test; + +global seq = 0; + +function my_seq(): count { + print seq, "my_seq()"; + return ++seq; +} + +type Inner: record { }; + +type State: record { + seq: count &default=my_seq(); + inner: Inner; +}; + +redef record Inner += { + seq: count &default=my_seq(); +}; + +event zeek_init() + { + local tbl: table[State] of State; + local s1 = State(); + local s2 = State(); + tbl[s1] = s1; + tbl[s2] = s2; + print seq, "printing"; + print seq, "s1", s1; + print seq, "s2", s2; + print seq, "tbl", tbl; + print seq, "done"; + } diff --git a/testing/btest/core/record-field-defer.zeek b/testing/btest/core/record-field-defer.zeek new file mode 100644 index 0000000000..fe57677887 --- /dev/null +++ b/testing/btest/core/record-field-defer.zeek @@ -0,0 +1,175 @@ +# @TEST-DOC: Nested records with non-const &defaults are not deferred initialized. Regression test for #3260 +# @TEST-EXEC: zeek -b -r $TRACES/http/get.trace %INPUT >output +# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff output + +module Test; + +global seq = 0; + +function my_network_time(): time + { + ++seq; + print seq, "my_network_time() called", network_time(); + return network_time(); + } + +type Inner: record { + ts: time &default=my_network_time(); +}; + +type State: record { + ts: time &default=my_network_time(); + inner: Inner; +}; + +global tbl: table[string] of State; + +event new_connection(c: connection) + { + print seq, "new_connection", c$uid, network_time(); + tbl[c$uid] = State(); + print seq, "new_connection done"; + } + +event connection_state_remove(c: connection) + { + print seq, "connection_state_remove", c$uid, network_time(); + local s = tbl[c$uid]; + print seq, "state", c$uid, s; + print seq, "connection_state_remove done"; + } + +# @TEST-START-NEXT + +# Same as before, but Inner contains two default fields + +module Test; + +global seq = 0; + +function my_network_time(): time + { + ++seq; + print seq, "my_network_time() called", network_time(); + return network_time(); + } + +type Inner: record { + ts: time &default=my_network_time(); + ts_other: time &default=my_network_time(); +}; + +type State: record { + ts: time &default=my_network_time(); + inner: Inner; +}; + +global tbl: table[string] of State; + +event new_connection(c: connection) + { + print seq, "new_connection", c$uid, network_time(); + tbl[c$uid] = State(); + print seq, "new_connection done"; + } + +event connection_state_remove(c: connection) + { + print seq, "connection_state_remove", c$uid, network_time(); + local s = tbl[c$uid]; + print seq, "state", c$uid, s; + print seq, "connection_state_remove done"; + } + + + +# @TEST-START-NEXT + +# Same as before, but Inner is instead redef'ed with non-const &default + +module Test; + +global seq = 0; + +function my_network_time(): time + { + ++seq; + print seq, "my_network_time() called", network_time(); + return network_time(); + } + +type Inner: record { }; + +type State: record { + ts: time &default=my_network_time(); + inner: Inner; +}; + +redef record Inner += { + ts: time &default=my_network_time(); +}; + +global tbl: table[string] of State; + +event new_connection(c: connection) + { + print seq, "new_connection", c$uid, network_time(); + tbl[c$uid] = State(); + print seq, "new_connection done"; + } + +event connection_state_remove(c: connection) + { + print seq, "connection_state_remove", c$uid, network_time(); + local s = tbl[c$uid]; + print seq, "state", c$uid, s; + print seq, "connection_state_remove done"; + } + +# @TEST-START-NEXT + +# Same as before, but State has two Inner fields and the Inner redef happens twice. + +module Test; + +global seq = 0; + +function my_network_time(): time + { + ++seq; + print seq, "my_network_time() called", network_time(); + return network_time(); + } + +type Inner: record { }; + +type State: record { + ts: time &default=my_network_time(); + inner: Inner; + inner_other: Inner; +}; + +redef record Inner += { + ts: time &default=my_network_time(); +}; + +redef record Inner += { + ts_other: time &default=my_network_time(); +}; + +global tbl: table[string] of State; + +event new_connection(c: connection) + { + print seq, "new_connection", c$uid, network_time(); + tbl[c$uid] = State(); + print seq, "new_connection done"; + } + +event connection_state_remove(c: connection) + { + print seq, "connection_state_remove", c$uid, network_time(); + local s = tbl[c$uid]; + print seq, "state", c$uid, s; + print seq, "connection_state_remove done"; + }