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

中间件编程

开发平台:

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. //#include "ace/OS_NS_unistd.h"
  20. #include "ThreadLocalStorage.h"
  21. #include "BaseServerTest.h"
  22. #include "XATMITestSuite.h"
  23. #include "xatmi.h"
  24. #include "tx.h"
  25. #include "TestRollbackOnly.h"
  26. extern void test_tpcall_TPETIME_service(TPSVCINFO *svcinfo);
  27. extern void test_tpcall_TPEOTYPE_service(TPSVCINFO *svcinfo);
  28. extern void test_tpcall_TPESVCFAIL_service(TPSVCINFO *svcinfo);
  29. extern void test_tprecv_TPEV_DISCONIMM_service(TPSVCINFO *svcinfo);
  30. extern void test_tprecv_TPEV_SVCFAIL_service(TPSVCINFO *svcinfo);
  31. extern void test_no_tpreturn_service(TPSVCINFO *svcinfo);
  32. void TestRollbackOnly::setUp() {
  33. BaseServerTest::setUp();
  34. // previous tests may have left a txn on the thread
  35. destroySpecific(TSS_KEY);
  36. sendlen = strlen("TestRbkOnly") + 1;
  37. BT_ASSERT((sendbuf
  38. = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  39. (void) strcpy(sendbuf, "TestRbkOnly");
  40. rcvlen = 60;
  41. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  42. != NULL);
  43. BT_ASSERT(tperrno == 0);
  44. }
  45. void TestRollbackOnly::tearDown() {
  46. destroySpecific(TSS_KEY);
  47. BT_ASSERT(tx_close() == TX_OK);
  48. ::tpfree( sendbuf);
  49. ::tpfree( rcvbuf);
  50. // Clean up server
  51. BaseServerTest::tearDown();
  52. }
  53. void TestRollbackOnly::test_tpcall_TPETIME() {
  54. userlogc((char*) "test_tpcall_TPETIME");
  55. int rc = tpadvertise((char*) "TestRbkOnly", test_tpcall_TPETIME_service);
  56. BT_ASSERT(tperrno == 0);
  57. BT_ASSERT(rc != -1);
  58. BT_ASSERT(tx_open() == TX_OK);
  59. // the TPETIME service sleeps for 8 so set the txn time to something smaller
  60. BT_ASSERT(tx_set_transaction_timeout(4l) == TX_OK);
  61. BT_ASSERT(tx_begin() == TX_OK);
  62. (void) ::tpcall((char*) "TestRbkOnly", (char *) sendbuf, sendlen,
  63. (char **) &rcvbuf, &rcvlen, (long) 0);
  64. BT_ASSERT(tperrno == TPETIME);
  65. TXINFO txinfo;
  66. int inTx = ::tx_info(&txinfo);
  67. userlogc((char*) "inTx=%d tx status=%ld", inTx, txinfo.transaction_state);
  68. BT_ASSERT(txinfo.transaction_state || TX_ROLLBACK_ONLY ||
  69. txinfo.transaction_state == TX_TIMEOUT_ROLLBACK_ONLY);
  70. BT_ASSERT(tx_commit() == TX_ROLLBACK);
  71. }
  72. void TestRollbackOnly::test_tpcall_TPEOTYPE() {
  73. userlogc((char*) "test_tpcall_TPEOTYPE");
  74. int rc = tpadvertise((char*) "TestRbkOnly", test_tpcall_TPEOTYPE_service);
  75. BT_ASSERT(tperrno == 0);
  76. BT_ASSERT(rc != -1);
  77. BT_ASSERT(tx_open() == TX_OK);
  78. BT_ASSERT(tx_begin() == TX_OK);
  79. (void) ::tpcall((char*) "TestRbkOnly", (char *) sendbuf, sendlen,
  80. (char **) &rcvbuf, &rcvlen, TPNOCHANGE);
  81. BT_ASSERT(tperrno == TPEOTYPE);
  82. TXINFO txinfo;
  83. int inTx = ::tx_info(&txinfo);
  84. userlogc((char*) "inTx=%d", inTx);
  85. BT_ASSERT(txinfo.transaction_state == TX_ROLLBACK_ONLY);
  86. BT_ASSERT(tx_commit() == TX_ROLLBACK);
  87. }
  88. void TestRollbackOnly::test_tpcall_TPESVCFAIL() {
  89. userlogc((char*) "test_tpcall_TPESVCFAIL");
  90. int rc = tpadvertise((char*) "TestRbkOnly", test_tpcall_TPESVCFAIL_service);
  91. BT_ASSERT(tperrno == 0);
  92. BT_ASSERT(rc != -1);
  93. BT_ASSERT(tx_open() == TX_OK);
  94. BT_ASSERT(tx_begin() == TX_OK);
  95. (void) ::tpcall((char*) "TestRbkOnly", (char *) sendbuf, sendlen,
  96. (char **) &rcvbuf, &rcvlen, (long) 0);
  97. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf,
  98. "test_tpcall_TPESVCFAIL_service") == 0);
  99. BT_ASSERT(tperrno == TPESVCFAIL);
  100. TXINFO txinfo;
  101. int inTx = ::tx_info(&txinfo);
  102. userlogc((char*) "inTx=%d", inTx);
  103. BT_ASSERT(txinfo.transaction_state == TX_ROLLBACK_ONLY);
  104. BT_ASSERT(tx_commit() == TX_ROLLBACK);
  105. }
  106. void TestRollbackOnly::test_tprecv_TPEV_DISCONIMM() {
  107. userlogc((char*) "test_tprecv_TPEV_DISCONIMM");
  108. int rc = tpadvertise((char*) "TestRbkOnly",
  109. test_tprecv_TPEV_DISCONIMM_service);
  110. BT_ASSERT(tperrno == 0);
  111. BT_ASSERT(rc != -1);
  112. BT_ASSERT(tx_open() == TX_OK);
  113. BT_ASSERT(tx_begin() == TX_OK);
  114. int cd = ::tpconnect((char*) "TestRbkOnly", (char *) sendbuf, sendlen,
  115. TPSENDONLY);
  116. ::tpdiscon(cd);
  117. BT_ASSERT(tperrno == 0);
  118. TXINFO txinfo;
  119. int inTx = ::tx_info(&txinfo);
  120. userlogc((char*) "inTx=%d", inTx);
  121. BT_ASSERT(txinfo.transaction_state == TX_ROLLBACK_ONLY);
  122. BT_ASSERT(tx_commit() == TX_ROLLBACK);
  123. }
  124. void TestRollbackOnly::test_tprecv_TPEV_SVCFAIL() {
  125. userlogc((char*) "test_tprecv_TPEV_SVCFAIL");
  126. int rc = tpadvertise((char*) "TestRbkOnly",
  127. test_tprecv_TPEV_SVCFAIL_service);
  128. BT_ASSERT(tperrno == 0);
  129. BT_ASSERT(rc != -1);
  130. BT_ASSERT(tx_open() == TX_OK);
  131. BT_ASSERT(tx_begin() == TX_OK);
  132. int cd = ::tpconnect((char*) "TestRbkOnly", (char *) sendbuf, sendlen,
  133. TPRECVONLY);
  134. long revent = 0;
  135. int status = ::tprecv(cd, (char **) &rcvbuf, &rcvlen, (long) 0, &revent);
  136. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf,
  137. "test_tprecv_TPEV_SVCFAIL_service") == 0);
  138. BT_ASSERT(status == -1);
  139. BT_ASSERT(revent == TPEV_SVCFAIL);
  140. BT_ASSERT(tperrno == TPEEVENT);
  141. TXINFO txinfo;
  142. int inTx = ::tx_info(&txinfo);
  143. userlogc((char*) "inTx=%d", inTx);
  144. BT_ASSERT(txinfo.transaction_state == TX_ROLLBACK_ONLY);
  145. BT_ASSERT(tx_commit() == TX_ROLLBACK);
  146. }
  147. void TestRollbackOnly::test_no_tpreturn() {
  148. userlogc((char*) "test_no_tpreturn");
  149. int rc = tpadvertise((char*) "TestRbkOnly", test_no_tpreturn_service);
  150. BT_ASSERT(tperrno == 0);
  151. BT_ASSERT(rc != -1);
  152. BT_ASSERT(tx_open() == TX_OK);
  153. BT_ASSERT(tx_begin() == TX_OK);
  154. (void) ::tpcall((char*) "TestRbkOnly", (char *) sendbuf, sendlen,
  155. (char **) &rcvbuf, &rcvlen, (long) 0);
  156. BT_ASSERT(tperrno == TPESVCERR);
  157. TXINFO txinfo;
  158. int inTx = ::tx_info(&txinfo);
  159. userlogc((char*) "inTx=%d", inTx);
  160. BT_ASSERT(txinfo.transaction_state == TX_ROLLBACK_ONLY);
  161. BT_ASSERT(tx_commit() == TX_ROLLBACK);
  162. }