class TestinitialUeContextSetupProcedure(unittest.TestCase): def setUp(self): self.mmeIoService = IoService("mme", 9000) self.enbIoService = IoService("enb", 9001) [s.start() for s in self.mmeIoService, self.enbIoService] self.enbProcedure = EnbinitialContextSetupProcedure(3, 0.5, self.enbIoService, self.__procedureEnbCompleteCallback__) def tearDown(self): [s.stop() for s in self.enbIoService, self.ueIoService] def __procedureEnbCompleteCallback__(self, result, addr, a, b, args=None): self.enbResult = result def test_procedureSuccessful(self): self.enbProcedure.start((localhost(), 9001), 0, "12") time.sleep(0.1) self.mmeIoService.sendMessage("enb", *initialContextSetupRequest(0)) time.sleep(0.1) self.assertEqual(self.result, EnbinitialContextSetupProcedureHandler.Complete) def testName(self): pass
class TestIoServiceAssertions(unittest.TestCase): def setUp(self): self.ioservice = IoService("service", 9000) def test_funcStop(self): with self.assertRaises(RuntimeError): self.ioservice.stop() def test_funcStartTimer(self): with self.assertRaises(RuntimeError): foo = self.ioservice.createTimer(1.0, lambda: None) foo.start() def test_funcSendMessage(self): with self.assertRaises(RuntimeError): self.ioservice.sendMessage((localhost(), 9000), "interface", "channelInfo", {"key": "value"})
class TestEnbInitialSecurityActivationProcedure(unittest.TestCase): def setUp(self): self.enbIoService = IoService("enb", 9000) self.ueIoService = IoService("ue", 9001) [s.start() for s in self.enbIoService, self.ueIoService] self.enbProcedure = EnbInitialSecurityActivationProcedureHandler( self.enbIoService, self.__procedureCompleteCallback__) self.enbIoService.addIncomingMessageCallback(self.enbProcedure.handleIncomingMessage) self.result = None def __procedureCompleteCallback__(self, result, rrcTransactionIdentifier): self.result = result def test_procedureSuccessful(self): self.enbProcedure.start((localhost(), 9001), 0, "cipherAlgo", "integProtAlgo") time.sleep(0.1) self.ueIoService.sendMessage("enb", *securityModeComplete(0)) time.sleep(0.1) self.assertEqual(self.result, EnbInitialSecurityActivationProcedureHandler.Complete)
class TestEnbInitialSecurityActivationProcedure(unittest.TestCase): def setUp(self): self.enbIoService = IoService("enb", 9000) self.ueIoService = IoService("ue", 9001) [s.start() for s in self.enbIoService, self.ueIoService] self.enbProcedure = EnbInitialSecurityActivationProcedureHandler( self.enbIoService, self.__procedureCompleteCallback__) self.enbIoService.addIncomingMessageCallback( self.enbProcedure.handleIncomingMessage) self.result = None def __procedureCompleteCallback__(self, result, rrcTransactionIdentifier): self.result = result def test_procedureSuccessful(self): self.enbProcedure.start((localhost(), 9001), 0, "cipherAlgo", "integProtAlgo") time.sleep(0.1) self.ueIoService.sendMessage("enb", *securityModeComplete(0)) time.sleep(0.1) self.assertEqual(self.result, EnbInitialSecurityActivationProcedureHandler.Complete)
class TestS1apSetupProcedure(unittest.TestCase): def setUp(self): self.sampleS1SetupRequestParameters = { "globalEnbId": 345, "enbName": "Taksim", "supportedTas": [ (41433, ("28603", "28604")), (41434, ("28603", "28604")), ], "csgIdList": [101, 122], "defaultPagingDrx": [32, 64, 128], } self.sampleS1SetupResponseParameters = { "mmeName": "Istanbul", "servedGummeis": [ (("28603", "28604"), (0, 1, 2), (23, 58, 127)), (("00108"), (0,), (12, 13, 14)), ], "relativeMmeCapacity": 255, "criticalityDiagnostics": None, } self.enbIoService = IoService("enb", 9001) self.mmeIoService = IoService("mme", 9000) [s.start() for s in self.enbIoService, self.mmeIoService] self.procedure = S1SetupProcedure(self.sampleS1SetupRequestParameters, (localhost(), 9000), self.enbIoService, self.__procedureProgressCallback__) self.enbIoService.addIncomingMessageCallback(self.procedure.handleIncomingMessage) self.progress = None self.args = None def tearDown(self): [s.stop() for s in self.enbIoService, self.mmeIoService] def __procedureProgressCallback__(self, progress, args=None): self.progress = progress self.args = args def test_procedureSuccessful(self): self.procedure.execute() time.sleep(0.1) self.mmeIoService.sendMessage("enb", *s1SetupResponse(**self.sampleS1SetupResponseParameters)) time.sleep(0.1) self.assertEqual(self.progress, S1SetupProcedure.ProgressSuccess) self.procedure.terminate() def test_procedureFirstRejectedThenSuccessful(self): self.procedure.execute() time.sleep(0.2) self.mmeIoService.sendMessage("enb", *s1SetupFailure(**{ "cause": "congestion", "timeToWait": 1, "criticalityDiagnostics": None, })) time.sleep(0.1) self.assertEqual(self.progress, S1SetupProcedure.ProgressWaitForNextAttempt) time.sleep(1.1) # greater than value of 'Time to wait' IE self.mmeIoService.sendMessage("enb", *s1SetupResponse(**self.sampleS1SetupResponseParameters)) time.sleep(0.1) self.assertEqual(self.progress, S1SetupProcedure.ProgressSuccess) self.procedure.terminate()
class TestRrcConnectionProcedure(unittest.TestCase): def setUp(self): self.enbIoService = IoService("enb", 9000) self.ueIoService = IoService("ue", 9001) [s.start() for s in self.enbIoService, self.ueIoService] procedureParameters = { "maxPrachPreambleAttempts": 5, "prachPreambleRepeatDelay": 0.7, "macContentionResolutionTimeout": 0.5, "rrcConnectionSetupTimeoutT300": 2.0 } rrcEstablishmentInputParameters = { "ueIdentityType": "randomValue", "ueIdentityValue": 3434, "rrcEstablishmentCause": "moSignaling", "selectedPlmnIdentity": 2801, "initialNasMessage": { "nasMessageType": "attachRequest" } } self.procedure = RrcConnectionEstablishmentProcedure( procedureParameters, (localhost(), 9000), self.ueIoService, self.__procedureCompleteCallback__, rrcEstablishmentInputParameters) def tearDown(self): [s.stop() for s in self.enbIoService, self.ueIoService] def __procedureCompleteCallback__(self, result): self.result = result def test_noRandomAccessResponseReceived(self): self.result = None self.procedure.execute() time.sleep(3.7) self.assertEqual(self.result, RrcConnectionEstablishmentProcedure.ErrorNoRandomAccessResponse) self.procedure.terminate() def test_noContentionResolutionIdentityReceived(self): self.result = None self.procedure.execute() time.sleep(0.4) # smaller than 0.7 temporaryCrnti = 43 uplinkGrant = 12 self.enbIoService.sendMessage("ue", *randomAccessResponse( self.procedure.raRnti, self.procedure.rapid, temporaryCrnti, uplinkGrant)) time.sleep(2.0) # greater than 0.5 self.assertEqual(self.result, RrcConnectionEstablishmentProcedure.ErrorNoContentionResolutionIdentity) self.procedure.terminate() def test_noRrcConnectionSetupReceived(self): self.result = None self.procedure.execute() time.sleep(0.4) # smaller than 0.7 temporaryCrnti = 43 uplinkGrant = 12 self.enbIoService.sendMessage("ue", *randomAccessResponse( self.procedure.raRnti, self.procedure.rapid, temporaryCrnti, uplinkGrant)) time.sleep(0.2) # smaller than 0.5 interface, channelInfo, message = contentionResolutionIdentity( temporaryCrnti, self.procedure.rrcConnectionRequestMessage) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(2.5) # greater than 2.0 self.assertEqual(self.result, RrcConnectionEstablishmentProcedure.ErrorNoRrcConnectionSetup) self.procedure.terminate() def test_rrcConnectionEstablished(self): self.result = None self.procedure.execute() time.sleep(0.4) # smaller than 0.7 temporaryCrnti = 43 uplinkGrant = 12 self.enbIoService.sendMessage("ue", *randomAccessResponse( self.procedure.raRnti, self.procedure.rapid, temporaryCrnti, uplinkGrant)) time.sleep(0.2) # smaller than 0.5 interface, channelInfo, message = contentionResolutionIdentity( temporaryCrnti, self.procedure.rrcConnectionRequestMessage) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.5) # less than 2.0 rrcTransactionIdentifier = 4 interface, channelInfo, message = rrcConnectionSetup(temporaryCrnti, rrcTransactionIdentifier) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.5) self.assertEqual(self.result, RrcConnectionEstablishmentProcedure.Success) self.procedure.terminate() def test_rrcConnectionEstablishedButSubsequentSetupsIgnored(self): self.result = None self.procedure.execute() time.sleep(0.4) # smaller than 0.7 temporaryCrnti = 43 uplinkGrant = 12 self.enbIoService.sendMessage("ue", *randomAccessResponse( self.procedure.raRnti, self.procedure.rapid, temporaryCrnti, uplinkGrant)) time.sleep(0.2) # smaller than 0.5 interface, channelInfo, message = contentionResolutionIdentity( temporaryCrnti, self.procedure.rrcConnectionRequestMessage) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.5) # less than 2.0 rrcTransactionIdentifier = 4 interface, channelInfo, message = rrcConnectionSetup(temporaryCrnti, rrcTransactionIdentifier) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.5) self.assertEqual(self.result, RrcConnectionEstablishmentProcedure.Success) self.result = None self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.2) self.assertEqual(self.result, None) self.procedure.terminate()
class TestS1apSetupProcedure(unittest.TestCase): def setUp(self): self.sampleS1SetupRequestParameters = { "globalEnbId": 345, "enbName": "Taksim", "supportedTas": [ (41433, ("28603", "28604")), (41434, ("28603", "28604")), ], "csgIdList": [101, 122], "defaultPagingDrx": [32, 64, 128], } self.sampleS1SetupResponseParameters = { "mmeName": "Istanbul", "servedGummeis": [ (("28603", "28604"), (0, 1, 2), (23, 58, 127)), (("00108"), (0, ), (12, 13, 14)), ], "relativeMmeCapacity": 255, "criticalityDiagnostics": None, } self.enbIoService = IoService("enb", 9001) self.mmeIoService = IoService("mme", 9000) [s.start() for s in self.enbIoService, self.mmeIoService] self.procedure = S1SetupProcedure(self.sampleS1SetupRequestParameters, (localhost(), 9000), self.enbIoService, self.__procedureProgressCallback__) self.enbIoService.addIncomingMessageCallback( self.procedure.handleIncomingMessage) self.progress = None self.args = None def tearDown(self): [s.stop() for s in self.enbIoService, self.mmeIoService] def __procedureProgressCallback__(self, progress, args=None): self.progress = progress self.args = args def test_procedureSuccessful(self): self.procedure.execute() time.sleep(0.1) self.mmeIoService.sendMessage( "enb", *s1SetupResponse(**self.sampleS1SetupResponseParameters)) time.sleep(0.1) self.assertEqual(self.progress, S1SetupProcedure.ProgressSuccess) self.procedure.terminate() def test_procedureFirstRejectedThenSuccessful(self): self.procedure.execute() time.sleep(0.2) self.mmeIoService.sendMessage( "enb", *s1SetupFailure( **{ "cause": "congestion", "timeToWait": 1, "criticalityDiagnostics": None, })) time.sleep(0.1) self.assertEqual(self.progress, S1SetupProcedure.ProgressWaitForNextAttempt) time.sleep(1.1) # greater than value of 'Time to wait' IE self.mmeIoService.sendMessage( "enb", *s1SetupResponse(**self.sampleS1SetupResponseParameters)) time.sleep(0.1) self.assertEqual(self.progress, S1SetupProcedure.ProgressSuccess) self.procedure.terminate()
class TestRrcConnectionProcedure(unittest.TestCase): def setUp(self): self.enbIoService = IoService("enb", 9000) self.ueIoService = IoService("ue", 9001) [s.start() for s in self.enbIoService, self.ueIoService] procedureParameters = { "maxPrachPreambleAttempts": 5, "prachPreambleRepeatDelay": 0.7, "macContentionResolutionTimeout": 0.5, "rrcConnectionSetupTimeoutT300": 2.0 } rrcEstablishmentInputParameters = { "ueIdentityType": "randomValue", "ueIdentityValue": 3434, "rrcEstablishmentCause": "moSignaling", "selectedPlmnIdentity": 2801, "initialNasMessage": { "nasMessageType": "attachRequest" } } self.procedure = RrcConnectionEstablishmentProcedure( procedureParameters, (localhost(), 9000), self.ueIoService, self.__procedureCompleteCallback__, rrcEstablishmentInputParameters) def tearDown(self): [s.stop() for s in self.enbIoService, self.ueIoService] def __procedureCompleteCallback__(self, result): self.result = result def test_noRandomAccessResponseReceived(self): self.result = None self.procedure.execute() time.sleep(3.7) self.assertEqual( self.result, RrcConnectionEstablishmentProcedure.ErrorNoRandomAccessResponse) self.procedure.terminate() def test_noContentionResolutionIdentityReceived(self): self.result = None self.procedure.execute() time.sleep(0.4) # smaller than 0.7 temporaryCrnti = 43 uplinkGrant = 12 self.enbIoService.sendMessage( "ue", *randomAccessResponse(self.procedure.raRnti, self.procedure.rapid, temporaryCrnti, uplinkGrant)) time.sleep(2.0) # greater than 0.5 self.assertEqual( self.result, RrcConnectionEstablishmentProcedure. ErrorNoContentionResolutionIdentity) self.procedure.terminate() def test_noRrcConnectionSetupReceived(self): self.result = None self.procedure.execute() time.sleep(0.4) # smaller than 0.7 temporaryCrnti = 43 uplinkGrant = 12 self.enbIoService.sendMessage( "ue", *randomAccessResponse(self.procedure.raRnti, self.procedure.rapid, temporaryCrnti, uplinkGrant)) time.sleep(0.2) # smaller than 0.5 interface, channelInfo, message = contentionResolutionIdentity( temporaryCrnti, self.procedure.rrcConnectionRequestMessage) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(2.5) # greater than 2.0 self.assertEqual( self.result, RrcConnectionEstablishmentProcedure.ErrorNoRrcConnectionSetup) self.procedure.terminate() def test_rrcConnectionEstablished(self): self.result = None self.procedure.execute() time.sleep(0.4) # smaller than 0.7 temporaryCrnti = 43 uplinkGrant = 12 self.enbIoService.sendMessage( "ue", *randomAccessResponse(self.procedure.raRnti, self.procedure.rapid, temporaryCrnti, uplinkGrant)) time.sleep(0.2) # smaller than 0.5 interface, channelInfo, message = contentionResolutionIdentity( temporaryCrnti, self.procedure.rrcConnectionRequestMessage) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.5) # less than 2.0 rrcTransactionIdentifier = 4 interface, channelInfo, message = rrcConnectionSetup( temporaryCrnti, rrcTransactionIdentifier) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.5) self.assertEqual(self.result, RrcConnectionEstablishmentProcedure.Success) self.procedure.terminate() def test_rrcConnectionEstablishedButSubsequentSetupsIgnored(self): self.result = None self.procedure.execute() time.sleep(0.4) # smaller than 0.7 temporaryCrnti = 43 uplinkGrant = 12 self.enbIoService.sendMessage( "ue", *randomAccessResponse(self.procedure.raRnti, self.procedure.rapid, temporaryCrnti, uplinkGrant)) time.sleep(0.2) # smaller than 0.5 interface, channelInfo, message = contentionResolutionIdentity( temporaryCrnti, self.procedure.rrcConnectionRequestMessage) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.5) # less than 2.0 rrcTransactionIdentifier = 4 interface, channelInfo, message = rrcConnectionSetup( temporaryCrnti, rrcTransactionIdentifier) self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.5) self.assertEqual(self.result, RrcConnectionEstablishmentProcedure.Success) self.result = None self.enbIoService.sendMessage("ue", interface, channelInfo, message) time.sleep(0.2) self.assertEqual(self.result, None) self.procedure.terminate()