" (C) 2013 by Holger Hans Peter Freyther All Rights Reserved This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . " Object subclass: M2UAASMock [ | socket | socketService: aSocket [ socket := aSocket ] handleAspActive: aMsg [ | ret | ret := M2UAMSG new msgClass: M2UAConstants clsASPTM; msgType: M2UAConstants asptmActivAck; yourself. socket sendToAsp: ret toMessage asByteArray ] handleAspDown: aMsg [ | ret | ret := M2UAMSG new msgClass: M2UAConstants clsASPSM; msgType: M2UAConstants aspsmDownAck; yourself. socket sendToAsp: ret toMessage asByteArray ] handleAspInactive: aMsg [ | ret | ret := M2UAMSG new msgClass: M2UAConstants clsASPTM; msgType: M2UAConstants asptmInactivAck; yourself. socket sendToAsp: ret toMessage asByteArray ] handleAspUp: aMsg [ | ret | ret := M2UAMSG new msgClass: M2UAConstants clsASPSM; msgType: M2UAConstants aspsmUpAck; yourself. socket sendToAsp: ret toMessage asByteArray ] onData: aData [ | msg | msg := M2UAMSG parseToClass: aData. msg dispatchOnAsp: self ] ] Object subclass: SCTPNetworkServiceMock [ | on_connect on_released on_data as asp | onSctpConnect: aBlock [ on_connect := aBlock ] applicationServer: anAs [ as := anAs ] applicationServerProcess: anAsp [ asp := anAsp ] onSctpData: aBlock [ on_data := aBlock ] onSctpReleased: aBlock [ on_released := aBlock ] hostname [ ^'localhost' ] port [ ^0 ] start [ "Nothing" on_connect value ] stop [ on_released value ] nextPut: aMsg [ as onData: aMsg ] sendToAsp: aMsg [ on_data value: nil value: nil value: 2 value: aMsg ] ] TestCase subclass: M2UAApplicationServerProcessTest [ testCreation [ | asp | asp := M2UAApplicationServerProcess new onAspActive: []; onAspDown: []; onAspInactive: []; onAspUp: []; onStateChange: []; onError: [:msg | ]; onNotify: [:type :ident | ]; onSctpEstablished: []; onSctpReleased: []; onSctpRestarted: []; onSctpStatus: []; yourself ] testStateTransitions [ | mock as asp | mock := SCTPNetworkServiceMock new. as := M2UAASMock new socketService: mock; yourself. asp := M2UAApplicationServerProcess initWith: mock. mock applicationServer: as; applicationServerProcess: asp. "This works as the mock will handle this synchronously" self assert: asp state = M2UAAspStateDown. asp sctpEstablish; aspUp. self assert: asp state = M2UAAspStateInactive. "Now bring it down and up again" asp aspDown. self assert: asp state = M2UAAspStateDown. asp aspUp; aspActive. self assert: asp state = M2UAAspStateActive. asp aspDown. self assert: asp state = M2UAAspStateDown. asp aspUp; aspActive; aspInactive. self assert: asp state = M2UAAspStateInactive. asp sctpRelease. self assert: asp state = M2UAAspStateDown ] ] TestCase subclass: M2UAAspStateMachineTest [ testLegalTransitions [ | machine | machine := M2UAAspStateMachine new. self assert: machine state = M2UAAspStateDown. machine aspUp: 'Link is up'. self assert: machine state = M2UAAspStateInactive. machine aspActive: 'Active'. self assert: machine state = M2UAAspStateActive. machine aspInactive: 'Inactive'. self assert: machine state = M2UAAspStateInactive. machine aspActive: 'Active'. self assert: machine state = M2UAAspStateActive. machine sctpCdi: 'Connection is gone'. self assert: machine state = M2UAAspStateDown ] ]