Skip to content

Commit 37e15e6

Browse files
committed
fix: encapsulate CancelledAt property and update unit tests for transaction cancellation
Assisted-by: GPT-5.4
1 parent 68ca134 commit 37e15e6

File tree

2 files changed

+16
-20
lines changed

2 files changed

+16
-20
lines changed

src/SIPSorcery/core/SIPTransactions/SIPTransaction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public string TransactionId
142142
/// For cancelled INVITEs this is the time they entered the cancelled state and is used to
143143
/// calculate expiry after T6. If unset, Created is used as a fallback by the transaction engine.
144144
/// </summary>
145-
public DateTime CancelledAt;
145+
public DateTime CancelledAt { get; private set; }
146146

147147
protected string m_branchId;
148148
public string BranchId

test/unit/core/SIPTransactions/SIPTransactionEngineUnitTest.cs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -233,14 +233,13 @@ public void CancelledInviteWithoutCancelledAt_ExpiresUsingCreatedFallback()
233233
SIPTransactionEngine engine = sipTransport.m_transactionEngine;
234234

235235
SIPRequest inviteRequest = GetDummyINVITERequest(SIPURI.ParseSIPURI("sip:dummy@127.0.0.1:12014"));
236-
var tx = new UACInviteTransaction(sipTransport, inviteRequest, null);
237-
engine.AddTransaction(tx);
238-
239-
tx.Created = DateTime.Now.AddMilliseconds(-(SIPTimings.T6 + 1000));
240-
tx.CancelledAt = DateTime.MinValue;
241-
242-
var stateField = typeof(SIPTransaction).GetField("m_transactionState", BindingFlags.Instance | BindingFlags.NonPublic);
243-
stateField.SetValue(tx, SIPTransactionStatesEnum.Cancelled);
236+
var tx = new UACInviteTransaction(sipTransport, inviteRequest, null);
237+
engine.AddTransaction(tx);
238+
239+
tx.Created = DateTime.Now.AddMilliseconds(-(SIPTimings.T6 + 1000));
240+
241+
var stateField = typeof(SIPTransaction).GetField("m_transactionState", BindingFlags.Instance | BindingFlags.NonPublic);
242+
stateField.SetValue(tx, SIPTransactionStatesEnum.Cancelled);
244243

245244
var removeExpiredMethod = typeof(SIPTransactionEngine).GetMethod("RemoveExpiredTransactions", BindingFlags.Instance | BindingFlags.NonPublic);
246245
removeExpiredMethod.Invoke(engine, null);
@@ -260,17 +259,14 @@ public void CancelledInviteWithRecentCancelledAt_IsNotExpired()
260259
SIPTransactionEngine engine = sipTransport.m_transactionEngine;
261260

262261
SIPRequest inviteRequest = GetDummyINVITERequest(SIPURI.ParseSIPURI("sip:dummy@127.0.0.1:12014"));
263-
var tx = new UACInviteTransaction(sipTransport, inviteRequest, null);
264-
engine.AddTransaction(tx);
265-
266-
tx.Created = DateTime.Now.AddMilliseconds(-(SIPTimings.T6 * 2));
267-
tx.CancelledAt = DateTime.Now;
268-
269-
var stateField = typeof(SIPTransaction).GetField("m_transactionState", BindingFlags.Instance | BindingFlags.NonPublic);
270-
stateField.SetValue(tx, SIPTransactionStatesEnum.Cancelled);
271-
272-
var removeExpiredMethod = typeof(SIPTransactionEngine).GetMethod("RemoveExpiredTransactions", BindingFlags.Instance | BindingFlags.NonPublic);
273-
removeExpiredMethod.Invoke(engine, null);
262+
var tx = new UACInviteTransaction(sipTransport, inviteRequest, null);
263+
engine.AddTransaction(tx);
264+
265+
tx.Created = DateTime.Now.AddMilliseconds(-(SIPTimings.T6 * 2));
266+
tx.CancelCall();
267+
268+
var removeExpiredMethod = typeof(SIPTransactionEngine).GetMethod("RemoveExpiredTransactions", BindingFlags.Instance | BindingFlags.NonPublic);
269+
removeExpiredMethod.Invoke(engine, null);
274270

275271
Assert.NotNull(engine.GetTransaction(inviteRequest));
276272

0 commit comments

Comments
 (0)