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

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2009, 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 "testTxAvoid.h"
  20. #include "OrbManagement.h"
  21. #include "XAResourceAdaptorImpl.h"
  22. #include "ace/OS_NS_unistd.h"
  23. #include "TxManager.h"
  24. #include "userlogc.h"
  25. #include "AtmiBrokerEnv.h"
  26. void initEnv() {
  27. #ifdef WIN32
  28. ::putenv("BLACKTIE_CONFIGURATION=win32");
  29. #else
  30. ACE_OS::putenv("BLACKTIE_CONFIGURATION=linux");
  31. #endif
  32. AtmiBrokerEnv::get_instance();
  33. }
  34. void destroyEnv(){
  35. ::putenv((char*) "BLACKTIE_CONFIGURATION=");
  36. AtmiBrokerEnv::discard_instance();
  37. }
  38. void doOne() {
  39. try {
  40. XARecoveryLog log("test_recovery_log");
  41. XID gid = {1L, 1L, 0L};
  42. XID xid = XAResourceManager::gen_xid(200, 0L, gid);
  43. XID xid2 = XAResourceManager::gen_xid(201, 0L, gid);
  44. int rv, cnt = 0;
  45. char* ior = (char *) "IOR:1";
  46. // add a record
  47. rv = log.add_rec(xid, ior);
  48. BT_ASSERT(rv == 0);
  49. // delete it by XID
  50. rv = log.del_rec(xid);
  51. BT_ASSERT(rv == 0);
  52. // add a record
  53. rv = log.add_rec(xid, ior);
  54. BT_ASSERT(rv == 0);
  55. // find it by xid
  56. ior = log.find_ior(xid);
  57. BT_ASSERT(ior != 0);
  58. // add another record
  59. BT_ASSERT(log.add_rec(xid2, (char *) "IOR:2") == 0);
  60. // use an iterator to check that there are two records
  61. for (rrec_t* rr = log.find_next(0); rr; rr = log.find_next(rr)) {
  62. cnt += 1;
  63. log.del_rec(rr->xid);
  64. }
  65. BT_ASSERT(cnt >= 2);
  66. } catch (RMException e) {
  67. std::string s = "Error creating recovery log: ";
  68. s += e.what();
  69. BT_FAIL(s.c_str());
  70. }
  71. }
  72. void doTwo() {
  73. userlogc_debug( (char*) "TestTransactions::test_basic begin");
  74. atmibroker::tx::TxManager *txm = atmibroker::tx::TxManager::get_instance();
  75. BT_ASSERT_EQUAL(TX_OK, txm->open());
  76. BT_ASSERT_EQUAL(TX_OK, txm->begin());
  77. BT_ASSERT_EQUAL(TX_OK, txm->suspend(123, NULL));
  78. BT_ASSERT_EQUAL(true, txm->isCdTransactional(123));
  79. BT_ASSERT_EQUAL(TX_OK, txm->resume(123));
  80. BT_ASSERT_EQUAL(TX_OK, txm->commit());
  81. BT_ASSERT_EQUAL(TX_OK, txm->close());
  82. atmibroker::tx::TxManager::discard_instance();
  83. userlogc( (char*) "TestTransactions::test_basic pass");
  84. }
  85.  
  86. void doThree(long delay) {
  87. (void) ACE_OS::sleep(delay);
  88. }
  89. void doFour() {
  90. BT_ASSERT_EQUAL(TX_OK, txx_rollback_only());
  91. }
  92. static int fn1(char *a, int i, long l) { return 0; }
  93. static int fn2(XID *x, int i, long l) { return 0; }
  94. static int fn3(XID *, long l1, int i, long l2) { return 0; }
  95. static int fn4(int *ip1, int *ip2, int i, long l) { return 0; }
  96. static struct xa_switch_t real_resource = { "DummyRM", 0L, 0, fn1, fn1, /* open and close */
  97. fn2, fn2, fn2, fn2, fn2, /*start, end, rollback, prepare, commit */
  98. fn3, /* recover */
  99. fn2, /* forget */
  100. fn4 /* complete */
  101. };
  102. // manufacture a dummy RM transaction id
  103. static XID xid = {
  104. 1L, /* long formatID */
  105. 0L, /* long gtrid_length */
  106. 0L, /* long bqual_length */
  107. {0} /* char data[XIDDATASIZE]; */
  108. };
  109. void* doFive() {
  110. XARecoveryLog log;
  111. CosTransactions::Control_ptr curr = (CosTransactions::Control_ptr) txx_get_control();
  112. // there should be a transaction running
  113. BT_ASSERT_MESSAGE("curr is nil", !CORBA::is_nil(curr));
  114. CosTransactions::Coordinator_ptr c = curr->get_coordinator(); // will leak curr if exception
  115. txx_release_control(curr);
  116. // and it should have a coordinator
  117. BT_ASSERT_MESSAGE("coordinator is nil", !CORBA::is_nil(c));
  118. // a side effect of starting a transaction is to start an orb
  119. CORBA::ORB_var orb = atmibroker::tx::TxManager::get_instance()->getOrb();
  120. BT_ASSERT_MESSAGE("orb is nil", !CORBA::is_nil(orb));
  121. // get a handle on a poa
  122. CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
  123. PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
  124. PortableServer::POAManager_var mgr = poa->the_POAManager();
  125. mgr->activate();
  126. // now for the real test:
  127. // - create a CosTransactions::Resource ...
  128. //XAResourceAdaptorImpl * ra = new XAResourceAdaptorImpl(findConnection("ots"), "Dummy", "", "", 123L, &real_resource, log);
  129. XAResourceAdaptorImpl * ra = new XAResourceAdaptorImpl(NULL, xid, xid, 123L, &real_resource, log);
  130. //XAResourceAdaptorImpl * ra = new XAResourceAdaptorImpl(123L, &real_resource, log);
  131. CORBA::Object_ptr ref = poa->servant_to_reference(ra);
  132. CosTransactions::Resource_var v = CosTransactions::Resource::_narrow(ref);
  133. try {
  134. // ... and enlist it with the transaction
  135. CosTransactions::RecoveryCoordinator_ptr rc = c->register_resource(v);
  136. BT_ASSERT_MESSAGE("recovery coordinator is nil", !CORBA::is_nil(rc));
  137. } catch (CosTransactions::Inactive&) {
  138. BT_FAIL("corba resource registration error - inactive");
  139. } catch (const CORBA::SystemException& ex) {
  140. ex._tao_print_exception("Resource registration error: ");
  141. BT_FAIL("corba resource registration error - system ex");
  142. }
  143. return ra;
  144. }
  145. void doSix(long delay) {
  146. (void) ACE_OS::sleep(delay);
  147. }
  148. void doSeven(void* rad) {
  149. XAResourceAdaptorImpl * ra = (XAResourceAdaptorImpl *) rad;
  150. // the resource should have been committed
  151. BT_ASSERT_MESSAGE("resource did not complete", ra->is_complete());
  152. }