CommunicationObjectSyncTest.cs 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329
  1. //
  2. // Unit tests for System.ServiceModel.CommunicationObject
  3. //
  4. // Contact:
  5. // Moonlight List ([email protected])
  6. //
  7. // Copyright (C) 2011 Novell, Inc (http://www.novell.com)
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. using System;
  29. using System.ServiceModel;
  30. using System.ServiceModel.Channels;
  31. // the file 'NUnitMoonHelper.cs' makes the Moon's unit test compiles and runs on NUnit
  32. using Microsoft.VisualStudio.TestTools.UnitTesting;
  33. using Mono.Moonlight.UnitTesting;
  34. namespace MonoTests.System.ServiceModel.Channels {
  35. [TestClass]
  36. public class CommunicationObjectSyncTest {
  37. class CommunicationObjectPoker : CommunicationObject {
  38. public CommunicationObjectPoker ()
  39. {
  40. }
  41. public CommunicationObjectPoker (object o)
  42. : base (o)
  43. {
  44. }
  45. public bool DefaultCloseTimeoutCalled { get; set; }
  46. public bool DefaultOpenTimeoutCalled { get; set; }
  47. public bool OnBeginCloseCalled { get; set; }
  48. public bool OnCloseCalled { get; set; }
  49. public bool OnEndCloseCalled { get; set; }
  50. public bool OnBeginOpenCalled { get; set; }
  51. public bool OnOpenCalled { get; set; }
  52. public bool OnEndOpenCalled { get; set; }
  53. public bool OnAbortCalled { get; set; }
  54. public CommunicationState OnAbortState { get; set; }
  55. public bool Disposed {
  56. get { return IsDisposed; }
  57. }
  58. protected override TimeSpan DefaultCloseTimeout {
  59. get {
  60. DefaultCloseTimeoutCalled = true;
  61. return TimeSpan.Zero;
  62. }
  63. }
  64. protected override TimeSpan DefaultOpenTimeout {
  65. get {
  66. DefaultOpenTimeoutCalled = true;
  67. return TimeSpan.Zero;
  68. }
  69. }
  70. protected override void OnAbort ()
  71. {
  72. OnAbortCalled = true;
  73. Assert.AreEqual (OnAbortState, State, "OnAbort/State");
  74. Assert.IsFalse (Disposed, "OnAbort/IsDisposed");
  75. }
  76. protected override IAsyncResult OnBeginClose (TimeSpan timeout, AsyncCallback callback, object state)
  77. {
  78. OnBeginCloseCalled = true;
  79. return null;
  80. }
  81. protected override IAsyncResult OnBeginOpen (TimeSpan timeout, AsyncCallback callback, object state)
  82. {
  83. OnBeginOpenCalled = true;
  84. return null;
  85. }
  86. protected override void OnClose (TimeSpan timeout)
  87. {
  88. OnCloseCalled = true;
  89. }
  90. protected override void OnEndClose (IAsyncResult result)
  91. {
  92. OnEndCloseCalled = true;
  93. }
  94. protected override void OnEndOpen (IAsyncResult result)
  95. {
  96. OnEndOpenCalled = true;
  97. }
  98. protected override void OnOpen (TimeSpan timeout)
  99. {
  100. OnOpenCalled = true;
  101. }
  102. public void _Fault ()
  103. {
  104. Fault ();
  105. Assert.AreEqual (CommunicationState.Faulted, State, "Fault/State");
  106. Assert.IsFalse (Disposed, "Fault/IsDisposed");
  107. }
  108. public void _FaultNoAssert ()
  109. {
  110. Fault ();
  111. }
  112. public object _ThisLock {
  113. get { return ThisLock; }
  114. }
  115. public void _ThrowIfDisposed ()
  116. {
  117. ThrowIfDisposed ();
  118. }
  119. public void _ThrowIfDisposedOrImmutable ()
  120. {
  121. ThrowIfDisposedOrImmutable ();
  122. }
  123. public void _ThrowIfDisposedOrNotOpen ()
  124. {
  125. ThrowIfDisposedOrNotOpen ();
  126. }
  127. }
  128. [TestMethod]
  129. public void Constructor ()
  130. {
  131. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  132. Assert.AreEqual (typeof (object), co._ThisLock.GetType (), "ThisLock/default");
  133. co = new CommunicationObjectPoker (null);
  134. Assert.IsNull (co._ThisLock, "ThisLock/null");
  135. co = new CommunicationObjectPoker (String.Empty);
  136. Assert.AreSame (String.Empty, co._ThisLock, "ThisLock/weak");
  137. }
  138. [TestMethod]
  139. #if NET_2_1
  140. [MoonlightBug]
  141. #else
  142. [NUnit.Framework.Ignore]
  143. #endif
  144. public void Create_Abort ()
  145. {
  146. int closing = 0;
  147. int closed = 0;
  148. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  149. co.Closing += delegate (object sender, EventArgs e) {
  150. closing++;
  151. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  152. Assert.AreSame (co, sender, "Closing/sender");
  153. Assert.AreSame (EventArgs.Empty, e, "Closing/e");
  154. Assert.IsFalse (co.Disposed, "Closing/Disposed");
  155. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  156. co._ThrowIfDisposed ();
  157. }, "Closing/ThrowIfDisposed");
  158. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  159. co._ThrowIfDisposedOrImmutable ();
  160. }, "Closing/ThrowIfDisposedOrImmutable");
  161. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  162. co._ThrowIfDisposedOrNotOpen ();
  163. }, "Closing/ThrowIfDisposedOrNotOpen");
  164. };
  165. co.Closed += delegate (object sender, EventArgs e) {
  166. closed++;
  167. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  168. Assert.AreSame (co, sender, "Closed/sender");
  169. Assert.AreSame (EventArgs.Empty, e, "Closed/e");
  170. Assert.IsTrue (co.Disposed, "Closed/Disposed");
  171. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  172. co._ThrowIfDisposed ();
  173. }, "Closed/ThrowIfDisposed");
  174. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  175. co._ThrowIfDisposedOrImmutable ();
  176. }, "Closed/ThrowIfDisposedOrImmutable");
  177. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  178. co._ThrowIfDisposedOrNotOpen ();
  179. }, "Closed/ThrowIfDisposedOrNotOpen");
  180. };
  181. Assert.AreEqual (CommunicationState.Created, co.State, "State/before");
  182. co.OnAbortState = CommunicationState.Closing;
  183. co.Abort ();
  184. Assert.AreEqual (1, closing, "closing");
  185. Assert.AreEqual (1, closed, "closed");
  186. Assert.AreEqual (CommunicationState.Closed, co.State, "State/after");
  187. Assert.IsTrue (co.Disposed, "IsDisposed");
  188. Assert.IsFalse (co.DefaultCloseTimeoutCalled, "DefaultCloseTimeoutCalled");
  189. Assert.IsFalse (co.DefaultOpenTimeoutCalled, "DefaultOpenTimeoutCalled");
  190. Assert.IsTrue (co.OnAbortCalled, "OnAbortCalled");
  191. Assert.IsFalse (co.OnBeginCloseCalled, "OnBeginCloseCalled");
  192. Assert.IsFalse (co.OnCloseCalled, "OnCloseCalled");
  193. Assert.IsFalse (co.OnEndCloseCalled, "OnEndCloseCalled");
  194. Assert.IsFalse (co.OnBeginOpenCalled, "OnBeginOpenCalled");
  195. Assert.IsFalse (co.OnOpenCalled, "OnOpenCalled");
  196. Assert.IsFalse (co.OnEndOpenCalled, "OnEndCloseCalled");
  197. }
  198. [TestMethod]
  199. #if NET_2_1
  200. [MoonlightBug]
  201. #else
  202. [NUnit.Framework.Ignore]
  203. #endif
  204. public void Create_Close ()
  205. {
  206. int opening = 0;
  207. int opened = 0;
  208. int closing = 0;
  209. int closed = 0;
  210. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  211. co.Opening += delegate (object sender, EventArgs e) {
  212. opening++;
  213. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  214. Assert.AreSame (co, sender, "Opening/sender");
  215. Assert.AreSame (EventArgs.Empty, e, "Opening/e");
  216. };
  217. co.Opened += delegate (object sender, EventArgs e) {
  218. opened++;
  219. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  220. Assert.AreSame (co, sender, "Opened/sender");
  221. Assert.AreSame (EventArgs.Empty, e, "Opened/e");
  222. };
  223. co.Closing += delegate (object sender, EventArgs e) {
  224. closing++;
  225. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  226. Assert.AreSame (co, sender, "Closing/sender");
  227. Assert.AreSame (EventArgs.Empty, e, "Closing/e");
  228. Assert.IsFalse (co.Disposed, "Closing/Disposed");
  229. // note: IsDisposed is false but we still throw!
  230. // but this match MSDN docs about ThrowIfDisposed
  231. Assert.Throws<ObjectDisposedException> (delegate {
  232. co._ThrowIfDisposed ();
  233. }, "Closing/ThrowIfDisposed");
  234. Assert.Throws<ObjectDisposedException> (delegate {
  235. co._ThrowIfDisposedOrImmutable ();
  236. }, "Closing/ThrowIfDisposedOrImmutable");
  237. Assert.Throws<ObjectDisposedException> (delegate {
  238. co._ThrowIfDisposedOrNotOpen ();
  239. }, "Closing/ThrowIfDisposedOrNotOpen");
  240. };
  241. co.Closed += delegate (object sender, EventArgs e) {
  242. closed++;
  243. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  244. Assert.AreSame (co, sender, "Closed/sender");
  245. Assert.AreSame (EventArgs.Empty, e, "Closed/e");
  246. Assert.IsTrue (co.Disposed, "Closed/Disposed");
  247. Assert.Throws<ObjectDisposedException> (delegate {
  248. co._ThrowIfDisposed ();
  249. }, "Closed/ThrowIfDisposed");
  250. Assert.Throws<ObjectDisposedException> (delegate {
  251. co._ThrowIfDisposedOrImmutable ();
  252. }, "Closed/ThrowIfDisposedOrImmutable");
  253. Assert.Throws<ObjectDisposedException> (delegate {
  254. co._ThrowIfDisposedOrNotOpen ();
  255. }, "Closed/ThrowIfDisposedOrNotOpen");
  256. };
  257. Assert.AreEqual (CommunicationState.Created, co.State, "State/before");
  258. co.OnAbortState = CommunicationState.Closing;
  259. // note: since this is not a "direct" abort then ObjectDisposedException
  260. co.Close ();
  261. Assert.AreEqual (0, opening, "opening");
  262. Assert.AreEqual (0, opened, "opened");
  263. Assert.AreEqual (1, closing, "closing");
  264. Assert.AreEqual (1, closed, "closed");
  265. Assert.AreEqual (CommunicationState.Closed, co.State, "State/after");
  266. Assert.IsTrue (co.Disposed, "IsDisposed");
  267. Assert.IsTrue (co.DefaultCloseTimeoutCalled, "DefaultCloseTimeoutCalled");
  268. Assert.IsFalse (co.DefaultOpenTimeoutCalled, "DefaultOpenTimeoutCalled");
  269. Assert.IsTrue (co.OnAbortCalled, "OnAbortCalled");
  270. Assert.IsFalse (co.OnBeginCloseCalled, "OnBeginCloseCalled");
  271. Assert.IsFalse (co.OnCloseCalled, "OnCloseCalled");
  272. Assert.IsFalse (co.OnEndCloseCalled, "OnEndCloseCalled");
  273. Assert.IsFalse (co.OnBeginOpenCalled, "OnBeginOpenCalled");
  274. Assert.IsFalse (co.OnOpenCalled, "OnOpenCalled");
  275. Assert.IsFalse (co.OnEndOpenCalled, "OnEndCloseCalled");
  276. // 2nd time, no events raised
  277. co.Close ();
  278. Assert.AreEqual (0, opening, "opening-b");
  279. Assert.AreEqual (0, opened, "opened-b");
  280. Assert.AreEqual (1, closing, "closing-c");
  281. Assert.AreEqual (1, closed, "closed-c");
  282. Assert.Throws<ObjectDisposedException> (delegate {
  283. co.Open ();
  284. }, "Open");
  285. Assert.AreEqual (0, opening, "opening-c");
  286. Assert.AreEqual (0, opened, "opened-c");
  287. Assert.AreEqual (1, closing, "closing-c");
  288. Assert.AreEqual (1, closed, "closed-c");
  289. }
  290. [TestMethod]
  291. #if NET_2_1
  292. [MoonlightBug]
  293. #else
  294. [NUnit.Framework.Ignore]
  295. #endif
  296. public void Create_Close_Fault ()
  297. {
  298. bool faulted = false;
  299. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  300. co.Faulted += delegate (object sender, EventArgs e) {
  301. faulted = true; // won't be hit
  302. };
  303. co.Open ();
  304. co.Close (); // real Close, not an implicit Abort since Open was called
  305. co._FaultNoAssert (); // don't check State since it won't be Faulted
  306. Assert.AreEqual (CommunicationState.Closed, co.State, "State/Fault");
  307. Assert.IsFalse (faulted, "Faulted");
  308. }
  309. [TestMethod]
  310. #if NET_2_1
  311. [MoonlightBug]
  312. #else
  313. [NUnit.Framework.Ignore]
  314. #endif
  315. public void Create_Open_Close_Abort ()
  316. {
  317. int opening = 0;
  318. int opened = 0;
  319. int closing = 0;
  320. int closed = 0;
  321. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  322. co.Opening += delegate (object sender, EventArgs e) {
  323. opening++;
  324. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  325. Assert.AreSame (co, sender, "Opening/sender");
  326. Assert.AreSame (EventArgs.Empty, e, "Opening/e");
  327. };
  328. co.Opened += delegate (object sender, EventArgs e) {
  329. opened++;
  330. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  331. Assert.AreSame (co, sender, "Opened/sender");
  332. Assert.AreSame (EventArgs.Empty, e, "Opened/e");
  333. };
  334. co.Closing += delegate (object sender, EventArgs e) {
  335. closing++;
  336. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  337. Assert.AreSame (co, sender, "Closing/sender");
  338. Assert.AreSame (EventArgs.Empty, e, "Closing/e");
  339. };
  340. co.Closed += delegate (object sender, EventArgs e) {
  341. closed++;
  342. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  343. Assert.AreSame (co, sender, "Closed/sender");
  344. Assert.AreSame (EventArgs.Empty, e, "Closed/e");
  345. };
  346. Assert.AreEqual (CommunicationState.Created, co.State, "State/before");
  347. co.Open ();
  348. Assert.AreEqual (1, opening, "opening");
  349. Assert.AreEqual (1, opened, "opened");
  350. Assert.AreEqual (0, closing, "closing");
  351. Assert.AreEqual (0, closed, "closed");
  352. Assert.AreEqual (CommunicationState.Opened, co.State, "State/after/open");
  353. Assert.IsFalse (co.Disposed, "IsDisposed/open");
  354. Assert.IsFalse (co.DefaultCloseTimeoutCalled, "DefaultCloseTimeoutCalled/open");
  355. Assert.IsTrue (co.DefaultOpenTimeoutCalled, "DefaultOpenTimeoutCalled/open");
  356. Assert.IsFalse (co.OnAbortCalled, "OnAbortCalled/open");
  357. Assert.IsFalse (co.OnBeginCloseCalled, "OnBeginCloseCalled/open");
  358. Assert.IsFalse (co.OnCloseCalled, "OnCloseCalled/open");
  359. Assert.IsFalse (co.OnEndCloseCalled, "OnEndCloseCalled/open");
  360. Assert.IsFalse (co.OnBeginOpenCalled, "OnBeginOpenCalled/open");
  361. Assert.IsTrue (co.OnOpenCalled, "OnOpenCalled/open");
  362. Assert.IsFalse (co.OnEndOpenCalled, "OnEndCloseCalled/open");
  363. co.Close ();
  364. Assert.AreEqual (1, opening, "opening-b");
  365. Assert.AreEqual (1, opened, "opened-b");
  366. Assert.AreEqual (1, closing, "closing-b");
  367. Assert.AreEqual (1, closed, "closed-b");
  368. Assert.AreEqual (CommunicationState.Closed, co.State, "State/close");
  369. Assert.IsTrue (co.Disposed, "IsDisposed/close");
  370. Assert.IsTrue (co.DefaultCloseTimeoutCalled, "DefaultCloseTimeoutCalled/close");
  371. Assert.IsTrue (co.DefaultOpenTimeoutCalled, "DefaultOpenTimeoutCalled/close");
  372. Assert.IsFalse (co.OnAbortCalled, "OnAbortCalled/close");
  373. Assert.IsFalse (co.OnBeginCloseCalled, "OnBeginCloseCalled/close");
  374. Assert.IsTrue (co.OnCloseCalled, "OnCloseCalled/close");
  375. Assert.IsFalse (co.OnEndCloseCalled, "OnEndCloseCalled/close");
  376. Assert.IsFalse (co.OnBeginOpenCalled, "OnBeginOpenCalled/close");
  377. Assert.IsTrue (co.OnOpenCalled, "OnOpenCalled/close");
  378. Assert.IsFalse (co.OnEndOpenCalled, "OnEndCloseCalled/close");
  379. co.Abort ();
  380. Assert.AreEqual (1, opening, "opening-c");
  381. Assert.AreEqual (1, opened, "opened-c");
  382. Assert.AreEqual (1, closing, "closing-c");
  383. Assert.AreEqual (1, closed, "closed-c");
  384. Assert.IsFalse (co.OnAbortCalled, "OnAbortCalled/abort");
  385. Assert.AreEqual (CommunicationState.Closed, co.State, "State/abort");
  386. }
  387. [TestMethod]
  388. #if NET_2_1
  389. [MoonlightBug]
  390. #else
  391. [NUnit.Framework.Ignore]
  392. #endif
  393. public void Create_Fault_Abort ()
  394. {
  395. int opening = 0;
  396. int opened = 0;
  397. int closing = 0;
  398. int closed = 0;
  399. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  400. co.Opening += delegate (object sender, EventArgs e) {
  401. opening++;
  402. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  403. Assert.AreSame (co, sender, "Opening/sender");
  404. Assert.AreSame (EventArgs.Empty, e, "Opening/e");
  405. };
  406. co.Opened += delegate (object sender, EventArgs e) {
  407. opened++;
  408. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  409. Assert.AreSame (co, sender, "Opened/sender");
  410. Assert.AreSame (EventArgs.Empty, e, "Opened/e");
  411. };
  412. co.Closing += delegate (object sender, EventArgs e) {
  413. closing++;
  414. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  415. Assert.AreSame (co, sender, "Closing/sender");
  416. Assert.AreSame (EventArgs.Empty, e, "Closing/e");
  417. Assert.IsFalse (co.Disposed, "Closing/Disposed");
  418. // note: IsDisposed is false but we still throw!
  419. // but this match MSDN docs about ThrowIfDisposed
  420. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  421. co._ThrowIfDisposed ();
  422. }, "Closing/ThrowIfDisposed");
  423. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  424. co._ThrowIfDisposedOrImmutable ();
  425. }, "Closing/ThrowIfDisposedOrImmutable");
  426. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  427. co._ThrowIfDisposedOrNotOpen ();
  428. }, "Closing/ThrowIfDisposedOrNotOpen");
  429. };
  430. co.Closed += delegate (object sender, EventArgs e) {
  431. closed++;
  432. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  433. Assert.AreSame (co, sender, "Closed/sender");
  434. Assert.AreSame (EventArgs.Empty, e, "Closed/e");
  435. Assert.IsTrue (co.Disposed, "Closed/Disposed");
  436. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  437. co._ThrowIfDisposed ();
  438. }, "Closed/ThrowIfDisposed");
  439. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  440. co._ThrowIfDisposedOrImmutable ();
  441. }, "Closed/ThrowIfDisposedOrImmutable");
  442. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  443. co._ThrowIfDisposedOrNotOpen ();
  444. }, "Closed/ThrowIfDisposedOrNotOpen");
  445. };
  446. Assert.AreEqual (CommunicationState.Created, co.State, "State/before");
  447. co.OnAbortState = CommunicationState.Closing;
  448. co._Fault ();
  449. Assert.AreEqual (0, opening, "opening");
  450. Assert.AreEqual (0, opened, "opened");
  451. Assert.AreEqual (0, closing, "closing");
  452. Assert.AreEqual (0, closed, "closed");
  453. Assert.AreEqual (CommunicationState.Faulted, co.State, "State/after");
  454. Assert.IsFalse (co.Disposed, "IsDisposed");
  455. Assert.IsFalse (co.DefaultCloseTimeoutCalled, "DefaultCloseTimeoutCalled");
  456. Assert.IsFalse (co.DefaultOpenTimeoutCalled, "DefaultOpenTimeoutCalled");
  457. Assert.IsFalse (co.OnAbortCalled, "OnAbortCalled");
  458. Assert.IsFalse (co.OnBeginCloseCalled, "OnBeginCloseCalled");
  459. Assert.IsFalse (co.OnCloseCalled, "OnCloseCalled");
  460. Assert.IsFalse (co.OnEndCloseCalled, "OnEndCloseCalled");
  461. Assert.IsFalse (co.OnBeginOpenCalled, "OnBeginOpenCalled");
  462. Assert.IsFalse (co.OnOpenCalled, "OnOpenCalled");
  463. Assert.IsFalse (co.OnEndOpenCalled, "OnEndCloseCalled");
  464. co.Abort ();
  465. Assert.AreEqual (0, opening, "opening-b");
  466. Assert.AreEqual (0, opened, "opened-b");
  467. Assert.AreEqual (1, closing, "closing-c");
  468. Assert.AreEqual (1, closed, "closed-c");
  469. }
  470. [TestMethod]
  471. #if NET_2_1
  472. [MoonlightBug]
  473. #else
  474. [NUnit.Framework.Ignore]
  475. #endif
  476. public void Create_Fault_Open_Close ()
  477. {
  478. int opening = 0;
  479. int opened = 0;
  480. int closing = 0;
  481. int closed = 0;
  482. int faulted = 0;
  483. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  484. co.Faulted += delegate (object sender, EventArgs e) {
  485. faulted++;
  486. Assert.AreEqual (CommunicationState.Faulted, co.State, "State/Faulted");
  487. Assert.AreSame (co, sender, "sender");
  488. Assert.AreSame (EventArgs.Empty, e, "e");
  489. };
  490. co.Opening += delegate (object sender, EventArgs e) {
  491. opening++;
  492. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  493. Assert.AreSame (co, sender, "Opening/sender");
  494. Assert.AreSame (EventArgs.Empty, e, "Opening/e");
  495. };
  496. co.Opened += delegate (object sender, EventArgs e) {
  497. opened++;
  498. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  499. Assert.AreSame (co, sender, "Opened/sender");
  500. Assert.AreSame (EventArgs.Empty, e, "Opened/e");
  501. };
  502. co.Closing += delegate (object sender, EventArgs e) {
  503. closing++;
  504. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  505. Assert.AreSame (co, sender, "Closing/sender");
  506. Assert.AreSame (EventArgs.Empty, e, "Closing/e");
  507. };
  508. co.Closed += delegate (object sender, EventArgs e) {
  509. closed++;
  510. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  511. Assert.AreSame (co, sender, "Closed/sender");
  512. Assert.AreSame (EventArgs.Empty, e, "Closed/e");
  513. };
  514. Assert.AreEqual (CommunicationState.Created, co.State, "State/before");
  515. co._Fault ();
  516. Assert.AreEqual (0, opening, "opening");
  517. Assert.AreEqual (0, opened, "opened");
  518. Assert.AreEqual (0, closing, "closing");
  519. Assert.AreEqual (0, closed, "closed");
  520. Assert.AreEqual (1, faulted, "faulted");
  521. Assert.AreEqual (CommunicationState.Faulted, co.State, "State/after");
  522. Assert.IsFalse (co.Disposed, "IsDisposed");
  523. // 2nd fault does not throw a CommunicationObjectFaultedException
  524. // nor does it raise Faulted again
  525. co._Fault ();
  526. Assert.AreEqual (1, faulted, "faulted(same)");
  527. Assert.IsFalse (co.DefaultCloseTimeoutCalled, "DefaultCloseTimeoutCalled");
  528. Assert.IsFalse (co.DefaultOpenTimeoutCalled, "DefaultOpenTimeoutCalled");
  529. Assert.IsFalse (co.OnAbortCalled, "OnAbortCalled");
  530. Assert.IsFalse (co.OnBeginCloseCalled, "OnBeginCloseCalled");
  531. Assert.IsFalse (co.OnCloseCalled, "OnCloseCalled");
  532. Assert.IsFalse (co.OnEndCloseCalled, "OnEndCloseCalled");
  533. Assert.IsFalse (co.OnBeginOpenCalled, "OnBeginOpenCalled");
  534. Assert.IsFalse (co.OnOpenCalled, "OnOpenCalled");
  535. Assert.IsFalse (co.OnEndOpenCalled, "OnEndCloseCalled");
  536. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  537. co.Open ();
  538. }, "Open");
  539. Assert.AreEqual (0, opening, "opening-b");
  540. Assert.AreEqual (0, opened, "opened-b");
  541. Assert.AreEqual (CommunicationState.Faulted, co.State, "State/Open");
  542. // calling Close on an Faulted instance will call OnAbort (not OnClose)
  543. co.OnAbortState = CommunicationState.Closing;
  544. Assert.IsFalse (co.OnAbortCalled, "OnAbortCalled/before");
  545. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  546. co.Close ();
  547. }, "Close");
  548. Assert.IsTrue (co.OnAbortCalled, "OnAbortCalled/after");
  549. Assert.IsFalse (co.OnCloseCalled, "OnCloseCalled/after");
  550. Assert.AreEqual (1, closing, "closing-c");
  551. Assert.AreEqual (1, closed, "closed-c");
  552. Assert.AreEqual (CommunicationState.Closed, co.State, "State/Close");
  553. }
  554. [TestMethod]
  555. #if NET_2_1
  556. [MoonlightBug]
  557. #else
  558. [NUnit.Framework.Ignore]
  559. #endif
  560. public void Create_Fault_Open_Abort_Close ()
  561. {
  562. int opening = 0;
  563. int opened = 0;
  564. int closing = 0;
  565. int closed = 0;
  566. int faulted = 0;
  567. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  568. co.Faulted += delegate (object sender, EventArgs e) {
  569. faulted++;
  570. Assert.AreEqual (CommunicationState.Faulted, co.State, "State/Faulted");
  571. Assert.AreSame (co, sender, "sender");
  572. Assert.AreSame (EventArgs.Empty, e, "e");
  573. };
  574. co.Opening += delegate (object sender, EventArgs e) {
  575. opening++;
  576. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  577. Assert.AreSame (co, sender, "Opening/sender");
  578. Assert.AreSame (EventArgs.Empty, e, "Opening/e");
  579. };
  580. co.Opened += delegate (object sender, EventArgs e) {
  581. opened++;
  582. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  583. Assert.AreSame (co, sender, "Opened/sender");
  584. Assert.AreSame (EventArgs.Empty, e, "Opened/e");
  585. };
  586. co.Closing += delegate (object sender, EventArgs e) {
  587. closing++;
  588. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  589. Assert.AreSame (co, sender, "Closing/sender");
  590. Assert.AreSame (EventArgs.Empty, e, "Closing/e");
  591. };
  592. co.Closed += delegate (object sender, EventArgs e) {
  593. closed++;
  594. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  595. Assert.AreSame (co, sender, "Closed/sender");
  596. Assert.AreSame (EventArgs.Empty, e, "Closed/e");
  597. };
  598. Assert.AreEqual (CommunicationState.Created, co.State, "State/before");
  599. co._Fault ();
  600. Assert.AreEqual (0, opening, "opening");
  601. Assert.AreEqual (0, opened, "opened");
  602. Assert.AreEqual (0, closing, "closing");
  603. Assert.AreEqual (0, closed, "closed");
  604. Assert.AreEqual (1, faulted, "faulted");
  605. Assert.AreEqual (CommunicationState.Faulted, co.State, "State/after");
  606. Assert.IsFalse (co.Disposed, "IsDisposed");
  607. // 2nd fault does not throw a CommunicationObjectFaultedException
  608. // nor does it raise Faulted again
  609. co._Fault ();
  610. Assert.AreEqual (1, faulted, "faulted(same)");
  611. Assert.IsFalse (co.DefaultCloseTimeoutCalled, "DefaultCloseTimeoutCalled");
  612. Assert.IsFalse (co.DefaultOpenTimeoutCalled, "DefaultOpenTimeoutCalled");
  613. Assert.IsFalse (co.OnAbortCalled, "OnAbortCalled");
  614. Assert.IsFalse (co.OnBeginCloseCalled, "OnBeginCloseCalled");
  615. Assert.IsFalse (co.OnCloseCalled, "OnCloseCalled");
  616. Assert.IsFalse (co.OnEndCloseCalled, "OnEndCloseCalled");
  617. Assert.IsFalse (co.OnBeginOpenCalled, "OnBeginOpenCalled");
  618. Assert.IsFalse (co.OnOpenCalled, "OnOpenCalled");
  619. Assert.IsFalse (co.OnEndOpenCalled, "OnEndCloseCalled");
  620. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  621. co.Open ();
  622. }, "Open");
  623. Assert.AreEqual (0, opening, "opening-b");
  624. Assert.AreEqual (0, opened, "opened-b");
  625. co.OnAbortState = CommunicationState.Closing;
  626. // Abort does not throw a CommunicationObjectFaultedException
  627. co.Abort ();
  628. Assert.AreEqual (1, closing, "closing-b");
  629. Assert.AreEqual (1, closed, "closed-b");
  630. co.Close ();
  631. Assert.AreEqual (1, closing, "closing-c");
  632. Assert.AreEqual (1, closed, "closed-c");
  633. }
  634. [TestMethod]
  635. #if NET_2_1
  636. [MoonlightBug]
  637. #else
  638. [NUnit.Framework.Ignore]
  639. #endif
  640. public void Create_Open_Open ()
  641. {
  642. int opening = 0;
  643. int opened = 0;
  644. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  645. co.Opening += delegate (object sender, EventArgs e) {
  646. opening++;
  647. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  648. Assert.AreSame (co, sender, "Opening/sender");
  649. Assert.AreSame (EventArgs.Empty, e, "Opening/e");
  650. };
  651. co.Opened += delegate (object sender, EventArgs e) {
  652. opened++;
  653. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  654. Assert.AreSame (co, sender, "Opened/sender");
  655. Assert.AreSame (EventArgs.Empty, e, "Opened/e");
  656. };
  657. co.Open ();
  658. Assert.AreEqual (1, opening, "opening");
  659. Assert.AreEqual (1, opened, "opened");
  660. Assert.AreEqual (CommunicationState.Opened, co.State, "State/after/open");
  661. Assert.IsFalse (co.Disposed, "IsDisposed/open");
  662. Assert.Throws<InvalidOperationException> (delegate {
  663. co.Open ();
  664. }, "Open/2");
  665. Assert.AreEqual (1, opening, "opening-b");
  666. Assert.AreEqual (1, opened, "openedg-b");
  667. Assert.AreEqual (CommunicationState.Opened, co.State, "State/after/openg-b");
  668. Assert.IsFalse (co.Disposed, "IsDisposed/openg-b");
  669. }
  670. // http://msdn.microsoft.com/en-us/library/ms789041.aspx
  671. // ThrowIfDisposed throws an exception if the state is Closing, Closed or Faulted.
  672. [TestMethod]
  673. #if NET_2_1
  674. [MoonlightBug]
  675. #else
  676. [NUnit.Framework.Ignore]
  677. #endif
  678. public void ThrowIfDisposed_Open_Close ()
  679. {
  680. bool opening = false;
  681. bool opened = false;
  682. bool closing = false;
  683. bool closed = false;
  684. bool faulted = false;
  685. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  686. co.Opening += delegate (object sender, EventArgs e) {
  687. opening = true;
  688. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  689. co._ThrowIfDisposed ();
  690. };
  691. co.Opened += delegate (object sender, EventArgs e) {
  692. opened = true;
  693. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  694. co._ThrowIfDisposed ();
  695. };
  696. co.Closing += delegate (object sender, EventArgs e) {
  697. closing = true;
  698. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  699. Assert.Throws<ObjectDisposedException> (delegate {
  700. co._ThrowIfDisposed ();
  701. }, "ThrowIfDisposed/Closing");
  702. };
  703. co.Closed += delegate (object sender, EventArgs e) {
  704. closed = true;
  705. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  706. Assert.Throws<ObjectDisposedException> (delegate {
  707. co._ThrowIfDisposed ();
  708. }, "ThrowIfDisposed/Closed");
  709. };
  710. co.Faulted += delegate (object sender, EventArgs e) {
  711. faulted = true;
  712. Assert.AreEqual (CommunicationState.Faulted, co.State, "Faulted/State");
  713. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  714. co._ThrowIfDisposed ();
  715. }, "ThrowIfDisposed/Faulted");
  716. };
  717. Assert.AreEqual (CommunicationState.Created, co.State, "Created");
  718. co._ThrowIfDisposed ();
  719. co.Open ();
  720. co.Close ();
  721. co._FaultNoAssert ();
  722. // ensure all states were tested
  723. Assert.IsTrue (opening, "opening");
  724. Assert.IsTrue (opened, "opened");
  725. Assert.IsTrue (closing, "closing");
  726. Assert.IsTrue (closed, "closing");
  727. Assert.IsFalse (faulted, "faulted");
  728. }
  729. [TestMethod]
  730. #if NET_2_1
  731. [MoonlightBug]
  732. #else
  733. [NUnit.Framework.Ignore]
  734. #endif
  735. public void ThrowIfDisposed_Fault_Abort ()
  736. {
  737. bool opening = false;
  738. bool opened = false;
  739. bool closing = false;
  740. bool closed = false;
  741. bool faulted = false;
  742. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  743. co.Opening += delegate (object sender, EventArgs e) {
  744. opening = true;
  745. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  746. co._ThrowIfDisposed ();
  747. };
  748. co.Opened += delegate (object sender, EventArgs e) {
  749. opened = true;
  750. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  751. co._ThrowIfDisposed ();
  752. };
  753. co.Closing += delegate (object sender, EventArgs e) {
  754. closing = true;
  755. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  756. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  757. co._ThrowIfDisposed ();
  758. }, "ThrowIfDisposed/Closing");
  759. };
  760. co.Closed += delegate (object sender, EventArgs e) {
  761. closed = true;
  762. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  763. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  764. co._ThrowIfDisposed ();
  765. }, "ThrowIfDisposed/Closed");
  766. };
  767. co.Faulted += delegate (object sender, EventArgs e) {
  768. faulted = true;
  769. Assert.AreEqual (CommunicationState.Faulted, co.State, "Faulted/State");
  770. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  771. co._ThrowIfDisposed ();
  772. }, "ThrowIfDisposed/Faulted");
  773. };
  774. Assert.AreEqual (CommunicationState.Created, co.State, "Created");
  775. co._ThrowIfDisposed ();
  776. co._FaultNoAssert ();
  777. co.OnAbortState = CommunicationState.Closing;
  778. co.Abort ();
  779. // ensure all states were tested
  780. Assert.IsFalse (opening, "opening");
  781. Assert.IsFalse (opened, "opened");
  782. Assert.IsTrue (closing, "closing");
  783. Assert.IsTrue (closed, "closing");
  784. Assert.IsTrue (faulted, "faulted");
  785. }
  786. // http://msdn.microsoft.com/en-us/library/ms789041.aspx
  787. // ThrowIfDisposedOrImmutable throws an exception if the state is not Created.
  788. [TestMethod]
  789. #if NET_2_1
  790. [MoonlightBug]
  791. #else
  792. [NUnit.Framework.Ignore]
  793. #endif
  794. public void ThrowIfDisposedOrImmutable_Open_Close ()
  795. {
  796. bool opening = false;
  797. bool opened = false;
  798. bool closing = false;
  799. bool closed = false;
  800. bool faulted = false;
  801. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  802. co.Opening += delegate (object sender, EventArgs e) {
  803. opening = true;
  804. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  805. Assert.Throws<InvalidOperationException> (delegate {
  806. co._ThrowIfDisposedOrImmutable ();
  807. }, "ThrowIfDisposedOrImmutable/Opening");
  808. };
  809. co.Opened += delegate (object sender, EventArgs e) {
  810. opened = true;
  811. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  812. Assert.Throws<InvalidOperationException> (delegate {
  813. co._ThrowIfDisposedOrImmutable ();
  814. }, "ThrowIfDisposedOrImmutable/Opened");
  815. };
  816. co.Closing += delegate (object sender, EventArgs e) {
  817. closing = true;
  818. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  819. Assert.Throws<ObjectDisposedException> (delegate {
  820. co._ThrowIfDisposedOrImmutable ();
  821. }, "ThrowIfDisposedOrImmutable/Closing");
  822. };
  823. co.Closed += delegate (object sender, EventArgs e) {
  824. closed = true;
  825. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  826. Assert.Throws<ObjectDisposedException> (delegate {
  827. co._ThrowIfDisposedOrImmutable ();
  828. }, "ThrowIfDisposedOrImmutable/Closed");
  829. };
  830. co.Faulted += delegate (object sender, EventArgs e) {
  831. faulted = true;
  832. Assert.AreEqual (CommunicationState.Faulted, co.State, "Faulted/State");
  833. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  834. co._ThrowIfDisposedOrImmutable ();
  835. }, "ThrowIfDisposedOrImmutable/Faulted");
  836. };
  837. Assert.AreEqual (CommunicationState.Created, co.State, "Created");
  838. co._ThrowIfDisposedOrImmutable ();
  839. co.Open ();
  840. co.Close ();
  841. co._FaultNoAssert ();
  842. // ensure all states were tested
  843. Assert.IsTrue (opening, "opening");
  844. Assert.IsTrue (opened, "opened");
  845. Assert.IsTrue (closing, "closing");
  846. Assert.IsTrue (closed, "closing");
  847. Assert.IsFalse (faulted, "faulted");
  848. }
  849. [TestMethod]
  850. #if NET_2_1
  851. [MoonlightBug]
  852. #else
  853. [NUnit.Framework.Ignore]
  854. #endif
  855. public void ThrowIfDisposedOrImmutable_Fault_Abort ()
  856. {
  857. bool opening = false;
  858. bool opened = false;
  859. bool closing = false;
  860. bool closed = false;
  861. bool faulted = false;
  862. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  863. co.Opening += delegate (object sender, EventArgs e) {
  864. opening = true;
  865. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  866. Assert.Throws<ObjectDisposedException> (delegate {
  867. co._ThrowIfDisposedOrImmutable ();
  868. }, "ThrowIfDisposedOrImmutable/Opening");
  869. };
  870. co.Opened += delegate (object sender, EventArgs e) {
  871. opened = true;
  872. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  873. Assert.Throws<ObjectDisposedException> (delegate {
  874. co._ThrowIfDisposedOrImmutable ();
  875. }, "ThrowIfDisposedOrImmutable/Opened");
  876. };
  877. co.Closing += delegate (object sender, EventArgs e) {
  878. closing = true;
  879. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  880. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  881. co._ThrowIfDisposedOrImmutable ();
  882. }, "ThrowIfDisposedOrImmutable/Closing");
  883. };
  884. co.Closed += delegate (object sender, EventArgs e) {
  885. closed = true;
  886. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  887. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  888. co._ThrowIfDisposedOrImmutable ();
  889. }, "ThrowIfDisposedOrImmutable/Closed");
  890. };
  891. co.Faulted += delegate (object sender, EventArgs e) {
  892. faulted = true;
  893. Assert.AreEqual (CommunicationState.Faulted, co.State, "Faulted/State");
  894. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  895. co._ThrowIfDisposedOrImmutable ();
  896. }, "ThrowIfDisposedOrImmutable/Faulted");
  897. };
  898. Assert.AreEqual (CommunicationState.Created, co.State, "Created");
  899. co._ThrowIfDisposedOrImmutable ();
  900. co._FaultNoAssert ();
  901. co.OnAbortState = CommunicationState.Closing;
  902. co.Abort ();
  903. // ensure all states were tested
  904. Assert.IsFalse (opening, "opening");
  905. Assert.IsFalse (opened, "opened");
  906. Assert.IsTrue (closing, "closing");
  907. Assert.IsTrue (closed, "closing");
  908. Assert.IsTrue (faulted, "faulted");
  909. }
  910. // http://msdn.microsoft.com/en-us/library/ms789041.aspx
  911. // ThrowIfDisposedOrNotOpen throws an exception if the state is not Opened.
  912. [TestMethod]
  913. #if NET_2_1
  914. [MoonlightBug]
  915. #else
  916. [NUnit.Framework.Ignore]
  917. #endif
  918. public void ThrowIfDisposedOrNotOpen_Open_Close ()
  919. {
  920. bool opening = false;
  921. bool opened = false;
  922. bool closing = false;
  923. bool closed = false;
  924. bool faulted = false;
  925. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  926. co.Opening += delegate (object sender, EventArgs e) {
  927. opening = true;
  928. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  929. Assert.Throws<InvalidOperationException> (delegate {
  930. co._ThrowIfDisposedOrNotOpen ();
  931. }, "ThrowIfDisposedOrNotOpen/Opening");
  932. };
  933. co.Opened += delegate (object sender, EventArgs e) {
  934. opened = true;
  935. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  936. co._ThrowIfDisposedOrNotOpen ();
  937. };
  938. co.Closing += delegate (object sender, EventArgs e) {
  939. closing = true;
  940. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  941. Assert.Throws<ObjectDisposedException> (delegate {
  942. co._ThrowIfDisposedOrNotOpen ();
  943. }, "ThrowIfDisposedOrNotOpen/Closing");
  944. };
  945. co.Closed += delegate (object sender, EventArgs e) {
  946. closed = true;
  947. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  948. Assert.Throws<ObjectDisposedException> (delegate {
  949. co._ThrowIfDisposedOrNotOpen ();
  950. }, "ThrowIfDisposedOrNotOpen/Closed");
  951. };
  952. co.Faulted += delegate (object sender, EventArgs e) {
  953. faulted = true;
  954. Assert.AreEqual (CommunicationState.Faulted, co.State, "Faulted/State");
  955. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  956. co._ThrowIfDisposedOrNotOpen ();
  957. }, "ThrowIfDisposedOrNotOpen/Faulted");
  958. };
  959. Assert.AreEqual (CommunicationState.Created, co.State, "Created");
  960. Assert.Throws<InvalidOperationException> (delegate {
  961. co._ThrowIfDisposedOrNotOpen ();
  962. }, "ThrowIfDisposedOrNotOpen/Created");
  963. co.Open ();
  964. co.Close ();
  965. co._FaultNoAssert ();
  966. // ensure all states were tested
  967. Assert.IsTrue (opening, "opening");
  968. Assert.IsTrue (opened, "opened");
  969. Assert.IsTrue (closing, "closing");
  970. Assert.IsTrue (closed, "closing");
  971. Assert.IsFalse (faulted, "faulted");
  972. }
  973. [TestMethod]
  974. #if NET_2_1
  975. [MoonlightBug]
  976. #else
  977. [NUnit.Framework.Ignore]
  978. #endif
  979. public void ThrowIfDisposedOrNotOpen_Fault_Abort ()
  980. {
  981. bool opening = false;
  982. bool opened = false;
  983. bool closing = false;
  984. bool closed = false;
  985. bool faulted = false;
  986. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  987. co.Opening += delegate (object sender, EventArgs e) {
  988. opening = true;
  989. Assert.AreEqual (CommunicationState.Opening, co.State, "Opening/State");
  990. Assert.Throws<ObjectDisposedException> (delegate {
  991. co._ThrowIfDisposedOrNotOpen ();
  992. }, "ThrowIfDisposedOrNotOpen/Opening");
  993. };
  994. co.Opened += delegate (object sender, EventArgs e) {
  995. opened = true;
  996. Assert.AreEqual (CommunicationState.Opened, co.State, "Opened/State");
  997. co._ThrowIfDisposedOrNotOpen ();
  998. };
  999. co.Closing += delegate (object sender, EventArgs e) {
  1000. closing = true;
  1001. Assert.AreEqual (CommunicationState.Closing, co.State, "Closing/State");
  1002. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  1003. co._ThrowIfDisposedOrNotOpen ();
  1004. }, "ThrowIfDisposedOrNotOpen/Closing");
  1005. };
  1006. co.Closed += delegate (object sender, EventArgs e) {
  1007. closed = true;
  1008. Assert.AreEqual (CommunicationState.Closed, co.State, "Closed/State");
  1009. Assert.Throws<CommunicationObjectAbortedException> (delegate {
  1010. co._ThrowIfDisposedOrNotOpen ();
  1011. }, "ThrowIfDisposedOrNotOpen/Closed");
  1012. };
  1013. co.Faulted += delegate (object sender, EventArgs e) {
  1014. faulted = true;
  1015. Assert.AreEqual (CommunicationState.Faulted, co.State, "Faulted/State");
  1016. Assert.Throws<CommunicationObjectFaultedException> (delegate {
  1017. co._ThrowIfDisposedOrNotOpen ();
  1018. }, "ThrowIfDisposedOrNotOpen/Faulted");
  1019. };
  1020. Assert.AreEqual (CommunicationState.Created, co.State, "Created");
  1021. Assert.Throws<InvalidOperationException> (delegate {
  1022. co._ThrowIfDisposedOrNotOpen ();
  1023. }, "ThrowIfDisposedOrNotOpen/Created");
  1024. co._FaultNoAssert ();
  1025. co.OnAbortState = CommunicationState.Closing;
  1026. co.Abort ();
  1027. // ensure all states were tested
  1028. Assert.IsFalse (opening, "opening");
  1029. Assert.IsFalse (opened, "opened");
  1030. Assert.IsTrue (closing, "closing");
  1031. Assert.IsTrue (closed, "closing");
  1032. Assert.IsTrue (faulted, "faulted");
  1033. }
  1034. class NoFaultCommunicationObject : CommunicationObjectPoker {
  1035. protected override void OnFaulted ()
  1036. {
  1037. Assert.AreEqual (CommunicationState.Faulted, State, "OnFaulted/State");
  1038. // base not called - Faulted won't be raised
  1039. }
  1040. }
  1041. [TestMethod]
  1042. #if NET_2_1
  1043. [MoonlightBug]
  1044. #else
  1045. [NUnit.Framework.Ignore]
  1046. #endif
  1047. public void NoOnFault ()
  1048. {
  1049. bool faulted = false;
  1050. NoFaultCommunicationObject co = new NoFaultCommunicationObject ();
  1051. co.Faulted += delegate (object sender, EventArgs e) {
  1052. faulted = true;
  1053. };
  1054. co._FaultNoAssert ();
  1055. Assert.AreEqual (CommunicationState.Faulted, co.State, "State");
  1056. Assert.IsFalse (faulted, "faulted");
  1057. }
  1058. class FaultCommunicationObject : CommunicationObjectPoker {
  1059. protected override void OnFaulted ()
  1060. {
  1061. base.OnFaulted ();
  1062. throw new NotFiniteNumberException ();
  1063. }
  1064. }
  1065. [TestMethod]
  1066. #if NET_2_1
  1067. [MoonlightBug]
  1068. #else
  1069. [NUnit.Framework.Ignore]
  1070. #endif
  1071. public void OnFaultThrowing ()
  1072. {
  1073. FaultCommunicationObject co = new FaultCommunicationObject ();
  1074. Assert.Throws<NotFiniteNumberException> (delegate {
  1075. co._FaultNoAssert ();
  1076. }, "Fault");
  1077. // OnFault is not called more than one time
  1078. co._FaultNoAssert ();
  1079. }
  1080. [TestMethod]
  1081. #if NET_2_1
  1082. [MoonlightBug]
  1083. #else
  1084. [NUnit.Framework.Ignore]
  1085. #endif
  1086. public void AbortWhileAborting ()
  1087. {
  1088. int closing = 0;
  1089. int closed = 0;
  1090. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  1091. co.Closing += delegate (object sender, EventArgs e) {
  1092. closing++;
  1093. co.OnAbortState = CommunicationState.Closing;
  1094. co.Abort ();
  1095. };
  1096. co.Closed += delegate (object sender, EventArgs e) {
  1097. closed++;
  1098. co.Abort ();
  1099. };
  1100. co.OnAbortState = CommunicationState.Created;
  1101. // Abort will call Closing, which can call Abort...
  1102. co.Abort ();
  1103. Assert.AreEqual (1, closing, "closing");
  1104. Assert.AreEqual (1, closed, "closed");
  1105. }
  1106. [TestMethod]
  1107. #if NET_2_1
  1108. [MoonlightBug]
  1109. #else
  1110. [NUnit.Framework.Ignore]
  1111. #endif
  1112. public void AbortWhileClosing ()
  1113. {
  1114. int closing = 0;
  1115. int closed = 0;
  1116. CommunicationObjectPoker co = new CommunicationObjectPoker ();
  1117. co.Closing += delegate (object sender, EventArgs e) {
  1118. closing++;
  1119. co.OnAbortState = CommunicationState.Closing;
  1120. // ensure we're not repeating OnClosing
  1121. co.Abort ();
  1122. };
  1123. co.Closed += delegate (object sender, EventArgs e) {
  1124. closed++;
  1125. co.Abort ();
  1126. };
  1127. co.Close ();
  1128. Assert.AreEqual (1, closing, "closing");
  1129. Assert.AreEqual (1, closed, "closed");
  1130. }
  1131. class NoAbortCommunicationObject : CommunicationObjectPoker {
  1132. protected override void OnAbort ()
  1133. {
  1134. Assert.AreEqual (CommunicationState.Closing, State, "OnAbort/State");
  1135. // base not called
  1136. }
  1137. }
  1138. [TestMethod]
  1139. #if NET_2_1
  1140. [MoonlightBug]
  1141. #else
  1142. [NUnit.Framework.Ignore]
  1143. #endif
  1144. public void NoOnAbort ()
  1145. {
  1146. bool closing = false;
  1147. bool closed = false;
  1148. NoAbortCommunicationObject co = new NoAbortCommunicationObject ();
  1149. co.Closing += delegate (object sender, EventArgs e) {
  1150. closing = true;
  1151. };
  1152. co.Closed += delegate (object sender, EventArgs e) {
  1153. closed = true;
  1154. };
  1155. co.Abort ();
  1156. Assert.AreEqual (CommunicationState.Closed, co.State, "State");
  1157. Assert.IsTrue (closing, "closing");
  1158. Assert.IsTrue (closed, "closed");
  1159. }
  1160. }
  1161. }