PageRenderTime 53ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/test/System.Web.Http.Test/Tracing/ITraceWriterExtensionsTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 1003 lines | 753 code | 127 blank | 123 comment | 0 complexity | d59410460417251d7265d2c1ede99466 MD5 | raw file
  1. using System.Net.Http;
  2. using System.Threading.Tasks;
  3. using Xunit;
  4. using Assert = Microsoft.TestCommon.AssertEx;
  5. namespace System.Web.Http.Tracing
  6. {
  7. public class ITraceWriterExtensionsTest
  8. {
  9. [Fact]
  10. public void Debug_With_Message_Traces()
  11. {
  12. // Arrange
  13. TestTraceWriter traceWriter = new TestTraceWriter();
  14. HttpRequestMessage request = new HttpRequestMessage();
  15. TraceRecord[] expectedTraces = new TraceRecord[]
  16. {
  17. new TraceRecord(request, "testCategory", TraceLevel.Debug) { Kind = TraceKind.Trace, Message = "The formatted message" },
  18. };
  19. // Act
  20. traceWriter.Debug(request, "testCategory", "The {0} message", "formatted");
  21. // Assert
  22. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  23. }
  24. [Fact]
  25. public void Debug_With_Exception_Traces()
  26. {
  27. // Arrange
  28. TestTraceWriter traceWriter = new TestTraceWriter();
  29. HttpRequestMessage request = new HttpRequestMessage();
  30. InvalidOperationException exception = new InvalidOperationException();
  31. TraceRecord[] expectedTraces = new TraceRecord[]
  32. {
  33. new TraceRecord(request, "testCategory", TraceLevel.Debug) { Kind = TraceKind.Trace, Exception = exception },
  34. };
  35. // Act
  36. traceWriter.Debug(request, "testCategory", exception);
  37. // Assert
  38. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  39. }
  40. [Fact]
  41. public void Debug_With_Message_And_Exception_Traces()
  42. {
  43. // Arrange
  44. TestTraceWriter traceWriter = new TestTraceWriter();
  45. HttpRequestMessage request = new HttpRequestMessage();
  46. InvalidOperationException exception = new InvalidOperationException();
  47. TraceRecord[] expectedTraces = new TraceRecord[]
  48. {
  49. new TraceRecord(request, "testCategory", TraceLevel.Debug) { Kind = TraceKind.Trace, Message = "The formatted message", Exception = exception },
  50. };
  51. // Act
  52. traceWriter.Debug(request, "testCategory", exception, "The {0} message", "formatted");
  53. // Assert
  54. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  55. }
  56. [Fact]
  57. public void Info_With_Message_Traces()
  58. {
  59. // Arrange
  60. TestTraceWriter traceWriter = new TestTraceWriter();
  61. HttpRequestMessage request = new HttpRequestMessage();
  62. TraceRecord[] expectedTraces = new TraceRecord[]
  63. {
  64. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Trace, Message = "The formatted message" },
  65. };
  66. // Act
  67. traceWriter.Info(request, "testCategory", "The {0} message", "formatted");
  68. // Assert
  69. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  70. }
  71. [Fact]
  72. public void Info_With_Exception_Traces()
  73. {
  74. // Arrange
  75. TestTraceWriter traceWriter = new TestTraceWriter();
  76. HttpRequestMessage request = new HttpRequestMessage();
  77. InvalidOperationException exception = new InvalidOperationException();
  78. TraceRecord[] expectedTraces = new TraceRecord[]
  79. {
  80. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Trace, Exception = exception },
  81. };
  82. // Act
  83. traceWriter.Info(request, "testCategory", exception);
  84. // Assert
  85. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  86. }
  87. [Fact]
  88. public void Info_With_Message_And_Exception_Traces()
  89. {
  90. // Arrange
  91. TestTraceWriter traceWriter = new TestTraceWriter();
  92. HttpRequestMessage request = new HttpRequestMessage();
  93. InvalidOperationException exception = new InvalidOperationException();
  94. TraceRecord[] expectedTraces = new TraceRecord[]
  95. {
  96. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Trace, Message = "The formatted message", Exception = exception },
  97. };
  98. // Act
  99. traceWriter.Info(request, "testCategory", exception, "The {0} message", "formatted");
  100. // Assert
  101. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  102. }
  103. [Fact]
  104. public void Warn_With_Message_Traces()
  105. {
  106. // Arrange
  107. TestTraceWriter traceWriter = new TestTraceWriter();
  108. HttpRequestMessage request = new HttpRequestMessage();
  109. TraceRecord[] expectedTraces = new TraceRecord[]
  110. {
  111. new TraceRecord(request, "testCategory", TraceLevel.Warn) { Kind = TraceKind.Trace, Message = "The formatted message" },
  112. };
  113. // Act
  114. traceWriter.Warn(request, "testCategory", "The {0} message", "formatted");
  115. // Assert
  116. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  117. }
  118. [Fact]
  119. public void Warn_With_Exception_Traces()
  120. {
  121. // Arrange
  122. TestTraceWriter traceWriter = new TestTraceWriter();
  123. HttpRequestMessage request = new HttpRequestMessage();
  124. InvalidOperationException exception = new InvalidOperationException();
  125. TraceRecord[] expectedTraces = new TraceRecord[]
  126. {
  127. new TraceRecord(request, "testCategory", TraceLevel.Warn) { Kind = TraceKind.Trace, Exception = exception },
  128. };
  129. // Act
  130. traceWriter.Warn(request, "testCategory", exception);
  131. // Assert
  132. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  133. }
  134. [Fact]
  135. public void Warn_With_Message_And_Exception_Traces()
  136. {
  137. // Arrange
  138. TestTraceWriter traceWriter = new TestTraceWriter();
  139. HttpRequestMessage request = new HttpRequestMessage();
  140. InvalidOperationException exception = new InvalidOperationException();
  141. TraceRecord[] expectedTraces = new TraceRecord[]
  142. {
  143. new TraceRecord(request, "testCategory", TraceLevel.Warn) { Kind = TraceKind.Trace, Message = "The formatted message", Exception = exception },
  144. };
  145. // Act
  146. traceWriter.Warn(request, "testCategory", exception, "The {0} message", "formatted");
  147. // Assert
  148. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  149. }
  150. [Fact]
  151. public void Error_With_Message_Traces()
  152. {
  153. // Arrange
  154. TestTraceWriter traceWriter = new TestTraceWriter();
  155. HttpRequestMessage request = new HttpRequestMessage();
  156. TraceRecord[] expectedTraces = new TraceRecord[]
  157. {
  158. new TraceRecord(request, "testCategory", TraceLevel.Error) { Kind = TraceKind.Trace, Message = "The formatted message" },
  159. };
  160. // Act
  161. traceWriter.Error(request, "testCategory", "The {0} message", "formatted");
  162. // Assert
  163. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  164. }
  165. [Fact]
  166. public void Error_With_Exception_Traces()
  167. {
  168. // Arrange
  169. TestTraceWriter traceWriter = new TestTraceWriter();
  170. HttpRequestMessage request = new HttpRequestMessage();
  171. InvalidOperationException exception = new InvalidOperationException();
  172. TraceRecord[] expectedTraces = new TraceRecord[]
  173. {
  174. new TraceRecord(request, "testCategory", TraceLevel.Error) { Kind = TraceKind.Trace, Exception = exception },
  175. };
  176. // Act
  177. traceWriter.Error(request, "testCategory", exception);
  178. // Assert
  179. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  180. }
  181. [Fact]
  182. public void Error_With_Message_And_Exception_Traces()
  183. {
  184. // Arrange
  185. TestTraceWriter traceWriter = new TestTraceWriter();
  186. HttpRequestMessage request = new HttpRequestMessage();
  187. InvalidOperationException exception = new InvalidOperationException();
  188. TraceRecord[] expectedTraces = new TraceRecord[]
  189. {
  190. new TraceRecord(request, "testCategory", TraceLevel.Error) { Kind = TraceKind.Trace, Message = "The formatted message", Exception = exception },
  191. };
  192. // Act
  193. traceWriter.Error(request, "testCategory", exception, "The {0} message", "formatted");
  194. // Assert
  195. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  196. }
  197. [Fact]
  198. public void Fatal_With_Message_Traces()
  199. {
  200. // Arrange
  201. TestTraceWriter traceWriter = new TestTraceWriter();
  202. HttpRequestMessage request = new HttpRequestMessage();
  203. TraceRecord[] expectedTraces = new TraceRecord[]
  204. {
  205. new TraceRecord(request, "testCategory", TraceLevel.Fatal) { Kind = TraceKind.Trace, Message = "The formatted message" },
  206. };
  207. // Act
  208. traceWriter.Fatal(request, "testCategory", "The {0} message", "formatted");
  209. // Assert
  210. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  211. }
  212. [Fact]
  213. public void Fatal_With_Exception_Traces()
  214. {
  215. // Arrange
  216. TestTraceWriter traceWriter = new TestTraceWriter();
  217. HttpRequestMessage request = new HttpRequestMessage();
  218. InvalidOperationException exception = new InvalidOperationException();
  219. TraceRecord[] expectedTraces = new TraceRecord[]
  220. {
  221. new TraceRecord(request, "testCategory", TraceLevel.Fatal) { Kind = TraceKind.Trace, Exception = exception },
  222. };
  223. // Act
  224. traceWriter.Fatal(request, "testCategory", exception);
  225. // Assert
  226. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  227. }
  228. [Fact]
  229. public void Fatal_With_Message_And_Exception_Traces()
  230. {
  231. // Arrange
  232. TestTraceWriter traceWriter = new TestTraceWriter();
  233. HttpRequestMessage request = new HttpRequestMessage();
  234. InvalidOperationException exception = new InvalidOperationException();
  235. TraceRecord[] expectedTraces = new TraceRecord[]
  236. {
  237. new TraceRecord(request, "testCategory", TraceLevel.Fatal) { Kind = TraceKind.Trace, Message = "The formatted message", Exception = exception },
  238. };
  239. // Act
  240. traceWriter.Fatal(request, "testCategory", exception, "The {0} message", "formatted");
  241. // Assert
  242. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  243. }
  244. [Fact]
  245. public void TraceBeginEnd_Throws_With_Null_This()
  246. {
  247. // Arrange
  248. TestTraceWriter traceWriter = null;
  249. HttpRequestMessage request = new HttpRequestMessage();
  250. // Act & Assert
  251. Assert.ThrowsArgumentNull(() => traceWriter.TraceBeginEnd(request,
  252. "",
  253. TraceLevel.Off,
  254. "",
  255. "",
  256. beginTrace: null,
  257. execute: () => { },
  258. endTrace: null,
  259. errorTrace: null),
  260. "traceWriter");
  261. }
  262. [Fact]
  263. public void TraceBeginEnd_Throws_With_Null_Execute_Action()
  264. {
  265. // Arrange
  266. TestTraceWriter traceWriter = new TestTraceWriter();
  267. HttpRequestMessage request = new HttpRequestMessage();
  268. // Act & Assert
  269. Assert.ThrowsArgumentNull(() => traceWriter.TraceBeginEnd(request,
  270. "",
  271. TraceLevel.Off,
  272. "",
  273. "",
  274. beginTrace: null,
  275. execute: null,
  276. endTrace: null,
  277. errorTrace: null),
  278. "execute");
  279. }
  280. [Fact]
  281. public void TraceBeginEnd_Accepts_Null_Trace_Actions()
  282. {
  283. // Arrange
  284. TestTraceWriter traceWriter = new TestTraceWriter();
  285. HttpRequestMessage request = new HttpRequestMessage();
  286. // Act & Assert
  287. traceWriter.TraceBeginEnd(request,
  288. "",
  289. TraceLevel.Off,
  290. "",
  291. "",
  292. beginTrace: null,
  293. execute: () => { },
  294. endTrace: null,
  295. errorTrace: null);
  296. }
  297. [Fact]
  298. public void TraceBeginEnd_Invokes_BeginTrace()
  299. {
  300. // Arrange
  301. TestTraceWriter traceWriter = new TestTraceWriter();
  302. HttpRequestMessage request = new HttpRequestMessage();
  303. bool invoked = false;
  304. // Act
  305. traceWriter.TraceBeginEnd(request,
  306. "",
  307. TraceLevel.Fatal,
  308. "",
  309. "",
  310. beginTrace: (tr) => { invoked = true; },
  311. execute: () => { },
  312. endTrace: (tr) => { },
  313. errorTrace: (tr) => { });
  314. // Assert
  315. Assert.True(invoked);
  316. }
  317. [Fact]
  318. public void TraceBeginEnd_Invokes_Execute()
  319. {
  320. // Arrange
  321. TestTraceWriter traceWriter = new TestTraceWriter();
  322. HttpRequestMessage request = new HttpRequestMessage();
  323. bool invoked = false;
  324. // Act
  325. traceWriter.TraceBeginEnd(request,
  326. "",
  327. TraceLevel.Fatal,
  328. "",
  329. "",
  330. beginTrace: (tr) => { },
  331. execute: () => { invoked = true; },
  332. endTrace: (tr) => { },
  333. errorTrace: (tr) => { });
  334. // Assert
  335. Assert.True(invoked);
  336. }
  337. [Fact]
  338. public void TraceBeginEnd_Invokes_EndTrace()
  339. {
  340. // Arrange
  341. TestTraceWriter traceWriter = new TestTraceWriter();
  342. HttpRequestMessage request = new HttpRequestMessage();
  343. bool invoked = false;
  344. // Act
  345. traceWriter.TraceBeginEnd(request,
  346. "",
  347. TraceLevel.Off,
  348. "",
  349. "",
  350. beginTrace: (tr) => { },
  351. execute: () => { },
  352. endTrace: (tr) => { invoked = true; },
  353. errorTrace: (tr) => { });
  354. // Assert
  355. Assert.True(invoked);
  356. }
  357. [Fact]
  358. public void TraceBeginEnd_Invokes_ErrorTrace()
  359. {
  360. // Arrange
  361. TestTraceWriter traceWriter = new TestTraceWriter();
  362. HttpRequestMessage request = new HttpRequestMessage();
  363. Exception exception = new InvalidOperationException();
  364. bool invoked = false;
  365. // Act
  366. Exception thrown = Assert.Throws<InvalidOperationException>(
  367. () => traceWriter.TraceBeginEnd(request,
  368. "",
  369. TraceLevel.Off,
  370. "",
  371. "",
  372. beginTrace: (tr) => { },
  373. execute: () => { throw exception; },
  374. endTrace: (tr) => { },
  375. errorTrace: (tr) => { invoked = true; }));
  376. // Assert
  377. Assert.True(invoked);
  378. Assert.Same(exception, thrown);
  379. }
  380. [Fact]
  381. public void TraceBeginEnd_Traces()
  382. {
  383. // Arrange
  384. TestTraceWriter traceWriter = new TestTraceWriter();
  385. HttpRequestMessage request = new HttpRequestMessage();
  386. TraceRecord[] expectedTraces = new TraceRecord[]
  387. {
  388. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Begin, Operator = "tester", Operation = "testOp", Message = "beginMessage" },
  389. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.End, Operator = "tester", Operation = "testOp", Message = "endMessage" },
  390. };
  391. // Act
  392. traceWriter.TraceBeginEnd(request,
  393. "testCategory",
  394. TraceLevel.Info,
  395. "tester",
  396. "testOp",
  397. beginTrace: (tr) => { tr.Message = "beginMessage"; },
  398. execute: () => { },
  399. endTrace: (tr) => { tr.Message = "endMessage"; },
  400. errorTrace: (tr) => { tr.Message = "won't happen"; });
  401. // Assert
  402. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  403. }
  404. [Fact]
  405. public void TraceBeginEnd_Traces_And_Throws_When_Execute_Throws()
  406. {
  407. // Arrange
  408. TestTraceWriter traceWriter = new TestTraceWriter();
  409. HttpRequestMessage request = new HttpRequestMessage();
  410. InvalidOperationException exception = new InvalidOperationException("test exception");
  411. TraceRecord[] expectedTraces = new TraceRecord[]
  412. {
  413. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Begin, Operator = "tester", Operation = "testOp", Message = "beginMessage" },
  414. new TraceRecord(request, "testCategory", TraceLevel.Error) { Kind = TraceKind.End, Operator = "tester", Operation = "testOp", Exception = exception, Message = "errorMessage" },
  415. };
  416. // Act
  417. Exception thrown = Assert.Throws<InvalidOperationException>(
  418. () => traceWriter.TraceBeginEnd(request,
  419. "testCategory",
  420. TraceLevel.Info,
  421. "tester",
  422. "testOp",
  423. beginTrace: (tr) => { tr.Message = "beginMessage"; },
  424. execute: () => { throw exception; },
  425. endTrace: (tr) => { tr.Message = "won't happen"; },
  426. errorTrace: (tr) => { tr.Message = "errorMessage"; }));
  427. // Assert
  428. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  429. Assert.Same(exception, thrown);
  430. }
  431. [Fact]
  432. public void TraceBeginEndAsync_Throws_With_Null_This()
  433. {
  434. // Arrange
  435. TestTraceWriter traceWriter = null;
  436. HttpRequestMessage request = new HttpRequestMessage();
  437. // Act & Assert
  438. Assert.ThrowsArgumentNull(() => traceWriter.TraceBeginEndAsync(request,
  439. "",
  440. TraceLevel.Off,
  441. "",
  442. "",
  443. beginTrace: null,
  444. execute: () => TaskHelpers.Completed(),
  445. endTrace: null,
  446. errorTrace: null),
  447. "traceWriter");
  448. }
  449. [Fact]
  450. public void TraceBeginEndAsync_Throws_With_Null_Execute_Action()
  451. {
  452. // Arrange
  453. TestTraceWriter traceWriter = new TestTraceWriter();
  454. HttpRequestMessage request = new HttpRequestMessage();
  455. // Act & Assert
  456. Assert.ThrowsArgumentNull(() => traceWriter.TraceBeginEndAsync(request,
  457. "",
  458. TraceLevel.Off,
  459. "",
  460. "",
  461. beginTrace: null,
  462. execute: null,
  463. endTrace: null,
  464. errorTrace: null),
  465. "execute");
  466. }
  467. [Fact]
  468. public void TraceBeginEndAsync_Accepts_Null_Trace_Actions()
  469. {
  470. // Arrange
  471. TestTraceWriter traceWriter = new TestTraceWriter();
  472. HttpRequestMessage request = new HttpRequestMessage();
  473. // Act & Assert
  474. Task t = traceWriter.TraceBeginEndAsync(request,
  475. "",
  476. TraceLevel.Off,
  477. "",
  478. "",
  479. beginTrace: null,
  480. execute: () => TaskHelpers.Completed(),
  481. endTrace: null,
  482. errorTrace: null);
  483. t.Wait();
  484. }
  485. [Fact]
  486. public void TraceBeginEndAsync_Invokes_BeginTrace()
  487. {
  488. // Arrange
  489. TestTraceWriter traceWriter = new TestTraceWriter();
  490. HttpRequestMessage request = new HttpRequestMessage();
  491. bool invoked = false;
  492. // Act
  493. traceWriter.TraceBeginEndAsync(request,
  494. "",
  495. TraceLevel.Fatal,
  496. "",
  497. "",
  498. beginTrace: (tr) => { invoked = true; },
  499. execute: () => TaskHelpers.Completed(),
  500. endTrace: (tr) => { },
  501. errorTrace: (tr) => { }).Wait();
  502. // Assert
  503. Assert.True(invoked);
  504. }
  505. [Fact]
  506. public void TraceBeginEndAsync_Invokes_Execute()
  507. {
  508. // Arrange
  509. TestTraceWriter traceWriter = new TestTraceWriter();
  510. HttpRequestMessage request = new HttpRequestMessage();
  511. bool invoked = false;
  512. // Act
  513. traceWriter.TraceBeginEndAsync(request,
  514. "",
  515. TraceLevel.Fatal,
  516. "",
  517. "",
  518. beginTrace: (tr) => { },
  519. execute: () =>
  520. {
  521. invoked = true;
  522. return TaskHelpers.Completed();
  523. },
  524. endTrace: (tr) => { },
  525. errorTrace: (tr) => { }).Wait();
  526. // Assert
  527. Assert.True(invoked);
  528. }
  529. [Fact]
  530. public void TraceBeginEndAsync_Invokes_EndTrace()
  531. {
  532. // Arrange
  533. TestTraceWriter traceWriter = new TestTraceWriter();
  534. HttpRequestMessage request = new HttpRequestMessage();
  535. bool invoked = false;
  536. // Act
  537. traceWriter.TraceBeginEndAsync(request,
  538. "",
  539. TraceLevel.Off,
  540. "",
  541. "",
  542. beginTrace: (tr) => { },
  543. execute: () => TaskHelpers.Completed(),
  544. endTrace: (tr) => { invoked = true; },
  545. errorTrace: (tr) => { }).Wait();
  546. // Assert
  547. Assert.True(invoked);
  548. }
  549. [Fact]
  550. public void TraceBeginEndAsync_Invokes_ErrorTrace()
  551. {
  552. // Arrange
  553. TestTraceWriter traceWriter = new TestTraceWriter();
  554. HttpRequestMessage request = new HttpRequestMessage();
  555. bool invoked = false;
  556. Exception exception = new InvalidOperationException();
  557. TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(null);
  558. tcs.TrySetException(exception);
  559. // Act
  560. Exception thrown = Assert.Throws<InvalidOperationException>(
  561. () => traceWriter.TraceBeginEndAsync(request,
  562. "",
  563. TraceLevel.Off,
  564. "",
  565. "",
  566. beginTrace: (tr) => { },
  567. execute: () => tcs.Task,
  568. endTrace: (tr) => { },
  569. errorTrace: (tr) => { invoked = true; }).Wait());
  570. // Assert
  571. Assert.True(invoked);
  572. Assert.Same(exception, thrown);
  573. }
  574. [Fact]
  575. public void TraceBeginEndAsync_Traces()
  576. {
  577. // Arrange
  578. TestTraceWriter traceWriter = new TestTraceWriter();
  579. HttpRequestMessage request = new HttpRequestMessage();
  580. TraceRecord[] expectedTraces = new TraceRecord[]
  581. {
  582. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Begin, Operator = "tester", Operation = "testOp", Message = "beginMessage" },
  583. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.End, Operator = "tester", Operation = "testOp", Message = "endMessage" },
  584. };
  585. // Act
  586. traceWriter.TraceBeginEndAsync(request,
  587. "testCategory",
  588. TraceLevel.Info,
  589. "tester",
  590. "testOp",
  591. beginTrace: (tr) => { tr.Message = "beginMessage"; },
  592. execute: () => TaskHelpers.Completed(),
  593. endTrace: (tr) => { tr.Message = "endMessage"; },
  594. errorTrace: (tr) => { tr.Message = "won't happen"; }).Wait();
  595. // Assert
  596. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  597. }
  598. [Fact]
  599. public void TraceBeginEndAsync_Traces_When_Inner_Cancels()
  600. {
  601. // Arrange
  602. TestTraceWriter traceWriter = new TestTraceWriter();
  603. HttpRequestMessage request = new HttpRequestMessage();
  604. TraceRecord[] expectedTraces = new TraceRecord[]
  605. {
  606. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Begin, Operator = "tester", Operation = "testOp", Message = "beginMessage" },
  607. new TraceRecord(request, "testCategory", TraceLevel.Warn) { Kind = TraceKind.End, Operator = "tester", Operation = "testOp", Message = "errorMessage" },
  608. };
  609. // Act & Assert
  610. Assert.Throws<TaskCanceledException>(
  611. () => traceWriter.TraceBeginEndAsync(request,
  612. "testCategory",
  613. TraceLevel.Info,
  614. "tester",
  615. "testOp",
  616. beginTrace: (tr) => { tr.Message = "beginMessage"; },
  617. execute: () => TaskHelpers.Canceled(),
  618. endTrace: (tr) => { tr.Message = "won't happen"; },
  619. errorTrace: (tr) => { tr.Message = "errorMessage"; }).Wait());
  620. // Assert
  621. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  622. }
  623. [Fact]
  624. public void TraceBeginAsync_Traces_And_Faults_When_Inner_Faults()
  625. {
  626. // Arrange
  627. TestTraceWriter traceWriter = new TestTraceWriter();
  628. HttpRequestMessage request = new HttpRequestMessage();
  629. InvalidOperationException exception = new InvalidOperationException();
  630. TraceRecord[] expectedTraces = new TraceRecord[]
  631. {
  632. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Begin, Operator = "tester", Operation = "testOp", Message = "beginMessage" },
  633. new TraceRecord(request, "testCategory", TraceLevel.Error) { Kind = TraceKind.End, Operator = "tester", Operation = "testOp", Message = "errorMessage", Exception = exception },
  634. };
  635. TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(null);
  636. tcs.TrySetException(exception);
  637. // Act & Assert
  638. InvalidOperationException thrown = Assert.Throws<InvalidOperationException>(
  639. () => traceWriter.TraceBeginEndAsync(request,
  640. "testCategory",
  641. TraceLevel.Info,
  642. "tester",
  643. "testOp",
  644. beginTrace: (tr) => { tr.Message = "beginMessage"; },
  645. execute: () => tcs.Task,
  646. endTrace: (tr) => { tr.Message = "won't happen"; },
  647. errorTrace: (tr) => { tr.Message = "errorMessage"; }).Wait());
  648. // Assert
  649. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  650. Assert.Same(exception, thrown);
  651. }
  652. [Fact]
  653. public void TraceBeginEndAsyncGeneric_Throws_With_Null_This()
  654. {
  655. // Arrange
  656. TestTraceWriter traceWriter = null;
  657. HttpRequestMessage request = new HttpRequestMessage();
  658. // Act & Assert
  659. Assert.ThrowsArgumentNull(() => traceWriter.TraceBeginEndAsync<int>(request,
  660. "",
  661. TraceLevel.Off,
  662. "",
  663. "",
  664. beginTrace: null,
  665. execute: () => TaskHelpers.FromResult<int>(1),
  666. endTrace: null,
  667. errorTrace: null),
  668. "traceWriter");
  669. }
  670. [Fact]
  671. public void TraceBeginEndAsyncGeneric_Throws_With_Null_Execute_Action()
  672. {
  673. // Arrange
  674. TestTraceWriter traceWriter = new TestTraceWriter();
  675. HttpRequestMessage request = new HttpRequestMessage();
  676. // Act & Assert
  677. Assert.ThrowsArgumentNull(() => traceWriter.TraceBeginEndAsync<int>(request,
  678. "",
  679. TraceLevel.Off,
  680. "",
  681. "",
  682. beginTrace: null,
  683. execute: null,
  684. endTrace: null,
  685. errorTrace: null),
  686. "execute");
  687. }
  688. [Fact]
  689. public void TraceBeginEndAsyncGeneric_Accepts_Null_Trace_Actions()
  690. {
  691. // Arrange
  692. TestTraceWriter traceWriter = new TestTraceWriter();
  693. HttpRequestMessage request = new HttpRequestMessage();
  694. // Act & Assert
  695. Task t = traceWriter.TraceBeginEndAsync<int>(request,
  696. "",
  697. TraceLevel.Off,
  698. "",
  699. "",
  700. beginTrace: null,
  701. execute: () => TaskHelpers.FromResult<int>(1),
  702. endTrace: null,
  703. errorTrace: null);
  704. t.Wait();
  705. }
  706. [Fact]
  707. public void TraceBeginEndAsyncGeneric_Invokes_BeginTrace()
  708. {
  709. // Arrange
  710. TestTraceWriter traceWriter = new TestTraceWriter();
  711. HttpRequestMessage request = new HttpRequestMessage();
  712. bool invoked = false;
  713. // Act
  714. traceWriter.TraceBeginEndAsync<int>(request,
  715. "",
  716. TraceLevel.Fatal,
  717. "",
  718. "",
  719. beginTrace: (tr) => { invoked = true; },
  720. execute: () => TaskHelpers.FromResult<int>(1),
  721. endTrace: (tr, value) => { },
  722. errorTrace: (tr) => { }).Wait();
  723. // Assert
  724. Assert.True(invoked);
  725. }
  726. [Fact]
  727. public void TraceBeginEndAsyncGeneric_Invokes_Execute()
  728. {
  729. // Arrange
  730. TestTraceWriter traceWriter = new TestTraceWriter();
  731. HttpRequestMessage request = new HttpRequestMessage();
  732. bool invoked = false;
  733. // Act
  734. traceWriter.TraceBeginEndAsync<int>(request,
  735. "",
  736. TraceLevel.Fatal,
  737. "",
  738. "",
  739. beginTrace: (tr) => { },
  740. execute: () =>
  741. {
  742. invoked = true;
  743. return TaskHelpers.FromResult<int>(1);
  744. },
  745. endTrace: (tr, value) => { },
  746. errorTrace: (tr) => { }).Wait();
  747. // Assert
  748. Assert.True(invoked);
  749. }
  750. [Fact]
  751. public void TraceBeginEndAsyncGeneric_Invokes_EndTrace()
  752. {
  753. // Arrange
  754. TestTraceWriter traceWriter = new TestTraceWriter();
  755. HttpRequestMessage request = new HttpRequestMessage();
  756. bool invoked = false;
  757. int invokedValue = 0;
  758. // Act
  759. traceWriter.TraceBeginEndAsync<int>(request,
  760. "",
  761. TraceLevel.Off,
  762. "",
  763. "",
  764. beginTrace: (tr) => { },
  765. execute: () => TaskHelpers.FromResult<int>(1),
  766. endTrace: (tr, value) => { invoked = true; invokedValue = value; },
  767. errorTrace: (tr) => { }).Wait();
  768. // Assert
  769. Assert.True(invoked);
  770. Assert.Equal(1, invokedValue);
  771. }
  772. [Fact]
  773. public void TraceBeginEndAsyncGeneric_Invokes_ErrorTrace()
  774. {
  775. // Arrange
  776. TestTraceWriter traceWriter = new TestTraceWriter();
  777. HttpRequestMessage request = new HttpRequestMessage();
  778. bool invoked = false;
  779. Exception exception = new InvalidOperationException();
  780. TaskCompletionSource<int> tcs = new TaskCompletionSource<int>(0);
  781. tcs.TrySetException(exception);
  782. // Act
  783. Exception thrown = Assert.Throws<InvalidOperationException>(
  784. () => traceWriter.TraceBeginEndAsync<int>(request,
  785. "",
  786. TraceLevel.Off,
  787. "",
  788. "",
  789. beginTrace: (tr) => { },
  790. execute: () => tcs.Task,
  791. endTrace: (tr, value) => { },
  792. errorTrace: (tr) => { invoked = true; }).Wait());
  793. // Assert
  794. Assert.True(invoked);
  795. Assert.Same(exception, thrown);
  796. }
  797. [Fact]
  798. public void TraceBeginEndAsyncGeneric_Traces()
  799. {
  800. // Arrange
  801. TestTraceWriter traceWriter = new TestTraceWriter();
  802. HttpRequestMessage request = new HttpRequestMessage();
  803. TraceRecord[] expectedTraces = new TraceRecord[]
  804. {
  805. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Begin, Operator = "tester", Operation = "testOp", Message = "beginMessage" },
  806. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.End, Operator = "tester", Operation = "testOp", Message = "endMessage1" },
  807. };
  808. // Act
  809. traceWriter.TraceBeginEndAsync<int>(request,
  810. "testCategory",
  811. TraceLevel.Info,
  812. "tester",
  813. "testOp",
  814. beginTrace: (tr) => { tr.Message = "beginMessage"; },
  815. execute: () => TaskHelpers.FromResult<int>(1),
  816. endTrace: (tr, value) => { tr.Message = "endMessage" + value; },
  817. errorTrace: (tr) => { tr.Message = "won't happen"; }).Wait();
  818. // Assert
  819. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  820. }
  821. [Fact]
  822. public void TraceBeginEndAsyncGeneric_Traces_When_Inner_Cancels()
  823. {
  824. // Arrange
  825. TestTraceWriter traceWriter = new TestTraceWriter();
  826. HttpRequestMessage request = new HttpRequestMessage();
  827. TraceRecord[] expectedTraces = new TraceRecord[]
  828. {
  829. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Begin, Operator = "tester", Operation = "testOp", Message = "beginMessage" },
  830. new TraceRecord(request, "testCategory", TraceLevel.Warn) { Kind = TraceKind.End, Operator = "tester", Operation = "testOp", Message = "errorMessage" },
  831. };
  832. // Act & Assert
  833. Assert.Throws<TaskCanceledException>(
  834. () => traceWriter.TraceBeginEndAsync<int>(request,
  835. "testCategory",
  836. TraceLevel.Info,
  837. "tester",
  838. "testOp",
  839. beginTrace: (tr) => { tr.Message = "beginMessage"; },
  840. execute: () => TaskHelpers.Canceled<int>(),
  841. endTrace: (tr, value) => { tr.Message = "won't happen"; },
  842. errorTrace: (tr) => { tr.Message = "errorMessage"; }).Wait());
  843. // Assert
  844. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  845. }
  846. [Fact]
  847. public void TraceBeginAsyncGeneric_Traces_And_Faults_When_Inner_Faults()
  848. {
  849. // Arrange
  850. TestTraceWriter traceWriter = new TestTraceWriter();
  851. HttpRequestMessage request = new HttpRequestMessage();
  852. InvalidOperationException exception = new InvalidOperationException();
  853. TraceRecord[] expectedTraces = new TraceRecord[]
  854. {
  855. new TraceRecord(request, "testCategory", TraceLevel.Info) { Kind = TraceKind.Begin, Operator = "tester", Operation = "testOp", Message = "beginMessage" },
  856. new TraceRecord(request, "testCategory", TraceLevel.Error) { Kind = TraceKind.End, Operator = "tester", Operation = "testOp", Message = "errorMessage", Exception = exception },
  857. };
  858. TaskCompletionSource<int> tcs = new TaskCompletionSource<int>(1);
  859. tcs.TrySetException(exception);
  860. // Act & Assert
  861. InvalidOperationException thrown = Assert.Throws<InvalidOperationException>(
  862. () => traceWriter.TraceBeginEndAsync<int>(request,
  863. "testCategory",
  864. TraceLevel.Info,
  865. "tester",
  866. "testOp",
  867. beginTrace: (tr) => { tr.Message = "beginMessage"; },
  868. execute: () => tcs.Task,
  869. endTrace: (tr, value) => { tr.Message = "won't happen"; },
  870. errorTrace: (tr) => { tr.Message = "errorMessage"; }).Wait());
  871. // Assert
  872. Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
  873. Assert.Same(exception, thrown);
  874. }
  875. }
  876. }