/codebase/src-cpp/test/ng6/saverestore/FederationSaveTest.cpp

https://github.com/graeme-muller/portico · C++ · 572 lines · 403 code · 44 blank · 125 comment · 0 complexity · 1fed3fc91c0ddb9104bb4a8d28406d76 MD5 · raw file

  1. /*
  2. * Copyright 2009 The Portico Project
  3. *
  4. * This file is part of portico.
  5. *
  6. * portico is free software; you can redistribute it and/or modify
  7. * it under the terms of the Common Developer and Distribution License (CDDL)
  8. * as published by Sun Microsystems. For more information see the LICENSE file.
  9. *
  10. * Use of this software is strictly AT YOUR OWN RISK!!!
  11. * If something bad happens you do not have permission to come crying to me.
  12. * (that goes for your lawyer as well)
  13. *
  14. */
  15. #include "FederationSaveTest.h"
  16. // Register test suite with the global repository
  17. CPPUNIT_TEST_SUITE_REGISTRATION( FederationSaveTest );
  18. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( FederationSaveTest, "FederationSaveTest" );
  19. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( FederationSaveTest, "SaveRestore" );
  20. /////////////////////////////////////////////////////////////////////////////////////////////
  21. ////////////////////////////////// Constructors/Destructors /////////////////////////////////
  22. /////////////////////////////////////////////////////////////////////////////////////////////
  23. FederationSaveTest::FederationSaveTest()
  24. {
  25. this->defaultFederate = new TestNG6Federate( "defaultFederate" );
  26. this->secondFederate = new TestNG6Federate( "secondFederate" );
  27. this->saveLabel = "FederationSaveTest";
  28. }
  29. FederationSaveTest::~FederationSaveTest()
  30. {
  31. delete this->defaultFederate;
  32. delete this->secondFederate;
  33. }
  34. /////////////////////////////////////////////////////////////////////////////////////////////
  35. /////////////////////////////// Test Setup and Helper Methods ///////////////////////////////
  36. /////////////////////////////////////////////////////////////////////////////////////////////
  37. void FederationSaveTest::setUp()
  38. {
  39. this->defaultFederate->quickCreate();
  40. this->defaultFederate->quickJoin();
  41. this->secondFederate->quickJoin();
  42. // initialize time settings in the default federate
  43. defaultFederate->quickEnableAsync();
  44. defaultFederate->quickEnableRegulating( 1.0 );
  45. defaultFederate->quickEnableConstrained();
  46. // initialize time settings in the second federate
  47. secondFederate->quickEnableAsync();
  48. secondFederate->quickEnableRegulating( 1.0 );
  49. secondFederate->quickEnableConstrained();
  50. // advance time a little
  51. defaultFederate->quickAdvanceRequest( 5.0 );
  52. secondFederate->quickAdvanceAndWait( 5.0 );
  53. defaultFederate->fedamb->waitForTimeAdvance( 5.0 );
  54. }
  55. void FederationSaveTest::tearDown()
  56. {
  57. this->secondFederate->quickResign();
  58. this->defaultFederate->quickResign();
  59. this->defaultFederate->quickDestroy();
  60. }
  61. ///////////////////////////////////////////////////////////////////////////////////////////
  62. //////////////////////////////// Request Save Test Methods ////////////////////////////////
  63. ///////////////////////////////////////////////////////////////////////////////////////////
  64. ///////////////////////////////////////////////
  65. // TEST: (valid) testRequestFederationSave() //
  66. ///////////////////////////////////////////////
  67. void FederationSaveTest::testRequestFederationSave()
  68. {
  69. try
  70. {
  71. defaultFederate->rtiamb->requestFederationSave( saveLabel );
  72. }
  73. catch( RTI::Exception& e )
  74. {
  75. failTest( "Unexpected exception while requesting federation save: %s", e._reason );
  76. }
  77. // make sure the proper callbacks are sent out
  78. defaultFederate->fedamb->waitForSaveInitiated( saveLabel );
  79. secondFederate->fedamb->waitForSaveInitiated( saveLabel );
  80. }
  81. ////////////////////////////////////////////////////
  82. // TEST: testRequestFederationSaveWhenNotJoined() //
  83. ////////////////////////////////////////////////////
  84. void FederationSaveTest::testRequestFederationSaveWhenNotJoined()
  85. {
  86. defaultFederate->quickResign();
  87. try
  88. {
  89. defaultFederate->rtiamb->requestFederationSave( this->saveLabel );
  90. failTestMissingException( "FederateNotExecutionMember",
  91. "requesting federation save when not joined" );
  92. }
  93. catch( RTI::FederateNotExecutionMember& fnem )
  94. {
  95. // success!
  96. }
  97. catch( RTI::Exception& e )
  98. {
  99. failTestWrongException( "FederateNotExecutionMember", e,
  100. "requesting federation save when not joined" );
  101. }
  102. }
  103. /////////////////////////////////////////////////////////
  104. // TEST: testRequestFederationSaveWhenSaveInProgress() //
  105. /////////////////////////////////////////////////////////
  106. void FederationSaveTest::testRequestFederationSaveWhenSaveInProgress()
  107. {
  108. defaultFederate->quickSaveInProgress( saveLabel );
  109. try
  110. {
  111. defaultFederate->rtiamb->requestFederationSave( "otherLabel" );
  112. failTestMissingException( "SaveInProgress", "requesting save while save in progress" );
  113. }
  114. catch( RTI::SaveInProgress& sip )
  115. {
  116. // success!
  117. }
  118. catch( RTI::Exception& e )
  119. {
  120. failTestWrongException( "SaveInProgress", e, "requesting save while save in progress" );
  121. }
  122. }
  123. ////////////////////////////////////////////////////////////
  124. // TEST: testRequestFederationSaveWhenRestoreInProgress() //
  125. ////////////////////////////////////////////////////////////
  126. void FederationSaveTest::testRequestFederationSaveWhenRestoreInProgress()
  127. {
  128. defaultFederate->quickRestoreInProgress( saveLabel, 2, defaultFederate, secondFederate );
  129. try
  130. {
  131. defaultFederate->rtiamb->requestFederationSave( saveLabel );
  132. failTestMissingException( "RestoreInProgress", "requesting save while restore in progress" );
  133. }
  134. catch( RTI::RestoreInProgress& rip )
  135. {
  136. // success
  137. }
  138. catch( RTI::Exception& e )
  139. {
  140. failTestWrongException("RestoreInProgress", e, "requesting save while restore in progress");
  141. }
  142. }
  143. ///////////////////////////////////////////////////////////////////////////////////////////
  144. /////////////////////////// Request Save With Time Test Methods ///////////////////////////
  145. ///////////////////////////////////////////////////////////////////////////////////////////
  146. //////////////////////////////////////////////////////////
  147. // TEST: (valid) testTimestampedRequestFederationSave() //
  148. //////////////////////////////////////////////////////////
  149. void FederationSaveTest::testTimestampedRequestFederationSave()
  150. {
  151. try
  152. {
  153. RTIfedTime time = 10.0;
  154. defaultFederate->rtiamb->requestFederationSave( saveLabel, time );
  155. }
  156. catch( RTI::Exception& e )
  157. {
  158. failTest( "Unexpected exception requesting federation save @ time 10.0: %s", e._reason );
  159. }
  160. // we shouldn't get any callbacks yet, as neither federate is at 10.0
  161. defaultFederate->fedamb->waitForSaveInitiatedTimeout( saveLabel );
  162. secondFederate->fedamb->waitForSaveInitiatedTimeout( saveLabel );
  163. // advance the federates to 10.0
  164. defaultFederate->quickAdvanceRequest( 10.0 );
  165. secondFederate->quickAdvanceAndWait( 10.0 );
  166. defaultFederate->fedamb->waitForTimeAdvance( 10.0 );
  167. // now we should get the save notification
  168. defaultFederate->fedamb->waitForSaveInitiated( saveLabel );
  169. secondFederate->fedamb->waitForSaveInitiated( saveLabel );
  170. }
  171. ////////////////////////////////////////////////////////////////
  172. // TEST: testTimestampedRequestFederationSaveWithTimeInPast() //
  173. ////////////////////////////////////////////////////////////////
  174. void FederationSaveTest::testTimestampedRequestFederationSaveWithTimeInPast()
  175. {
  176. try
  177. {
  178. RTIfedTime theTime = 1.0;
  179. defaultFederate->rtiamb->requestFederationSave( this->saveLabel, theTime );
  180. failTestMissingException( "FederateNotExecutionMember",
  181. "requesting federation save with time in past" );
  182. }
  183. catch( RTI::FederationTimeAlreadyPassed& ftap )
  184. {
  185. // success!
  186. }
  187. catch( RTI::Exception& e )
  188. {
  189. failTestWrongException( "FederationTimeAlreadyPassed", e,
  190. "requesting federation save with time in past" );
  191. }
  192. }
  193. ///////////////////////////////////////////////////////////////
  194. // TEST: testTimestampedRequestFederationSaveWhenNotJoined() //
  195. ///////////////////////////////////////////////////////////////
  196. void FederationSaveTest::testTimestampedRequestFederationSaveWhenNotJoined()
  197. {
  198. defaultFederate->quickResign();
  199. try
  200. {
  201. RTIfedTime theTime = 10.0;
  202. defaultFederate->rtiamb->requestFederationSave( this->saveLabel, theTime );
  203. failTestMissingException( "FederateNotExecutionMember",
  204. "requesting federation save when not joined" );
  205. }
  206. catch( RTI::FederateNotExecutionMember& fnem )
  207. {
  208. // success!
  209. }
  210. catch( RTI::Exception& e )
  211. {
  212. failTestWrongException( "FederateNotExecutionMember", e,
  213. "requesting federation save when not joined" );
  214. }
  215. }
  216. ////////////////////////////////////////////////////////////////////
  217. // TEST: testTimestampedRequestFederationSaveWhenSaveInProgress() //
  218. ////////////////////////////////////////////////////////////////////
  219. void FederationSaveTest::testTimestampedRequestFederationSaveWhenSaveInProgress()
  220. {
  221. defaultFederate->quickSaveInProgress( saveLabel );
  222. try
  223. {
  224. RTIfedTime time = 10.0;
  225. defaultFederate->rtiamb->requestFederationSave( saveLabel, time );
  226. failTestMissingException( "SaveInProgress",
  227. "requesting timestampped save while save in progress" );
  228. }
  229. catch( RTI::SaveInProgress& sip )
  230. {
  231. // success!
  232. }
  233. catch( RTI::Exception& e )
  234. {
  235. failTestWrongException( "SaveInProgress", e,
  236. "requesting timestampped save while save in progress" );
  237. }
  238. }
  239. ///////////////////////////////////////////////////////////////////////
  240. // TEST: testTimestampedRequestFederationSaveWhenRestoreInProgress() //
  241. ///////////////////////////////////////////////////////////////////////
  242. void FederationSaveTest::testTimestampedRequestFederationSaveWhenRestoreInProgress()
  243. {
  244. defaultFederate->quickRestoreInProgress( saveLabel, 2, defaultFederate, secondFederate );
  245. try
  246. {
  247. RTIfedTime time = 100.0;
  248. defaultFederate->rtiamb->requestFederationSave( saveLabel, time );
  249. failTestMissingException( "RestoreInProgress",
  250. "requesting timestamped save while restore in progress" );
  251. }
  252. catch( RTI::RestoreInProgress& rip )
  253. {
  254. // success
  255. }
  256. catch( RTI::Exception& e )
  257. {
  258. failTestWrongException("RestoreInProgress", e,
  259. "requesting timestamped save while restore in progress");
  260. }
  261. }
  262. ///////////////////////////////////////////////////////////////////////////////////////////
  263. ///////////////////////////////// Save Begun Test Methods /////////////////////////////////
  264. ///////////////////////////////////////////////////////////////////////////////////////////
  265. ///////////////////////////////////////////
  266. // TEST: (valid) testFederateSaveBegun() //
  267. ///////////////////////////////////////////
  268. void FederationSaveTest::testFederateSaveBegun()
  269. {
  270. defaultFederate->quickSaveRequest( saveLabel );
  271. defaultFederate->fedamb->waitForSaveInitiated( saveLabel );
  272. secondFederate->fedamb->waitForSaveInitiated( saveLabel );
  273. try
  274. {
  275. defaultFederate->rtiamb->federateSaveBegun();
  276. }
  277. catch( RTI::Exception& e )
  278. {
  279. failTest( "Unexpected exception informing RTI that federate has begun saving: %s", e._reason );
  280. }
  281. // the call didn't result in an error, so we must be good.
  282. }
  283. ////////////////////////////////////////////////////
  284. // TEST: testFederateSaveBegunWithoutActiveSave() //
  285. ////////////////////////////////////////////////////
  286. void FederationSaveTest::testFederateSaveBegunWithoutActiveSave()
  287. {
  288. try
  289. {
  290. defaultFederate->rtiamb->federateSaveBegun();
  291. failTestMissingException( "SaveNotInitiated",
  292. "informing federate save begun without active save" );
  293. }
  294. catch( RTI::SaveNotInitiated& sni )
  295. {
  296. // success!
  297. }
  298. catch( RTI::Exception& e )
  299. {
  300. failTestWrongException( "SaveNotInitiated", e,
  301. "informing federate save begun without active save" );
  302. }
  303. }
  304. ////////////////////////////////////////////////
  305. // TEST: testFederateSaveBegunWhenNotJoined() //
  306. ////////////////////////////////////////////////
  307. void FederationSaveTest::testFederateSaveBegunWhenNotJoined()
  308. {
  309. defaultFederate->quickResign();
  310. try
  311. {
  312. defaultFederate->rtiamb->federateSaveBegun();
  313. failTestMissingException( "FederateNotExecutionMember",
  314. "informing federate save begun" );
  315. }
  316. catch( RTI::FederateNotExecutionMember& fnem )
  317. {
  318. // success!
  319. }
  320. catch( RTI::Exception& e )
  321. {
  322. failTestWrongException( "FederateNotExecutionMember", e,
  323. "informing federate save begun" );
  324. }
  325. }
  326. ////////////////////////////////////////////////////////
  327. // TEST: testFederateSaveBegunWhenRestoreInProgress() //
  328. ////////////////////////////////////////////////////////
  329. void FederationSaveTest::testFederateSaveBegunWhenRestoreInProgress()
  330. {
  331. defaultFederate->quickRestoreInProgress( saveLabel, 2, defaultFederate, secondFederate );
  332. try
  333. {
  334. defaultFederate->rtiamb->federateSaveBegun();
  335. failTestMissingException( "RestoreInProgress",
  336. "informing federate save begun while restore in progress" );
  337. }
  338. catch( RTI::RestoreInProgress& rip )
  339. {
  340. // success
  341. }
  342. catch( RTI::Exception& e )
  343. {
  344. failTestWrongException("RestoreInProgress", e,
  345. "informing federate save begun while restore in progress");
  346. }
  347. }
  348. ///////////////////////////////////////////////////////////////////////////////////////////
  349. //////////////////////////////// Save Complete Test Methods ///////////////////////////////
  350. ///////////////////////////////////////////////////////////////////////////////////////////
  351. //////////////////////////////////////////////
  352. // TEST: (valid) testFederateSaveComplete() //
  353. //////////////////////////////////////////////
  354. void FederationSaveTest::testFederateSaveComplete()
  355. {
  356. defaultFederate->quickSaveRequest( saveLabel );
  357. defaultFederate->fedamb->waitForSaveInitiated( saveLabel );
  358. secondFederate->fedamb->waitForSaveInitiated( saveLabel );
  359. defaultFederate->quickSaveBegun();
  360. secondFederate->quickSaveBegun();
  361. try
  362. {
  363. defaultFederate->rtiamb->federateSaveComplete();
  364. secondFederate->rtiamb->federateSaveComplete();
  365. }
  366. catch( RTI::Exception& e )
  367. {
  368. failTest( "Informing RTI that a save has been completed: %s", e._reason );
  369. }
  370. // all are complete, wait for notification that federation has saved happily
  371. defaultFederate->fedamb->waitForFederationSaved();
  372. secondFederate->fedamb->waitForFederationSaved();
  373. }
  374. ///////////////////////////////////////////////////////
  375. // TEST: testFederateSaveCompleteWithoutActiveSave() //
  376. ///////////////////////////////////////////////////////
  377. void FederationSaveTest::testFederateSaveCompleteWithoutActiveSave()
  378. {
  379. try
  380. {
  381. defaultFederate->rtiamb->federateSaveComplete();
  382. failTestMissingException( "SaveNotInitiated",
  383. "informing federate save complete without active save" );
  384. }
  385. catch( RTI::SaveNotInitiated& sni )
  386. {
  387. // success!
  388. }
  389. catch( RTI::Exception& e )
  390. {
  391. failTestWrongException( "SaveNotInitiated", e,
  392. "informing federate save complete without active save" );
  393. }
  394. }
  395. ///////////////////////////////////////////////////
  396. // TEST: testFederateSaveCompleteWhenNotJoined() //
  397. ///////////////////////////////////////////////////
  398. void FederationSaveTest::testFederateSaveCompleteWhenNotJoined()
  399. {
  400. defaultFederate->quickResign();
  401. try
  402. {
  403. defaultFederate->rtiamb->federateSaveComplete();
  404. failTestMissingException( "FederateNotExecutionMember","informing federate save complete" );
  405. }
  406. catch( RTI::FederateNotExecutionMember& fnem )
  407. {
  408. // success!
  409. }
  410. catch( RTI::Exception& e )
  411. {
  412. failTestWrongException( "FederateNotExecutionMember", e,
  413. "informing federate save complete" );
  414. }
  415. }
  416. ///////////////////////////////////////////////////////////
  417. // TEST: testFederateSaveCompleteWhenRestoreInProgress() //
  418. ///////////////////////////////////////////////////////////
  419. void FederationSaveTest::testFederateSaveCompleteWhenRestoreInProgress()
  420. {
  421. defaultFederate->quickRestoreInProgress( saveLabel, 2, defaultFederate, secondFederate );
  422. try
  423. {
  424. defaultFederate->rtiamb->federateSaveComplete();
  425. failTestMissingException( "RestoreInProgress",
  426. "informing federate save complete while restore in progress" );
  427. }
  428. catch( RTI::RestoreInProgress& rip )
  429. {
  430. // success
  431. }
  432. catch( RTI::Exception& e )
  433. {
  434. failTestWrongException("RestoreInProgress", e,
  435. "informing federate save complete while restore in progress");
  436. }
  437. }
  438. ///////////////////////////////////////////////////////////////////////////////////////////
  439. ////////////////////////////// Save Not Complete Test Methods /////////////////////////////
  440. ///////////////////////////////////////////////////////////////////////////////////////////
  441. //////////////////////////////////////////////////
  442. // TEST: (valid) testFederateSaveNotCompleted() //
  443. //////////////////////////////////////////////////
  444. void FederationSaveTest::testFederateSaveNotCompleted()
  445. {
  446. defaultFederate->quickSaveRequest( saveLabel );
  447. defaultFederate->fedamb->waitForSaveInitiated( saveLabel );
  448. secondFederate->fedamb->waitForSaveInitiated( saveLabel );
  449. defaultFederate->quickSaveBegun();
  450. secondFederate->quickSaveBegun();
  451. defaultFederate->quickSaveComplete();
  452. try
  453. {
  454. secondFederate->rtiamb->federateSaveNotComplete();
  455. }
  456. catch( RTI::Exception& e )
  457. {
  458. failTest( "Informing RTI that a save has been not completed: %s", e._reason );
  459. }
  460. // all are complete, wait for notification that federation has saved happily
  461. defaultFederate->fedamb->waitForFederationNotSaved();
  462. secondFederate->fedamb->waitForFederationNotSaved();
  463. }
  464. ///////////////////////////////////////////////////////////
  465. // TEST: testFederateSaveNotCompletedWithoutActiveSave() //
  466. ///////////////////////////////////////////////////////////
  467. void FederationSaveTest::testFederateSaveNotCompletedWithoutActiveSave()
  468. {
  469. try
  470. {
  471. defaultFederate->rtiamb->federateSaveNotComplete();
  472. failTestMissingException( "SaveNotInitiated",
  473. "informing federate save not complete without active save" );
  474. }
  475. catch( RTI::SaveNotInitiated& sni )
  476. {
  477. // success!
  478. }
  479. catch( RTI::Exception& e )
  480. {
  481. failTestWrongException( "SaveNotInitiated", e,
  482. "informing federate save not complete without active save" );
  483. }
  484. }
  485. ///////////////////////////////////////////////////////
  486. // TEST: testFederateSaveNotCompletedWhenNotJoined() //
  487. ///////////////////////////////////////////////////////
  488. void FederationSaveTest::testFederateSaveNotCompletedWhenNotJoined()
  489. {
  490. defaultFederate->quickResign();
  491. try
  492. {
  493. defaultFederate->rtiamb->federateSaveNotComplete();
  494. failTestMissingException( "FederateNotExecutionMember",
  495. "informing federate save not complete" );
  496. }
  497. catch( RTI::FederateNotExecutionMember& fnem )
  498. {
  499. // success!
  500. }
  501. catch( RTI::Exception& e )
  502. {
  503. failTestWrongException( "FederateNotExecutionMember", e,
  504. "informing federate save not complete" );
  505. }
  506. }
  507. ///////////////////////////////////////////////////////////////
  508. // TEST: testFederateSaveNotCompletedWhenRestoreInProgress() //
  509. ///////////////////////////////////////////////////////////////
  510. void FederationSaveTest::testFederateSaveNotCompletedWhenRestoreInProgress()
  511. {
  512. defaultFederate->quickRestoreInProgress( saveLabel, 2, defaultFederate, secondFederate );
  513. try
  514. {
  515. defaultFederate->rtiamb->federateSaveNotComplete();
  516. failTestMissingException( "RestoreInProgress",
  517. "informing federate save not complete while restore in progress" );
  518. }
  519. catch( RTI::RestoreInProgress& rip )
  520. {
  521. // success
  522. }
  523. catch( RTI::Exception& e )
  524. {
  525. failTestWrongException("RestoreInProgress", e,
  526. "informing federate save not complete while restore in progress");
  527. }
  528. }