Python library for working with the PD Buddy Sink Serial Console Configuration Interface
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

__init__.py 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. """Unit tests for the top-level pdbuddy classes"""
  2. import unittest
  3. import pdbuddy
  4. class SinkTestCase(unittest.TestCase):
  5. def setUp(self):
  6. # Get devices
  7. pdbs_devices = list(pdbuddy.Sink.get_devices())
  8. # If there are no devices, skip the test
  9. if len(pdbs_devices) == 0:
  10. self.skipTest("No PD Buddy Sink devices found")
  11. # Open the first device
  12. self.pdbs = pdbuddy.Sink(pdbs_devices[0])
  13. self.obj_valid = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  14. flags=pdbuddy.SinkFlags.NONE, v=15000, i=3000)
  15. self.obj_valid_gb = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  16. flags=pdbuddy.SinkFlags.GIVEBACK, v=15000, i=3000)
  17. self.obj_huge_vi = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  18. flags=pdbuddy.SinkFlags.NONE, v=65536, i=65536)
  19. self.obj_big_vi = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  20. flags=pdbuddy.SinkFlags.NONE, v=20001, i=5001)
  21. self.obj_neg_vi = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  22. flags=pdbuddy.SinkFlags.NONE, v=-1, i=-1)
  23. def tearDown(self):
  24. # Close the connection to the PD Buddy Sink
  25. self.pdbs.close()
  26. def test_identify(self):
  27. self.pdbs.identify()
  28. def test_help(self):
  29. help_text = self.pdbs.help()
  30. self.assertTrue(len(help_text) > 0)
  31. self.assertTrue(len(help_text[0]) > 0)
  32. def test_license(self):
  33. license_text = self.pdbs.license()
  34. self.assertTrue(len(license_text) > 0)
  35. self.assertTrue(len(license_text[0]) > 0)
  36. def test_set_tmpcfg_valid(self):
  37. self.pdbs.set_tmpcfg(self.obj_valid)
  38. self.assertEqual(self.pdbs.get_tmpcfg(), self.obj_valid)
  39. def test_set_tmpcfg_valid_gb(self):
  40. self.pdbs.set_tmpcfg(self.obj_valid_gb)
  41. self.assertEqual(self.pdbs.get_tmpcfg(), self.obj_valid_gb)
  42. def test_set_tmpcfg_huge_vi(self):
  43. with self.assertRaises(ValueError):
  44. self.pdbs.set_tmpcfg(self.obj_huge_vi)
  45. def test_set_tmpcfg_big_vi(self):
  46. with self.assertRaises(ValueError):
  47. self.pdbs.set_tmpcfg(self.obj_big_vi)
  48. def test_set_tmpcfg_neg_vi(self):
  49. with self.assertRaises(ValueError):
  50. self.pdbs.set_tmpcfg(self.obj_neg_vi)
  51. def test_write(self):
  52. self.test_set_tmpcfg_valid()
  53. self.pdbs.write()
  54. self.assertEqual(self.pdbs.get_cfg(), self.obj_valid)
  55. def test_get_cfg_index(self):
  56. self.assertIsInstance(self.pdbs.get_cfg(0), pdbuddy.SinkConfig)
  57. def test_get_cfg_index_bad(self):
  58. with self.assertRaises(IndexError):
  59. self.pdbs.get_cfg(-1)
  60. def test_load(self):
  61. # Write obj_valid to flash
  62. self.test_write()
  63. # Write obj_valid_gb to tmpcfg
  64. self.test_set_tmpcfg_valid_gb()
  65. self.assertNotEqual(self.pdbs.get_cfg(), self.pdbs.get_tmpcfg())
  66. # Load flash to tmpcfg
  67. self.pdbs.load()
  68. self.assertEqual(self.pdbs.get_cfg(), self.pdbs.get_tmpcfg())
  69. def test_erase(self):
  70. self.pdbs.erase()
  71. with self.assertRaises(KeyError):
  72. self.pdbs.load()
  73. def test_context_manager(self):
  74. self.pdbs.close()
  75. with pdbuddy.Sink(list(pdbuddy.Sink.get_devices())[0]) as pdbs:
  76. # Test something with the conext manager. For example, this is
  77. # essentially test_get_cfg_index.
  78. self.assertIsInstance(pdbs.get_cfg(0), pdbuddy.SinkConfig)
  79. def test_output(self):
  80. try:
  81. self.pdbs.output(False)
  82. self.assertFalse(self.pdbs.output())
  83. self.pdbs.output(True)
  84. self.assertTrue(self.pdbs.output())
  85. except KeyError:
  86. self.skipTest("Command output not supported")
  87. except ValueError:
  88. self.skipTest("Unknown value returned by PD Buddy Sink")
  89. class SinkConfigTestCase(unittest.TestCase):
  90. def setUp(self):
  91. self.obj_none = pdbuddy.SinkConfig(status=None, flags=None, v=None,
  92. i=None)
  93. self.obj_empty = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.EMPTY,
  94. flags=None, v=None, i=None)
  95. self.obj_valid = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  96. flags=pdbuddy.SinkFlags.NONE, v=15000, i=3000)
  97. self.obj_invalid = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.INVALID,
  98. flags=pdbuddy.SinkFlags.NONE, v=15000, i=3000)
  99. self.obj_valid_gb = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  100. flags=pdbuddy.SinkFlags.GIVEBACK, v=15000, i=3000)
  101. self.obj_valid_5v = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  102. flags=pdbuddy.SinkFlags.NONE, v=5000, i=3000)
  103. self.obj_valid_1a = pdbuddy.SinkConfig(status=pdbuddy.SinkStatus.VALID,
  104. flags=pdbuddy.SinkFlags.NONE, v=15000, i=1000)
  105. def test_str_none(self):
  106. self.assertEqual(str(self.obj_none), "No configuration")
  107. def test_str_empty(self):
  108. self.assertEqual(str(self.obj_empty), "status: empty")
  109. def test_str_valid(self):
  110. self.assertEqual(str(self.obj_valid),
  111. "status: valid\nflags: (none)\nv: 15.00 V\ni: 3.00 A")
  112. def test_str_invalid(self):
  113. self.assertEqual(str(self.obj_invalid),
  114. "status: invalid\nflags: (none)\nv: 15.00 V\ni: 3.00 A")
  115. def test_str_valid_gb(self):
  116. self.assertEqual(str(self.obj_valid_gb),
  117. "status: valid\nflags: GiveBack\nv: 15.00 V\ni: 3.00 A")
  118. def test_str_valid_5v(self):
  119. self.assertEqual(str(self.obj_valid_5v),
  120. "status: valid\nflags: (none)\nv: 5.00 V\ni: 3.00 A")
  121. def test_str_valid_1a(self):
  122. self.assertEqual(str(self.obj_valid_1a),
  123. "status: valid\nflags: (none)\nv: 15.00 V\ni: 1.00 A")
  124. def test_eq_none(self):
  125. self.assertTrue(self.obj_none == pdbuddy.SinkConfig(None, None, None,
  126. None))
  127. def test_eq_valid(self):
  128. # Set invalid object as valid
  129. self.obj_invalid = self.obj_invalid._replace(status=pdbuddy.SinkStatus.VALID)
  130. self.assertTrue(self.obj_valid == self.obj_invalid)
  131. def test_eq_wrong_type(self):
  132. self.assertFalse(self.obj_none == "hello world")
  133. def test_eq_wrong_status(self):
  134. self.assertFalse(self.obj_valid == self.obj_invalid)
  135. def test_eq_wrong_flags(self):
  136. self.assertFalse(self.obj_valid == self.obj_valid_gb)
  137. def test_eq_wrong_voltage(self):
  138. self.assertFalse(self.obj_valid == self.obj_valid_5v)
  139. def test_eq_wrong_current(self):
  140. self.assertFalse(self.obj_valid == self.obj_valid_1a)
  141. def test_ne_none(self):
  142. self.assertFalse(self.obj_none != pdbuddy.SinkConfig(None, None, None,
  143. None))
  144. def test_ne_valid(self):
  145. # Set invalid object as valid
  146. self.obj_invalid = self.obj_invalid._replace(status=pdbuddy.SinkStatus.VALID)
  147. self.assertFalse(self.obj_valid != self.obj_invalid)
  148. def test_ne_wrong_type(self):
  149. self.assertTrue(self.obj_none != "hello world")
  150. def test_ne_wrong_status(self):
  151. self.assertTrue(self.obj_valid != self.obj_invalid)
  152. def test_hash_identical(self):
  153. self.assertEqual(hash(self.obj_none), hash(pdbuddy.SinkConfig(None,
  154. None, None, None)))
  155. def test_hash_different(self):
  156. self.assertNotEqual(hash(self.obj_none), hash(self.obj_valid))
  157. def test_from_text_none(self):
  158. ft_none = pdbuddy.SinkConfig.from_text([])
  159. self.assertEqual(ft_none, self.obj_none)
  160. def test_from_text_empty(self):
  161. ft_empty = pdbuddy.SinkConfig.from_text([b"status: empty"])
  162. self.assertEqual(ft_empty, self.obj_empty)
  163. def test_from_text_valid(self):
  164. ft_valid = pdbuddy.SinkConfig.from_text([b"status: valid",
  165. b"flags: (none)",
  166. b"v: 15.00 V",
  167. b"i: 3.00 A"])
  168. self.assertEqual(ft_valid, self.obj_valid)
  169. def test_from_text_invalid(self):
  170. ft_invalid = pdbuddy.SinkConfig.from_text([b"status: invalid",
  171. b"flags: (none)",
  172. b"v: 15.00 V",
  173. b"i: 3.00 A"])
  174. self.assertEqual(ft_invalid, self.obj_invalid)
  175. def test_from_text_valid_gb(self):
  176. ft_valid_gb = pdbuddy.SinkConfig.from_text([b"status: valid",
  177. b"flags: GiveBack",
  178. b"v: 15.00 V",
  179. b"i: 3.00 A"])
  180. self.assertEqual(ft_valid_gb, self.obj_valid_gb)
  181. def test_from_text_valid_5v(self):
  182. ft_valid_5v = pdbuddy.SinkConfig.from_text([b"status: valid",
  183. b"flags: (none)",
  184. b"v: 5.00 V",
  185. b"i: 3.00 A"])
  186. self.assertEqual(ft_valid_5v, self.obj_valid_5v)
  187. def test_from_text_valid_1a(self):
  188. ft_valid_1a = pdbuddy.SinkConfig.from_text([b"status: valid",
  189. b"flags: (none)",
  190. b"v: 15.00 V",
  191. b"i: 1.00 A"])
  192. self.assertEqual(ft_valid_1a, self.obj_valid_1a)
  193. def test_from_text_invalid_index(self):
  194. with self.assertRaises(IndexError):
  195. pdbuddy.SinkConfig.from_text([b"Invalid index"])
  196. def test_from_text_no_configuration(self):
  197. ft_no_config = pdbuddy.SinkConfig.from_text([b"No configuration"])
  198. self.assertEqual(ft_no_config, self.obj_none)
  199. def test_from_text_valid_extra(self):
  200. ft_valid = pdbuddy.SinkConfig.from_text([b"status: valid",
  201. b"flags: (none)",
  202. b"This is an extra line, which shouldn't hurt anything.",
  203. b"v: 15.00 V",
  204. b"i: 3.00 A"])
  205. self.assertEqual(ft_valid, self.obj_valid)