Beispiel #1
0
class MythDatabaseTest(unittest.TestCase):
    def setUp(self):
        self.platform = Platform()

        #self.translator = Mock()
        self.langInfo = util_mock.XBMCLangInfo(self.platform)
        self.translator = util_mock.Translator(self.platform, self.langInfo)

        self.bus = Mock()
        self.domainCache = Mock()
        self.settings = MythSettings(self.platform, self.translator)

        privateConfig = OnDemandConfig()
        self.settings.put('mysql_host', privateConfig.get('mysql_host'))
        self.settings.put('mysql_database',
                          privateConfig.get('mysql_database'))
        self.settings.put('mysql_password',
                          privateConfig.get('mysql_password'))

        self.db = MythDatabase(self.settings, self.translator,
                               self.domainCache)
        self.conn = Connection(self.settings, self.translator, self.platform,
                               self.bus, self.db)

    def tearDown(self):
        #self.db.close()
        self.conn.close()

    def test_saveSchedule_NewSchedule(self):
        now = datetime.datetime.now()
        programs = self.db.getTVGuideDataFlattened(now, now,
                                                   self.db.getChannels())
        if len(programs) == 0:
            log.warn(
                'Cannot run unit tests without program listings in the database'
            )
            return

        schedule = RecordingSchedule.fromProgram(programs[0], self.translator)
        log.debug('Test schedule = %s' % schedule)
        result = self.db.saveSchedule(schedule)
        log.debug('Save schedule result = %s' % result)

    def test_addJob_UserJob1(self):
        recordings = self.conn.getAllRecordings()
        if not recordings:
            log.warn(
                'Cannot run unit tests without program listings in the database'
            )
            return

        job = Job.fromProgram(recordings[-1],
                              JobType.USERJOB & JobType.USERJOB1)
        log.debug(job)

        self.assertIsNone(job.id)
        self.db.addJob(job)
        log.debug(job)
        self.assertIsNotNone(job.id)
Beispiel #2
0
class MythDatabaseTest(unittest.TestCase):
    def setUp(self):
        self.platform = Platform()

        # self.translator = Mock()
        self.langInfo = util_mock.XBMCLangInfo(self.platform)
        self.translator = util_mock.Translator(self.platform, self.langInfo)

        self.bus = Mock()
        self.domainCache = Mock()
        self.settings = MythSettings(self.platform, self.translator)

        privateConfig = OnDemandConfig()
        self.settings.put("mysql_host", privateConfig.get("mysql_host"))
        self.settings.put("mysql_database", privateConfig.get("mysql_database"))
        self.settings.put("mysql_password", privateConfig.get("mysql_password"))

        self.db = MythDatabase(self.settings, self.translator, self.domainCache)
        self.conn = Connection(self.settings, self.translator, self.platform, self.bus, self.db)

    def tearDown(self):
        # self.db.close()
        self.conn.close()

    def test_saveSchedule_NewSchedule(self):
        now = datetime.datetime.now()
        programs = self.db.getTVGuideDataFlattened(now, now, self.db.getChannels())
        if len(programs) == 0:
            log.warn("Cannot run unit tests without program listings in the database")
            return

        schedule = RecordingSchedule.fromProgram(programs[0], self.translator)
        log.debug("Test schedule = %s" % schedule)
        result = self.db.saveSchedule(schedule)
        log.debug("Save schedule result = %s" % result)

    def test_addJob_UserJob1(self):
        recordings = self.conn.getAllRecordings()
        if not recordings:
            log.warn("Cannot run unit tests without program listings in the database")
            return

        job = Job.fromProgram(recordings[-1], JobType.USERJOB & JobType.USERJOB1)
        log.debug(job)

        self.assertIsNone(job.id)
        self.db.addJob(job)
        log.debug(job)
        self.assertIsNotNone(job.id)
