Enhance transaction tracking test
This commit is contained in:
parent
f8a0ca25a4
commit
931f765df5
@ -69,71 +69,34 @@ struct test_case
|
||||
{
|
||||
{ "BEGIN", QUERY_TYPE_BEGIN_TRX },
|
||||
{ "BEGIN WORK", QUERY_TYPE_BEGIN_TRX },
|
||||
{ "BEGIN WORK", QUERY_TYPE_BEGIN_TRX },
|
||||
|
||||
{ "COMMIT", QUERY_TYPE_COMMIT },
|
||||
{ "COMMIT WORK", QUERY_TYPE_COMMIT },
|
||||
{ "COMMIT WORK", QUERY_TYPE_COMMIT },
|
||||
|
||||
{ "ROLLBACK", QUERY_TYPE_ROLLBACK },
|
||||
{ "ROLLBACK WORK", QUERY_TYPE_ROLLBACK },
|
||||
{ "ROLLBACK WORK", QUERY_TYPE_ROLLBACK },
|
||||
|
||||
{ "START TRANSACTION", QUERY_TYPE_BEGIN_TRX },
|
||||
{ "START TRANSACTION", QUERY_TYPE_BEGIN_TRX },
|
||||
|
||||
{ "START TRANSACTION READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ },
|
||||
{ "START TRANSACTION READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ },
|
||||
{ "START TRANSACTION READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ },
|
||||
{ "START TRANSACTION READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ },
|
||||
|
||||
{ "START TRANSACTION READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE },
|
||||
{ "START TRANSACTION READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE },
|
||||
{ "START TRANSACTION READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE },
|
||||
{ "START TRANSACTION READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE },
|
||||
|
||||
{ "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX },
|
||||
{ "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX },
|
||||
{ "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX },
|
||||
{ "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX },
|
||||
{ "START TRANSACTION WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX },
|
||||
|
||||
{ "START TRANSACTION WITH CONSISTENT SNAPSHOT, READ ONLY", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ },
|
||||
{ "START TRANSACTION READ ONLY, WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_READ },
|
||||
{ "START TRANSACTION WITH CONSISTENT SNAPSHOT, READ WRITE", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE },
|
||||
{ "START TRANSACTION READ WRITE, WITH CONSISTENT SNAPSHOT", QUERY_TYPE_BEGIN_TRX | QUERY_TYPE_WRITE },
|
||||
|
||||
{ "SET AUTOCOMMIT=true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT=true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT =true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT =true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT = true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT = true", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
|
||||
{ "SET AUTOCOMMIT=1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT=1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT =1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT =1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT = 1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT = 1", QUERY_TYPE_COMMIT|QUERY_TYPE_ENABLE_AUTOCOMMIT },
|
||||
|
||||
{ "SET AUTOCOMMIT=false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT=false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT =false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT =false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT = false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT = false", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
|
||||
{ "SET AUTOCOMMIT=0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT=0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT =0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT =0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT = 0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
{ "SET AUTOCOMMIT = 0", QUERY_TYPE_BEGIN_TRX|QUERY_TYPE_DISABLE_AUTOCOMMIT },
|
||||
};
|
||||
|
||||
const size_t N_TEST_CASES = sizeof(test_cases)/sizeof(test_cases[0]);
|
||||
|
||||
|
||||
bool test(uint32_t (*getter)(GWBUF*), const char* zStmt, uint32_t expected_type_mask)
|
||||
{
|
||||
int rc = true;
|
||||
@ -144,7 +107,8 @@ bool test(uint32_t (*getter)(GWBUF*), const char* zStmt, uint32_t expected_type_
|
||||
|
||||
if (type_mask != expected_type_mask)
|
||||
{
|
||||
cerr << zStmt << ": expected " << expected_type_mask << ", but got " << type_mask << "." << endl;
|
||||
cerr << "\"" << zStmt << "\""
|
||||
<< ": expected " << expected_type_mask << ", but got " << type_mask << "." << endl;
|
||||
rc = false;
|
||||
}
|
||||
|
||||
@ -153,6 +117,153 @@ bool test(uint32_t (*getter)(GWBUF*), const char* zStmt, uint32_t expected_type_
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
const char* prefixes[] =
|
||||
{
|
||||
" ",
|
||||
" "
|
||||
};
|
||||
|
||||
const int N_PREFIXES = sizeof(prefixes) / sizeof(prefixes[0]);
|
||||
|
||||
bool test_with_prefixes(uint32_t (*getter)(GWBUF*), const string& base, uint32_t type_mask)
|
||||
{
|
||||
bool rc = true;
|
||||
|
||||
for (int i = 0; i < N_PREFIXES; ++i)
|
||||
{
|
||||
string s = prefixes[i] + base;
|
||||
|
||||
if (!test(getter, s.c_str(), type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
const char* suffixes[] =
|
||||
{
|
||||
" ",
|
||||
" ",
|
||||
";",
|
||||
" ;",
|
||||
" ;",
|
||||
" ;",
|
||||
" ;",
|
||||
" ; ",
|
||||
" ; "
|
||||
};
|
||||
|
||||
const int N_SUFFIXES = sizeof(suffixes) / sizeof(suffixes[0]);
|
||||
|
||||
bool test_with_suffixes(uint32_t (*getter)(GWBUF*), const string& base, uint32_t type_mask)
|
||||
{
|
||||
bool rc = true;
|
||||
|
||||
for (int i = 0; i < N_SUFFIXES; ++i)
|
||||
{
|
||||
string s = base + suffixes[i];
|
||||
|
||||
if (!test(getter, s.c_str(), type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
const char* whitespace[] =
|
||||
{
|
||||
" "
|
||||
};
|
||||
|
||||
const int N_WHITESPACE = sizeof(whitespace) / sizeof(whitespace[0]);
|
||||
|
||||
bool test_with_whitespace(uint32_t (*getter)(GWBUF*), const string& base, uint32_t type_mask)
|
||||
{
|
||||
bool rc = true;
|
||||
|
||||
string::const_iterator i = base.begin();
|
||||
string::const_iterator end = base.end();
|
||||
|
||||
string head;
|
||||
|
||||
while (i != end)
|
||||
{
|
||||
if (*i == ' ')
|
||||
{
|
||||
string tail(i + 1, end);
|
||||
|
||||
for (int j = 0; j < N_WHITESPACE; ++j)
|
||||
{
|
||||
string s = head + whitespace[j] + tail;
|
||||
|
||||
if (!test(getter, s.c_str(), type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
head += *i;
|
||||
|
||||
++i;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
const char* commas[] =
|
||||
{
|
||||
" ,",
|
||||
" ,",
|
||||
" , ",
|
||||
" , ",
|
||||
};
|
||||
|
||||
const int N_COMMAS = sizeof(commas) / sizeof(commas[0]);
|
||||
|
||||
bool test_with_commas(uint32_t (*getter)(GWBUF*), const string& base, uint32_t type_mask)
|
||||
{
|
||||
bool rc = true;
|
||||
|
||||
string::const_iterator i = base.begin();
|
||||
string::const_iterator end = base.end();
|
||||
|
||||
string head;
|
||||
|
||||
while (i != end)
|
||||
{
|
||||
if (*i == ',')
|
||||
{
|
||||
string tail(i + 1, end);
|
||||
|
||||
for (int j = 0; j < N_COMMAS; ++j)
|
||||
{
|
||||
string s = head + commas[j] + tail;
|
||||
|
||||
if (!test(getter, s.c_str(), type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
head += *i;
|
||||
|
||||
++i;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
bool test(uint32_t (*getter)(GWBUF*))
|
||||
{
|
||||
bool rc = true;
|
||||
@ -167,86 +278,28 @@ bool test(uint32_t (*getter)(GWBUF*))
|
||||
|
||||
string s;
|
||||
|
||||
// Just the string
|
||||
s = base;
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Prepended with one space.
|
||||
s = " " + base;
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
if (!test_with_prefixes(getter, base, pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Prepended with two spaces.
|
||||
s = " " + base;
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
if (!test_with_whitespace(getter, base, pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with one space.
|
||||
s = base + " ";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
if (!test_with_commas(getter, base, pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with two spaces.
|
||||
s = base + " ";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with a ";".
|
||||
s = base + ";";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with a " ;".
|
||||
s = base + " ;";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with a " ;".
|
||||
s = base + " ;";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with a "; ".
|
||||
s = base + "; ";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with a "; ".
|
||||
s = base + "; ";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with a " ; ".
|
||||
s = base + " ; ";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
||||
// Appended with a " ; ".
|
||||
s = base + " ; ";
|
||||
if (!test(getter, s.c_str(), pTest->type_mask))
|
||||
if (!test_with_suffixes(getter, base, pTest->type_mask))
|
||||
{
|
||||
rc = false;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user