Beispiel #1
0
 def _checkIdle(self):
     if self.doidle is False:
         return
     XBMCit = xbmc.getGlobalIdleTime()
     if self.player.isPlaying():
         self._playeridle = False
         self._startidle = XBMCit
     else:  # player is not playing
         if self._playeridle is False:  # if the first pass with player idle, start timing here
             self._playeridle = True
             self._startidle = XBMCit
     myit = XBMCit - self._startidle  # amount of time idle and not playing
     for it in self.idleTs:
         if myit > it[0]:  # if time exceeded idle timer
             if it[2] is False:  # idle task has NOT been executed
                 msg = Message(Topic('onIdle', it[1]))
                 self.publish(msg)
                 it[2] = True
         else:  # if time has not exceeded timer
             it[2] = False  # reset task executed flag
     for it in self.afterIdles:
         if myit > it[0]:  # time has exceeded timer
             it[2] = True  # set flag that task needs to be executed when exiting idle
         else:  # time has not exceeded idle timer
             if it[2] is True:  # if flag to execute has been set
                 msg = Message(Topic('afterIdle', it[1]))
                 self.publish(msg)
             it[2] = False  # reset flag to execute
Beispiel #2
0
 def start(self):
     oldsnapshots = WatchdogStartup.getPickle()
     newsnapshots = {}
     for setting in self.settings:
         folder = translatepath(setting['ws_folder'])
         if os.path.exists(folder):
             newsnapshot = DirectorySnapshot(
                 folder, recursive=setting['ws_recursive'])
             newsnapshots[folder] = newsnapshot
             if oldsnapshots is not None:
                 if folder in oldsnapshots.keys():
                     oldsnapshot = oldsnapshots[folder]
                     diff = DirectorySnapshotDiff(oldsnapshot, newsnapshot)
                     changes = self.getChangesFromDiff(diff)
                     if len(changes) > 0:
                         eh = EventHandler(
                             patterns=setting['ws_patterns'].split(','),
                             ignore_patterns=setting['ws_ignore_patterns'].
                             split(','),
                             ignore_directories=setting[
                                 'ws_ignore_directories'])
                         observer = Observer()
                         try:
                             observer.schedule(
                                 eh,
                                 folder,
                                 recursive=setting['ws_recursive'])
                             time.sleep(0.5)
                             for change in changes:
                                 eh.dispatch(change)
                                 time.sleep(0.25)
                             try:
                                 observer.unschedule_all()
                             except Exception:
                                 pass
                         except Exception:
                             raise
                         if len(eh.data) > 0:
                             message = Message(Topic(
                                 'onStartupFileChanges', setting['key']),
                                               listOfChanges=eh.data)
                             self.publish(message)
         else:
             message = Message(Topic('onStartupFileChanges',
                                     setting['key']),
                               listOfChanges=[{
                                   'DirsDeleted': folder
                               }])
             log(msg=_('Watchdog Startup folder not found: %s') % folder)
             self.publish(message)