Beispiel #3
0
class LiveTVBrainTest(unittest.TestCase):

    def setUp(self):
        translator = mockito.Mock()
        platform = mockito.Mock()
        bus = mockito.Mock()
        settings = MythSettings(platform, translator)
        privateConfig = OnDemandConfig()
        settings.put('mysql_host', privateConfig.get('mysql_host'))
        settings.put('mysql_password', privateConfig.get('mysql_password'))
        settings.put('mysql_database', privateConfig.get('mysql_database'))
        self.db = MythDatabase(settings, translator)
        self.conn = Connection(settings, translator, platform, bus, self.db)
        self.brain = FileLiveTvBrain(self.conn, self.db)
    
    def tearDown(self):
        self.conn.close()
        
    def test_watchLiveTV(self):
        
#        tuners = self.conn.getTuners()
#        for t in tuners:
#            if t.tunerId == 5 and t.isRecording():
#                t.stopLiveTV()
        
        channel = self.db.getChannels()[1]
        log.debug('Attempting to watch %s' % channel)
        tuner = self.brain.watchLiveTV(channel)
        log.debug("Assuming we're watching some tv...")
        
        for x in range(20):
            time.sleep(1)
            log.debug(self.brain.getLiveTVStatus())
            
        log.debug('Stopping live tv...')
        self.brain.onPlayBackStopped()
        log.debug('all done')
        
    def xxxtest_stopAllTuners(self):
        tuners = self.conn.getTuners()
        for t in tuners:
            if t.tunerId == 5:
                t.stopLiveTV()
Beispiel #4
0
class LiveTVBrainTest(unittest.TestCase):
    def setUp(self):
        translator = mockito.Mock()
        platform = mockito.Mock()
        bus = mockito.Mock()
        settings = MythSettings(platform, translator)
        privateConfig = OnDemandConfig()
        settings.put('mysql_host', privateConfig.get('mysql_host'))
        settings.put('mysql_password', privateConfig.get('mysql_password'))
        settings.put('mysql_database', privateConfig.get('mysql_database'))
        self.db = MythDatabase(settings, translator)
        self.conn = Connection(settings, translator, platform, bus, self.db)
        self.brain = FileLiveTvBrain(self.conn, self.db)

    def tearDown(self):
        self.conn.close()

    def test_watchLiveTV(self):

        #        tuners = self.conn.getTuners()
        #        for t in tuners:
        #            if t.tunerId == 5 and t.isRecording():
        #                t.stopLiveTV()

        channel = self.db.getChannels()[1]
        log.debug('Attempting to watch %s' % channel)
        tuner = self.brain.watchLiveTV(channel)
        log.debug("Assuming we're watching some tv...")

        for x in range(20):
            time.sleep(1)
            log.debug(self.brain.getLiveTVStatus())

        log.debug('Stopping live tv...')
        self.brain.onPlayBackStopped()
        log.debug('all done')

    def xxxtest_stopAllTuners(self):
        tuners = self.conn.getTuners()
        for t in tuners:
            if t.tunerId == 5:
                t.stopLiveTV()
