TestTxTPCall.cxx
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:7k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2008, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. #include "TestAssert.h"
  19. #ifndef WIN32
  20. #include "ace/OS_NS_unistd.h"
  21. #endif
  22. #include "ThreadLocalStorage.h"
  23. #include "BaseServerTest.h"
  24. #include "XATMITestSuite.h"
  25. #include "xatmi.h"
  26. #include "tx.h"
  27. #include "TestTxTPCall.h"
  28. #include "Sleeper.h"
  29. /* service routines */
  30. static void tx_fill_buf_rtn(TPSVCINFO *svcinfo) {
  31. int len = 60;
  32. char *toReturn = ::tpalloc((char*) "X_OCTET", NULL, len);
  33. TXINFO txinfo;
  34. int inTx = ::tx_info(&txinfo);
  35. strcpy(toReturn, "inTx=");
  36. strcat(toReturn, inTx ? "true" : "false");
  37. tpreturn(TPSUCCESS, 0, toReturn, len, 0);
  38. }
  39. void test_tx_tpcall_x_octet_service_tardy(TPSVCINFO *svcinfo) {
  40. userlogc((char*) "TxLog: service running: test_tx_tpcall_x_octet_service_tardy");
  41. ::sleeper(8);//ACE_OS::sleep(6L);
  42. tx_fill_buf_rtn(svcinfo);
  43. }
  44. void test_tx_tpcall_x_octet_service_without_tx(TPSVCINFO *svcinfo) {
  45. userlogc((char*) "TxLog: service running: test_tx_tpcall_x_octet_service_without_tx");
  46. tx_fill_buf_rtn(svcinfo);
  47. }
  48. void test_tx_tpcall_x_octet_service_with_tx(TPSVCINFO *svcinfo) {
  49. userlogc((char*) "TxLog: service running: test_tx_tpcall_x_octet_service_with_tx");
  50. tx_fill_buf_rtn(svcinfo);
  51. }
  52. /* test setup */
  53. void TestTxTPCall::setUp() {
  54. userlogc((char*) "TestTxTPCall::setUp");
  55. BaseServerTest::setUp();
  56. BT_ASSERT(tx_open() == TX_OK);
  57. sendlen = strlen("TestTxTPCall") + 1;
  58. BT_ASSERT((sendbuf = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  59. (void) strcpy(sendbuf, "TestTxTPCall");
  60. rcvlen = 60;
  61. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen)) != NULL);
  62. BT_ASSERT(tperrno == 0);
  63. }
  64. /* test teardown */
  65. void TestTxTPCall::tearDown() {
  66. userlogc((char*) "TestTxTPCall::tearDown");
  67. ::tpfree(sendbuf);
  68. ::tpfree(rcvbuf);
  69. // test may have left a txn on the thread which would cause tx_close to fail
  70. destroySpecific(TSS_KEY);
  71. int rc = tpunadvertise((char*) "tpcall_x_octet");
  72. BT_ASSERT(tperrno == 0);
  73. BT_ASSERT(rc != -1);
  74. BT_ASSERT(tx_close() == TX_OK);
  75. // Clean up server
  76. BaseServerTest::tearDown();
  77. }
  78. /* client routines */
  79. void TestTxTPCall::test_timeout_no_tx() {
  80. userlogc((char*) "TestTxTPCall: test_timeout_no_tx");
  81. int rc = tpadvertise((char*) "tpcall_x_octet", test_tx_tpcall_x_octet_service_tardy);
  82. BT_ASSERT(tperrno == 0 && rc != -1);
  83. int cd = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen, (char **) &rcvbuf, &rcvlen, (long) 0);
  84. BT_ASSERT(cd != -1);
  85. BT_ASSERT(tperrno != TPETIME);
  86. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "inTx=false") == 0);
  87. }
  88. void TestTxTPCall::test_timeout_with_tx() {
  89. userlogc((char*) "TestTxTPCall: test_timeout_with_tx");
  90. int rv1 = tpadvertise((char*) "tpcall_x_octet", test_tx_tpcall_x_octet_service_tardy);
  91. // the service will sleep for 4 seconds so set the timeout to be less that 4
  92. int rv2 = tx_set_transaction_timeout(4);
  93. BT_ASSERT(rv1 != 1 && rv2 == TX_OK && tx_begin() == TX_OK);
  94. int rv3 = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen, (char **) &rcvbuf, &rcvlen, (long) 0);
  95. userlogc((char*) "TxLog: test_timeout_with_tx tpcall=%d tperrno=%d", rv3, tperrno);
  96. BT_ASSERT(rv3 == -1);
  97. BT_ASSERT(tperrno == TPETIME);
  98. // the transaction should have been marked as rollback only
  99. BT_ASSERT(tx_commit() == TX_ROLLBACK);
  100. }
  101. void TestTxTPCall::test_tpcall_without_tx() {
  102. userlogc((char*) "TestTxTPCall: test_tpcall_without_tx");
  103. int rc = tpadvertise((char*) "tpcall_x_octet", test_tx_tpcall_x_octet_service_without_tx);
  104. BT_ASSERT(tperrno == 0);
  105. BT_ASSERT(rc != -1);
  106. int id = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen, (char **) &rcvbuf, &rcvlen, (long) 0);
  107. BT_ASSERT(id != -1);
  108. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "inTx=false") == 0);
  109. // make sure there is no active transaction
  110. BT_ASSERT(tx_commit() != TX_OK);
  111. userlogc_debug((char*) "TxLog: test_tpcall_without_tx: passed");
  112. }
  113. void TestTxTPCall::test_tpcall_with_tx() {
  114. userlogc((char*) "TestTxTPCall: test_tpcall_with_tx");
  115. int rc = tpadvertise((char*) "tpcall_x_octet", test_tx_tpcall_x_octet_service_with_tx);
  116. BT_ASSERT(tperrno == 0);
  117. BT_ASSERT(rc != -1);
  118. // start a transaction
  119. userlogc_debug((char*) "TxLog: test_tpcall_with_tx: tx_open");
  120. BT_ASSERT(tx_begin() == TX_OK);
  121. userlogc_debug((char*) "TxLog: test_tpcall_with_tx: tpcall");
  122. (void) ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen, (char **) &rcvbuf, &rcvlen, (long) 0);
  123. userlogc_debug((char*) "TxLog: test_tpcall_with_tx: tx_commit");
  124. // make sure there is still an active transaction - ie starting a new one should fail
  125. /* BT_ASSERT(tx_begin() != TX_OK);*/
  126. BT_ASSERT(tx_commit() == TX_OK);
  127. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "inTx=true") == 0);
  128. }
  129. void TestTxTPCall::test_tpcancel_with_tx() {
  130. userlogc((char*) "TestTxTPCall: test_tpcancel_with_tx");
  131. int rc = tpadvertise((char*) "tpcall_x_octet", test_tx_tpcall_x_octet_service_with_tx);
  132. BT_ASSERT(tperrno == 0);
  133. BT_ASSERT(rc != -1);
  134. // start a transaction
  135. userlogc_debug((char*) "TxLog: test_tpcancel_with_tx: tx_open");
  136. BT_ASSERT(tx_begin() == TX_OK);
  137. userlogc_debug((char*) "TxLog: test_tpcancel_with_tx: tpcall");
  138. int cd = ::tpacall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen, (long) 0);
  139. BT_ASSERT(cd != -1);
  140. BT_ASSERT(tperrno == 0);
  141. // cancel should fail with TPETRAN since the outstanding call is transactional
  142. userlogc_debug((char*) "TxLog: test_tpcancel_with_tx: tpcancel %d", cd);
  143. int cancelled = ::tpcancel(cd);
  144. BT_ASSERT(cancelled == -1);
  145. BT_ASSERT(tperrno == TPETRAN);
  146. // a tpgetrply should succeed since the tpcancel request will have failed
  147. int res = ::tpgetrply(&cd, (char **) &rcvbuf, &rcvlen, 0);
  148. BT_ASSERT(res != -1);
  149. BT_ASSERT(tperrno == 0);
  150. userlogc_debug((char*) "TxLog: test_tpcancel_with_tx: tx_commit");
  151. // commit should succeed since the failed tpcancel does not affect the callers tx
  152. BT_ASSERT(tx_commit() == TX_OK);
  153. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "inTx=true") == 0);
  154. }