/chirp/library/checker_test.py

https://github.com/emperorcezar/chirpradio-machine · Python · 189 lines · 147 code · 37 blank · 5 comment · 7 complexity · d74f2e969da68a8fee84b854aeccf02f MD5 · raw file

  1. #!/usr/bin/env python
  2. import unittest
  3. import mutagen.id3
  4. from chirp.library import audio_file
  5. from chirp.library import checker
  6. from chirp.library import constants
  7. from chirp.library import ufid
  8. TEST_VOL = 17
  9. TEST_TS = 1228080954
  10. TEST_FP = "1" * 40
  11. TEST_DURATION = 12345
  12. TEST_ALBUM_ID = 33333
  13. TEST_FRAME_COUNT = 444
  14. TEST_FRAME_SIZE = 55555
  15. class CheckerTest(unittest.TestCase):
  16. def setUp(self):
  17. self.au_file = audio_file.AudioFile()
  18. self.au_file.volume = TEST_VOL
  19. self.au_file.import_timestamp = TEST_TS
  20. self.au_file.fingerprint = TEST_FP
  21. self.au_file.duration_ms = TEST_DURATION
  22. self.au_file.mutagen_id3 = mutagen.id3.ID3()
  23. self.au_file.album_id = TEST_ALBUM_ID
  24. self.au_file.frame_count = TEST_FRAME_COUNT
  25. self.au_file.frame_size = TEST_FRAME_SIZE
  26. def assertTagError(self, prefix):
  27. errors = checker.find_tags_errors(self.au_file)
  28. for err_msg in errors:
  29. if err_msg.startswith(prefix):
  30. return
  31. print errors
  32. self.fail()
  33. def assertNoTagError(self, prefix):
  34. errors = checker.find_tags_errors(self.au_file)
  35. for err_msg in errors:
  36. if err_msg.startswith(prefix):
  37. self.fail(errors)
  38. def test_general_tag_checks(self):
  39. self.assertTagError(checker.ERROR_TAG_MISSING_REQUIRED + "UFID")
  40. self.au_file.mutagen_id3["TALB"] = mutagen.id3.TALB(
  41. text="Album Name", encoding=0) # latin-1, which is wrong
  42. self.assertTagError(checker.ERROR_TAG_WRONG_ENCODING)
  43. self.au_file.mutagen_id3["LINK"] = mutagen.id3.LINK(
  44. url="http://www.chirpradio.org/")
  45. self.assertTagError(checker.ERROR_TAG_NOT_WHITELISTED)
  46. def test_numeric_tag_checks(self):
  47. tlen_tag = mutagen.id3.TLEN(text=["bad"])
  48. self.au_file.mutagen_id3["TLEN"] = tlen_tag
  49. self.assertTagError(checker.ERROR_NUMERIC_MALFORMED + "TLEN")
  50. tlen_tag.text = ["12345"]
  51. self.assertNoTagError(checker.ERROR_NUMERIC_MALFORMED + "TLEN")
  52. def test_tflt_tag_checks(self):
  53. tflt_tag = mutagen.id3.TFLT(text=["bad"])
  54. self.au_file.mutagen_id3["TFLT"] = tflt_tag
  55. self.assertTagError(checker.ERROR_TFLT_NON_WHITELISTED)
  56. tflt_tag.text = ["MPG/3"]
  57. self.assertNoTagError(checker.ERROR_TFLT_NON_WHITELISTED)
  58. def test_tlen_tag_checks(self):
  59. tlen_tag = mutagen.id3.TLEN(text=[str(TEST_DURATION+1)])
  60. self.au_file.mutagen_id3["TLEN"] = tlen_tag
  61. self.assertTagError(checker.ERROR_TLEN_INCORRECT)
  62. tlen_tag.text = [str(TEST_DURATION)]
  63. self.assertNoTagError(checker.ERROR_TLEN_INCORRECT)
  64. def test_town_tag_checks(self):
  65. town_tag = mutagen.id3.TOWN(text=["Incorrect"])
  66. self.au_file.mutagen_id3["TOWN"] = town_tag
  67. self.assertTagError(checker.ERROR_TOWN_INCORRECT)
  68. town_tag.text = [constants.TOWN_FILE_OWNER]
  69. self.assertNoTagError(checker.ERROR_TOWN_INCORRECT)
  70. def test_tpe_tag_checks(self):
  71. tpe_tag = mutagen.id3.TPE1(text=["Non-standard artist name"])
  72. self.au_file.mutagen_id3.add(tpe_tag)
  73. self.assertTagError(checker.ERROR_TPE_NONSTANDARD)
  74. tpe_tag.text = ["Bob Dylan"]
  75. self.assertNoTagError(checker.ERROR_TPE_NONSTANDARD)
  76. def test_order_tag_checks(self):
  77. for tag_type in (mutagen.id3.TPOS, mutagen.id3.TRCK):
  78. tag = tag_type()
  79. for bad_order in ("bad", "3", "3,4", " 3/4", "4/3"):
  80. tag.text = [bad_order]
  81. self.au_file.mutagen_id3.add(tag)
  82. self.assertTagError(
  83. checker.ERROR_ORDER_MALFORMED + tag.FrameID)
  84. tag.text = ["3/4"]
  85. self.assertNoTagError(
  86. checker.ERROR_ORDER_MALFORMED + tag.FrameID)
  87. def test_ufid_tag_checks(self):
  88. ufid_tag = mutagen.id3.UFID(owner="bad", data="bad")
  89. self.au_file.mutagen_id3.add(ufid_tag)
  90. self.assertTagError(checker.ERROR_TAG_MISSING_REQUIRED + "UFID")
  91. ufid_tag.owner = constants.UFID_OWNER_IDENTIFIER
  92. # Need to re-add since changing the owner also changes the
  93. # hash key. A very annoying corner case, more proof that
  94. # mutagen's "just make it look like a dict" strategy is
  95. # ultimately misguided.
  96. self.au_file.mutagen_id3.add(ufid_tag)
  97. self.assertTagError(checker.ERROR_UFID_BAD_MALFORMED)
  98. bad_ufid_data = ufid.ufid(TEST_VOL + 1, TEST_TS, TEST_FP)
  99. ufid_tag.data = bad_ufid_data
  100. self.assertTagError(checker.ERROR_UFID_BAD_VOLUME)
  101. bad_ufid_data = ufid.ufid(TEST_VOL, TEST_TS + 1, TEST_FP)
  102. ufid_tag.data = bad_ufid_data
  103. self.assertTagError(checker.ERROR_UFID_BAD_TIMESTAMP)
  104. bad_ufid_data = ufid.ufid(TEST_VOL, TEST_TS, "2" * 40)
  105. ufid_tag.data = bad_ufid_data
  106. self.assertTagError(checker.ERROR_UFID_BAD_FINGERPRINT)
  107. ufid_tag.data = self.au_file.ufid()
  108. errors = checker.find_tags_errors(self.au_file)
  109. self.assertNoTagError(checker.ERROR_TAG_MISSING_REQUIRED + "UFID")
  110. self.assertNoTagError(checker.ERROR_UFID_BAD_OWNER)
  111. self.assertNoTagError(checker.ERROR_UFID_BAD_MALFORMED)
  112. self.assertNoTagError(checker.ERROR_UFID_BAD_VOLUME)
  113. self.assertNoTagError(checker.ERROR_UFID_BAD_TIMESTAMP)
  114. self.assertNoTagError(checker.ERROR_UFID_BAD_FINGERPRINT)
  115. def test_tag_checks_no_errors(self):
  116. self.au_file.mutagen_id3.add(mutagen.id3.TOWN(
  117. text=["MPG/3"],
  118. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  119. self.au_file.mutagen_id3.add(mutagen.id3.TLEN(
  120. text=[str(TEST_DURATION)],
  121. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  122. self.au_file.mutagen_id3.add(mutagen.id3.TOWN(
  123. text=[constants.TOWN_FILE_OWNER],
  124. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  125. self.au_file.mutagen_id3.add(mutagen.id3.TPE1(
  126. text=["Bob Dylan"],
  127. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  128. self.au_file.mutagen_id3.add(mutagen.id3.TIT2(
  129. text=["Just Like Tom Thumb's Blues"],
  130. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  131. self.au_file.mutagen_id3.add(mutagen.id3.TRCK(
  132. text=["3/4"],
  133. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  134. self.au_file.mutagen_id3.add(self.au_file.ufid_tag())
  135. self.au_file.mutagen_id3.add(mutagen.id3.TFLT(
  136. text=["MPG/3"],
  137. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  138. self.au_file.mutagen_id3.add(mutagen.id3.TXXX(
  139. desc=constants.TXXX_FRAME_SIZE_DESCRIPTION,
  140. text=[unicode(TEST_FRAME_SIZE)],
  141. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  142. self.au_file.mutagen_id3.add(mutagen.id3.TXXX(
  143. desc=constants.TXXX_FRAME_COUNT_DESCRIPTION,
  144. text=[unicode(TEST_FRAME_COUNT)],
  145. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  146. self.au_file.mutagen_id3.add(mutagen.id3.TXXX(
  147. desc=constants.TXXX_ALBUM_ID_DESCRIPTION,
  148. text=[unicode(TEST_ALBUM_ID)],
  149. encoding=constants.DEFAULT_ID3_TEXT_ENCODING))
  150. self.assertEqual([], checker.find_tags_errors(self.au_file))
  151. if __name__ == "__main__":
  152. unittest.main()