Beispiel #5
0
class MythDatabaseTest(unittest.TestCase):

    def setUp(self):
        self.platform = Platform()
        self.langInfo = util_mock.XBMCLangInfo(self.platform)
        self.translator = util_mock.Translator(self.platform, self.langInfo)
        self.settings = MythSettings(self.platform, self.translator)
        self.protocol = protocol.Protocol56()
        privateConfig = OnDemandConfig()
        self.settings.put('mysql_host', privateConfig.get('mysql_host'))
        self.settings.put('mysql_port', privateConfig.get('mysql_port'))
        self.settings.put('mysql_database', privateConfig.get('mysql_database'))
        self.settings.put('mysql_user', privateConfig.get('mysql_user'))  
        self.settings.put('mysql_password', privateConfig.get('mysql_password'))
        self.domainCache = Mock()
        self.db = MythDatabase(self.settings, self.translator, self.domainCache)

    def tearDown(self):
        try:
            self.db.close()
        except:
            pass
        
    def test_constructor(self):
        self.assertTrue(self.db)

    def test_toBackend(self):
        master = self.db.getMasterBackend()
        self.assertEqual(master, self.db.toBackend(master.hostname))
        self.assertEqual(master, self.db.toBackend(master.ipAddress))
        self.assertTrue(master,   self.db.toBackend('bogus'))
        self.assertEqual(master, self.db.toBackend(master.hostname.upper()))
        self.assertEqual(master, self.db.toBackend(master.hostname.lower()))
        
    def test_getBackends(self):
        bes = self.db.getBackends()
        self.assertTrue(len(bes) >= 1)
        
    def test_getMasterBackend(self):
        mbe = self.db.getMasterBackend()
        log.debug(mbe)        
        self.assertTrue(mbe.hostname)
        self.assertTrue(mbe.ipAddress)
        self.assertTrue(mbe.port)
        self.assertTrue(mbe.master)
        self.assertFalse(mbe.slave)
    
    def test_getSlaveBackends(self):
        slaves = self.db.getSlaveBackends()
        for slave in slaves:
            log.debug(slave)
            self.assertFalse(slave.master)
            self.assertTrue(slave.slave)
        
    def test_getChannels(self):
        channels = self.db.getChannels()
        for i, channel in enumerate(channels):
            log.debug("%d - %s"%(i+1, channel))
            self.assertTrue('Expected int but was %s' % type(channel.getChannelId()), isinstance(channel.getChannelId(), int))
            self.assertTrue('Expected str but was %s' % type(channel.getChannelNumber()), isinstance(channel.getChannelNumber(), str))
            self.assertTrue('Expected str but was %s' % type(channel.getCallSign()), isinstance(channel.getCallSign(), str))
            self.assertTrue('Expected str but was %s' % type(channel.getChannelName()), isinstance(channel.getChannelName(), str))
            self.assertTrue('Expected str but was %s' % type(channel.getIconPath()), isinstance(channel.getIconPath(), str))
            self.assertTrue('Expected int but was %s' % type(channel.getTunerId()), isinstance(channel.getTunerId(), int))

    def test_getRecordingProfileNames(self):
        self.assertTrue(self.db.getRecordingProfileNames())
                
    def test_getRecordingGroups(self):
        groups = self.db.getRecordingGroups()
        self.assertTrue('Default' in groups)

    def test_getRecordingTitles_InAllGroups(self):
        titles = self.db.getRecordingTitles('All Groups')
        self.assertTrue(len(titles) > 0)
        total = titles[0][1]
        for i, title in enumerate(titles):
            titleName = title[0]
            titleCount = title[1]
            log.debug('%d - %s x %s' %(i+1, titleCount, titleName))

    def test_getRecordingTitles_ForNonExistantRecordingGroupReturnsAllShowsWithCountOfZero(self):
        titles = self.db.getRecordingTitles('bogus group')
        self.assertEquals(1, len(titles))
        self.assertEquals('All Shows', titles[0][0])
        self.assertEquals(0, titles[0][1])

    def test_getRecordingTitles_ForDeletedRecordingsGroup(self):
        deleted = self.db.getRecordingTitles('Deleted')
        for i, title in enumerate(deleted):
            titleName = title[0]
            titleCount = title[1]
            log.debug('%d - Deleted recording %s recorded %s times' % (i+1, titleName, titleCount))
        self.assertTrue(len(deleted) > 0)

    def test_getTuners(self):
        tuners = self.db.getTuners()
        self.assertTrue(len(tuners) > 0, 'No tuners found')
        for i, tuner in enumerate(tuners):
            log.debug('%d - %s' %(i+1, tuner))
            self.assertIsNotNone(tuner.tunerId)
            self.assertIsNotNone(tuner.hostname)
            self.assertIsNotNone(tuner.signalTimeout)
            self.assertIsNotNone(tuner.channelTimeout)
            self.assertIsNotNone(tuner.domainCache)
            
    def test_getMythSetting_KeyOnly_Found(self):
        s = self.db.getMythSetting('mythfilldatabaseLastRunStatus')
        log.debug('mythfillstatus = %s' % s)
        self.assertFalse(s is None)

    def test_getMythSetting_KeyOnly_NotFound(self):
        s = self.db.getMythSetting('blahblah')
        self.assertTrue(s is None)

    def test_getMythSetting_KeyWithHostname_Found(self):
        # TODO
        pass

    def test_getMythSetting_KeyWithHostname_NotFound(self):
        s = self.db.getMythSetting('blahblah', 'foobar')
        self.assertTrue(s is None)
    
    def test_getRecordingSchedules_All(self):
        schedules = self.db.getRecordingSchedules()
        for i, s in enumerate(schedules):
            log.debug('%d - %s' % (i+1, s))
        self.assertTrue(schedules)
        
    def test_getRecordingSchedules_By_Channel(self):
        # TODO
        pass
    
    def test_getRecordingSchedules_By_ScheduleId(self):
        # Setup
        schedules = self.db.getRecordingSchedules()
        if len(schedules) == 0:
            self.fail('Need schedules to run test')
        expectedSchedule = schedules.pop()
        
        # Test
        actualSchedules = self.db.getRecordingSchedules(scheduleId=expectedSchedule.getScheduleId())
        
        # Verify
        self.assertEquals(1, len(actualSchedules))
        self.assertEquals(expectedSchedule.getScheduleId(), actualSchedules.pop().getScheduleId())

    def test_getJobs_All(self):
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        self.assertTrue(jobs is not None)
        for index, job in enumerate(jobs):
            log.debug('job %d = %s' % (index, job))
            
    def test_getJobs_ForProgram(self):
        # Setup
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        if len(jobs) == 0:
            log.warn('No jobs in database to test with. Test skipped...')
            return 
        job = jobs[-1]  # last job
        data = [''] * self.protocol.recordSize()
        data[4]  = job.channelId
        data[11] = time.mktime(job.startTime.timetuple()) 
        program = RecordedProgram(data=data, settings=Mock(), translator=Mock(), platform=Mock(), protocol=self.protocol, conn=Mock())
    
        # Test
        jobs = self.db.getJobs(program=program)
    
        # Verify
        self.assertTrue(len(jobs) > 0)
        for index, actual in enumerate(jobs):
            log.debug('job %d = %s' % (index, actual))
            self.assertEquals(job.channelId, actual.channelId)
            self.assertEquals(job.startTime, actual.startTime)

    def test_getJobs_ByJobType(self):
        # Setup
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        if len(jobs) == 0:
            log.warn('No jobs in database to test with. Test skipped...')
            return
        job = jobs[0]
    
        # Test
        jobs = self.db.getJobs(jobType=job.jobType)
    
        # Verify
        self.assertTrue(len(jobs) > 0)
        for index, j2 in enumerate(jobs):
            log.debug('job %d = %s' % (index, j2))
            self.assertEquals(job.jobType, j2.jobType)
        
    def test_getJobs_ForProgram_ByJobType(self):
        # Setup
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        if len(jobs) == 0:
            log.warn('No jobs in database to test with. Test skipped...')
            return 
        job = jobs[-1] # last job
        data = [''] * self.protocol.recordSize()
        data[4]  = job.channelId
        data[11] = time.mktime(job.startTime.timetuple()) 
        program = RecordedProgram(data=data, settings=Mock(), translator=Mock(), platform=Mock(), protocol=self.protocol, conn=Mock())
    
        # Test
        jobs = self.db.getJobs(program=program, jobType=job.jobType)
    
        # Verify
        self.assertTrue(len(jobs) > 0)
        for index, actual in enumerate(jobs):
            log.debug('job %d = %s' % (index, actual))
            self.assertEquals(job.channelId, actual.channelId)
            self.assertEquals(job.startTime, actual.startTime)
            self.assertEquals(job.jobType, actual.jobType)
            
    def test_getUserJobs(self):
        userJobs = self.db.getUserJobs()
        for j in userJobs:
            log.debug(j)
        self.assertEqual(4, len(userJobs))

    def test_getTVGuideDataFlattened(self):
        # TODO: Convert to mocks w/ assertions
        channels = self.db.getChannels()[:2]
        programs = self.db.getTVGuideDataFlattened(
            datetime.datetime.now(), 
            datetime.datetime.now() + datetime.timedelta(hours=4), 
            channels)
        
        for p in programs:
            log.debug(p)
            
    def test_getFramerate(self):
        from mythbox.mythtv.conn import Connection
        from mythbox.util import safe_str
        from mythbox.mythtv.enums import RecordingStatus
        
        conn = Connection(settings=self.settings, translator=Mock(), platform=Mock(), bus=Mock(), db=self.db)
        try:
            recordings = conn.getAllRecordings()[-10:]
            for r in recordings:
                if r.isCommFlagged() and r.getRecordingStatus() == RecordingStatus.RECORDED:
                    fps  = self.db.getFramerate(r)
                    log.debug('%s - %s - %s %d' % (safe_str(r.title()), safe_str(r.subtitle()), fps, r.getRecordingStatus()))
                    self.assertGreaterEqual(fps, 0.0, fps)
        finally:
            conn.close()
            
