public void When_1000_transactions_are_in_trying_state() { var m = new Mock <ISipMessageSender>(); var l = new Mock <ISipListener>(); var txTable = new SipClientTransactionTable(); SipNonInviteClientTransaction ctx; for (int i = 0; i < 1000; i++) { /*provide a separate sequence so that each transaction has a unique ID*/ var r = new SipRequestBuilder().WithCSeq(new SipCSeqHeaderBuilder().WithSequence(i).Build()).Build(); ctx = new SipNonInviteClientTransaction(txTable, m.Object, l.Object, r, new TimerFactory()); ctx.SendRequest(); /*go to state*/ } Assert.IsTrue(txTable.Keys.Count == 1000); /*extra race condition check. Wait T1 time, so while disposing the transactions, their Retransmit is firing.*/ var dateTime = DateTime.Now.AddMilliseconds(SipConstants.T1); while (dateTime > DateTime.Now) { } ; txTable.Values.ToList().ForEach(a => a.Dispose()); Assert.IsTrue(txTable.Keys.Count == 0); }
internal override StateResult HandleResponse(SipNonInviteClientTransaction ctx, SipResponse response) { return(new StateResult() { InformToUser = true }); }
internal override void Initialize(SipNonInviteClientTransaction ctx) { //start the timer ctx.EndCompletedTimer.Start(); //dispose timers (that were started in the trying state) ctx.TimeOutTimer.Dispose(); ctx.ReTransmitTimer.Dispose(); }
public ISipClientTransaction CreateClientTransaction(SipRequest request) { Check.Require(request, "request"); Check.IsTrue(SipMethods.IsMethod(request.RequestLine.Method), "Request method is not supported"); ISipClientTransaction tx; if (request.RequestLine.Method == SipMethods.Ack) { throw new ArgumentException("Can not create a transaction for the 'ACK' request"); } ISipListener txListener = _sipListener; SipAbstractDialog dialog; if (_dialogTable.TryGetValue(GetDialogId(request, true), out dialog)) { txListener = dialog; } if (request.RequestLine.Method == SipMethods.Invite) { tx = new SipInviteClientTransaction( ClientTransactionTable, this, txListener, request, _stack.GetTimerFactory(), _stack.CreateHeaderFactory(), _stack.CreateMessageFactory()); } else { tx = new SipNonInviteClientTransaction( ClientTransactionTable, this, txListener, request, _stack.GetTimerFactory()); } return(tx); }
public void Test_Retransmit() { var s = new Mock <ISipMessageSender>(); var l = new Mock <ISipListener>(); var txTable = new SipClientTransactionTable(); var request = new SipRequestBuilder().Build(); SipNonInviteClientTransaction ctx = new SipNonInviteClientTransaction(txTable, s.Object, l.Object, request, new TimerFactoryMockBuilder().Build()); ctx.SendRequest(); var dateTime = DateTime.Now.AddMilliseconds(SipConstants.T1); while (dateTime > DateTime.Now) { } ; s.Verify(ss => ss.SendRequest(request), Times.Exactly(2)); ctx.Dispose(); }
internal override void Retransmit(SipNonInviteClientTransaction ctx) { //do nothing }
internal override StateResult HandleResponse(SipNonInviteClientTransaction ctx, SipResponse response) { return new StateResult(){ InformToUser = true }; }
protected override void Given() { _ctx = new SipNonInviteClientTransaction(TxTable, Sender.Object, Listener.Object, Request, TimerFactory); GivenOverride(); }