/tv/lib/test/conversionstest.py

https://github.com/kazcw/miro
Python | 160 lines | 125 code | 24 blank | 11 comment | 13 complexity | a02721771e95d2c8bb4beaf6a816d6d2 MD5 | raw file
  1. import os
  2. import glob
  3. from miro.test.framework import MiroTestCase
  4. from miro import app
  5. from miro import prefs
  6. from miro import conversions
  7. from miro.plat import resources
  8. DATA = resources.path("testdata/conversions")
  9. class ConverterManagerTest(MiroTestCase):
  10. def build_config_file(self, filename, data):
  11. fn = os.path.join(self.tempdir, filename)
  12. fp = open(fn, "w")
  13. fp.write(data)
  14. fp.close()
  15. def test_empty(self):
  16. cm = conversions.ConverterManager()
  17. cm.load_converters(os.path.join(self.tempdir, "*.conv"))
  18. self.assertEquals(len(cm.get_converters()), 0)
  19. self.assertRaises(KeyError, cm.lookup_converter, "abc")
  20. def test_parsing(self):
  21. self.build_config_file(
  22. "foo.conv",
  23. "[DEFAULT]\n"
  24. "name: Foo\n"
  25. "executable: ffmpeg\n"
  26. "\n"
  27. "[Target1]\n"
  28. "extension: mp4\n"
  29. "parameters: -i {input}\n"
  30. )
  31. cm = conversions.ConverterManager()
  32. cm.load_converters(os.path.join(self.tempdir, "*.conv"))
  33. self.assertEqual(len(cm.get_converters()), 1)
  34. converter = cm.lookup_converter("target1")
  35. # this comes from the section name
  36. self.assertEqual(converter.name, "Target1")
  37. # this comes from the default
  38. self.assertEqual(converter.executable, "ffmpeg")
  39. # this comes from the section
  40. self.assertEqual(converter.extension, "mp4")
  41. # this is a special case
  42. self.assertEqual(converter.platforms, None)
  43. def test_only_on(self):
  44. self.build_config_file(
  45. "foo2.conv",
  46. "[DEFAULT]\n"
  47. "name: Foo\n"
  48. "executable: ffmpeg\n"
  49. "\n"
  50. "[Target1]\n"
  51. "extension: mp4\n"
  52. "parameters: -i {input}\n"
  53. "only_on: %(platform)s\n" % {
  54. "platform": app.config.get(prefs.APP_PLATFORM)}
  55. )
  56. cm = conversions.ConverterManager()
  57. cm.load_converters(os.path.join(self.tempdir, "*.conv"))
  58. self.assertEqual(len(cm.get_converters()), 1)
  59. converter = cm.lookup_converter("target1")
  60. self.assertEqual(
  61. converter.platforms, app.config.get(prefs.APP_PLATFORM))
  62. class MockFFMpegConversionTask(conversions.FFMpegConversionTask):
  63. def __init__(self):
  64. # not calling superclass init because it does a bunch of
  65. # stuff we don't want to deal with mocking.
  66. # instead, initialize the bits we're testing
  67. self.error = None
  68. self.progress = 0
  69. self.duration = None
  70. def _log_progress(self, line):
  71. pass
  72. def _notify_progress(self):
  73. pass
  74. class FFMpegConversionTaskTest(MiroTestCase):
  75. def test_ffmpeg_mp4_to_mp3(self):
  76. f = open(os.path.join(DATA, "ffmpeg.mp4.mp3.txt"), "r")
  77. try:
  78. lines = conversions.line_reader(f)
  79. mock = MockFFMpegConversionTask()
  80. mock.process_output(lines)
  81. # no errors and progress equals 1.0
  82. self.assertEquals(mock.error, None)
  83. self.assertEquals(mock.progress, 1.0)
  84. self.assertEquals(mock.duration, 368)
  85. finally:
  86. f.close()
  87. def test_unknown_encoder(self):
  88. f = open(os.path.join(DATA, "ffmpeg.unknown_encoder.txt"), "r")
  89. try:
  90. lines = conversions.line_reader(f)
  91. mock = MockFFMpegConversionTask()
  92. mock.process_output(lines)
  93. # this kicks up an 'Unknown encoder' error. make sure
  94. # it's captured and progress is 0.
  95. self.assertEquals(mock.error, "Unknown encoder 'libx264'")
  96. self.assertEquals(mock.progress, 0)
  97. finally:
  98. f.close()
  99. def test_error_while_decoding_stream(self):
  100. f = open(os.path.join(DATA, "ffmpeg.error_while_decoding_stream.txt"), "r")
  101. try:
  102. lines = conversions.line_reader(f)
  103. mock = MockFFMpegConversionTask()
  104. mock.process_output(lines)
  105. # no errors and progress equals 1.0
  106. self.assertEquals(mock.error, None)
  107. self.assertEquals(mock.progress, 1.0)
  108. self.assertEquals(mock.duration, 33)
  109. finally:
  110. f.close()
  111. class ConversionInfoTest(MiroTestCase):
  112. def get_output_file(self, filepath):
  113. filename = os.path.basename(filepath)
  114. return os.path.join(DATA, "output", filename + ".output")
  115. def test_parse_ffmpeg_output(self):
  116. for mem in glob.glob(os.path.join(DATA, "ffmpeg_info*")):
  117. lines = open(mem, "r").read().splitlines()
  118. try:
  119. ast = conversions.parse_ffmpeg_output(lines)
  120. except Exception, e:
  121. print "test_parse_ffmpeg_output failed: on %s" % mem
  122. raise
  123. try:
  124. info = conversions.extract_info(ast)
  125. except ValueError, ve:
  126. info = str(ve)
  127. output_file = self.get_output_file(mem)
  128. if not os.path.exists(output_file):
  129. print "output file does not exist! ", output_file
  130. print ast.pformat()
  131. print "output:", repr(info)
  132. else:
  133. output = open(output_file, "r").read()
  134. self.assertEquals(
  135. eval(output.strip()), info,
  136. "%s != %s (%s)" % (eval(output.strip()), info, mem))