Beispiel #6
0
class MythChannelIconResolverTest(unittest.TestCase):

    def setUp(self):
        self.platform = getPlatform()
        self.translator = Mock()
        self.domainCache = Mock()
        self.settings = MythSettings(self.platform, self.translator)
        
        privateConfig = OnDemandConfig()
        self.settings.setMySqlHost(privateConfig.get('mysql_host'))
        self.settings.setMySqlPort(privateConfig.get('mysql_port'))
        self.settings.setMySqlDatabase(privateConfig.get('mysql_database'))
        self.settings.setMySqlUser(privateConfig.get('mysql_user'))  
        self.settings.setMySqlPassword(privateConfig.get('mysql_password'))
        
        self.db = MythDatabase(self.settings, self.translator, self.domainCache)
        self.bus = EventBus()
        self.conn = Connection(self.settings, self.translator, self.platform, self.bus, self.db)

    def tearDown(self):
        self.conn.close()

    def test_store_When_channel_has_icon_Then_download_icon(self):
        # Setup
        channels = filter(lambda x: x.getIconPath(), self.db.getChannels()) # filter out channels that don't have an icon
        self.assertTrue(len(channels) > 0, 'Channels with icon needed in db to run test')
        downloader = MythChannelIconResolver(self.conn)
         
        # Test - download icons for first 5 channels
        for channel in channels[:min(5, len(channels))]:
            if channel.getIconPath():
                dest = os.path.sep.join([tempfile.gettempdir(), 'channel_' + str(channel.getChannelId()) + channel.getCallSign() + str(time.time()) + '.png'])
                downloader.store(channel, dest)
        
                # Verify
                log.debug('Downloaded %s to %s' % (channel.getIconPath(), dest))
                self.assertTrue(os.path.exists(dest))
                self.assertTrue(os.path.isfile(dest))
                self.assertTrue(os.path.getsize(dest) > 0)
                
                # Cleanup
                os.remove(dest)        
    
    def test_store_When_channel_has_no_icon_Then_do_nothing(self):
        # Setup
        channel = Channel({'name':'Bogus Channel', 'icon':None, 'chanid': '9', 'callsign': 'WXYZ'})
        conn = Mock()
        downloader = MythChannelIconResolver(conn)
         
        # Test 
        downloader.store(channel, 'bogusDestDir')
    
        # Verify
        verifyZeroInteractions(conn)

    def test_store_When_channel_has_iconpath_but_filename_misspelled_Then_do_nothing(self):
        # Setup
        channel = Channel({'name':'Bogus Channel', 'icon': 'bogusIcon.png', 'chanid': '9', 'callsign': 'WXYZ'})
        downloader = MythChannelIconResolver(self.conn)
         
        # Test - download icons for first 5 channels
        dest = os.path.sep.join([tempfile.gettempdir(), str(channel.getChannelId()) + channel.getCallSign() + str(time.time()) + ".png"])
        downloader.store(channel, dest)

        # Verify
        self.assertFalse(os.path.exists(dest))
