/* * Copyright (c) 2010-2012 Postgres-XC Development Group */ #include #include #include "gtm/libpq-fe.h" #include "gtm/gtm_c.h" #include "gtm/gtm_client.h" #include "test_common.h" pthread_key_t threadinfo_key; void setUp() { conn = PQconnectGTM(connect_string); if (conn == NULL) { client_log(("Error in connection\n")); exit(1); } client_log(("PGconnectGTM() ok.\n")); } void tearDown() { GTMPQfinish(conn); } void test_txn_01() { GlobalTransactionId gxid; int rc; SETUP(); gxid = begin_transaction(conn, GTM_ISOLATION_SERIALIZABLE, timestamp); _ASSERT( gxid != InvalidGlobalTransactionId ); rc = prepare_transaction(conn, gxid); _ASSERT( rc>=0 ); rc = abort_transaction(conn, gxid); _ASSERT( rc>=0 ); TEARDOWN(); } void test_txn_02() { GlobalTransactionId gxid; int rc; SETUP(); gxid = begin_transaction(conn, GTM_ISOLATION_SERIALIZABLE, timestamp); _ASSERT( gxid != InvalidGlobalTransactionId ); rc = prepare_transaction(conn, gxid); _ASSERT( rc>=0 ); rc = commit_transaction(conn, gxid); _ASSERT( rc>=0 ); TEARDOWN(); } void test_txn_03() { GlobalTransactionId gxid; int rc; SETUP(); gxid = begin_transaction_autovacuum(conn, GTM_ISOLATION_SERIALIZABLE); _ASSERT( gxid != InvalidGlobalTransactionId ); rc = commit_transaction(conn, gxid); _ASSERT( rc>=0 ); TEARDOWN(); } void test_txn_11() { GTM_IsolationLevel isolevel = GTM_ISOLATION_SERIALIZABLE; char *gid = "test"; GlobalTransactionId gxid =InvalidGlobalTransactionId; GlobalTransactionId prepared_gxid =InvalidGlobalTransactionId; int datanodecnt = 0; char **datanodes = NULL; int coordcnt = 0; char **coordinators = NULL; int rc; SETUP(); gxid = begin_transaction(conn, isolevel, timestamp); _ASSERT( gxid != InvalidGlobalTransactionId ); printf("test_txn_11: gxid=%d\n", gxid); rc = start_prepared_transaction(conn, gxid, gid, datanodecnt, datanodes, coordcnt, coordinators); _ASSERT( rc>=0 ); rc = get_gid_data(conn, isolevel, gid, &gxid, &prepared_gxid, &datanodecnt, datanodes, &coordcnt, coordinators); printf("test_txn_11: prepared_gxid=%d\n", prepared_gxid); _ASSERT( rc>=0 ); rc = commit_prepared_transaction(conn, gxid, prepared_gxid); _ASSERT( rc>=0 ); TEARDOWN(); } void test_txn_51() { GlobalTransactionId gxid; int rc; SETUP(); gxid = begin_transaction(conn, GTM_ISOLATION_SERIALIZABLE, timestamp); _ASSERT( gxid == InvalidGlobalTransactionId ); TEARDOWN(); } void test_txn_52() { GlobalTransactionId gxid; int rc; SETUP(); rc = prepare_transaction(conn, InvalidGlobalTransactionId); _ASSERT( rc==-1 ); TEARDOWN(); } void test_txn_53() { GlobalTransactionId gxid; int rc; SETUP(); rc = commit_transaction(conn, InvalidGlobalTransactionId); _ASSERT( rc==-1 ); TEARDOWN(); } void test_txn_54() { GlobalTransactionId gxid; int rc; SETUP(); rc = abort_transaction(conn, InvalidGlobalTransactionId); _ASSERT( rc==-1 ); TEARDOWN(); } int main(int argc, char *argv[]) { sprintf(connect_string, "host=localhost port=6666 node_name=one remote_type=%d", GTM_NODE_GTM); test_txn_01(); test_txn_02(); test_txn_03(); test_txn_11(); /* * connect to standby. must be prevented. */ sprintf(connect_string, "host=localhost port=6667 node_name=one remote_type=%d", GTM_NODE_GTM); test_txn_51(); test_txn_52(); test_txn_53(); test_txn_54(); /* * promote GTM standby to become GTM active. */ system("./promote.sh"); sleep(1); test_txn_01(); test_txn_02(); test_txn_03(); test_txn_11(); return 0; }