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
Exemple #2
0
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"})
Exemple #3
0
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"})
Exemple #4
0
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)
Exemple #5
0
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)
Exemple #6
0
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()
Exemple #7
0
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()
Exemple #8
0
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()
Exemple #9
0
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()