Dreamine.FullKit.Tests 1.0.0.0
Dreamine.FullKit.Tests 기능을 검증하는 자동화 테스트 프로젝트입니다.
로딩중...
검색중...
일치하는것 없음
ResilientTransportStateTests.cs
이 파일의 문서화 페이지로 가기
1using Dreamine.Communication.Abstractions.Enums;
2using Dreamine.Communication.Abstractions.Interfaces;
3using Dreamine.Communication.Abstractions.Models;
4using Dreamine.Communication.Abstractions.Options;
5using Dreamine.Communication.Core.Resilience;
6
8
18{
35 [Fact]
37 {
38 var inner = new ControllableTransport();
39 var policy = new ReconnectPolicy { Enabled = false };
40 await using var transport = new ResilientMessageTransport(inner, policy);
41
42 var states = new System.Collections.Concurrent.ConcurrentBag<ConnectionState>();
43 transport.StateChanged += (_, s) => states.Add(s);
44
45 // Trigger connect so state transitions to Connected, then disconnect.
46 await transport.ConnectAsync();
47 await transport.DisconnectAsync();
48
49 // All observed transitions must be real changes (no duplicate consecutive states).
50 var list = states.ToArray();
51 for (int i = 1; i < list.Length; i++)
52 {
53 Assert.NotEqual(list[i - 1], list[i]);
54 }
55 }
56
73 [Fact]
75 {
76 var inner = new ControllableTransport();
77 var policy = new ReconnectPolicy { Enabled = false };
78 var transport = new ResilientMessageTransport(inner, policy);
79
80 // Fire multiple concurrent DisposeAsync calls — only the first should take effect.
81 var tasks = Enumerable.Range(0, 8)
82 .Select(_ => transport.DisposeAsync().AsTask())
83 .ToArray();
84
85 await Task.WhenAll(tasks);
86
87 // Inner transport should have been disposed exactly once.
88 Assert.Equal(1, inner.DisposeCount);
89 }
90
107 [Fact]
109 {
110 var inner = new ControllableTransport();
111 var policy = new ReconnectPolicy { Enabled = false };
112 var queueOptions = new OutboundQueueOptions
113 {
114 DisconnectedSendPolicy = DisconnectedSendPolicy.Queue
115 };
116 await using var transport = new ResilientMessageTransport(inner, policy, queueOptions);
117
118 var msg = new MessageEnvelope { Route = "test.route", Name = "hello" };
119 await transport.SendAsync(msg);
120
121 Assert.Equal(1, transport.QueuedMessageCount);
122 }
123
132 private sealed class ControllableTransport : IMessageTransport
133 {
142 private bool _connected;
151 private int _disposeCount;
152
161 public int DisposeCount => System.Threading.Volatile.Read(ref _disposeCount);
162
163#pragma warning disable CS0067
172 public event EventHandler<MessageEnvelope>? MessageReceived;
173#pragma warning restore CS0067
182 public event EventHandler<ConnectionState>? StateChanged;
183
192 public ConnectionState State => _connected
193 ? ConnectionState.Connected
194 : ConnectionState.Disconnected;
195
204 public TransportKind Kind => TransportKind.InMemory;
205
230 public Task ConnectAsync(CancellationToken cancellationToken = default)
231 {
232 _connected = true;
233 StateChanged?.Invoke(this, ConnectionState.Connected);
234 return Task.CompletedTask;
235 }
236
261 public Task DisconnectAsync(CancellationToken cancellationToken = default)
262 {
263 _connected = false;
264 StateChanged?.Invoke(this, ConnectionState.Disconnected);
265 return Task.CompletedTask;
266 }
267
308 public Task SendAsync(MessageEnvelope message, CancellationToken cancellationToken = default)
309 {
310 if (!_connected)
311 throw new InvalidOperationException("Not connected.");
312 return Task.CompletedTask;
313 }
314
331 public ValueTask DisposeAsync()
332 {
333 System.Threading.Interlocked.Increment(ref _disposeCount);
334 return ValueTask.CompletedTask;
335 }
336 }
337}
Task SendAsync(MessageEnvelope message, CancellationToken cancellationToken=default)