Files
MaxScale/maxscale-system-test/fwf_reload.cpp
Markus Mäkelä a4975edbba MXS-1389: Fix rule reloading and query parsing requirements
Reloading of rules now properly uses the current rule file if no argument
was provided. The rule version counter also used atomic operations for the
sake of correctness.

The rule parsing is now only required for DML type statements that should
be fully parsed.
2017-09-08 09:31:38 +03:00

113 lines
3.1 KiB
C++

/**
* @file fwf_reload - Same as fwf but with reloading of rules
*/
#include <iostream>
#include <ctime>
#include "testconnections.h"
#include "maxadmin_operations.h"
#include "sql_t1.h"
#include "fw_copy_rules.h"
int main(int argc, char *argv[])
{
TestConnections::skip_maxscale_start(true);
TestConnections *Test = new TestConnections(argc, argv);
char sql[4096];
char pass_file[4096];
char deny_file[4096];
char rules_dir[4096];
sprintf(rules_dir, "%s/fw/", test_dir);
int N = 12;
int i;
Test->stop_maxscale();
char first_rule[] = "rules1";
copy_rules(Test, first_rule, rules_dir);
Test->start_maxscale();
Test->connect_rwsplit();
for (i = 1; i <= N; i++)
{
char str[1024];
sprintf(str, "rules%d", i);
Test->set_timeout(180);
copy_rules(Test, str, rules_dir);
Test->ssh_maxscale(true, "maxadmin call command dbfwfilter rules/reload Database-Firewall");
int local_result = 0;
sprintf(pass_file, "%s/fw/pass%d", test_dir, i);
FILE *file = fopen(pass_file, "r");
if (file)
{
Test->tprintf("********** Trying queries that should be OK ********** \n");
while (!feof(file))
{
Test->set_timeout(180);
if (execute_query_from_file(Test->conn_rwsplit, file) == 1)
{
Test->tprintf("Query should succeed: %s\n", sql);
local_result++;
}
}
fclose(file);
}
else
{
Test->add_result(1, "Error opening file '%s': %d, %s\n", pass_file, errno, strerror(errno));
break;
}
sprintf(deny_file, "%s/fw/deny%d", test_dir, i);
file = fopen(deny_file, "r");
if (file)
{
Test->tprintf("********** Trying queries that should FAIL ********** \n");
while (!feof(file))
{
Test->set_timeout(180);
int rc = execute_query_from_file(Test->conn_rwsplit, file);
if (rc != -1 && (rc == 0 ||
mysql_errno(Test->conn_rwsplit) != 1141))
{
Test->tprintf("Query should fail: %s\n", sql);
local_result++;
}
}
fclose(file);
}
else
{
Test->add_result(1, "Error opening file '%s': %d, %s\n", deny_file, errno, strerror(errno));
break;
}
Test->add_result(local_result, "********** rules%d test FAILED\n", i);
}
Test->tprintf("Trying rules with syntax error\n");
copy_rules(Test, (char *) "rules_syntax_error", rules_dir);
char *output = Test->ssh_maxscale_output(true,
"maxadmin call command dbfwfilter rules/reload Database-Firewall");
Test->add_result(strcasestr(output, "Failed") == NULL, "Reloading rules should fail with syntax errors");
Test->check_maxscale_processes(1);
int rval = Test->global_result;
delete Test;
return rval;
}