aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--README.txt16
-rw-r--r--hlr_mgmt/__init__.py14
-rw-r--r--hlr_mgmt/tests.py209
-rw-r--r--hlr_mgmt/views.py1
-rwxr-xr-xosmocom-oohmi (renamed from osmo-oohmi)0
-rw-r--r--setup.cfg2
-rw-r--r--setup.py5
8 files changed, 236 insertions, 14 deletions
diff --git a/.gitignore b/.gitignore
index 2883e3a..543d3ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,5 @@ dist/
# autogenerated files when run in this directory
*.pid
-*.log \ No newline at end of file
+*.log
+*.coverage
diff --git a/README.txt b/README.txt
index 2ddf6c6..d84e416 100644
--- a/README.txt
+++ b/README.txt
@@ -51,7 +51,13 @@ Installation & Configuration:
sudo python setup.py install
cp production.ini /etc/openbsc/production.ini
-3) Run the Server:
+3) Verify installation:
+
+ python setup.py nosetests
+
+ If the above command generates errors, try to fix these before running the software
+
+4) Run the Server:
cd /etc/openbsc/
pserve production.ini start
@@ -61,11 +67,11 @@ Installation & Configuration:
pserver --help
-4) Install init script
+5) Install init script
- sudo cp osmo-oohmi /etc/init.d/osmo-oohmi
- sudo update-rc.d osmo-oohmi defaults
+ sudo cp osmocom-oohmi /etc/init.d/osmocom-oohmi
+ sudo update-rc.d osmocom-oohmi defaults
-5) Access the Web Interface
+6) Access the Web Interface
http://localhost:8080/
diff --git a/hlr_mgmt/__init__.py b/hlr_mgmt/__init__.py
index fb65c1e..915211e 100644
--- a/hlr_mgmt/__init__.py
+++ b/hlr_mgmt/__init__.py
@@ -69,10 +69,7 @@ def new_request_subscriber(event):
request.db = sqlite3.connect(settings['db'])
request.add_finished_callback(close_db_connection)
-def main(global_config, **settings):
- """ This function returns a Pyramid WSGI application.
- """
-
+def load_settings():
# configuration settings
settings = {}
settings['reload_all'] = True
@@ -87,7 +84,7 @@ def main(global_config, **settings):
settings['sgsn_ip'] = "127.0.0.1"
settings['bsc_port'] = 4242
settings['sgsn_port'] = 4245
-
+
# loads MCC MNC codes to memory
mcc_mnc = os.path.join(here,'mcc_mnc.csv')
settings['mcc_mnc'] = parse_mcc_csv(mcc_mnc)
@@ -99,6 +96,13 @@ def main(global_config, **settings):
subMonitor.start()
settings['subMonitor'] = subMonitor
+ return settings
+
+def main(global_config, **settings):
+ """ This function returns a Pyramid WSGI application.
+ """
+ settings = load_settings
+
# session factory
session_factory = UnencryptedCookieSessionFactoryConfig('0p3nb5c.5ign4tur3')
diff --git a/hlr_mgmt/tests.py b/hlr_mgmt/tests.py
new file mode 100644
index 0000000..4a7d67c
--- /dev/null
+++ b/hlr_mgmt/tests.py
@@ -0,0 +1,209 @@
+# -*- coding: utf-8 -*-
+
+###
+# Copyright (C) 2013
+# Fraunhofer Institute for Open Communication Systems (FOKUS)
+# Competence Center NETwork research (NET), St. Augustin, GERMANY
+# Alton MacDonald <alton.kenneth.macdonald@fokus.fraunhofer.de>
+#
+# 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 <http://www.gnu.org/licenses/>.
+###
+
+import unittest
+from pyramid import testing
+from pyramid.httpexceptions import HTTPFound
+import sqlite3, logging
+
+from . import load_settings
+log = logging.getLogger(__name__)
+
+class Tester(unittest.TestCase):
+
+ def setUp(self):
+ self.settings = load_settings()
+ self.config = testing.setUp()
+ self.config.add_route('subscribers', '/subscribers/')
+
+ def tearDown(self):
+ testing.tearDown()
+ self.settings['subMonitor'].stop()
+
+ def generate_request(self):
+ request = testing.DummyRequest()
+ request.registry.settings = self.settings
+ try:
+ db = sqlite3.connect(self.settings['db'])
+ except:
+ log.debug('HLR database not found. Loading dummy database to memory')
+ db = sqlite3.connect(":memory:")
+ request.db = db
+ return request
+
+ ### Properly importing additional modules for unit testings ###
+
+ def _getClass_telnet_backend(self):
+ from telnet_backend import telnet_backend
+ return telnet_backend
+
+ def _getClass_RegisterIMEI(self):
+ from RegisterIMEI import RegisterIMEI
+ return RegisterIMEI
+
+ def _getClass_SubscriberMonitor(self):
+ from SubscriberMonitor import SubscriberMonitor
+ return SubscriberMonitor
+
+ ### telnet_backend unit tests ###
+
+ def _test_telnet_connection(self, service):
+ telnet_backend = self._getClass_telnet_backend()
+ db = telnet_backend(self.settings[service+'_ip'], self.settings[service+'_port'])
+ if db.connect():
+ version = db.get_version()
+ db.close()
+ assert isinstance(version, list)
+ else:
+ assert isinstance(db, telnet_backend)
+
+ def test_telnet_bsc_connection(self):
+ self._test_telnet_connection("bsc")
+
+ def test_telnet_sgsn_connection(self):
+ self._test_telnet_connection("sgsn")
+
+ ### RegisterIMEI unit tests ###
+
+ def test_RegisterIMEI(self):
+ RegisterIMEI = self._getClass_RegisterIMEI()
+ IMEI = "12345678901234"
+ reg_imei = RegisterIMEI(imei=IMEI)
+ self.assertEquals(reg_imei.pre_checks(),-1)
+ luhn = reg_imei.calculate_luhn(IMEI)
+ reg_imei.imei = IMEI + str((luhn+1)%10)
+ self.assertEquals(reg_imei.pre_checks(),-2)
+ reg_imei.imei = IMEI + str(luhn)
+ self.assertEquals(reg_imei.pre_checks(),0)
+ self.assertTrue(reg_imei.isvalid_imei(reg_imei.imei))
+
+ ### SubscriberMonitor unit tests ###
+
+ def test_SubscriberMonitor(self):
+ SubscriberMonitor = self._getClass_SubscriberMonitor()
+ subMonitor = None
+ try:
+ subMonitor = SubscriberMonitor(self.settings['provider'], self.settings['db'], port=self.settings['bsc_port'])
+ except:
+ return
+ assert isinstance(subMonitor, SubscriberMonitor)
+ subMonitor.start()
+ self.assertTrue(subMonitor.is_running)
+ if subMonitor.is_running():
+ subMonitor.stop()
+ self.assertFalse(subMonitor.is_running())
+
+ ### server html view unit tests ###
+ """
+ @view_config(context='pyramid.exceptions.NotFound', renderer='notfound.mako')
+ @view_config(route_name='www_root', renderer='home.mako')
+ @view_config(route_name='subscribers', renderer='subscribers.mako')
+ @view_config(route_name='subscriber_detail', renderer='subscriber_detail.mako')
+ @view_config(route_name='scripts', renderer='scripts.mako')
+ @view_config(route_name='sms', renderer='sms.mako')
+ @view_config(route_name='bsc', renderer='bsc.mako')
+ @view_config(route_name='sgsn', renderer='sgsn.mako')
+ @view_config(route_name='bts', renderer='bts.mako')
+ """
+ # testing to make sure that the web page generation does not crash
+
+ def test_not_found(self):
+ from .views import notfound_view
+ result = notfound_view(self.generate_request())
+ self.assertEqual(result, {})
+
+ def test_www_root(self):
+ from .views import www_root
+ result = www_root(self.generate_request())
+ self.assertEqual(result, {})
+
+ def test_subscriber_view(self):
+ from .views import subscriber_view
+ result = subscriber_view(self.generate_request())
+ self.assertTrue(result.has_key('subscribers'))
+
+ def test_subscriber_detail_view(self):
+ from .views import subscriber_view, subscriber_detail_view
+ result = subscriber_detail_view(self.generate_request())
+ if not isinstance(result,HTTPFound):
+ self.assertTrue(result.has_key('extension')
+ and result.has_key('subscriber')
+ and result.has_key('mm'))
+ else:
+ log.debug(result)
+
+ def test_scripts_view(self):
+ from .views import scripts_view
+ result = scripts_view(self.generate_request())
+ self.assertTrue(result.has_key('service_status'))
+ scripts = result['service_status']
+ self.assertTrue(scripts.has_key('lcr')
+ and scripts.has_key('asterisk')
+ and scripts.has_key('ggsn')
+ and scripts.has_key('nitb')
+ and scripts.has_key('sgsn')
+ and scripts.has_key('subMonitor'))
+
+ def test_sms_view(self):
+ from .views import sms_view
+ result = sms_view(self.generate_request())
+ self.assertTrue(result.has_key('sms'))
+
+ def test_bsc_view(self):
+ from .views import bsc_view
+ result = bsc_view(self.generate_request())
+ self.assertTrue(result.has_key('bsc_version')
+ and result.has_key('bsc_network')
+ and result.has_key('bsc_statistics'))
+
+ def test_sgsn_view(self):
+ from .views import sgsn_view
+ result = sgsn_view(self.generate_request())
+ self.assertTrue(result.has_key('sgsn_version')
+ and result.has_key('ns_statistics'))
+
+ def test_bts_view(self):
+ from .views import bts_view
+ result = bts_view(self.generate_request())
+ self.assertTrue(result.has_key('bts')
+ and result.has_key('phys_cfg'))
+
+ ### server URI command unit tests ###
+ """
+ @view_config(route_name='delete_sms')
+ @view_config(route_name='clear_sms')
+ @view_config(route_name='send_sms')
+ @view_config(route_name='broadcast_sms')
+ @view_config(route_name='manage_service')
+ """
+ # nothing to test here since these are all redirects
+
+ ### server ajax unit tests ###
+ """
+ @view_config(route_name='authorize_toggle', renderer='json')
+ @view_config(route_name='authorize_imei', renderer='json')
+ @view_config(route_name='clear_component', renderer='json')
+ @view_config(route_name='rename_component', renderer='json')
+ @view_config(route_name='toggle_channel',renderer='json')
+ """
+ # nothing to test here since these only say if the interaction with the database was successfull
+
diff --git a/hlr_mgmt/views.py b/hlr_mgmt/views.py
index 9b5f2a1..98ff47a 100644
--- a/hlr_mgmt/views.py
+++ b/hlr_mgmt/views.py
@@ -205,7 +205,6 @@ def bsc_view(request):
if bsc.connected:
bsc_version = bsc.get_version()
bsc_network = bsc.get_network_info()
- print bsc_network
bsc_statistics = bsc.get_network_statistics()
bsc.close()
return {'bsc_version': bsc_version, 'bsc_network': bsc_network, 'bsc_statistics': bsc_statistics}
diff --git a/osmo-oohmi b/osmocom-oohmi
index 10bfff8..10bfff8 100755
--- a/osmo-oohmi
+++ b/osmocom-oohmi
diff --git a/setup.cfg b/setup.cfg
index 9752b68..68ed554 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,7 +1,7 @@
[nosetests]
match = ^test
nocapture = 1
-cover-package = osmo_oohmi
+cover-package = hlr_mgmt
with-coverage = 1
cover-erase = 1
diff --git a/setup.py b/setup.py
index 5a07a06..aca8cb6 100644
--- a/setup.py
+++ b/setup.py
@@ -21,6 +21,7 @@
###
import os
+import multiprocessing
from setuptools import setup, find_packages
@@ -33,6 +34,8 @@ requires = [
'pyramid_debugtoolbar',
'pyramid_exclog',
'waitress',
+ 'nose',
+ 'coverage'
]
setup(name='osmo_oohmi',
@@ -54,7 +57,7 @@ setup(name='osmo_oohmi',
zip_safe=False,
install_requires=requires,
tests_require=requires,
- test_suite="osmo_oohmi",
+ test_suite="nose.collector",
entry_points="""\
[paste.app_factory]
main = hlr_mgmt:main