4
0

testsam.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465
  1. /*
  2. * Copyright (c) 2009-2011 Red Hat, Inc.
  3. *
  4. * All rights reserved.
  5. *
  6. * Author: Jan Friesse (jfriesse@redhat.com)
  7. *
  8. * This software licensed under BSD license, the text of which follows:
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions are met:
  12. *
  13. * - Redistributions of source code must retain the above copyright notice,
  14. * this list of conditions and the following disclaimer.
  15. * - Redistributions in binary form must reproduce the above copyright notice,
  16. * this list of conditions and the following disclaimer in the documentation
  17. * and/or other materials provided with the distribution.
  18. * - Neither the name of the Red Hat, Inc. nor the names of its
  19. * contributors may be used to endorse or promote products derived from this
  20. * software without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  23. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  26. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  27. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  28. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  29. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  30. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  31. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  32. * THE POSSIBILITY OF SUCH DAMAGE.
  33. */
  34. /*
  35. * Provides test of SAM API
  36. */
  37. #include <config.h>
  38. #include <limits.h>
  39. #include <pthread.h>
  40. #include <sys/types.h>
  41. #include <stdio.h>
  42. #include <stdint.h>
  43. #include <stdlib.h>
  44. #include <unistd.h>
  45. #include <corosync/corotypes.h>
  46. #include <corosync/sam.h>
  47. #include <signal.h>
  48. #include <string.h>
  49. #include <sys/wait.h>
  50. #include <corosync/cmap.h>
  51. extern const char *__progname;
  52. static int test2_sig_delivered = 0;
  53. static int test5_hc_cb_count = 0;
  54. static int test6_sig_delivered = 0;
  55. /*
  56. * First test will just register SAM, with policy restart. First instance will
  57. * sleep one second, send hc and sleep another 3 seconds. This should force restart.
  58. * Second instance will sleep one second, send hc, stop hc and sleep 3 seconds.
  59. * Then start hc again and sleep 3 seconds. This should force restart again.
  60. * Last instance just calls initialize again. This should end with error.
  61. * Then call start, followed by stop and start again. Finally, we will call finalize
  62. * twice. One should succeed, second should fail. After this, we will call every function
  63. * (none should succeed).
  64. */
  65. static int test1 (void)
  66. {
  67. cs_error_t error;
  68. unsigned int instance_id;
  69. int i;
  70. printf ("%s: initialize\n", __FUNCTION__);
  71. error = sam_initialize (2000, SAM_RECOVERY_POLICY_RESTART);
  72. if (error != CS_OK) {
  73. fprintf (stderr, "Can't initialize SAM API. Error %d\n", error);
  74. return 1;
  75. }
  76. printf ("%s: register\n", __FUNCTION__);
  77. error = sam_register (&instance_id);
  78. if (error != CS_OK) {
  79. fprintf (stderr, "Can't register. Error %d\n", error);
  80. return 1;
  81. }
  82. if (instance_id == 1 || instance_id == 2) {
  83. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  84. error = sam_start ();
  85. if (error != CS_OK) {
  86. fprintf (stderr, "Can't start hc. Error %d\n", error);
  87. return 1;
  88. }
  89. for (i = 0; i < 10; i++) {
  90. printf ("%s iid %d: sleep 1\n", __FUNCTION__, instance_id);
  91. sleep (1);
  92. printf ("%s iid %d: hc send\n", __FUNCTION__, instance_id);
  93. error = sam_hc_send ();
  94. if (error != CS_OK) {
  95. fprintf (stderr, "Can't send hc. Error %d\n", error);
  96. return 1;
  97. }
  98. }
  99. if (instance_id == 2) {
  100. printf ("%s iid %d: stop\n", __FUNCTION__, instance_id);
  101. error = sam_stop ();
  102. if (error != CS_OK) {
  103. fprintf (stderr, "Can't send hc. Error %d\n", error);
  104. return 1;
  105. }
  106. }
  107. printf ("%s iid %d: sleep 3\n", __FUNCTION__, instance_id);
  108. sleep (3);
  109. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  110. error = sam_start ();
  111. if (error != CS_OK) {
  112. fprintf (stderr, "Can't start hc. Error %d\n", error);
  113. return 1;
  114. }
  115. printf ("%s iid %d: sleep 3\n", __FUNCTION__, instance_id);
  116. sleep (3);
  117. return 0;
  118. }
  119. if (instance_id == 3) {
  120. error = sam_initialize (2000, SAM_RECOVERY_POLICY_RESTART);
  121. if (error == CS_OK) {
  122. fprintf (stderr, "Can initialize SAM API after initialization");
  123. return 1;
  124. }
  125. error = sam_start ();
  126. if (error != CS_OK) {
  127. fprintf (stderr, "Can't start hc. Error %d\n", error);
  128. return 1;
  129. }
  130. error = sam_stop ();
  131. if (error != CS_OK) {
  132. fprintf (stderr, "Can't stop hc. Error %d\n", error);
  133. return 1;
  134. }
  135. error = sam_finalize ();
  136. if (error != CS_OK) {
  137. fprintf (stderr, "Can't finalize sam. Error %d\n", error);
  138. return 1;
  139. }
  140. error = sam_finalize ();
  141. if (error == CS_OK) {
  142. fprintf (stderr, "Can finalize sam after finalization!\n");
  143. return 1;
  144. }
  145. if (sam_initialize (2, SAM_RECOVERY_POLICY_RESTART) == CS_OK ||
  146. sam_start () == CS_OK || sam_stop () == CS_OK ||
  147. sam_register (NULL) == CS_OK || sam_hc_send () == CS_OK ||
  148. sam_hc_callback_register (NULL) == CS_OK) {
  149. fprintf (stderr, "Can call one of function after finalization!\n");
  150. return 1;
  151. }
  152. return 0;
  153. }
  154. return 1;
  155. }
  156. static void test2_signal (int sig) {
  157. printf ("%s\n", __FUNCTION__);
  158. test2_sig_delivered = 1;
  159. }
  160. /*
  161. * This tests recovery policy quit and callback.
  162. */
  163. static int test2 (void) {
  164. cs_error_t error;
  165. unsigned int instance_id;
  166. printf ("%s: initialize\n", __FUNCTION__);
  167. error = sam_initialize (2000, SAM_RECOVERY_POLICY_QUIT);
  168. if (error != CS_OK) {
  169. fprintf (stderr, "Can't initialize SAM API. Error %d\n", error);
  170. return 1;
  171. }
  172. printf ("%s: register\n", __FUNCTION__);
  173. error = sam_register (&instance_id);
  174. if (error != CS_OK) {
  175. fprintf (stderr, "Can't register. Error %d\n", error);
  176. return 1;
  177. }
  178. if (instance_id == 1) {
  179. signal (SIGTERM, test2_signal);
  180. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  181. error = sam_start ();
  182. if (error != CS_OK) {
  183. fprintf (stderr, "Can't start hc. Error %d\n", error);
  184. return 1;
  185. }
  186. printf ("%s iid %d: sleep 1\n", __FUNCTION__, instance_id);
  187. sleep (1);
  188. printf ("%s iid %d: hc send\n", __FUNCTION__, instance_id);
  189. error = sam_hc_send ();
  190. if (error != CS_OK) {
  191. fprintf (stderr, "Can't send hc. Error %d\n", error);
  192. return 1;
  193. }
  194. printf ("%s iid %d: wait for delivery of signal\n", __FUNCTION__, instance_id);
  195. while (!test2_sig_delivered) {
  196. sleep (1);
  197. }
  198. printf ("%s iid %d: wait for real kill\n", __FUNCTION__, instance_id);
  199. sleep (3);
  200. }
  201. return 1;
  202. }
  203. /*
  204. * Smoke test. Better to turn off coredump ;) This has no time limit, just restart process
  205. * when it dies.
  206. */
  207. static int test3 (void) {
  208. cs_error_t error;
  209. unsigned int instance_id;
  210. printf ("%s: initialize\n", __FUNCTION__);
  211. error = sam_initialize (0, SAM_RECOVERY_POLICY_RESTART);
  212. if (error != CS_OK) {
  213. fprintf (stderr, "Can't initialize SAM API. Error %d\n", error);
  214. return 1;
  215. }
  216. printf ("%s: register\n", __FUNCTION__);
  217. error = sam_register (&instance_id);
  218. if (error != CS_OK) {
  219. fprintf (stderr, "Can't register. Error %d\n", error);
  220. return 1;
  221. }
  222. if (instance_id < 100) {
  223. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  224. error = sam_start ();
  225. if (error != CS_OK) {
  226. fprintf (stderr, "Can't start hc. Error %d\n", error);
  227. return 1;
  228. }
  229. printf ("%s iid %d: Sending signal\n", __FUNCTION__, instance_id);
  230. kill(getpid(), SIGSEGV);
  231. return 1;
  232. }
  233. return 0;
  234. }
  235. /*
  236. * Test sam_data_store, sam_data_restore and sam_data_getsize
  237. */
  238. static int test4 (void)
  239. {
  240. size_t size;
  241. cs_error_t err;
  242. int i;
  243. unsigned int instance_id;
  244. char saved_data[128];
  245. char saved_data2[128];
  246. printf ("%s: sam_data_getsize 1\n", __FUNCTION__);
  247. err = sam_data_getsize (&size);
  248. if (err != CS_ERR_BAD_HANDLE) {
  249. fprintf (stderr, "Test should return CS_ERR_BAD_HANDLE. Error returned %d\n", err);
  250. return 1;
  251. }
  252. printf ("%s: sam_data_getsize 2\n", __FUNCTION__);
  253. err = sam_data_getsize (NULL);
  254. if (err != CS_ERR_INVALID_PARAM) {
  255. fprintf (stderr, "Test should return CS_ERR_INVALID_PARAM. Error returned %d\n", err);
  256. return 1;
  257. }
  258. printf ("%s: sam_data_store 1\n", __FUNCTION__);
  259. err = sam_data_store (NULL, 0);
  260. if (err != CS_ERR_BAD_HANDLE) {
  261. fprintf (stderr, "Test should return CS_ERR_BAD_HANDLE. Error returned %d\n", err);
  262. return 1;
  263. }
  264. printf ("%s: sam_data_restore 1\n", __FUNCTION__);
  265. err = sam_data_restore (saved_data, sizeof (saved_data));
  266. if (err != CS_ERR_BAD_HANDLE) {
  267. fprintf (stderr, "Test should return CS_ERR_BAD_HANDLE. Error returned %d\n", err);
  268. return 1;
  269. }
  270. printf ("%s: sam_initialize\n", __FUNCTION__);
  271. err = sam_initialize (0, SAM_RECOVERY_POLICY_RESTART);
  272. if (err != CS_OK) {
  273. fprintf (stderr, "Can't initialize SAM API. Error %d\n", err);
  274. return 1;
  275. }
  276. printf ("%s: sam_data_getsize 3\n", __FUNCTION__);
  277. err = sam_data_getsize (&size);
  278. if (err != CS_OK) {
  279. fprintf (stderr, "Test should return CS_ERR_BAD_HANDLE. Error returned %d\n", err);
  280. return 1;
  281. }
  282. if (size != 0) {
  283. fprintf (stderr, "Test should return size of 0. Returned %zx\n", size);
  284. return 1;
  285. }
  286. printf ("%s: sam_data_restore 2\n", __FUNCTION__);
  287. err = sam_data_restore (NULL, sizeof (saved_data));
  288. if (err != CS_ERR_INVALID_PARAM) {
  289. fprintf (stderr, "Test should return CS_ERR_INVALID_PARAM. Error returned %d\n", err);
  290. return 1;
  291. }
  292. /*
  293. * Store some real data
  294. */
  295. for (i = 0; i < sizeof (saved_data); i++) {
  296. saved_data[i] = (char)(i + 5);
  297. }
  298. printf ("%s: sam_data_store 2\n", __FUNCTION__);
  299. err = sam_data_store (saved_data, sizeof (saved_data));
  300. if (err != CS_OK) {
  301. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  302. return 1;
  303. }
  304. printf ("%s: sam_data_getsize 4\n", __FUNCTION__);
  305. err = sam_data_getsize (&size);
  306. if (err != CS_OK) {
  307. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  308. return 1;
  309. }
  310. if (size != sizeof (saved_data)) {
  311. fprintf (stderr, "Test should return size of 0. Returned %zx\n", size);
  312. return 1;
  313. }
  314. printf ("%s: sam_data_restore 3\n", __FUNCTION__);
  315. err = sam_data_restore (saved_data2, sizeof (saved_data2) - 1);
  316. if (err != CS_ERR_INVALID_PARAM) {
  317. fprintf (stderr, "Test should return CS_ERR_INVALID_PARAM. Error returned %d\n", err);
  318. return 1;
  319. }
  320. printf ("%s: sam_data_restore 4\n", __FUNCTION__);
  321. err = sam_data_restore (saved_data2, sizeof (saved_data2));
  322. if (err != CS_OK) {
  323. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  324. return 1;
  325. }
  326. if (memcmp (saved_data, saved_data2, sizeof (saved_data2)) != 0) {
  327. fprintf (stderr, "Retored data are not same\n");
  328. return 1;
  329. }
  330. memset (saved_data2, 0, sizeof (saved_data2));
  331. printf ("%s: sam_data_store 3\n", __FUNCTION__);
  332. err = sam_data_store (NULL, 1);
  333. if (err != CS_OK) {
  334. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  335. return 1;
  336. }
  337. printf ("%s: sam_data_getsize 5\n", __FUNCTION__);
  338. err = sam_data_getsize (&size);
  339. if (err != CS_OK) {
  340. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  341. return 1;
  342. }
  343. if (size != 0) {
  344. fprintf (stderr, "Test should return size of 0. Returned %zx\n", size);
  345. return 1;
  346. }
  347. printf ("%s: sam_data_store 4\n", __FUNCTION__);
  348. err = sam_data_store (saved_data, sizeof (saved_data));
  349. if (err != CS_OK) {
  350. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  351. return 1;
  352. }
  353. printf ("%s: register\n", __FUNCTION__);
  354. err = sam_register (&instance_id);
  355. if (err != CS_OK) {
  356. fprintf (stderr, "Can't register. Error %d\n", err);
  357. return 1;
  358. }
  359. if (instance_id == 1) {
  360. printf ("%s iid %d: sam_start\n", __FUNCTION__, instance_id);
  361. err = sam_start ();
  362. if (err != CS_OK) {
  363. fprintf (stderr, "Can't start hc. Error %d\n", err);
  364. return 1;
  365. }
  366. printf ("%s iid %d: sam_data_getsize 6\n", __FUNCTION__, instance_id);
  367. err = sam_data_getsize (&size);
  368. if (err != CS_OK) {
  369. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  370. return 1;
  371. }
  372. if (size != sizeof (saved_data2)) {
  373. fprintf (stderr, "Test should return size of 0. Returned %zx\n", size);
  374. return 1;
  375. }
  376. printf ("%s iid %d: sam_data_restore 5\n", __FUNCTION__, instance_id);
  377. err = sam_data_restore (saved_data2, sizeof (saved_data2));
  378. if (err != CS_OK) {
  379. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  380. return 1;
  381. }
  382. if (memcmp (saved_data, saved_data2, sizeof (saved_data2)) != 0) {
  383. fprintf (stderr, "Retored data are not same\n");
  384. return 1;
  385. }
  386. for (i = 0; i < sizeof (saved_data); i++) {
  387. saved_data[i] = (char)(i - 5);
  388. }
  389. printf ("%s iid %d: sam_data_store 5\n", __FUNCTION__, instance_id);
  390. err = sam_data_store (saved_data, sizeof (saved_data) - 7);
  391. if (err != CS_OK) {
  392. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  393. return 1;
  394. }
  395. exit (1);
  396. }
  397. if (instance_id == 2) {
  398. printf ("%s iid %d: sam_start\n", __FUNCTION__, instance_id);
  399. err = sam_start ();
  400. if (err != CS_OK) {
  401. fprintf (stderr, "Can't start hc. Error %d\n", err);
  402. return 1;
  403. }
  404. printf ("%s iid %d: sam_data_getsize 7\n", __FUNCTION__, instance_id);
  405. err = sam_data_getsize (&size);
  406. if (err != CS_OK) {
  407. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  408. return 1;
  409. }
  410. if (size != sizeof (saved_data2) - 7) {
  411. fprintf (stderr, "Test should return size of 0. Returned %zx\n", size);
  412. return 1;
  413. }
  414. printf ("%s iid %d: sam_data_restore 6\n", __FUNCTION__, instance_id);
  415. err = sam_data_restore (saved_data2, sizeof (saved_data2));
  416. if (err != CS_OK) {
  417. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  418. return 1;
  419. }
  420. for (i = 0; i < sizeof (saved_data); i++) {
  421. saved_data[i] = (char)(i - 5);
  422. }
  423. if (memcmp (saved_data, saved_data2, sizeof (saved_data2) - 7) != 0) {
  424. fprintf (stderr, "Retored data are not same\n");
  425. return 1;
  426. }
  427. printf ("%s iid %d: sam_data_store 6\n", __FUNCTION__, instance_id);
  428. err = sam_data_store (NULL, 0);
  429. if (err != CS_OK) {
  430. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  431. return 1;
  432. }
  433. exit (1);
  434. }
  435. if (instance_id == 3) {
  436. printf ("%s iid %d: sam_data_getsize 8\n", __FUNCTION__, instance_id);
  437. err = sam_data_getsize (&size);
  438. if (err != CS_OK) {
  439. fprintf (stderr, "Test should return CS_OK. Error returned %d\n", err);
  440. return 1;
  441. }
  442. if (size != 0) {
  443. fprintf (stderr, "Test should return size of 0. Returned %zx\n", size);
  444. return 1;
  445. }
  446. }
  447. return (0);
  448. }
  449. static int test5_hc_cb (void)
  450. {
  451. cs_error_t res;
  452. printf ("%s %d\n", __FUNCTION__, ++test5_hc_cb_count);
  453. res = sam_data_store (&test5_hc_cb_count, sizeof (test5_hc_cb_count));
  454. if (res != CS_OK)
  455. return 1;
  456. if (test5_hc_cb_count > 10)
  457. return 1;
  458. return 0;
  459. }
  460. /*
  461. * Test event driven healtchecking.
  462. */
  463. static int test5 (void)
  464. {
  465. cs_error_t error;
  466. unsigned int instance_id;
  467. int hc_cb_count;
  468. printf ("%s: initialize\n", __FUNCTION__);
  469. error = sam_initialize (100, SAM_RECOVERY_POLICY_RESTART);
  470. if (error != CS_OK) {
  471. fprintf (stderr, "Can't initialize SAM API. Error %d\n", error);
  472. return 1;
  473. }
  474. printf ("%s: register\n", __FUNCTION__);
  475. error = sam_register (&instance_id);
  476. if (error != CS_OK) {
  477. fprintf (stderr, "Can't register. Error %d\n", error);
  478. return 1;
  479. }
  480. if (instance_id == 1) {
  481. printf ("%s iid %d: hc callback register\n", __FUNCTION__, instance_id);
  482. error = sam_hc_callback_register (test5_hc_cb);
  483. if (error != CS_OK) {
  484. fprintf (stderr, "Can't register hc cb. Error %d\n", error);
  485. return 1;
  486. }
  487. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  488. error = sam_start ();
  489. if (error != CS_OK) {
  490. fprintf (stderr, "Can't start hc. Error %d\n", error);
  491. return 1;
  492. }
  493. sleep (2);
  494. printf ("%s iid %d: Failed. Wasn't killed.\n", __FUNCTION__, instance_id);
  495. return 1;
  496. }
  497. if (instance_id == 2) {
  498. error = sam_data_restore (&hc_cb_count, sizeof (hc_cb_count));
  499. if (error != CS_OK) {
  500. fprintf (stderr, "sam_data_restore should return CS_OK. Error returned %d\n", error);
  501. return 1;
  502. }
  503. if (hc_cb_count != 11) {
  504. fprintf (stderr, "%s iid %d: Premature killed. hc_cb_count should be 11 and it is %d\n",
  505. __FUNCTION__, instance_id - 1, hc_cb_count);
  506. return 1;
  507. }
  508. return 0;
  509. }
  510. return 1;
  511. }
  512. static void test6_signal (int sig) {
  513. cs_error_t error;
  514. printf ("%s\n", __FUNCTION__);
  515. test6_sig_delivered++;
  516. if ((error = sam_data_store (&test6_sig_delivered, sizeof (test6_sig_delivered))) != CS_OK) {
  517. fprintf (stderr, "Can't store data! Error : %d\n", error);
  518. }
  519. }
  520. /*
  521. * Test warn signal set.
  522. */
  523. static int test6 (void) {
  524. cs_error_t error;
  525. unsigned int instance_id;
  526. int test6_sig_del;
  527. printf ("%s: initialize\n", __FUNCTION__);
  528. error = sam_initialize (2000, SAM_RECOVERY_POLICY_RESTART);
  529. if (error != CS_OK) {
  530. fprintf (stderr, "Can't initialize SAM API. Error %d\n", error);
  531. return 1;
  532. }
  533. printf ("%s: register\n", __FUNCTION__);
  534. error = sam_register (&instance_id);
  535. if (error != CS_OK) {
  536. fprintf (stderr, "Can't register. Error %d\n", error);
  537. return 1;
  538. }
  539. if (instance_id == 1) {
  540. error = sam_warn_signal_set (SIGUSR1);
  541. if (error != CS_OK) {
  542. fprintf (stderr, "Can't set warn signal. Error %d\n", error);
  543. return 1;
  544. }
  545. signal (SIGUSR1, test6_signal);
  546. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  547. error = sam_start ();
  548. if (error != CS_OK) {
  549. fprintf (stderr, "Can't start hc. Error %d\n", error);
  550. return 1;
  551. }
  552. printf ("%s iid %d: sleep 1\n", __FUNCTION__, instance_id);
  553. sleep (1);
  554. printf ("%s iid %d: hc send\n", __FUNCTION__, instance_id);
  555. error = sam_hc_send ();
  556. if (error != CS_OK) {
  557. fprintf (stderr, "Can't send hc. Error %d\n", error);
  558. return 1;
  559. }
  560. printf ("%s iid %d: wait for delivery of signal\n", __FUNCTION__, instance_id);
  561. while (!test6_sig_delivered) {
  562. sleep (1);
  563. }
  564. printf ("%s iid %d: wait for real kill\n", __FUNCTION__, instance_id);
  565. sleep (3);
  566. printf ("%s iid %d: wasn't killed\n", __FUNCTION__, instance_id);
  567. return (1);
  568. }
  569. if (instance_id == 2) {
  570. error = sam_data_restore (&test6_sig_del, sizeof (test6_sig_del));
  571. if (error != CS_OK) {
  572. fprintf (stderr, "Can't restore data. Error %d\n", error);
  573. return 1;
  574. }
  575. if (test6_sig_del != 1) {
  576. fprintf (stderr, "Previous test failed. Signal was not delivered\n");
  577. return 1;
  578. }
  579. error = sam_warn_signal_set (SIGKILL);
  580. if (error != CS_OK) {
  581. fprintf (stderr, "Can't set warn signal. Error %d\n", error);
  582. return 1;
  583. }
  584. signal (SIGUSR1, test6_signal);
  585. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  586. error = sam_start ();
  587. if (error != CS_OK) {
  588. fprintf (stderr, "Can't start hc. Error %d\n", error);
  589. return 1;
  590. }
  591. printf ("%s iid %d: sleep 1\n", __FUNCTION__, instance_id);
  592. sleep (1);
  593. printf ("%s iid %d: hc send\n", __FUNCTION__, instance_id);
  594. error = sam_hc_send ();
  595. if (error != CS_OK) {
  596. fprintf (stderr, "Can't send hc. Error %d\n", error);
  597. return 1;
  598. }
  599. printf ("%s iid %d: wait for delivery of signal\n", __FUNCTION__, instance_id);
  600. while (!test6_sig_delivered) {
  601. sleep (1);
  602. }
  603. printf ("%s iid %d: wasn't killed\n", __FUNCTION__, instance_id);
  604. return (1);
  605. }
  606. if (instance_id == 3) {
  607. error = sam_data_restore (&test6_sig_del, sizeof (test6_sig_del));
  608. if (error != CS_OK) {
  609. fprintf (stderr, "Can't restore data. Error %d\n", error);
  610. return 1;
  611. }
  612. if (test6_sig_del != 1) {
  613. fprintf (stderr, "Previous test failed. Signal WAS delivered\n");
  614. return 1;
  615. }
  616. return (0);
  617. }
  618. return 1;
  619. }
  620. static void *test7_thread (void *arg)
  621. {
  622. /* Wait 5s */
  623. sleep (5);
  624. exit (0);
  625. }
  626. /*
  627. * Test quorum
  628. */
  629. static int test7 (void) {
  630. cmap_handle_t cmap_handle;
  631. cs_error_t err;
  632. unsigned int instance_id;
  633. pthread_t kill_thread;
  634. char *str;
  635. err = cmap_initialize (&cmap_handle);
  636. if (err != CS_OK) {
  637. printf ("Could not initialize Cluster Map API instance error %d. Test skipped\n", err);
  638. return (1);
  639. }
  640. if (cmap_get_string(cmap_handle, "quorum.provider", &str) != CS_OK) {
  641. printf ("Could not get \"provider\" key: %d. Test skipped\n", err);
  642. return (1);
  643. }
  644. if (strcmp(str, "testquorum") != 0) {
  645. printf ("Provider is not testquorum. Test skipped\n");
  646. return (1);
  647. }
  648. free(str);
  649. /*
  650. * Set to not quorate
  651. */
  652. err = cmap_set_uint8(cmap_handle, "quorum.quorate", 0);
  653. if (err != CS_OK) {
  654. printf ("Can't set map key. Error %d\n", err);
  655. return (2);
  656. }
  657. printf ("%s: initialize\n", __FUNCTION__);
  658. err = sam_initialize (2000, SAM_RECOVERY_POLICY_QUORUM_RESTART);
  659. if (err != CS_OK) {
  660. fprintf (stderr, "Can't initialize SAM API. Error %d\n", err);
  661. return 2;
  662. }
  663. printf ("%s: register\n", __FUNCTION__);
  664. err = sam_register (&instance_id);
  665. if (err != CS_OK) {
  666. fprintf (stderr, "Can't register. Error %d\n", err);
  667. return 2;
  668. }
  669. if (instance_id == 1) {
  670. /*
  671. * Sam start should block forever, but 10s for us should be enough
  672. */
  673. pthread_create (&kill_thread, NULL, test7_thread, NULL);
  674. printf ("%s iid %d: start - should block forever (waiting 5s)\n", __FUNCTION__, instance_id);
  675. err = sam_start ();
  676. if (err != CS_OK) {
  677. fprintf (stderr, "Can't start hc. Error %d\n", err);
  678. return 2;
  679. }
  680. printf ("%s iid %d: wasn't killed\n", __FUNCTION__, instance_id);
  681. return (2);
  682. }
  683. if (instance_id == 2) {
  684. /*
  685. * Set to quorate
  686. */
  687. err = cmap_set_uint8(cmap_handle, "quorum.quorate", 1);
  688. if (err != CS_OK) {
  689. printf ("Can't set map key. Error %d\n", err);
  690. return (2);
  691. }
  692. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  693. err = sam_start ();
  694. if (err != CS_OK) {
  695. fprintf (stderr, "Can't start hc. Error %d\n", err);
  696. return 2;
  697. }
  698. /*
  699. * Set corosync unquorate
  700. */
  701. err = cmap_set_uint8(cmap_handle, "quorum.quorate", 0);
  702. if (err != CS_OK) {
  703. printf ("Can't set map key. Error %d\n", err);
  704. return (2);
  705. }
  706. printf ("%s iid %d: sleep 3\n", __FUNCTION__, instance_id);
  707. sleep (3);
  708. printf ("%s iid %d: wasn't killed\n", __FUNCTION__, instance_id);
  709. return (2);
  710. }
  711. if (instance_id == 3) {
  712. return (0);
  713. }
  714. return (2);
  715. }
  716. /*
  717. * Test cmap integration + quit policy
  718. */
  719. static int test8 (pid_t pid, pid_t old_pid, int test_n) {
  720. cmap_handle_t cmap_handle;
  721. cs_error_t err;
  722. uint64_t tstamp1, tstamp2;
  723. int32_t msec_diff;
  724. unsigned int instance_id;
  725. char key_name[CMAP_KEYNAME_MAXLEN];
  726. char *str;
  727. err = cmap_initialize (&cmap_handle);
  728. if (err != CS_OK) {
  729. printf ("Could not initialize Cluster Map API instance error %d. Test skipped\n", err);
  730. return (1);
  731. }
  732. printf ("%s test %d\n", __FUNCTION__, test_n);
  733. if (test_n == 2) {
  734. /*
  735. * Object should not exist
  736. */
  737. printf ("%s Testing if object exists (it shouldn't)\n", __FUNCTION__);
  738. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.state", pid);
  739. err = cmap_get_string(cmap_handle, key_name, &str);
  740. if (err == CS_OK) {
  741. printf ("Could find key \"%s\": %d.\n", key_name, err);
  742. free(str);
  743. return (2);
  744. }
  745. }
  746. if (test_n == 1 || test_n == 2) {
  747. printf ("%s: initialize\n", __FUNCTION__);
  748. err = sam_initialize (2000, SAM_RECOVERY_POLICY_QUIT | SAM_RECOVERY_POLICY_CMAP);
  749. if (err != CS_OK) {
  750. fprintf (stderr, "Can't initialize SAM API. Error %d\n", err);
  751. return 2;
  752. }
  753. printf ("%s: register\n", __FUNCTION__);
  754. err = sam_register (&instance_id);
  755. if (err != CS_OK) {
  756. fprintf (stderr, "Can't register. Error %d\n", err);
  757. return 2;
  758. }
  759. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.recovery", pid);
  760. err = cmap_get_string(cmap_handle, key_name, &str);
  761. if (err != CS_OK) {
  762. printf ("Could not get \"recovery\" key: %d.\n", err);
  763. return (2);
  764. }
  765. if (strcmp(str, "quit") != 0) {
  766. printf ("Recovery key \"%s\" is not \"quit\".\n", key_name);
  767. return (2);
  768. }
  769. free(str);
  770. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.state", pid);
  771. err = cmap_get_string(cmap_handle, key_name, &str);
  772. if (err != CS_OK) {
  773. printf ("Could not get \"state\" key: %d.\n", err);
  774. return (2);
  775. }
  776. if (strcmp(str, "stopped") != 0) {
  777. printf ("State key is not \"stopped\".\n");
  778. return (2);
  779. }
  780. free(str);
  781. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  782. err = sam_start ();
  783. if (err != CS_OK) {
  784. fprintf (stderr, "Can't start hc. Error %d\n", err);
  785. return 2;
  786. }
  787. err = cmap_get_string(cmap_handle, key_name, &str);
  788. if (err != CS_OK) {
  789. printf ("Could not get \"state\" key: %d.\n", err);
  790. return (2);
  791. }
  792. if (strcmp(str, "running") != 0) {
  793. printf ("State key is not \"running\".\n");
  794. return (2);
  795. }
  796. free(str);
  797. printf ("%s iid %d: stop\n", __FUNCTION__, instance_id);
  798. err = sam_stop ();
  799. if (err != CS_OK) {
  800. fprintf (stderr, "Can't stop hc. Error %d\n", err);
  801. return 2;
  802. }
  803. err = cmap_get_string(cmap_handle, key_name, &str);
  804. if (err != CS_OK) {
  805. printf ("Could not get \"state\" key: %d.\n", err);
  806. return (2);
  807. }
  808. if (strcmp(str, "stopped") != 0) {
  809. printf ("State key is not \"stopped\".\n");
  810. return (2);
  811. }
  812. free(str);
  813. printf ("%s iid %d: sleeping 5\n", __FUNCTION__, instance_id);
  814. sleep (5);
  815. err = cmap_get_string(cmap_handle, key_name, &str);
  816. if (err != CS_OK) {
  817. printf ("Could not get \"state\" key: %d.\n", err);
  818. return (2);
  819. }
  820. if (strcmp(str, "stopped") != 0) {
  821. printf ("State key is not \"stopped\".\n");
  822. return (2);
  823. }
  824. free(str);
  825. printf ("%s iid %d: start 2\n", __FUNCTION__, instance_id);
  826. err = sam_start ();
  827. if (err != CS_OK) {
  828. fprintf (stderr, "Can't start hc. Error %d\n", err);
  829. return 2;
  830. }
  831. err = cmap_get_string(cmap_handle, key_name, &str);
  832. if (err != CS_OK) {
  833. printf ("Could not get \"state\" key: %d.\n", err);
  834. return (2);
  835. }
  836. if (strcmp(str, "running") != 0) {
  837. printf ("State key is not \"running\".\n");
  838. return (2);
  839. }
  840. free(str);
  841. if (test_n == 2) {
  842. printf ("%s iid %d: sleeping 5. Should be killed\n", __FUNCTION__, instance_id);
  843. sleep (5);
  844. return (2);
  845. } else {
  846. printf ("%s iid %d: Test HC\n", __FUNCTION__, instance_id);
  847. err = sam_hc_send ();
  848. if (err != CS_OK) {
  849. fprintf (stderr, "Can't send hc. Error %d\n", err);
  850. return 2;
  851. }
  852. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.last_updated", pid);
  853. err = cmap_get_uint64(cmap_handle, key_name, &tstamp1);
  854. if (err != CS_OK) {
  855. printf ("Could not get \"last_updated\" key: %d.\n", err);
  856. return (2);
  857. }
  858. printf ("%s iid %d: Sleep 1\n", __FUNCTION__, instance_id);
  859. sleep (1);
  860. err = sam_hc_send ();
  861. if (err != CS_OK) {
  862. fprintf (stderr, "Can't send hc. Error %d\n", err);
  863. return 2;
  864. }
  865. sleep (1);
  866. err = cmap_get_uint64(cmap_handle, key_name, &tstamp2);
  867. if (err != CS_OK) {
  868. printf ("Could not get \"last_updated\" key: %d.\n", err);
  869. return (2);
  870. }
  871. msec_diff = (tstamp2 - tstamp1)/CS_TIME_NS_IN_MSEC;
  872. if (msec_diff < 500 || msec_diff > 2000) {
  873. printf ("Difference %d is not within <500, 2000> interval.\n", msec_diff);
  874. return (2);
  875. }
  876. printf ("%s iid %d: stop 2\n", __FUNCTION__, instance_id);
  877. err = sam_stop ();
  878. if (err != CS_OK) {
  879. fprintf (stderr, "Can't stop hc. Error %d\n", err);
  880. return 2;
  881. }
  882. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.state", pid);
  883. err = cmap_get_string(cmap_handle, key_name, &str);
  884. if (err != CS_OK) {
  885. printf ("Could not get \"state\" key: %d.\n", err);
  886. return (2);
  887. }
  888. if (strcmp(str, "stopped") != 0) {
  889. printf ("State key is not \"stopped\".\n");
  890. return (2);
  891. }
  892. free(str);
  893. printf ("%s iid %d: exiting\n", __FUNCTION__, instance_id);
  894. return (0);
  895. }
  896. }
  897. if (test_n == 3) {
  898. printf ("%s Testing if status is failed\n", __FUNCTION__);
  899. /*
  900. * Previous should be FAILED
  901. */
  902. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.state", pid);
  903. err = cmap_get_string(cmap_handle, key_name, &str);
  904. if (err != CS_OK) {
  905. printf ("Could not get \"state\" key: %d.\n", err);
  906. return (2);
  907. }
  908. if (strcmp(str, "failed") != 0) {
  909. printf ("State key is not \"failed\".\n");
  910. return (2);
  911. }
  912. return (0);
  913. }
  914. return (2);
  915. }
  916. /*
  917. * Test cmap integration + restart policy
  918. */
  919. static int test9 (pid_t pid, pid_t old_pid, int test_n) {
  920. cs_error_t err;
  921. cmap_handle_t cmap_handle;
  922. unsigned int instance_id;
  923. char *str;
  924. char key_name[CMAP_KEYNAME_MAXLEN];
  925. err = cmap_initialize (&cmap_handle);
  926. if (err != CS_OK) {
  927. printf ("Could not initialize Cluster Map API instance error %d. Test skipped\n", err);
  928. return (1);
  929. }
  930. printf ("%s test %d\n", __FUNCTION__, test_n);
  931. if (test_n == 1) {
  932. printf ("%s: initialize\n", __FUNCTION__);
  933. err = sam_initialize (2000, SAM_RECOVERY_POLICY_RESTART | SAM_RECOVERY_POLICY_CMAP);
  934. if (err != CS_OK) {
  935. fprintf (stderr, "Can't initialize SAM API. Error %d\n", err);
  936. return 2;
  937. }
  938. printf ("%s: register\n", __FUNCTION__);
  939. err = sam_register (&instance_id);
  940. if (err != CS_OK) {
  941. fprintf (stderr, "Can't register. Error %d\n", err);
  942. return 2;
  943. }
  944. printf ("%s: iid %d\n", __FUNCTION__, instance_id);
  945. if (instance_id < 3) {
  946. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.recovery", pid);
  947. err = cmap_get_string(cmap_handle, key_name, &str);
  948. if (err != CS_OK) {
  949. printf ("Could not get \"recovery\" key: %d.\n", err);
  950. return (2);
  951. }
  952. if (strcmp(str, "restart") != 0) {
  953. printf ("Recovery key \"%s\" is not \"restart\".\n", str);
  954. return (2);
  955. }
  956. free(str);
  957. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.state", pid);
  958. err = cmap_get_string(cmap_handle, key_name, &str);
  959. if (err != CS_OK) {
  960. printf ("Could not get \"state\" key: %d.\n", err);
  961. return (2);
  962. }
  963. if (strcmp(str, "stopped") != 0) {
  964. printf ("State key is not \"stopped\".\n");
  965. return (2);
  966. }
  967. free(str);
  968. printf ("%s iid %d: start\n", __FUNCTION__, instance_id);
  969. err = sam_start ();
  970. if (err != CS_OK) {
  971. fprintf (stderr, "Can't start hc. Error %d\n", err);
  972. return 2;
  973. }
  974. err = cmap_get_string(cmap_handle, key_name, &str);
  975. if (err != CS_OK) {
  976. printf ("Could not get \"state\" key: %d.\n", err);
  977. return (2);
  978. }
  979. if (strcmp(str, "running") != 0) {
  980. printf ("State key is not \"running\".\n");
  981. return (2);
  982. }
  983. free(str);
  984. printf ("%s iid %d: waiting for kill\n", __FUNCTION__, instance_id);
  985. sleep (10);
  986. return (2);
  987. }
  988. if (instance_id == 3) {
  989. printf ("%s iid %d: mark failed\n", __FUNCTION__, instance_id);
  990. if (err != CS_OK) {
  991. fprintf (stderr, "Can't start hc. Error %d\n", err);
  992. return 2;
  993. }
  994. err = sam_mark_failed ();
  995. if (err != CS_OK) {
  996. fprintf (stderr, "Can't mark failed. Error %d\n", err);
  997. return 2;
  998. }
  999. sleep (10);
  1000. return (2);
  1001. }
  1002. return (2);
  1003. }
  1004. if (test_n == 2) {
  1005. printf ("%s Testing if status is failed\n", __FUNCTION__);
  1006. /*
  1007. * Previous should be FAILED
  1008. */
  1009. snprintf(key_name, CMAP_KEYNAME_MAXLEN, "resources.process.%d.state", pid);
  1010. err = cmap_get_string(cmap_handle, key_name, &str);
  1011. if (err != CS_OK) {
  1012. printf ("Could not get \"state\" key: %d.\n", err);
  1013. return (2);
  1014. }
  1015. if (strcmp(str, "failed") != 0) {
  1016. printf ("State key is not \"failed\".\n");
  1017. return (2);
  1018. }
  1019. free(str);
  1020. return (0);
  1021. }
  1022. return (2);
  1023. }
  1024. int main(int argc, char *argv[])
  1025. {
  1026. pid_t pid, old_pid;
  1027. int err;
  1028. int stat;
  1029. int all_passed = 1;
  1030. int no_skipped = 0;
  1031. pid = fork ();
  1032. if (pid == -1) {
  1033. fprintf (stderr, "Can't fork\n");
  1034. return 1;
  1035. }
  1036. if (pid == 0) {
  1037. err = test1 ();
  1038. sam_finalize ();
  1039. return err;
  1040. }
  1041. waitpid (pid, &stat, 0);
  1042. fprintf (stderr, "test1 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : "failed"));
  1043. if (WEXITSTATUS (stat) != 0)
  1044. all_passed = 0;
  1045. pid = fork ();
  1046. if (pid == -1) {
  1047. fprintf (stderr, "Can't fork\n");
  1048. return 1;
  1049. }
  1050. if (pid == 0) {
  1051. err = test2 ();
  1052. sam_finalize ();
  1053. return (err);
  1054. }
  1055. waitpid (pid, &stat, 0);
  1056. fprintf (stderr, "test2 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : "failed"));
  1057. if (WEXITSTATUS (stat) != 0)
  1058. all_passed = 0;
  1059. pid = fork ();
  1060. if (pid == -1) {
  1061. fprintf (stderr, "Can't fork\n");
  1062. return 1;
  1063. }
  1064. if (pid == 0) {
  1065. err = test3 ();
  1066. sam_finalize ();
  1067. return (err);
  1068. }
  1069. waitpid (pid, &stat, 0);
  1070. fprintf (stderr, "test3 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : "failed"));
  1071. if (WEXITSTATUS (stat) != 0)
  1072. all_passed = 0;
  1073. pid = fork ();
  1074. if (pid == -1) {
  1075. fprintf (stderr, "Can't fork\n");
  1076. return 1;
  1077. }
  1078. if (pid == 0) {
  1079. err = test4 ();
  1080. sam_finalize ();
  1081. return (err);
  1082. }
  1083. waitpid (pid, &stat, 0);
  1084. fprintf (stderr, "test4 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : "failed"));
  1085. if (WEXITSTATUS (stat) != 0)
  1086. all_passed = 0;
  1087. pid = fork ();
  1088. if (pid == -1) {
  1089. fprintf (stderr, "Can't fork\n");
  1090. return 1;
  1091. }
  1092. if (pid == 0) {
  1093. err = test5 ();
  1094. sam_finalize ();
  1095. return (err);
  1096. }
  1097. waitpid (pid, &stat, 0);
  1098. fprintf (stderr, "test5 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : "failed"));
  1099. if (WEXITSTATUS (stat) != 0)
  1100. all_passed = 0;
  1101. pid = fork ();
  1102. if (pid == -1) {
  1103. fprintf (stderr, "Can't fork\n");
  1104. return 1;
  1105. }
  1106. if (pid == 0) {
  1107. err = test6 ();
  1108. sam_finalize ();
  1109. return (err);
  1110. }
  1111. waitpid (pid, &stat, 0);
  1112. fprintf (stderr, "test6 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : "failed"));
  1113. if (WEXITSTATUS (stat) != 0)
  1114. all_passed = 0;
  1115. pid = fork ();
  1116. if (pid == -1) {
  1117. fprintf (stderr, "Can't fork\n");
  1118. return 2;
  1119. }
  1120. if (pid == 0) {
  1121. err = test7 ();
  1122. sam_finalize ();
  1123. return (err);
  1124. }
  1125. waitpid (pid, &stat, 0);
  1126. fprintf (stderr, "test7 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : (WEXITSTATUS (stat) == 1 ? "skipped" : "failed")));
  1127. if (WEXITSTATUS (stat) == 1)
  1128. no_skipped++;
  1129. if (WEXITSTATUS (stat) > 1)
  1130. all_passed = 0;
  1131. pid = fork ();
  1132. if (pid == -1) {
  1133. fprintf (stderr, "Can't fork\n");
  1134. return 2;
  1135. }
  1136. if (pid == 0) {
  1137. err = test8 (getpid (), 0, 1);
  1138. sam_finalize ();
  1139. return (err);
  1140. }
  1141. waitpid (pid, &stat, 0);
  1142. old_pid = pid;
  1143. if (WEXITSTATUS (stat) == 0) {
  1144. pid = fork ();
  1145. if (pid == -1) {
  1146. fprintf (stderr, "Can't fork\n");
  1147. return 2;
  1148. }
  1149. if (pid == 0) {
  1150. err = test8 (getpid (), old_pid, 2);
  1151. sam_finalize ();
  1152. return (err);
  1153. }
  1154. waitpid (pid, &stat, 0);
  1155. old_pid = pid;
  1156. if (WEXITSTATUS (stat) == 0) {
  1157. pid = fork ();
  1158. if (pid == -1) {
  1159. fprintf (stderr, "Can't fork\n");
  1160. return 2;
  1161. }
  1162. if (pid == 0) {
  1163. err = test8 (old_pid, 0, 3);
  1164. sam_finalize ();
  1165. return (err);
  1166. }
  1167. waitpid (pid, &stat, 0);
  1168. }
  1169. }
  1170. fprintf (stderr, "test8 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : (WEXITSTATUS (stat) == 1 ? "skipped" : "failed")));
  1171. if (WEXITSTATUS (stat) == 1)
  1172. no_skipped++;
  1173. if (WEXITSTATUS (stat) > 1)
  1174. all_passed = 0;
  1175. pid = fork ();
  1176. if (pid == -1) {
  1177. fprintf (stderr, "Can't fork\n");
  1178. return 2;
  1179. }
  1180. if (pid == 0) {
  1181. err = test9 (getpid (), 0, 1);
  1182. sam_finalize ();
  1183. return (err);
  1184. }
  1185. waitpid (pid, &stat, 0);
  1186. old_pid = pid;
  1187. if (WEXITSTATUS (stat) == 0) {
  1188. pid = fork ();
  1189. if (pid == -1) {
  1190. fprintf (stderr, "Can't fork\n");
  1191. return 2;
  1192. }
  1193. if (pid == 0) {
  1194. err = test9 (old_pid, 0, 2);
  1195. sam_finalize ();
  1196. return (err);
  1197. }
  1198. waitpid (pid, &stat, 0);
  1199. }
  1200. fprintf (stderr, "test9 %s\n", (WEXITSTATUS (stat) == 0 ? "passed" : (WEXITSTATUS (stat) == 1 ? "skipped" : "failed")));
  1201. if (WEXITSTATUS (stat) == 1)
  1202. no_skipped++;
  1203. if (WEXITSTATUS (stat) > 1)
  1204. all_passed = 0;
  1205. if (all_passed)
  1206. fprintf (stderr, "All tests passed (%d skipped)\n", no_skipped);
  1207. return (all_passed ? 0 : 1);
  1208. }