test_settings_loader.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. import os
  2. import inspect
  3. import platform
  4. import shutil
  5. import unittest
  6. from kalliope.core.ConfigurationManager import SettingLoader
  7. from kalliope.core.Models import Singleton
  8. from kalliope.core.Models import Resources
  9. from kalliope.core.Models.settings.Options import Options
  10. from kalliope.core.Models.settings.Player import Player
  11. from kalliope.core.Models.settings.RestAPI import RestAPI
  12. from kalliope.core.Models.settings.Settings import Settings
  13. from kalliope.core.Models.settings.Stt import Stt
  14. from kalliope.core.Models.settings.RecognitionOptions import RecognitionOptions
  15. from kalliope.core.Models.settings.Trigger import Trigger
  16. from kalliope.core.Models.settings.Tts import Tts
  17. class TestSettingLoader(unittest.TestCase):
  18. def setUp(self):
  19. # get current script directory path. We are in /an/unknown/path/kalliope/core/tests
  20. cur_script_directory = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
  21. # get parent dir. Now we are in /an/unknown/path/kalliope
  22. root_dir = os.path.normpath(cur_script_directory + os.sep + os.pardir)
  23. self.settings_file_to_test = root_dir + os.sep + "Tests/settings/settings_test.yml"
  24. self.settings_dict = {
  25. 'rest_api':
  26. {'allowed_cors_origin': False,
  27. 'active': True,
  28. 'login': 'admin',
  29. 'password_protected': True,
  30. 'password': 'secret', 'port': 5000},
  31. 'default_trigger': 'snowboy',
  32. 'triggers': [{'snowboy': {'pmdl_file': 'trigger/snowboy/resources/kalliope-FR-6samples.pmdl'}}],
  33. 'default_player': 'mplayer',
  34. 'players': [{'mplayer': {}}, {'pyalsaaudio': {"device": "default"}}],
  35. 'speech_to_text': [{'google': {'language': 'fr-FR'}}],
  36. 'cache_path': '/tmp/kalliope_tts_cache',
  37. 'resource_directory': {
  38. 'stt': '/tmp/kalliope/tests/kalliope_resources_dir/stt',
  39. 'tts': '/tmp/kalliope/tests/kalliope_resources_dir/tts',
  40. 'neuron': '/tmp/kalliope/tests/kalliope_resources_dir/neurons',
  41. 'trigger': '/tmp/kalliope/tests/kalliope_resources_dir/trigger'},
  42. 'default_text_to_speech': 'pico2wave',
  43. 'default_speech_to_text': 'google',
  44. 'text_to_speech': [
  45. {'pico2wave': {'cache': True, 'language': 'fr-FR'}},
  46. {'voxygen': {'voice': 'Agnes', 'cache': True}}
  47. ],
  48. 'var_files': ["../Tests/settings/variables.yml"],
  49. 'options': {'deaf': True, 'mute': False},
  50. 'hooks': {'on_waiting_for_trigger': 'test',
  51. 'on_stop_listening': None,
  52. 'on_start_listening': None,
  53. 'on_order_found': None,
  54. 'on_start': ['on-start-synapse', 'bring-led-on'],
  55. 'on_undeaf': [],
  56. 'on_triggered': ['on-triggered-synapse'],
  57. 'on_deaf': [],
  58. 'on_mute': [],
  59. 'on_unmute': [],
  60. 'on_order_not_found': [
  61. 'order-not-found-synapse'],
  62. 'on_processed_synapses': None,
  63. 'on_start_speaking': None,
  64. 'on_stop_speaking': None
  65. }
  66. }
  67. # Init the folders, otherwise it raises an exceptions
  68. os.makedirs("/tmp/kalliope/tests/kalliope_resources_dir/neurons")
  69. os.makedirs("/tmp/kalliope/tests/kalliope_resources_dir/stt")
  70. os.makedirs("/tmp/kalliope/tests/kalliope_resources_dir/tts")
  71. os.makedirs("/tmp/kalliope/tests/kalliope_resources_dir/trigger")
  72. def tearDown(self):
  73. # Cleanup
  74. shutil.rmtree('/tmp/kalliope/tests/kalliope_resources_dir')
  75. Singleton._instances = {}
  76. def test_singleton(self):
  77. s1 = SettingLoader(file_path=self.settings_file_to_test)
  78. s2 = SettingLoader(file_path=self.settings_file_to_test)
  79. self.assertTrue(s1.settings is s2.settings)
  80. def test_get_yaml_config(self):
  81. sl = SettingLoader(file_path=self.settings_file_to_test)
  82. self.maxDiff = None
  83. self.assertDictEqual(sl.yaml_config, self.settings_dict)
  84. def test_get_settings(self):
  85. settings_object = Settings()
  86. settings_object.default_tts_name = "pico2wave"
  87. settings_object.default_stt_name = "google"
  88. settings_object.default_trigger_name = "snowboy"
  89. settings_object.default_player_name = "mplayer"
  90. tts1 = Tts(name="pico2wave", parameters={'cache': True, 'language': 'fr-FR'})
  91. tts2 = Tts(name="voxygen", parameters={'voice': 'Agnes', 'cache': True})
  92. settings_object.ttss = [tts1, tts2]
  93. stt = Stt(name="google", parameters={'language': 'fr-FR'})
  94. settings_object.stts = [stt]
  95. trigger1 = Trigger(name="snowboy",
  96. parameters={'pmdl_file': 'trigger/snowboy/resources/kalliope-FR-6samples.pmdl'})
  97. settings_object.triggers = [trigger1]
  98. player1 = Player(name="mplayer", parameters={})
  99. player2 = Player(name="pyalsaaudio", parameters={"device": "default"})
  100. settings_object.players = [player1, player2]
  101. settings_object.rest_api = RestAPI(password_protected=True, active=True,
  102. login="admin", password="secret", port=5000,
  103. allowed_cors_origin=False)
  104. settings_object.cache_path = '/tmp/kalliope_tts_cache'
  105. resources = Resources(neuron_folder="/tmp/kalliope/tests/kalliope_resources_dir/neurons",
  106. stt_folder="/tmp/kalliope/tests/kalliope_resources_dir/stt",
  107. tts_folder="/tmp/kalliope/tests/kalliope_resources_dir/tts",
  108. trigger_folder="/tmp/kalliope/tests/kalliope_resources_dir/trigger")
  109. settings_object.resources = resources
  110. settings_object.variables = {
  111. "author": "Lamonf",
  112. "test_number": 60,
  113. "test": "kalliope"
  114. }
  115. settings_object.options = Options(deaf=True, mute=False)
  116. settings_object.machine = platform.machine()
  117. settings_object.recognition_options = RecognitionOptions()
  118. settings_object.hooks = {'on_waiting_for_trigger': 'test',
  119. 'on_stop_listening': None,
  120. 'on_start_listening': None,
  121. 'on_order_found': None,
  122. 'on_start': ['on-start-synapse', 'bring-led-on'],
  123. 'on_undeaf': [],
  124. 'on_triggered': ['on-triggered-synapse'],
  125. 'on_deaf': [],
  126. 'on_mute': [],
  127. 'on_unmute': [],
  128. 'on_order_not_found': [
  129. 'order-not-found-synapse'],
  130. 'on_processed_synapses': None,
  131. 'on_start_speaking': None,
  132. 'on_stop_speaking': None,
  133. }
  134. sl = SettingLoader(file_path=self.settings_file_to_test)
  135. self.assertEqual(settings_object, sl.settings)
  136. def test_get_default_speech_to_text(self):
  137. expected_default_speech_to_text = "google"
  138. sl = SettingLoader(file_path=self.settings_file_to_test)
  139. self.assertEqual(expected_default_speech_to_text, sl._get_default_speech_to_text(self.settings_dict))
  140. def test_get_default_text_to_speech(self):
  141. expected_default_text_to_speech = "pico2wave"
  142. sl = SettingLoader(file_path=self.settings_file_to_test)
  143. self.assertEqual(expected_default_text_to_speech, sl._get_default_text_to_speech(self.settings_dict))
  144. def test_get_default_trigger(self):
  145. expected_default_trigger = "snowboy"
  146. sl = SettingLoader(file_path=self.settings_file_to_test)
  147. self.assertEqual(expected_default_trigger, sl._get_default_trigger(self.settings_dict))
  148. def test_get_stts(self):
  149. stt = Stt(name="google", parameters={'language': 'fr-FR'})
  150. sl = SettingLoader(file_path=self.settings_file_to_test)
  151. self.assertEqual([stt], sl._get_stts(self.settings_dict))
  152. def test_get_ttss(self):
  153. tts1 = Tts(name="pico2wave", parameters={'cache': True, 'language': 'fr-FR'})
  154. tts2 = Tts(name="voxygen", parameters={'voice': 'Agnes', 'cache': True})
  155. sl = SettingLoader(file_path=self.settings_file_to_test)
  156. self.assertEqual([tts1, tts2], sl._get_ttss(self.settings_dict))
  157. def test_get_triggers(self):
  158. trigger1 = Trigger(name="snowboy",
  159. parameters={'pmdl_file': 'trigger/snowboy/resources/kalliope-FR-6samples.pmdl'})
  160. sl = SettingLoader(file_path=self.settings_file_to_test)
  161. self.assertEqual([trigger1], sl._get_triggers(self.settings_dict))
  162. def test_get_players(self):
  163. player1 = Player(name="mplayer",
  164. parameters={})
  165. player2 = Player(name="pyalsaaudio",
  166. parameters={'device': 'default'})
  167. sl = SettingLoader(file_path=self.settings_file_to_test)
  168. self.assertEqual([player1, player2], sl._get_players(self.settings_dict))
  169. def test_get_rest_api(self):
  170. expected_rest_api = RestAPI(password_protected=True, active=True,
  171. login="admin", password="secret", port=5000,
  172. allowed_cors_origin=False)
  173. sl = SettingLoader(file_path=self.settings_file_to_test)
  174. self.assertEqual(expected_rest_api, sl._get_rest_api(self.settings_dict))
  175. def test_get_cache_path(self):
  176. expected_cache_path = '/tmp/kalliope_tts_cache'
  177. sl = SettingLoader(file_path=self.settings_file_to_test)
  178. self.assertEqual(expected_cache_path, sl._get_cache_path(self.settings_dict))
  179. def test_get_resources(self):
  180. resources = Resources(neuron_folder="/tmp/kalliope/tests/kalliope_resources_dir/neurons",
  181. stt_folder="/tmp/kalliope/tests/kalliope_resources_dir/stt",
  182. tts_folder="/tmp/kalliope/tests/kalliope_resources_dir/tts",
  183. trigger_folder="/tmp/kalliope/tests/kalliope_resources_dir/trigger")
  184. expected_resource = resources
  185. sl = SettingLoader(file_path=self.settings_file_to_test)
  186. self.assertEqual(expected_resource, sl._get_resources(self.settings_dict))
  187. def test_get_variables(self):
  188. expected_result = {
  189. "author": "Lamonf",
  190. "test_number": 60,
  191. "test": "kalliope"
  192. }
  193. sl = SettingLoader(file_path=self.settings_file_to_test)
  194. self.assertEqual(expected_result,
  195. sl._get_variables(self.settings_dict))
  196. def test_get_options(self):
  197. expected_result = Options(deaf=True, mute=False)
  198. sl = SettingLoader(file_path=self.settings_file_to_test)
  199. self.assertEqual(expected_result,
  200. sl._get_options(self.settings_dict))
  201. def test_get_hooks(self):
  202. # test with only one hook set
  203. settings = dict()
  204. settings["hooks"] = {
  205. "on_start": "test_synapse"
  206. }
  207. expected_dict = {
  208. "on_start": "test_synapse",
  209. "on_waiting_for_trigger": None,
  210. "on_triggered": None,
  211. "on_start_listening": None,
  212. "on_stop_listening": None,
  213. "on_order_found": None,
  214. "on_order_not_found": None,
  215. "on_deaf": None,
  216. "on_undeaf": None,
  217. "on_mute": None,
  218. "on_unmute": None,
  219. "on_start_speaking": None,
  220. "on_stop_speaking": None
  221. }
  222. returned_dict = SettingLoader._get_hooks(settings)
  223. self.assertEqual(returned_dict, expected_dict)
  224. # test with no hook set
  225. settings = dict()
  226. expected_dict = {
  227. "on_start": None,
  228. "on_waiting_for_trigger": None,
  229. "on_triggered": None,
  230. "on_start_listening": None,
  231. "on_stop_listening": None,
  232. "on_order_found": None,
  233. "on_order_not_found": None,
  234. "on_deaf": None,
  235. "on_undeaf": None,
  236. "on_mute": None,
  237. "on_unmute": None,
  238. "on_start_speaking": None,
  239. "on_stop_speaking": None
  240. }
  241. returned_dict = SettingLoader._get_hooks(settings)
  242. self.assertEqual(returned_dict, expected_dict)
  243. if __name__ == '__main__':
  244. unittest.main()
  245. # suite = unittest.TestSuite()
  246. # suite.addTest(TestSettingLoader("test_get_hooks"))
  247. # runner = unittest.TextTestRunner()
  248. # runner.run(suite)