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

中间件编程

开发平台:

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 "BaseServerTest.h"
  20. #include "XATMITestSuite.h"
  21. #include "xatmi.h"
  22. #include "TestTPCall.h"
  23. #include "Sleeper.h"
  24. extern void test_tpcall_x_octet_service(TPSVCINFO *svcinfo);
  25. extern void test_tpcall_x_octet_service_zero(TPSVCINFO *svcinfo);
  26. extern void test_tpcall_x_common_service(TPSVCINFO *svcinfo);
  27. extern void test_tpcall_x_c_type_service(TPSVCINFO *svcinfo);
  28. extern void test_tpcall_TPNOBLOCK(TPSVCINFO *svcinfo);
  29. extern void test_tpcall_TPNOTIME(TPSVCINFO *svcinfo);
  30. void TestTPCall::setUp() {
  31. userlogc((char*) "TestTPCall::setUp");
  32. sendbuf = NULL;
  33. rcvbuf = NULL;
  34. BaseServerTest::setUp();
  35. // Do local work
  36. }
  37. void TestTPCall::tearDown() {
  38. userlogc((char*) "TestTPCall::tearDown");
  39. // Do local work
  40. ::tpfree( sendbuf);
  41. ::tpfree( rcvbuf);
  42. // Clean up server
  43. BaseServerTest::tearDown();
  44. }
  45. void TestTPCall::test_tpcall_systemerr() {
  46. userlogc((char*) "test_tpcall_systemerr");
  47. sendlen = strlen("test_tpcall_systemerr") + 1;
  48. rcvlen = sendlen;
  49. BT_ASSERT((sendbuf
  50. = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  51. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  52. != NULL);
  53. (void) strcpy(sendbuf, "test_tpcall_systemerr");
  54. BT_ASSERT(tperrno == 0);
  55. // TODO stopNamingService();
  56. int id = ::tpcall((char*) "TestTPCall", (char *) sendbuf, sendlen,
  57. (char **) &rcvbuf, &rcvlen, (long) 0);
  58. BT_ASSERT(tperrno == TPESYSTEM);
  59. BT_ASSERT(id == -1);
  60. BT_ASSERT(strcmp(rcvbuf, "testtpcall") == -1);
  61. }
  62. void TestTPCall::test_tpcall_unknown_service() {
  63. userlogc((char*) "test_tpcall_unknown_service");
  64. sendlen = strlen("test_tpcall_unknown_service") + 1;
  65. rcvlen = sendlen;
  66. sendbuf = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen);
  67. rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen);
  68. strcpy(sendbuf, "test_tpcall_unknown_service");
  69. int id = ::tpcall((char*) "UNKNOWN_SERVICE", (char *) sendbuf, sendlen,
  70. (char **) &rcvbuf, &rcvlen, (long) 0);
  71. BT_ASSERT(tperrno == TPENOENT);
  72. BT_ASSERT(id == -1);
  73. BT_ASSERT(tperrno != 0);
  74. }
  75. void TestTPCall::test_tpcall_x_octet_lessdata() {
  76. userlogc((char*) "test_tpcall_x_octet_lessdata");
  77. BT_FAIL("UNIMPLEMENTED");
  78. }
  79. void TestTPCall::test_tpcall_null_service() {
  80. userlogc((char*) "test_tpcall_x_octet");
  81. tpadvertise((char*) "tpcall_x_octet", test_tpcall_x_octet_service);
  82. sendlen = strlen("test_tpcall_x_octet") + 1;
  83. rcvlen = sendlen;
  84. BT_ASSERT((sendbuf
  85. = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  86. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  87. != NULL);
  88. (void) strcpy(sendbuf, "test_tpcall_x_octet");
  89. BT_ASSERT(tperrno == 0);
  90. int id = ::tpcall(NULL, (char *) sendbuf, sendlen, (char **) &rcvbuf,
  91. &rcvlen, (long) 0);
  92. BT_ASSERT(tperrno == TPEINVAL);
  93. BT_ASSERT(id == -1);
  94. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "tpcall_x_octet") != 0);
  95. }
  96. void TestTPCall::test_tpcall_x_octet() {
  97. userlogc((char*) "test_tpcall_x_octet");
  98. tpadvertise((char*) "tpcall_x_octet", test_tpcall_x_octet_service);
  99. sendlen = strlen("test_tpcall_x_octet") + 1;
  100. rcvlen = sendlen;
  101. BT_ASSERT((sendbuf
  102. = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  103. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  104. != NULL);
  105. (void) strcpy(sendbuf, "test_tpcall_x_octet");
  106. BT_ASSERT(tperrno == 0);
  107. int id = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen,
  108. (char **) &rcvbuf, &rcvlen, (long) 0);
  109. BT_ASSERT(tperrno != TPEINVAL);
  110. BT_ASSERT(tperrno != TPENOENT);
  111. BT_ASSERT(tperrno != TPEITYPE);
  112. BT_ASSERT(tperrno != TPEOTYPE);
  113. BT_ASSERT(tperrno != TPETRAN);
  114. BT_ASSERT(tperrno != TPETIME);
  115. BT_ASSERT(tperrno != TPESVCFAIL);
  116. BT_ASSERT(tperrno != TPESVCERR);
  117. BT_ASSERT(tperrno != TPEBLOCK);
  118. BT_ASSERT(tperrno != TPGOTSIG);
  119. BT_ASSERT(tperrno != TPEPROTO);
  120. BT_ASSERT(tperrno != TPESYSTEM);
  121. BT_ASSERT(tperrno != TPEOS);
  122. BT_ASSERT(tperrno == 0);
  123. BT_ASSERT(tpurcode == 20);
  124. BT_ASSERT(id != -1);
  125. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "tpcall_x_octet") == 0);
  126. }
  127. void TestTPCall::test_tpcall_x_octet_zero() {
  128. userlogc((char*) "test_tpcall_x_octet_zero");
  129. tpadvertise((char*) "tpcall_x_octet", test_tpcall_x_octet_service_zero);
  130. BT_ASSERT((sendbuf = (char *) tpalloc((char*) "X_OCTET", NULL, 0))
  131. != NULL);
  132. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, 0))
  133. != NULL);
  134. BT_ASSERT(tperrno == 0);
  135. sendlen = 0;
  136. rcvlen = sendlen;
  137. int id = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, 0,
  138. (char **) &rcvbuf, &rcvlen, (long) 0);
  139. BT_ASSERT(tperrno != TPEINVAL);
  140. BT_ASSERT(tperrno != TPENOENT);
  141. BT_ASSERT(tperrno != TPEITYPE);
  142. BT_ASSERT(tperrno != TPEOTYPE);
  143. BT_ASSERT(tperrno != TPETRAN);
  144. BT_ASSERT(tperrno != TPETIME);
  145. BT_ASSERT(tperrno != TPESVCFAIL);
  146. BT_ASSERT(tperrno != TPESVCERR);
  147. BT_ASSERT(tperrno != TPEBLOCK);
  148. BT_ASSERT(tperrno != TPGOTSIG);
  149. BT_ASSERT(tperrno != TPEPROTO);
  150. BT_ASSERT(tperrno != TPESYSTEM);
  151. BT_ASSERT(tperrno != TPEOS);
  152. BT_ASSERT(tperrno == 0);
  153. BT_ASSERT(tpurcode == 21);
  154. BT_ASSERT(id != -1);
  155. BT_ASSERT(rcvlen == 0);
  156. }
  157. #include "malloc.h"
  158. // 9.1.2
  159. void TestTPCall::test_tpcall_x_common() {
  160. userlogc((char*) "test_tpcall_x_common");
  161. tpadvertise((char*) "tpcall_x_common", test_tpcall_x_common_service);
  162. DEPOSIT *dptr;
  163. dptr = (DEPOSIT*) tpalloc((char*) "X_COMMON", (char*) "deposit", 0);
  164. rcvlen = 60;
  165. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  166. != NULL);
  167. sendbuf = (char*) dptr;
  168. dptr->acct_no = 12345678;
  169. dptr->amount = 50;
  170. // userlogc("%d %d %d", sizeof(long), sizeof(int), sizeof(short));
  171. // char foo[sizeof(short)]; // 8
  172. // memcpy(foo, &sendbuf[8], sizeof(short));
  173. // short* bar = (short*) foo;
  174. // short barbar = *bar;
  175. int id = ::tpcall((char*) "tpcall_x_common", (char*) dptr, 0,
  176. (char**) &rcvbuf, &rcvlen, 0);
  177. BT_ASSERT(tperrno == 0);
  178. BT_ASSERT(tpurcode == 22);
  179. BT_ASSERT(id != -1);
  180. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "tpcall_x_common") == 0);
  181. }
  182. // 9.1.3
  183. void TestTPCall::test_tpcall_x_c_type() {
  184. userlogc((char*) "test_tpcall_x_c_type");
  185. tpadvertise((char*) "tpcall_x_c_type", test_tpcall_x_c_type_service);
  186. ACCT_INFO *aptr;
  187. aptr = (ACCT_INFO*) tpalloc((char*) "X_C_TYPE", (char*) "acct_info", 0);
  188. rcvlen = 60;
  189. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  190. != NULL);
  191. sendbuf = (char*) aptr;
  192. aptr->acct_no = 12345678;
  193. strcpy(aptr->name, "TOM");
  194. aptr->foo[0] = 1.1F;
  195. aptr->foo[1] = 2.2F;
  196. aptr->balances[0] = 1.1;
  197. aptr->balances[1] = 2.2;
  198. int id = ::tpcall((char*) "tpcall_x_c_type", (char*) aptr, 0,
  199. (char**) &rcvbuf, &rcvlen, TPNOCHANGE);
  200. BT_ASSERT(tperrno == 0);
  201. BT_ASSERT(tpurcode == 23);
  202. BT_ASSERT(id != -1);
  203. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "tpcall_x_c_type") == 0);
  204. }
  205. void TestTPCall::test_tpcall_with_TPNOCHANGE() {
  206. userlogc((char*) "test_tpcall_with_TPNOCHANGE");
  207. tpadvertise((char*) "tpcall_x_c_type", test_tpcall_x_c_type_service);
  208. ACCT_INFO *aptr;
  209. aptr = (ACCT_INFO*) tpalloc((char*) "X_C_TYPE", (char*) "acct_info", 0);
  210. rcvlen = 60;
  211. rcvbuf = (char *) tpalloc((char*) "X_C_TYPE", (char*) "acct_info", 0);
  212. BT_ASSERT(rcvbuf != NULL);
  213. sendbuf = (char*) aptr;
  214. aptr->acct_no = 12345678;
  215. strcpy(aptr->name, "TOM");
  216. aptr->foo[0] = 1.1F;
  217. aptr->foo[1] = 2.2F;
  218. aptr->balances[0] = 1.1;
  219. aptr->balances[1] = 2.2;
  220. int id = ::tpcall((char*) "tpcall_x_c_type", (char*) aptr, 0,
  221. (char**) &rcvbuf, &rcvlen, TPNOCHANGE);
  222. BT_ASSERT(tperrno == TPEOTYPE);
  223. BT_ASSERT(id == -1);
  224. char* type = (char*) malloc(8);
  225. char* subtype = (char*) malloc(16);
  226. long toTest = ::tptypes(rcvbuf, type, subtype);
  227. BT_ASSERT(strncmp(type, "X_C_TYPE", 8) == 0);
  228. BT_ASSERT(strncmp(subtype, "acct_info", 16) == 0);
  229. BT_ASSERT(toTest == sizeof(ACCT_INFO));
  230. free(type);
  231. free(subtype);
  232. }
  233. void TestTPCall::test_tpcall_without_TPNOCHANGE() {
  234. userlogc((char*) "test_tpcall_without_TPNOCHANGE");
  235. tpadvertise((char*) "tpcall_x_c_type", test_tpcall_x_c_type_service);
  236. ACCT_INFO *aptr;
  237. aptr = (ACCT_INFO*) tpalloc((char*) "X_C_TYPE", (char*) "acct_info", 0);
  238. rcvlen = 60;
  239. rcvbuf = (char *) tpalloc((char*) "X_C_TYPE", (char*) "acct_info", 0);
  240. BT_ASSERT(rcvbuf != NULL);
  241. sendbuf = (char*) aptr;
  242. aptr->acct_no = 12345678;
  243. strcpy(aptr->name, "TOM");
  244. aptr->foo[0] = 1.1F;
  245. aptr->foo[1] = 2.2F;
  246. aptr->balances[0] = 1.1;
  247. aptr->balances[1] = 2.2;
  248. int id = ::tpcall((char*) "tpcall_x_c_type", (char*) aptr, 0,
  249. (char**) &rcvbuf, &rcvlen, 0);
  250. BT_ASSERT(tperrno == 0);
  251. BT_ASSERT(tpurcode == 23);
  252. BT_ASSERT(id != -1);
  253. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, "tpcall_x_c_type") == 0);
  254. BT_ASSERT(rcvlen == 60);
  255. char* type = (char*) malloc(8);
  256. char* subtype = (char*) malloc(16);
  257. long toTest = ::tptypes(rcvbuf, type, subtype);
  258. BT_ASSERT(strcmp(type, "X_OCTET") == 0);
  259. BT_ASSERT(strcmp(subtype, "") == 0);
  260. BT_ASSERT(toTest == 60);
  261. free(type);
  262. free(subtype);
  263. }
  264. void test_tpcall_x_octet_service(TPSVCINFO *svcinfo) {
  265. userlogc((char*) "test_tpcall_x_octet_service");
  266. bool ok = false;
  267. if (svcinfo->data) {
  268. if (strncmp(svcinfo->data, "test_tpcall_x_octet", svcinfo->len) == 0) {
  269. ok = true;
  270. }
  271. }
  272. int len = 60;
  273. char *toReturn = ::tpalloc((char*) "X_OCTET", NULL, len);
  274. if (ok) {
  275. strcpy(toReturn, "tpcall_x_octet");
  276. } else {
  277. strcpy(toReturn, "fail");
  278. if (svcinfo->data) {
  279. strcpy(toReturn, svcinfo->data);
  280. } else {
  281. strcpy(toReturn, "dud");
  282. }
  283. }
  284. tpreturn(TPSUCCESS, 20, toReturn, len, 0);
  285. }
  286. void test_tpcall_x_octet_service_zero(TPSVCINFO *svcinfo) {
  287. userlogc((char*) "test_tpcall_x_octet_service_zero");
  288. int len = 0;
  289. char *toReturn = ::tpalloc((char*) "X_OCTET", NULL, len);
  290. tpreturn(TPSUCCESS, 21, toReturn, len, 0);
  291. }
  292. void test_tpcall_x_common_service(TPSVCINFO *svcinfo) {
  293. userlogc((char*) "test_tpcall_x_common_service");
  294. bool ok = false;
  295. DEPOSIT *dptr = (DEPOSIT*) svcinfo->data;
  296. if (dptr->acct_no == 12345678 && dptr->amount == 50) {
  297. ok = true;
  298. }
  299. int len = 60;
  300. char *toReturn = ::tpalloc((char*) "X_OCTET", NULL, len);
  301. if (ok) {
  302. strcpy(toReturn, "tpcall_x_common");
  303. } else {
  304. strcpy(toReturn, "fail");
  305. }
  306. tpreturn(TPSUCCESS, 22, toReturn, len, 0);
  307. }
  308. void test_tpcall_x_c_type_service(TPSVCINFO *svcinfo) {
  309. userlogc((char*) "test_tpcall_x_c_type_service");
  310. bool ok = false;
  311. ACCT_INFO *aptr = (ACCT_INFO*) svcinfo->data;
  312. bool acctEq = aptr->acct_no == 12345678;
  313. bool nameEq = strcmp(aptr->name, "TOM") == 0;
  314. bool fooEq = aptr->foo[0] == 1.1F && aptr->foo[1] == 2.2F;
  315. bool balsEq = aptr->balances[0] == 1.1 && aptr->balances[1] == 2.2;
  316. if (acctEq && nameEq && fooEq && balsEq) {
  317. ok = true;
  318. }
  319. int len = 60;
  320. char *toReturn = ::tpalloc((char*) "X_OCTET", NULL, len);
  321. if (ok) {
  322. strcpy(toReturn, "tpcall_x_c_type");
  323. } else {
  324. strcpy(toReturn, "fail");
  325. }
  326. tpreturn(TPSUCCESS, 23, toReturn, len, 0);
  327. }
  328. void TestTPCall::test_tpcall_with_TPNOBLOCK() {
  329. char* toTest = (char*) "test_tpcall_TPNOBLOCK";
  330. userlogc(toTest);
  331. tpadvertise((char*) "tpcall_x_octet", test_tpcall_TPNOBLOCK);
  332. sendlen = strlen(toTest) + 1;
  333. rcvlen = sendlen;
  334. BT_ASSERT((sendbuf
  335. = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  336. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  337. != NULL);
  338. (void) strcpy(sendbuf, toTest);
  339. BT_ASSERT(tperrno == 0);
  340. int id = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen,
  341. (char **) &rcvbuf, &rcvlen, TPNOBLOCK);
  342. BT_ASSERT(tperrno == 0);
  343. BT_ASSERT(id != -1);
  344. BT_ASSERT(strcmp(rcvbuf, toTest) == 0);
  345. }
  346. void TestTPCall::test_tpcall_without_TPNOBLOCK() {
  347. char* toTest = (char*) "test_tpcall_no_TPNOBLOCK";
  348. userlogc(toTest);
  349. tpadvertise((char*) "tpcall_x_octet", test_tpcall_TPNOBLOCK);
  350. sendlen = strlen(toTest) + 1;
  351. rcvlen = sendlen;
  352. BT_ASSERT((sendbuf
  353. = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  354. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  355. != NULL);
  356. (void) strcpy(sendbuf, toTest);
  357. BT_ASSERT(tperrno == 0);
  358. int id = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen,
  359. (char **) &rcvbuf, &rcvlen, (long) 0);
  360. BT_ASSERT(tperrno == 0);
  361. BT_ASSERT(id != -1);
  362. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, toTest) == 0);
  363. }
  364. void TestTPCall::test_tpcall_without_TPNOTIME() {
  365. char* toTest = (char*) "test_tpcall_no_TPNOTIME";
  366. userlogc(toTest);
  367. tpadvertise((char*) "tpcall_x_octet", test_tpcall_TPNOTIME);
  368. sendlen = strlen(toTest) + 1;
  369. rcvlen = sendlen;
  370. BT_ASSERT((sendbuf
  371. = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  372. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  373. != NULL);
  374. (void) strcpy(sendbuf, toTest);
  375. BT_ASSERT(tperrno == 0);
  376. int id = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen,
  377. (char **) &rcvbuf, &rcvlen, 0);
  378. BT_ASSERT(tperrno == TPETIME);
  379. BT_ASSERT(id == -1);
  380. BT_ASSERT(strcmp(rcvbuf, toTest) == -1);
  381. }
  382. void TestTPCall::test_tpcall_with_TPNOTIME() {
  383. char* toTest = (char*) "test_tpcall_TPNOTIME";
  384. userlogc(toTest);
  385. tpadvertise((char*) "tpcall_x_octet", test_tpcall_TPNOTIME);
  386. sendlen = strlen(toTest) + 1;
  387. rcvlen = sendlen;
  388. BT_ASSERT((sendbuf
  389. = (char *) tpalloc((char*) "X_OCTET", NULL, sendlen)) != NULL);
  390. BT_ASSERT((rcvbuf = (char *) tpalloc((char*) "X_OCTET", NULL, rcvlen))
  391. != NULL);
  392. (void) strcpy(sendbuf, toTest);
  393. BT_ASSERT(tperrno == 0);
  394. int id = ::tpcall((char*) "tpcall_x_octet", (char *) sendbuf, sendlen,
  395. (char **) &rcvbuf, &rcvlen, TPNOTIME);
  396. BT_ASSERT(tperrno == 0);
  397. BT_ASSERT(id != -1);
  398. BT_ASSERT_MESSAGE(rcvbuf, strcmp(rcvbuf, toTest) == 0);
  399. }
  400. void test_tpcall_TPNOBLOCK(TPSVCINFO *svcinfo) {
  401. userlogc((char*) "test_tpcall_TPNOBLOCK");
  402. ::sleeper(5);
  403. tpreturn(TPSUCCESS, 0, svcinfo->data, svcinfo->len, 0);
  404. }
  405. void test_tpcall_TPNOTIME(TPSVCINFO *svcinfo) {
  406. userlogc((char*) "test_tpcall_TPNOTIME");
  407. ::sleeper(31);
  408. tpreturn(TPSUCCESS, 0, svcinfo->data, svcinfo->len, 0);
  409. }