Beispiel #3
0
 def testBuiltin(self):
     start_debug = is_xbmc_debug()
     self.task = taskdict['builtin']['class']
     taskKwargs = {
         'builtin': 'ToggleDebug',
         'type': 'builtin',
         'notify': False
     }
     userargs = ''
     tm = TaskManager(self.task,
                      1,
                      None,
                      -1,
                      taskid='T1',
                      userargs=userargs,
                      **taskKwargs)
     topic = Topic('onPlayBackStarted')
     runKwargs = events['onPlayBackStarted']['expArgs']
     self.clear_q()
     tm.start(topic, **runKwargs)
     time.sleep(3)
     debug = is_xbmc_debug()
     tm.start(topic, **runKwargs)
     if debug == start_debug:
         raise AssertionError(_('Builtin test failed'))
 def testDailyAlarm(self):
     from time import strftime
     self.topics = [Topic('onDailyAlarm', 'E1')]
     hour, minute = strftime('%H:%M').split(':')
     xsettings = [{
         'hour': int(hour),
         'minute': int(minute) + 1,
         'key': 'E1'
     }]
     settings = Settings()
     flexmock(settings, getEventsByType=xsettings)
     self.publisher = SchedulePublisher(self.dispatcher, settings)
     self.publisher.intervalAlarms = []
     self.publisher.sleep = time.sleep
     self.publisher.sleepinterval = 1
     self.subscriber.addTopic(self.topics[0])
     self.dispatcher.addSubscriber(self.subscriber)
     self.dispatcher.start()
     self.publisher.start()
     self.subscriber.waitForMessage(count=1, timeout=65)
     self.publisher.abort()
     self.dispatcher.abort()
     messages = self.subscriber.retrieveMessages()
     msgtopics = [msg.topic for msg in messages]
     time.sleep(1)
     for topic in self.topics:
         assert topic in msgtopics
 def testScriptShell(self):
     self.task = taskdict['script']['class']
     if sys.platform.startswith('win'):
         testfile = 'tstScript.bat'
     else:
         testfile = 'tstScript.sh'
     taskKwargs = {'scriptfile':'"%s"' % os.path.join(testdir, testfile),
                   'use_shell':True, 'type':'script', 'waitForCompletion': True, 'notify':False}
     userargs = 'abc def:ghi'
     self.task.validate(taskKwargs)
     tm = TaskManager(self.task, 1, None, -1, taskid='T1', userargs=userargs, **taskKwargs)
     tm.returnHandler = self.returnHandler
     topic = Topic('onPlaybackStarted')
     runKwargs = events['onPlayBackStarted']['expArgs']
     self.clear_q()
     tm.start(topic, **runKwargs)
     try:
         tr = self.q.get(timeout=2)
     except Queue.Empty:
         raise AssertionError(_('Timed out waiting for return'))
     else:
         if tr.iserror is True:
             log(loglevel=xbmc.LOGERROR, msg=_('testScriptShell returned with an error: %s') % tr.msg)
             raise AssertionError(_('Script with shell test failed'))
         else:
             retArgs = re.findall(r'Process returned data: \[(.+)\]', tr.msg)[0]
             if retArgs != userargs:
                 raise AssertionError(_('Script with shell test failed'))
 def testPythonExternal(self):
     self.task = taskdict['python']['class']
     taskKwargs = {'pythonfile':os.path.join(testdir, 'tstPythonGlobal.py'),
                   'import':True, 'type':'python', 'notify':False}
     userargs = 'jkl mno:pqr'
     tm = TaskManager(self.task, 1, None, -1, taskid='T1', userargs=userargs, **taskKwargs)
     tm.returnHandler = self.returnHandler
     topic = Topic('onPlaybackStarted')
     runKwargs = events['onPlayBackStarted']['expArgs']
     self.clear_q()
     tm.start(topic, **runKwargs)
     try:
         tr = self.q.get(timeout=1)
     except Queue.Empty:
         raise AssertionError(_('Timed out waiting for return'))
     if tr.iserror is True:
         log(loglevel=xbmc.LOGERROR, msg=_('testPythonExternal returned with an error: %s') % tr.msg)
     if isAndroid:
         raise AssertionError(_('Cannot fully test pythonExternal on Android'))
     try:
         retArgs = sys.modules['__builtin__'].__dict__['testReturn']
     except KeyError:
         retArgs = sys.modules['builtins'].__dict__['testReturn']
     finally:
         try:
             sys.modules['__builtin__'].__dict__.pop('testReturn', None)
         except KeyError:
             sys.modules['builtins'].__dict__.pop('testReturn', None)
     if ' '.join(retArgs[0]) != userargs:
         raise AssertionError(_('Python external test failed'))
 def onNotification(self, sender, method, data):
     for criterion in self.jsoncriteria:
         if criterion['sender'] == sender and criterion[
                 'method'] == method and criterion['data'] == data:
             topic = Topic('onNotification', criterion['eventId'])
             kwargs = {'sender': sender, 'method': method, 'data': data}
             self.publish(Message(topic, **kwargs))
Beispiel #8
0
 def onPlayBackStarted(self):
     self.getInfo()
     try:
         self.totalTime = self.getTotalTime()
     except RuntimeError:
         self.totalTime = -1
     topic = Topic('onPlayBackStarted')
     self.publish(Message(topic, **self.info))
