zeek/testing/btest/broker/store/create-failure.zeek
Jon Siwek 6af436aad3 GH-1426: Improve handling of Broker data store creation failures
Broker::create_master() and Broker::create_clone() now return
a valid value even when there's a failure to open the backend database
(e.g. SQLite filesystem error).  In that case, the returned value can
still be passed into other data store operations, but they'll fail
immediately with an error.  Broker::is_closed() can now also be used to
determine whether the data store creation calls failed.
2021-03-06 02:32:29 -08:00

77 lines
2 KiB
Text

# @TEST-EXEC: mkdir fail.sqlite
# @TEST-EXEC: btest-bg-run zeek "BROKER_FILE_VERBOSITY=error BROKER_CONSOLE_VERBOSITY=quiet zeek -b %INPUT >out 2>err"
# @TEST-EXEC: btest-bg-wait 60
# @TEST-EXEC: btest-diff zeek/out
# @TEST-EXEC: TEST_DIFF_CANONIFIER="$SCRIPTS/diff-remove-abspath $SCRIPTS/diff-sort" btest-diff zeek/err
redef exit_only_after_terminate = T;
global c = 0;
global m1: opaque of Broker::Store;
global m2: opaque of Broker::Store;
global c1: opaque of Broker::Store;
global c2: opaque of Broker::Store;
global check_it: function(name: string, s: opaque of Broker::Store);
function check_terminate_conditions()
{
++c;
if ( c == 4 )
{
print Broker::is_closed(m1);
print Broker::is_closed(m2);
print Broker::is_closed(c1);
print Broker::is_closed(c2);
# Failed to originally open m1, so should raise an error.
Broker::close(m1);
Broker::close(m2);
Broker::close(c1);
# Closing c2 is an error since it's actually referring to m2, already
# closed above (i.e. making a clone of a master store that already lives
# in the same process, just returns a handle to the master).
Broker::close(c2);
print Broker::is_closed(m1);
print Broker::is_closed(m2);
print Broker::is_closed(c1);
print Broker::is_closed(c2);
check_it("m1", m1);
check_it("c1", c1);
check_it("m2", m2);
check_it("c2", c2);
}
else if ( c == 8 )
terminate();
}
function check_it(name: string, s: opaque of Broker::Store)
{
when ( local r = Broker::keys(s) )
{
check_terminate_conditions();
print fmt("%s keys result: %s", name, r);
}
timeout 1sec
{
check_terminate_conditions();
print fmt("%s timeout", name);
}
}
event zeek_init()
{
m1 = Broker::create_master("../fail", Broker::SQLITE);
m2 = Broker::create_master("ok");
c1 = Broker::create_clone("../fail");
c2 = Broker::create_clone("ok");
print Broker::is_closed(m1);
print Broker::is_closed(m2);
print Broker::is_closed(c1);
print Broker::is_closed(c2);
check_it("m1", m1);
check_it("c1", c1);
check_it("m2", m2);
check_it("c2", c2);
}