diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5ca1868a8c990ae3ac798d8e8059ffe2eba75858..ddd1ac582372c8c50ebfc1ee6194db3084b19292 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,6 +18,9 @@ before_script: simple_guru_help: stage: test script: - - whoami - python3 guru.py -h +print_connection_status: + stage: test + script: + - python3 guru.py -pcs \ No newline at end of file diff --git a/aura.py b/aura.py index b4f11040ed910ea5d566d22e2efabaf857b4caaa..984022063eb9bc99c2bd56cb40d70ca773624d83 100755 --- a/aura.py +++ b/aura.py @@ -1,16 +1,19 @@ #!/usr/bin/python3 -import signal import os +import sys +import signal +import unittest from modules.scheduling.scheduler import AuraScheduler from modules.communication.liquidsoap.communicator import LiquidSoapCommunicator from modules.communication.redis.adapter import ServerRedisAdapter from modules.web.routes import Routes -from libraries.base.config import AuraConfig from libraries.base.logger import AuraLogger -class Aura(AuraConfig, AuraLogger): +from testing.test import TestConfig, TestLogger + +class Aura(AuraLogger): server = None messenger = None controller = None @@ -19,9 +22,19 @@ class Aura(AuraConfig, AuraLogger): def __init__(self): super(Aura, self).__init__() + def test_yourself(self): + self.run_test(TestConfig) + self.run_test(TestLogger) + + def run_test(self, testingClass): + runner = unittest.TextTestRunner() + result = runner.run(unittest.makeSuite(testingClass)) + + def startup(self): + server = object -# self.controller = AuraController(self.config) + # self.controller = AuraController(self.config) # create scheduler and ls_communicator self.liquidsoapcommunicator = LiquidSoapCommunicator(self.config) self.scheduler = AuraScheduler(self.config) @@ -42,6 +55,9 @@ class Aura(AuraConfig, AuraLogger): signal.signal(signal.SIGUSR1, receive_signal) + self.join_comm() + self.start_web_service() + def join_comm(self): # start listener thread self.messenger.start() @@ -60,8 +76,13 @@ class Aura(AuraConfig, AuraLogger): # # ## ## ## ## ## # # def main(): aura = Aura() - aura.join_comm() - aura.start_web_service() + + if len(sys.argv) >= 2 and sys.argv[1] == "--na-gspiast-di-?": + aura.test_yourself() + else: + aura.startup() + + # # ## ## ## ## ## ## # # # # End ENTRY FUNCTION # # # # ## ## ## ## ## ## # # diff --git a/configuration/engine.ini b/configuration/engine.ini index 6f18c0d39249cbf04011b9985cc739684d2915dd..663e3c3faa6b53a01e3ed8a6d16e2d7b9980306d 100644 --- a/configuration/engine.ini +++ b/configuration/engine.ini @@ -73,7 +73,6 @@ importerurl="http://localhost:8008/api/v1/groups/_public/playlists/" audiobase="/var/audio/rec" altaudiobase="/var/audio/preprod" playlistdir="/var/audio/playlists/" -install_dir="/home/gg/PycharmProjects/engine" [stream] stream="y" diff --git a/libraries/base/config.py b/libraries/base/config.py index c4ff1361738e667450e80a913e1900ac02d45f14..b4641dd1937f44a90ddc17ba1026f69b3f88879d 100644 --- a/libraries/base/config.py +++ b/libraries/base/config.py @@ -12,6 +12,8 @@ class AuraConfig: config = None def __init__(self): + super(AuraConfig, self).__init__() + self.config = ConfigReader() self.read_config() def read_config(self): @@ -19,5 +21,4 @@ class AuraConfig: reads aura.ini :return: """ - self.config = ConfigReader() self.config.load_config() diff --git a/libraries/base/logger.py b/libraries/base/logger.py index a1981d389cdb9145a5a06fa3464d255c38d9212a..0e854fb89a47dfa7f2aa5a71f7e92ff2287e901d 100644 --- a/libraries/base/logger.py +++ b/libraries/base/logger.py @@ -4,11 +4,14 @@ Aura logger functions import logging +from libraries.base.config import AuraConfig -class AuraLogger: + +class AuraLogger(AuraConfig): logger = None def __init__(self): + super(AuraLogger, self).__init__() self.__create_logger("AuraEngine") def __create_logger(self, name): diff --git a/libraries/database/broadcasts.py b/libraries/database/broadcasts.py index 9d3a2afd9a61a7ba54eaca956ae4c2a716d305bb..1c2a5be16498c72b9db1a0eedacf5a6e6906390d 100644 --- a/libraries/database/broadcasts.py +++ b/libraries/database/broadcasts.py @@ -86,6 +86,17 @@ class Schedule(DB.Model, AuraDatabaseModel): show_fallback_id = Column(Integer) station_fallback_id = Column(Integer) + @staticmethod + def select_all(): + # fetching all entries + all_entries = DB.session.query(Schedule).filter().order_by(Schedule.schedule_start).all() + return all_entries + + @staticmethod + def select_by_id(id): + entry = DB.session.query(Schedule).filter(Schedule.schedule_id == id).first() + return entry + def get_length(self): sec1 = int(datetime.datetime.strptime(self.start[0:16].replace(" ", "T"), "%Y-%m-%dT%H:%M").strftime("%s")) sec2 = int(datetime.datetime.strptime(self.end[0:16].replace(" ", "T"), "%Y-%m-%dT%H:%M").strftime("%s")) @@ -181,6 +192,11 @@ class ScheduleEntry(DB.Model, AuraDatabaseModel): def select_one(playlist_id, entry_num): return DB.session.query(ScheduleEntry).filter(ScheduleEntry.playlist_id == playlist_id, ScheduleEntry.entry_num == entry_num).first() + # ------------------------------------------------------------------------------------------ # + @staticmethod + def select_playlist(playlist_id): + return DB.session.query(ScheduleEntry).filter(ScheduleEntry.playlist_id == playlist_id).all() + # ------------------------------------------------------------------------------------------ # def __str__(self): return "ScheduleID: #" + str(self.schedule_id) + " Showname: " + self.schedule.show_name + " starts @ " + str(self.entry_start) + " and plays " + self.source @@ -206,9 +222,21 @@ class TrackService(DB.Model, AuraDatabaseModel): schedule_entry = relationship("ScheduleEntry", primaryjoin="and_(TrackService.playlist_id==ScheduleEntry.playlist_id, TrackService.entry_num==ScheduleEntry.entry_num)", lazy="joined") @staticmethod + # ------------------------------------------------------------------------------------------ # def select_one(trackservice_id): return DB.session.query(TrackService).filter(TrackService.trackservice_id == trackservice_id).first() + @staticmethod + # ------------------------------------------------------------------------------------------ # + def select_by_day(day): + day_plus_one = day + datetime.timedelta(days=1) + tracks = DB.session.query(TrackService).filter(TrackService.start >= str(day), TrackService.start < str(day_plus_one)).all() + return tracks + + # ------------------------------------------------------------------------------------------ # + def __str__(self): + return "TrackServiceID: #" + str(self.trackservice_id) + " playlist_id: " + str(self.playlist_id) + " started @ " + str(self.start) + " and played " + self.source + # ------------------------------------------------------------------------------------------ # # class TrackServiceSchedule(db.Model, AuraDatabaseModel): # """ diff --git a/libraries/exceptions/auraexceptions.py b/libraries/exceptions/auraexceptions.py index 12bd4c40b8faf89100d7e636a8eecd8ccd547ce3..766ed364b405488219a97384ea79a425f6630b7a 100644 --- a/libraries/exceptions/auraexceptions.py +++ b/libraries/exceptions/auraexceptions.py @@ -6,8 +6,10 @@ class NoProgrammeLoadedException(Exception): class LQConnectionError(Exception): pass + class RedisConnectionException(Exception): pass + class PlaylistException(Exception): pass diff --git a/modules/base/config.py b/modules/base/config.py index 31fac6bc8f423bace176097c0da8a1b3e0228bc3..4c8200cefd68093b775eec6b9a483a4830dc5548 100644 --- a/modules/base/config.py +++ b/modules/base/config.py @@ -124,4 +124,6 @@ class ConfigReader(object): v = config_parser.get(section, key).replace('"', '').strip() self.set(key, v) + self.set("install_dir", os.path.realpath(__file__ + "../../../..")) + diff --git a/requirements.txt b/requirements.txt index 92f76983d90b76a0ce412f2f6d47e0e006a955c4..8775dc8db2bef4c8bc5173db951e27b026644b8a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,4 @@ redis==2.10.5 simplejson==3.11.1 mutagen==1.38 python-dateutil==2.6.0 +validators==0.12.1 diff --git a/testing/test.py b/testing/test.py new file mode 100644 index 0000000000000000000000000000000000000000..ef4405919e493613917e802de1fc8b55be18355f --- /dev/null +++ b/testing/test.py @@ -0,0 +1,91 @@ +import os +import unittest +import validators + +from datetime import datetime + +# libraries.base +from libraries.base.logger import AuraLogger +from libraries.base.config import AuraConfig +# libraries.database +from libraries.database.broadcasts import Schedule, ScheduleEntry, TrackService + + +class TestLogger(unittest.TestCase): + aura_logger = None + + def setUp(self): + self.aura_logger = AuraLogger() + + def test_logger(self): + self.assertTrue(self.aura_logger.logger.hasHandlers()) + + +class TestConfig(unittest.TestCase): + aura_config = None + + def setUp(self): + self.aura_config = AuraConfig() + + def test_config(self): + # is ini path correct set? + self.assertEqual(self.aura_config.config.ini_path, "/etc/aura/engine.ini") + + # install_dir is set by runtime. is it a directory? + self.assertTrue(os.path.isdir(self.aura_config.config.get("install_dir"))) + + # calendarurl and importerurl set and valid urls? + self.assertTrue(validators.url(self.aura_config.config.get("calendarurl"))) + self.assertTrue(validators.url(self.aura_config.config.get("importerurl"))) + + # is liquidsoap socketdir set and a directory? + self.assertTrue(os.path.isdir(self.aura_config.config.get("socketdir"))) + + # database settings set? + self.assertIsNotNone(self.aura_config.config.get("db_user")) + self.assertIsNotNone(self.aura_config.config.get("db_pass")) + self.assertIsNotNone(self.aura_config.config.get("db_name")) + self.assertIsNotNone(self.aura_config.config.get("db_host")) + +class TestSchedule(unittest.TestCase): + schedule = None + + def setUp(self): + self.schedule = Schedule() + + def test_schedule(self): + # select one and check if its not None and a Schedule + entry = self.schedule.select_by_id(1) + self.assertIsNotNone(entry) + self.assertIsInstance(entry, Schedule) + + +class TestScheduleEntry(unittest.TestCase): + schedule_entry = None + + def setUp(self): + self.schedule_entry = ScheduleEntry() + + def test_schedule_entry(self): + # select one playlist and check if its not None, a ScheduleEntry + entry = self.schedule_entry.select_playlist(2) + + self.assertIsNotNone(entry) + self.assertIsInstance(entry, list) + self.assertGreaterEqual(len(entry), 1) + + +class TestTrackService(unittest.TestCase): + track_service = None + + def setUp(self): + self.track_service = TrackService() + + def test_track_service(self): + day = datetime.strptime('19.03.2018', '%d.%m.%Y') + entry = self.track_service.select_by_day(day) + self.assertIsNotNone(entry) + self.assertIsInstance(entry, list) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file