Add tests for SQL transactions.
This commit is contained in:
parent
25ea80890d
commit
7026e68b06
@ -1,4 +1,5 @@
|
|||||||
#include <sourcemod>
|
#include <sourcemod>
|
||||||
|
#include <testing>
|
||||||
|
|
||||||
public Plugin:myinfo =
|
public Plugin:myinfo =
|
||||||
{
|
{
|
||||||
@ -16,6 +17,12 @@ public OnPluginStart()
|
|||||||
RegServerCmd("sql_test_thread1", Command_TestSql3)
|
RegServerCmd("sql_test_thread1", Command_TestSql3)
|
||||||
RegServerCmd("sql_test_thread2", Command_TestSql4)
|
RegServerCmd("sql_test_thread2", Command_TestSql4)
|
||||||
RegServerCmd("sql_test_thread3", Command_TestSql5)
|
RegServerCmd("sql_test_thread3", Command_TestSql5)
|
||||||
|
RegServerCmd("sql_test_txn", Command_TestTxn)
|
||||||
|
|
||||||
|
new Handle:hibernate = FindConVar("sv_hibernate_when_empty");
|
||||||
|
if (hibernate != INVALID_HANDLE) {
|
||||||
|
ServerCommand("sv_hibernate_when_empty 0");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintQueryData(Handle:query)
|
PrintQueryData(Handle:query)
|
||||||
@ -198,3 +205,93 @@ public Action:Command_TestSql5(args)
|
|||||||
return Plugin_Handled;
|
return Plugin_Handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FastQuery(Handle:db, const String:query[])
|
||||||
|
{
|
||||||
|
new String:error[256];
|
||||||
|
if (!SQL_FastQuery(db, query)) {
|
||||||
|
SQL_GetError(db, error, sizeof(error));
|
||||||
|
ThrowError("ERROR: %s", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Txn_Test1_OnSuccess(Handle:db, any:data, numQueries, Handle:results[], any:queryData[])
|
||||||
|
{
|
||||||
|
SetTestContext("Transaction Test 1");
|
||||||
|
AssertEq("data", data, 1000);
|
||||||
|
AssertEq("numQueries", numQueries, 3);
|
||||||
|
AssertEq("queryData[0]", queryData[0], 50);
|
||||||
|
AssertEq("queryData[1]", queryData[1], 60);
|
||||||
|
AssertEq("queryData[2]", queryData[2], 70);
|
||||||
|
AssertFalse("HasResultSet(0)", SQL_HasResultSet(results[0]));
|
||||||
|
AssertFalse("HasResultSet(1)", SQL_HasResultSet(results[1]));
|
||||||
|
AssertTrue("HasResultSet(2)", SQL_HasResultSet(results[2]));
|
||||||
|
AssertTrue("FetchRow(2)", SQL_FetchRow(results[2]));
|
||||||
|
AssertEq("FetchInt(2, 0)", SQL_FetchInt(results[2], 0), 5);
|
||||||
|
AssertFalse("FetchRow(2)", SQL_FetchRow(results[2]));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Txn_Test1_OnFailure(Handle:db, any:data, numQueries, const String:error[], failIndex, any:queryData[])
|
||||||
|
{
|
||||||
|
ThrowError("Transaction test 1 failed: %s (failIndex=%d)", error, failIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Txn_Test2_OnSuccess(Handle:db, any:data, numQueries, Handle:results[], any:queryData[])
|
||||||
|
{
|
||||||
|
ThrowError("Transaction test 2 failed: should have failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Txn_Test2_OnFailure(Handle:db, any:data, numQueries, const String:error[], failIndex, any:queryData[])
|
||||||
|
{
|
||||||
|
SetTestContext("Transaction Test 2");
|
||||||
|
AssertEq("data", data, 1000);
|
||||||
|
AssertEq("numQueries", numQueries, 3);
|
||||||
|
AssertEq("queryData[0]", queryData[0], 50);
|
||||||
|
AssertEq("queryData[1]", queryData[1], 60);
|
||||||
|
AssertEq("queryData[2]", queryData[2], 70);
|
||||||
|
AssertEq("failIndex", failIndex, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action:Command_TestTxn(args)
|
||||||
|
{
|
||||||
|
new String:error[256];
|
||||||
|
new Handle:db = SQL_Connect("storage-local", false, error, sizeof(error));
|
||||||
|
if (db == INVALID_HANDLE) {
|
||||||
|
ThrowError("ERROR: %s", error);
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
FastQuery(db, "DROP TABLE IF EXISTS egg");
|
||||||
|
FastQuery(db, "CREATE TABLE egg(id int primary key)");
|
||||||
|
FastQuery(db, "INSERT INTO egg (id) VALUES (1)");
|
||||||
|
FastQuery(db, "INSERT INTO egg (id) VALUES (2)");
|
||||||
|
FastQuery(db, "INSERT INTO egg (id) VALUES (3)");
|
||||||
|
|
||||||
|
SetTestContext("CreateTransaction");
|
||||||
|
|
||||||
|
new Handle:txn = SQL_CreateTransaction();
|
||||||
|
AssertEq("AddQuery", SQL_AddQuery(txn, "INSERT INTO egg (id) VALUES (4)", 50), 0);
|
||||||
|
AssertEq("AddQuery", SQL_AddQuery(txn, "INSERT INTO egg (id) VALUES (5)", 60), 1);
|
||||||
|
AssertEq("AddQuery", SQL_AddQuery(txn, "SELECT COUNT(id) FROM egg", 70), 2);
|
||||||
|
SQL_ExecuteTransaction(
|
||||||
|
db,
|
||||||
|
txn,
|
||||||
|
Txn_Test1_OnSuccess,
|
||||||
|
Txn_Test1_OnFailure,
|
||||||
|
1000
|
||||||
|
);
|
||||||
|
|
||||||
|
txn = SQL_CreateTransaction();
|
||||||
|
AssertEq("AddQuery", SQL_AddQuery(txn, "INSERT INTO egg (id) VALUES (6)", 50), 0);
|
||||||
|
AssertEq("AddQuery", SQL_AddQuery(txn, "INSERT INTO egg (id) VALUES (6)", 60), 1);
|
||||||
|
AssertEq("AddQuery", SQL_AddQuery(txn, "SELECT COUNT(id) FROM egg", 70), 2);
|
||||||
|
SQL_ExecuteTransaction(
|
||||||
|
db,
|
||||||
|
txn,
|
||||||
|
Txn_Test2_OnSuccess,
|
||||||
|
Txn_Test2_OnFailure,
|
||||||
|
1000
|
||||||
|
);
|
||||||
|
|
||||||
|
CloseHandle(db);
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user