Beispiel #9
0
    def run(self):
        lastwindowid = xbmcgui.getCurrentWindowId()
        lastprofile = getProfileString()
        laststereomode = getStereoscopicMode()
        interval = self.interval
        firstloop = True
        starttime = time.time()
        while not self.abort_evt.is_set():

            self._checkIdle()

            newprofile = getProfileString()
            if newprofile != lastprofile:
                self.publish(
                    Message(Topic('onProfileChange'), profilePath=newprofile))
                lastprofile = newprofile

            newstereomode = getStereoscopicMode()
            if newstereomode != laststereomode:
                self.publish(
                    Message(Topic('onStereoModeChange'),
                            stereoMode=newstereomode))
                laststereomode = newstereomode

            newwindowid = xbmcgui.getCurrentWindowId()
            if newwindowid != lastwindowid:
                if lastwindowid in self.closewindowsids.keys():
                    self.publish(
                        Message(
                            Topic('onWindowClose',
                                  self.closewindowsids[lastwindowid])))
                if newwindowid in self.openwindowids:
                    self.publish(
                        Message(
                            Topic('onWindowOpen',
                                  self.openwindowids[newwindowid])))
                lastwindowid = newwindowid

            if firstloop:
                endtime = time.time()
                interval = int(interval - (endtime - starttime) * 1000)
                interval = max(5, interval)
                firstloop = False
            xbmc.sleep(interval)
        del self.player
 def __init__(self, match, nomatch, subtopic, publish):
     super(LogCheckSimple, self).__init__(name='LogCheckSimple')
     self.match = match
     self.nomatch = nomatch
     self.publish = publish
     self.queue = Queue()
     self._abort_evt = threading.Event()
     self._abort_evt.clear()
     self.topic = Topic('onLogSimple', subtopic)
 def testLoopIdle(self):
     self.topics = [Topic('onIdle', 'E1'), Topic('onIdle', 'E2')]
     for topic in self.topics:
         self.subscriber.addTopic(topic)
     self.dispatcher.addSubscriber(self.subscriber)
     idleSettings = {'E1': 3, 'E2': 5}
     settings = Settings()
     flexmock(settings, getIdleTimes=idleSettings)
     flexmock(settings, general={'LoopFreq': 100})
     self.publisher = LoopPublisher(self.dispatcher, settings)
     self.dispatcher.start()
     self.publisher.start()
     time.sleep(7)
     self.publisher.abort()
     self.dispatcher.abort()
     messages = self.subscriber.retrieveMessages()
     msgtopics = [msg.topic for msg in messages]
     for topic in self.topics:
         assert topic in msgtopics
 def onAVStarted(self):
     self.getInfo()
     try:
         self.totalTime = self.getTotalTime()
     except RuntimeError:
         self.totalTime = -1
     finally:
         if self.totalTime == 0:
             self.totalTime = -1
     topic = Topic('onAVStarted')
     self.publish(Message(topic, **self.info))
Beispiel #13
0
 def onPlayBackEnded(self):
     topic = Topic('onPlayBackEnded')
     try:
         tt = self.totalTime
         tp = self.playingTime
         pp = int(100 * tp / tt)
     except RuntimeError:
         pp = -1
     self.publish(Message(topic, percentPlayed=str(pp), **self.info))
     self.totalTime = -1.0
     self.playingTime = 0.0
     self.info = {}
 def testScriptNoShell(self):
     self.task = taskdict['script']['class']
     outfile = os.path.join(testdir, 'scriptoutput.txt')
     try:
         os.remove(outfile)
     except OSError:
         pass
     if sys.platform.startswith('win'):
         testfile = 'tstScript.bat'
     else:
         testfile = 'tstScript.sh'
     taskKwargs = {
         'scriptfile': '"%s"' % os.path.join(testdir, testfile),
         'use_shell': False,
         'type': 'script',
         'waitForCompletion': True,
         'notify': False
     }
     self.task.validate(taskKwargs)
     userargs = 'abc def:ghi'
     tm = TaskManager(self.task,
                      1,
                      None,
                      -1,
                      taskid='T1',
                      userargs=userargs,
                      **taskKwargs)
     tm.returnHandler = self.returnHandler
     topic = Topic('onPlaybackStarted')
     runKwargs = events['onPlayBackStarted']['expArgs']
     tm.start(topic, **runKwargs)
     try:
         tr = self.q.get(timeout=2)
     except Queue.Empty:
         raise AssertionError(_('Timed out waiting for return'))
     else:
         if tr.iserror is True:
             log(loglevel=xbmc.LOGERROR,
                 msg=_('testScriptNoShell returned with an error: %s') %
                 tr.msg)
         try:
             with open(outfile, 'r') as f:
                 retArgs = f.readline()
         except OSError:
             retArgs = ''
         try:
             os.remove(outfile)
         except OSError:
             pass
         if retArgs.strip('\n') != userargs:
             raise AssertionError(_('Script without shell test failed'))
