diff --git a/server/core/test/testtrxtracking.cc b/server/core/test/testtrxtracking.cc index b7a54ef4d..e54b8de0a 100644 --- a/server/core/test/testtrxtracking.cc +++ b/server/core/test/testtrxtracking.cc @@ -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; }