Beispiel #7
0
class MythDatabaseTest(unittest.TestCase):
    def setUp(self):
        self.platform = Platform()
        self.langInfo = util_mock.XBMCLangInfo(self.platform)
        self.translator = util_mock.Translator(self.platform, self.langInfo)
        self.settings = MythSettings(self.platform, self.translator)
        self.protocol = protocol.Protocol56()
        privateConfig = OnDemandConfig()
        self.settings.put('mysql_host', privateConfig.get('mysql_host'))
        self.settings.put('mysql_port', privateConfig.get('mysql_port'))
        self.settings.put('mysql_database',
                          privateConfig.get('mysql_database'))
        self.settings.put('mysql_user', privateConfig.get('mysql_user'))
        self.settings.put('mysql_password',
                          privateConfig.get('mysql_password'))
        self.domainCache = Mock()
        self.db = MythDatabase(self.settings, self.translator,
                               self.domainCache)

    def tearDown(self):
        try:
            self.db.close()
        except:
            pass

    def test_constructor(self):
        self.assertTrue(self.db)

    def test_toBackend(self):
        master = self.db.getMasterBackend()
        self.assertEqual(master, self.db.toBackend(master.hostname))
        self.assertEqual(master, self.db.toBackend(master.ipAddress))
        self.assertTrue(master, self.db.toBackend('bogus'))
        self.assertEqual(master, self.db.toBackend(master.hostname.upper()))
        self.assertEqual(master, self.db.toBackend(master.hostname.lower()))

    def test_getBackends(self):
        bes = self.db.getBackends()
        self.assertTrue(len(bes) >= 1)

    def test_getMasterBackend(self):
        mbe = self.db.getMasterBackend()
        log.debug(mbe)
        self.assertTrue(mbe.hostname)
        self.assertTrue(mbe.ipAddress)
        self.assertTrue(mbe.port)
        self.assertTrue(mbe.master)
        self.assertFalse(mbe.slave)

    def test_getSlaveBackends(self):
        slaves = self.db.getSlaveBackends()
        for slave in slaves:
            log.debug(slave)
            self.assertFalse(slave.master)
            self.assertTrue(slave.slave)

    def test_getChannels(self):
        channels = self.db.getChannels()
        for i, channel in enumerate(channels):
            log.debug("%d - %s" % (i + 1, channel))
            self.assertTrue(
                'Expected int but was %s' % type(channel.getChannelId()),
                isinstance(channel.getChannelId(), int))
            self.assertTrue(
                'Expected str but was %s' % type(channel.getChannelNumber()),
                isinstance(channel.getChannelNumber(), str))
            self.assertTrue(
                'Expected str but was %s' % type(channel.getCallSign()),
                isinstance(channel.getCallSign(), str))
            self.assertTrue(
                'Expected str but was %s' % type(channel.getChannelName()),
                isinstance(channel.getChannelName(), str))
            self.assertTrue(
                'Expected str but was %s' % type(channel.getIconPath()),
                isinstance(channel.getIconPath(), str))
            self.assertTrue(
                'Expected int but was %s' % type(channel.getTunerId()),
                isinstance(channel.getTunerId(), int))

    def test_getRecordingProfileNames(self):
        self.assertTrue(self.db.getRecordingProfileNames())

    def test_getRecordingGroups(self):
        groups = self.db.getRecordingGroups()
        self.assertTrue('Default' in groups)

    def test_getRecordingTitles_InAllGroups(self):
        titles = self.db.getRecordingTitles('All Groups')
        self.assertTrue(len(titles) > 0)
        total = titles[0][1]
        for i, title in enumerate(titles):
            titleName = title[0]
            titleCount = title[1]
            log.debug('%d - %s x %s' % (i + 1, titleCount, titleName))

    def test_getRecordingTitles_ForNonExistantRecordingGroupReturnsAllShowsWithCountOfZero(
            self):
        titles = self.db.getRecordingTitles('bogus group')
        self.assertEquals(1, len(titles))
        self.assertEquals('All Shows', titles[0][0])
        self.assertEquals(0, titles[0][1])

    def test_getRecordingTitles_ForDeletedRecordingsGroup(self):
        deleted = self.db.getRecordingTitles('Deleted')
        for i, title in enumerate(deleted):
            titleName = title[0]
            titleCount = title[1]
            log.debug('%d - Deleted recording %s recorded %s times' %
                      (i + 1, titleName, titleCount))
        self.assertTrue(len(deleted) > 0)

    def test_getTuners(self):
        tuners = self.db.getTuners()
        self.assertTrue(len(tuners) > 0, 'No tuners found')
        for i, tuner in enumerate(tuners):
            log.debug('%d - %s' % (i + 1, tuner))
            self.assertIsNotNone(tuner.tunerId)
            self.assertIsNotNone(tuner.hostname)
            self.assertIsNotNone(tuner.signalTimeout)
            self.assertIsNotNone(tuner.channelTimeout)
            self.assertIsNotNone(tuner.domainCache)

    def test_getMythSetting_KeyOnly_Found(self):
        s = self.db.getMythSetting('mythfilldatabaseLastRunStatus')
        log.debug('mythfillstatus = %s' % s)
        self.assertFalse(s is None)

    def test_getMythSetting_KeyOnly_NotFound(self):
        s = self.db.getMythSetting('blahblah')
        self.assertTrue(s is None)

    def test_getMythSetting_KeyWithHostname_Found(self):
        # TODO
        pass

    def test_getMythSetting_KeyWithHostname_NotFound(self):
        s = self.db.getMythSetting('blahblah', 'foobar')
        self.assertTrue(s is None)

    def test_getRecordingSchedules_All(self):
        schedules = self.db.getRecordingSchedules()
        for i, s in enumerate(schedules):
            log.debug('%d - %s' % (i + 1, s))
        self.assertTrue(schedules)

    def test_getRecordingSchedules_By_Channel(self):
        # TODO
        pass

    def test_getRecordingSchedules_By_ScheduleId(self):
        # Setup
        schedules = self.db.getRecordingSchedules()
        if len(schedules) == 0:
            self.fail('Need schedules to run test')
        expectedSchedule = schedules.pop()

        # Test
        actualSchedules = self.db.getRecordingSchedules(
            scheduleId=expectedSchedule.getScheduleId())

        # Verify
        self.assertEquals(1, len(actualSchedules))
        self.assertEquals(expectedSchedule.getScheduleId(),
                          actualSchedules.pop().getScheduleId())

    def test_getJobs_All(self):
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        self.assertTrue(jobs is not None)
        for index, job in enumerate(jobs):
            log.debug('job %d = %s' % (index, job))

    def test_getJobs_ForProgram(self):
        # Setup
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        if len(jobs) == 0:
            log.warn('No jobs in database to test with. Test skipped...')
            return
        job = jobs[-1]  # last job
        data = [''] * self.protocol.recordSize()
        data[4] = job.channelId
        data[11] = time.mktime(job.startTime.timetuple())
        program = RecordedProgram(data=data,
                                  settings=Mock(),
                                  translator=Mock(),
                                  platform=Mock(),
                                  protocol=self.protocol,
                                  conn=Mock())

        # Test
        jobs = self.db.getJobs(program=program)

        # Verify
        self.assertTrue(len(jobs) > 0)
        for index, actual in enumerate(jobs):
            log.debug('job %d = %s' % (index, actual))
            self.assertEquals(job.channelId, actual.channelId)
            self.assertEquals(job.startTime, actual.startTime)

    def test_getJobs_ByJobType(self):
        # Setup
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        if len(jobs) == 0:
            log.warn('No jobs in database to test with. Test skipped...')
            return
        job = jobs[0]

        # Test
        jobs = self.db.getJobs(jobType=job.jobType)

        # Verify
        self.assertTrue(len(jobs) > 0)
        for index, j2 in enumerate(jobs):
            log.debug('job %d = %s' % (index, j2))
            self.assertEquals(job.jobType, j2.jobType)

    def test_getJobs_ForProgram_ByJobType(self):
        # Setup
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        if len(jobs) == 0:
            log.warn('No jobs in database to test with. Test skipped...')
            return
        job = jobs[-1]  # last job
        data = [''] * self.protocol.recordSize()
        data[4] = job.channelId
        data[11] = time.mktime(job.startTime.timetuple())
        program = RecordedProgram(data=data,
                                  settings=Mock(),
                                  translator=Mock(),
                                  platform=Mock(),
                                  protocol=self.protocol,
                                  conn=Mock())

        # Test
        jobs = self.db.getJobs(program=program, jobType=job.jobType)

        # Verify
        self.assertTrue(len(jobs) > 0)
        for index, actual in enumerate(jobs):
            log.debug('job %d = %s' % (index, actual))
            self.assertEquals(job.channelId, actual.channelId)
            self.assertEquals(job.startTime, actual.startTime)
            self.assertEquals(job.jobType, actual.jobType)

    def test_getUserJobs(self):
        userJobs = self.db.getUserJobs()
        for j in userJobs:
            log.debug(j)
        self.assertEqual(4, len(userJobs))

    def test_getTVGuideDataFlattened(self):
        # TODO: Convert to mocks w/ assertions
        channels = self.db.getChannels()[:2]
        programs = self.db.getTVGuideDataFlattened(
            datetime.datetime.now(),
            datetime.datetime.now() + datetime.timedelta(hours=4), channels)

        for p in programs:
            log.debug(p)

    def test_getFramerate(self):
        from mythbox.mythtv.conn import Connection
        from mythbox.util import safe_str
        from mythbox.mythtv.enums import RecordingStatus

        conn = Connection(settings=self.settings,
                          translator=Mock(),
                          platform=Mock(),
                          bus=Mock(),
                          db=self.db)
        try:
            recordings = conn.getAllRecordings()[-10:]
            for r in recordings:
                if r.isCommFlagged() and r.getRecordingStatus(
                ) == RecordingStatus.RECORDED:
                    fps = self.db.getFramerate(r)
                    log.debug('%s - %s - %s %d' %
                              (safe_str(r.title()), safe_str(
                                  r.subtitle()), fps, r.getRecordingStatus()))
                    self.assertGreaterEqual(fps, 0.0, fps)
        finally:
            conn.close()