Beispiel #15
0
 def initialize(self):
     for setting in self.watchdogSettings:
         patterns = setting['patterns'].split(',')
         ignore_patterns = setting['ignore_patterns'].split(',')
         eh = EventHandler(patterns=patterns,
                           ignore_patterns=ignore_patterns,
                           ignore_directories=setting['ignore_directories'],
                           topic=Topic('onFileSystemChange',
                                       setting['key']),
                           publish=self.publish)
         self.event_handlers.append(eh)
         folder = translatepath(setting['folder'])
         mysetting = [eh, folder, setting['recursive']]
         self.observersettings.append(mysetting)
 def testStereoModeChange(self):
     self.topics = [Topic('onStereoModeChange')]
     self.subscriber.addTopic(self.topics[0])
     self.dispatcher.addSubscriber(self.subscriber)
     settings = Settings()
     flexmock(settings, general={'LoopFreq': 100})
     self.publisher = LoopPublisher(self.dispatcher, settings)
     self.dispatcher.start()
     self.publisher.start()
     self.subscriber.waitForMessage(count=1, timeout=5)
     self.publisher.abort()
     self.dispatcher.abort()
     messages = self.subscriber.retrieveMessages()
     msgtopics = [msg.topic for msg in messages]
     for topic in self.topics:
         assert topic in msgtopics
 def testProfileChange(self):
     self.topics = [Topic('onProfileChange')]
     self.subscriber.addTopic(self.topics[0])
     self.dispatcher.addSubscriber(self.subscriber)
     settings = Settings()
     flexmock(settings, general={'LoopFreq': 100})
     self.publisher = LoopPublisher(self.dispatcher, settings)
     self.dispatcher.start()
     self.publisher.start()
     time.sleep(5)
     self.publisher.abort()
     self.dispatcher.abort()
     messages = self.subscriber.retrieveMessages()
     msgtopics = [msg.topic for msg in messages]
     for topic in self.topics:
         assert topic in msgtopics
 def onPlayBackStarted(self):
     self.playingFile = self.getPlayingFileX()
     try:
         self.totalTime = self.getTotalTime()
     except Exception:
         self.totalTime = -1
     self.playingType = self.playing_type()
     self.playingTitle = self.getTitle()
     topic = Topic('onPlayBackStarted')
     kwargs = {
         'mediaType': self.playingType,
         'fileName': self.playingFile,
         'title': self.playingTitle,
         'aspectRatio': self.getAspectRatio(),
         'resolution': self.getResoluion()
     }
     self.publish(Message(topic, **kwargs))
 def testOnWindowOpen(self):
     self.topics = [Topic('onWindowOpen', 'E1')]
     self.subscriber.addTopic(self.topics[0])
     self.dispatcher.addSubscriber(self.subscriber)
     settings = Settings()
     flexmock(settings, general={'LoopFreq': 100})
     flexmock(settings, getOpenwindowids={10001: 'E1'})
     self.publisher = LoopPublisher(self.dispatcher, settings)
     self.dispatcher.start()
     self.publisher.start()
     self.subscriber.waitForMessage(count=1, timeout=5)
     self.publisher.abort()
     self.dispatcher.abort()
     messages = self.subscriber.retrieveMessages()
     msgtopics = [msg.topic for msg in messages]
     for topic in self.topics:
         assert topic in msgtopics
 def testOnWindowClose(self):
     self.topics = [Topic('onWindowClose', 'E1')]
     self.subscriber.addTopic(self.topics[0])
     self.dispatcher.addSubscriber(self.subscriber)
     settings = Settings()
     flexmock(settings, general={'LoopFreq': 100})
     flexmock(settings, getClosewindowids={10001: 'E1'})
     self.publisher = LoopPublisher(self.dispatcher, settings)
     self.dispatcher.start()
     self.publisher.start()
     time.sleep(5)
     self.publisher.abort()
     self.dispatcher.abort()
     messages = self.subscriber.retrieveMessages()
     msgtopics = [msg.topic for msg in messages]
     for topic in self.topics:
         assert topic in msgtopics
 def __init__(self, match, nomatch, subtopic, publish):
     super(LogCheckRegex, self).__init__(name='LogCheckRegex')
     try:
         re_match = re.compile(match, flags=re.IGNORECASE)
     except re.error:
         raise
     if nomatch != '':
         try:
             re_nomatch = re.compile(nomatch, flags=re.IGNORECASE)
         except re.error:
             raise
     else:
         re_nomatch = None
     self.match = re_match
     self.nomatch = re_nomatch
     self.publish = publish
     self.queue = Queue()
     self._abort_evt = threading.Event()
     self._abort_evt.clear()
     self.topic = Topic('onLogRegex', subtopic)
 def setup(self):
     self.folder = translatepath('special://addon/resources/lib/tests')
     watchdogStartupSettings = [{
         'ws_folder': self.folder,
         'ws_patterns': '*',
         'ws_ignore_patterns': '',
         'ws_ignore_directories': True,
         'ws_recursive': False,
         'key': 'E1'
     }]
     self.saveduserpickle = WatchdogStartup.getPickle()
     self.dispatcher = Dispatcher()
     self.subscriber = testSubscriber()
     self.topic = Topic('onStartupFileChanges', 'E1')
     self.subscriber.addTopic(self.topic)
     self.dispatcher.addSubscriber(self.subscriber)
     settings = Settings()
     flexmock(settings, getWatchdogStartupSettings=watchdogStartupSettings)
     self.publisher = WatchdogStartup(self.dispatcher, settings)
     self.dispatcher.start()
 def setup(self):
     self.folder = translatepath('special://addon/resources/lib/tests')
     setPathRW(self.folder)
     watchdogSettings = [{
         'folder': self.folder,
         'patterns': '*',
         'ignore_patterns': '',
         'ignore_directories': True,
         'recursive': False,
         'key': 'E1'
     }]
     self.dispatcher = Dispatcher()
     self.subscriber = testSubscriber()
     self.topic = Topic('onFileSystemChange', 'E1')
     self.subscriber.addTopic(self.topic)
     self.dispatcher.addSubscriber(self.subscriber)
     settings = Settings()
     flexmock(settings, getWatchdogSettings=watchdogSettings)
     self.publisher = WatchdogPublisher(self.dispatcher, settings)
     self.dispatcher.start()
 def onPlayBackEnded(self):
     topic = Topic('onPlayBackEnded')
     try:
         tt = self.totalTime
         tp = self.playingTime
         pp = int(100 * tp / tt)
     except Exception:
         pp = -1
     kwargs = {
         'mediaType': self.playingType,
         'fileName': self.playingFile,
         'title': self.playingTitle,
         'percentPlayed': str(pp)
     }
     self.publish(Message(topic, **kwargs))
     self.playingTitle = ''
     self.playingFile = ''
     self.playingType = ''
     self.totalTime = -1.0
     self.playingTime = 0.0
