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)
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)
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()
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()
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))
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()
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))