Beispiel #8
0
class MythChannelIconResolverTest(unittest.TestCase):
    def setUp(self):
        self.platform = getPlatform()
        self.translator = Mock()
        self.domainCache = Mock()
        self.settings = MythSettings(self.platform, self.translator)

        privateConfig = OnDemandConfig()
        self.settings.setMySqlHost(privateConfig.get('mysql_host'))
        self.settings.setMySqlPort(privateConfig.get('mysql_port'))
        self.settings.setMySqlDatabase(privateConfig.get('mysql_database'))
        self.settings.setMySqlUser(privateConfig.get('mysql_user'))
        self.settings.setMySqlPassword(privateConfig.get('mysql_password'))

        self.db = MythDatabase(self.settings, self.translator,
                               self.domainCache)
        self.bus = EventBus()
        self.conn = Connection(self.settings, self.translator, self.platform,
                               self.bus, self.db)

    def tearDown(self):
        self.conn.close()

    def test_store_When_channel_has_icon_Then_download_icon(self):
        # Setup
        channels = filter(lambda x: x.getIconPath(), self.db.getChannels()
                          )  # filter out channels that don't have an icon
        self.assertTrue(
            len(channels) > 0, 'Channels with icon needed in db to run test')
        downloader = MythChannelIconResolver(self.conn)

        # Test - download icons for first 5 channels
        for channel in channels[:min(5, len(channels))]:
            if channel.getIconPath():
                dest = os.path.sep.join([
                    tempfile.gettempdir(),
                    'channel_' + str(channel.getChannelId()) +
                    channel.getCallSign() + str(time.time()) + '.png'
                ])
                downloader.store(channel, dest)

                # Verify
                log.debug('Downloaded %s to %s' %
                          (channel.getIconPath(), dest))
                self.assertTrue(os.path.exists(dest))
                self.assertTrue(os.path.isfile(dest))
                self.assertTrue(os.path.getsize(dest) > 0)

                # Cleanup
                os.remove(dest)

    def test_store_When_channel_has_no_icon_Then_do_nothing(self):
        # Setup
        channel = Channel({
            'name': 'Bogus Channel',
            'icon': None,
            'chanid': '9',
            'callsign': 'WXYZ'
        })
        conn = Mock()
        downloader = MythChannelIconResolver(conn)

        # Test
        downloader.store(channel, 'bogusDestDir')

        # Verify
        verifyZeroInteractions(conn)

    def test_store_When_channel_has_iconpath_but_filename_misspelled_Then_do_nothing(
            self):
        # Setup
        channel = Channel({
            'name': 'Bogus Channel',
            'icon': 'bogusIcon.png',
            'chanid': '9',
            'callsign': 'WXYZ'
        })
        downloader = MythChannelIconResolver(self.conn)

        # Test - download icons for first 5 channels
        dest = os.path.sep.join([
            tempfile.gettempdir(),
            str(channel.getChannelId()) + channel.getCallSign() +
            str(time.time()) + ".png"
        ])
        downloader.store(channel, dest)

        # Verify
        self.assertFalse(os.path.exists(dest))