Beispiel #25
0
 def testHttp(self):
     serverEnabled, serverPort, serverUser, serverPassword = getWebserverInfo(
     )
     if serverEnabled:
         self.task = taskdict['http']['class']
         taskKwargs = {
             'http': 'http://localhost:%s/jsonrpc' % str(serverPort),
             'user': serverUser,
             'pass': serverPassword,
             'type': 'http',
             'request-type': 'GET',
             'notify': False
         }
         userargs = '?request={"jsonrpc":%__"2.0"%_%__"id": 1%_%__"method":"Application.Setmute"%_%__"params":{"mute":"toggle"}}'
         tm = TaskManager(self.task,
                          1,
                          None,
                          -1,
                          taskid='T1',
                          userargs=userargs,
                          **taskKwargs)
         tm.returnHandler = self.returnHandler
         topic = Topic('onPlaybackStarted')
         runKwargs = events['onPlayBackStarted']['expArgs']
         self.clear_q()
         tm.start(topic, **runKwargs)
         try:
             tr = self.q.get(timeout=1)
         except Queue.Empty:
             raise Queue.Empty(_('testHttp never returned'))
         else:
             tm.start(topic, **runKwargs)  # Toggle Mute again
         if tr.iserror is True:
             log(loglevel=xbmc.LOGERROR,
                 msg=_('testHttp returned with an error: %s') % tr.msg)
         if '{"id":1,"jsonrpc":"2.0","result":' not in tr.msg:
             raise AssertionError(_('Http test failed'))
     else:
         raise AssertionError(
             'Http test cannot be run because webserver not enabled')
 def testIntervalAlarm(self):
     self.topics = [Topic('onIntervalAlarm', 'E1')]
     xsettings = [{'hours': 0, 'minutes': 0, 'seconds': 10, 'key': 'E1'}]
     settings = Settings()
     self.dispatcher = Dispatcher()
     self.subscriber = MockSubscriber()
     flexmock(settings, getEventsByType=xsettings)
     self.publisher = SchedulePublisher(self.dispatcher, settings)
     self.publisher.dailyAlarms = []
     self.publisher.sleep = time.sleep
     self.publisher.sleepinterval = 1
     self.subscriber.testq = Queue.Queue()
     self.subscriber.addTopic(self.topics[0])
     self.dispatcher.addSubscriber(self.subscriber)
     self.dispatcher.start()
     self.publisher.start()
     self.subscriber.waitForMessage(count=1, timeout=20)
     self.publisher.abort()
     self.dispatcher.abort()
     messages = self.subscriber.retrieveMessages()
     msgtopics = [msg.topic for msg in messages]
     for topic in self.topics:
         assert topic in msgtopics
 def testLogRegex(self):
     self.topics = [Topic('onLogRegex', 'E1')]
     xsettings = [{
         'matchIf': 'kodi_callbacks',
         'rejectIf': '',
         'eventId': 'E1'
     }]
     settings = Settings()
     flexmock(settings, getLogRegexes=xsettings)
     flexmock(settings, general={'LogFreq': 100})
     self.publisher = LogPublisher(self.dispatcher, settings)
     try:
         os.remove(testLog.fn)
     except OSError:
         pass
     finally:
         with open(testLog.fn, 'w') as f:
             f.writelines('')
     self.subscriber.addTopic(self.topics[0])
     self.dispatcher.addSubscriber(self.subscriber)
     self.dispatcher.start()
     self.publisher.start()
     t = threading.Thread(target=testLog.logSimulate)
     t.start()
     t.join()
     self.publisher.abort()
     self.dispatcher.abort()
     time.sleep(2)
     try:
         os.remove(testLog.fn)
     except OSError:
         pass
     messages = self.subscriber.retrieveMessages()
     msgtopics = [msg.topic for msg in messages]
     for topic in self.topics:
         assert topic in msgtopics
Beispiel #28
0
 def prePublishDailyAlarm(self, key):
     meseage = Message(Topic('onDailyAlarm', key))
     self.publish(meseage)
Beispiel #29
0
 def prePublishIntervalAlarm(self, key):
     meseage = Message(Topic('onIntervalAlarm', key))
     self.publish(meseage)
 def onScanFinished(self, library):
     topic = Topic('onScanFinished')
     kwargs = {'library': library}
     self.publish(Message(topic, **kwargs))