Browse Source

[Tests] #234 player modularity tests

TODO:
Doc
monf 7 years ago
parent
commit
8ea917529a

+ 2 - 1
.travis.yml

@@ -21,7 +21,8 @@ before_install:
 - sudo python get-pip.py
 
 install:
-  - pip install -r install/files/python_requirements.txt
+  - sudo python setup.py install
+  # - pip install -r install/files/python_requirements.txt
   - pip install python2-pythondialog || pip install pythondialog
   - pip install coveralls
 

+ 17 - 0
Tests/settings/settings_test.yml

@@ -46,6 +46,23 @@ text_to_speech:
       voice: "Agnes"
       cache: True
 
+# ---------------------------
+# players
+# ---------------------------
+# This is the sound player that will be used by default
+default_player: "mplayer"
+
+# players configuration
+# Available engine are:
+# - mplayer
+# - pyalsaaudio
+# - pyaudioplayer
+# - sounddeviceplayer
+players:
+  - mplayer: {}
+  - pyalsaaudio:
+     device: "default"
+
 # ---------------------------
 # Wake up answers
 # ---------------------------

+ 1 - 1
Tests/test_dynamic_loading.py

@@ -15,7 +15,7 @@ class TestDynamicLoading(unittest.TestCase):
     """
 
     def setUp(self):
-        # get current script directory path. We are in /an/unknown/path/kalliope/core/Tests
+        # get current script directory path. We are in /an/unknown/path/kalliope/core/tests
         cur_script_directory = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
         # get parent dir. Now we are in /an/unknown/path/kalliope
         root_dir = os.path.normpath(cur_script_directory + os.sep + os.pardir)

+ 22 - 1
Tests/test_models.py

@@ -1,6 +1,8 @@
 import unittest
 import ast
 import mock
+
+from kalliope.core.Models.Player import Player
 from kalliope.core.Models.Tts import Tts
 
 from kalliope.core.Models.Trigger import Trigger
@@ -279,6 +281,7 @@ class TestModels(unittest.TestCase):
             setting1 = Settings(default_tts_name="pico2wav",
                                 default_stt_name="google",
                                 default_trigger_name="swoyboy",
+                                default_player_name="mplayer",
                                 ttss=["ttts"],
                                 stts=["stts"],
                                 random_wake_up_answers=["yes"],
@@ -287,6 +290,7 @@ class TestModels(unittest.TestCase):
                                 on_ready_answers=None,
                                 on_ready_sounds=None,
                                 triggers=["snowboy"],
+                                players=["mplayer"],
                                 rest_api=rest_api1,
                                 cache_path="/tmp/kalliope",
                                 default_synapse="default_synapse",
@@ -296,6 +300,7 @@ class TestModels(unittest.TestCase):
             setting2 = Settings(default_tts_name="accapela",
                                 default_stt_name="bing",
                                 default_trigger_name="swoyboy",
+                                default_player_name="mplayer",
                                 ttss=["ttts"],
                                 stts=["stts"],
                                 random_wake_up_answers=["no"],
@@ -313,6 +318,7 @@ class TestModels(unittest.TestCase):
             setting3 = Settings(default_tts_name="pico2wav",
                                 default_stt_name="google",
                                 default_trigger_name="swoyboy",
+                                default_player_name="mplayer",
                                 ttss=["ttts"],
                                 stts=["stts"],
                                 random_wake_up_answers=["yes"],
@@ -321,6 +327,7 @@ class TestModels(unittest.TestCase):
                                 on_ready_answers=None,
                                 on_ready_sounds=None,
                                 triggers=["snowboy"],
+                                players=["mplayer"],
                                 rest_api=rest_api1,
                                 cache_path="/tmp/kalliope",
                                 default_synapse="default_synapse",
@@ -345,6 +352,7 @@ class TestModels(unittest.TestCase):
                 'random_wake_up_sounds': None,
                 'on_ready_answers': None,
                 'default_trigger_name': 'swoyboy',
+                'default_player_name': 'mplayer',
                 'cache_path': '/tmp/kalliope',
                 'stts': ['stts'],
                 'machine': 'pumpkins',
@@ -354,7 +362,8 @@ class TestModels(unittest.TestCase):
                 'variables': {'key1': 'val1'},
                 'resources': None,
                 'triggers': ['snowboy'],
-                'rpi_settings': None
+                'rpi_settings': None,
+                'players': ['mplayer']
             }
 
             self.assertDictEqual(expected_result_serialize, setting1.serialize())
@@ -428,6 +437,18 @@ class TestModels(unittest.TestCase):
         self.assertTrue(trigger1.__eq__(trigger3))
         self.assertFalse(trigger1.__eq__(trigger2))
 
+    def test_Player(self):
+        player1 = Player(name="player1", parameters={"key1": "val1"})
+        player2 = Player(name="player2", parameters={"key2": "val2"})
+        player3 = Player(name="player1", parameters={"key1": "val1"})
+
+        expected_result_serialize = {'name': 'player1', 'parameters': {'key1': 'val1'}}
+
+        self.assertDictEqual(expected_result_serialize, player1.serialize())
+
+        self.assertTrue(player1.__eq__(player3))
+        self.assertFalse(player1.__eq__(player2))
+
     def test_Tts(self):
         tts1 = Tts(name="tts1", parameters={"key1": "val1"})
         tts2 = Tts(name="tts2", parameters={"key2": "val2"})

+ 1 - 1
Tests/test_neuron_module.py

@@ -11,7 +11,7 @@ class TestNeuronModule(unittest.TestCase):
 
     def setUp(self):
         self.expected_result = "hello, this is a replaced word"
-        # this allow us to run the test from an IDE and from the root with python -m unittest Tests.TestNeuronModule
+        # this allow us to run the test from an IDE and from the root with python -m unittest tests.TestNeuronModule
         if "/Tests" in os.getcwd():
             self.file_template = "templates/template_test.j2"
         else:

+ 44 - 0
Tests/test_player_launcher.py

@@ -0,0 +1,44 @@
+import unittest
+import mock
+
+from kalliope.core.Models.Player import Player
+from kalliope.core.Models.Settings import Settings
+from kalliope.core.PlayerLauncher import PlayerLauncher
+
+
+class TestPlayerLauncher(unittest.TestCase):
+    """
+    Class to test Launchers Classes (PlayerLauncher) and methods
+    """
+
+    def setUp(self):
+        pass
+
+    ####
+    # Player Launcher
+    def test_get_player(self):
+        """
+        Test the PlayerLauncher trying to run the Player
+        """
+        player1 = Player("Player", {})
+        player2 = Player("Player2", {'test': "hitheparamtest"})
+        settings = Settings()
+        settings.players = [player1, player2]
+        with mock.patch("kalliope.core.Utils.get_dynamic_class_instantiation") as mock_get_class_instantiation:
+            # Get the player1
+            settings.default_player_name = "Player"
+            PlayerLauncher.get_player(settings=settings)
+
+            mock_get_class_instantiation.assert_called_once_with(package_name="players",
+                                                                 module_name=player1.name,
+                                                                 parameters=player1.parameters)
+            mock_get_class_instantiation.reset_mock()
+
+            # Get the player 2
+            settings.default_player_name = "Player2"
+            PlayerLauncher.get_player(settings=settings)
+
+            mock_get_class_instantiation.assert_called_once_with(package_name="players",
+                                                                 module_name=player2.name,
+                                                                 parameters=player2.parameters)
+            mock_get_class_instantiation.reset_mock()

+ 16 - 1
Tests/test_settings_loader.py

@@ -7,6 +7,7 @@ import unittest
 from kalliope.core.ConfigurationManager import SettingLoader
 from kalliope.core.Models import Singleton
 from kalliope.core.Models import Resources
+from kalliope.core.Models.Player import Player
 from kalliope.core.Models.RestAPI import RestAPI
 from kalliope.core.Models.Settings import Settings
 from kalliope.core.Models.Stt import Stt
@@ -17,7 +18,7 @@ from kalliope.core.Models.Tts import Tts
 class TestSettingLoader(unittest.TestCase):
 
     def setUp(self):
-        # get current script directory path. We are in /an/unknown/path/kalliope/core/Tests
+        # get current script directory path. We are in /an/unknown/path/kalliope/core/tests
         cur_script_directory = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
         # get parent dir. Now we are in /an/unknown/path/kalliope
         root_dir = os.path.normpath(cur_script_directory + os.sep + os.pardir)
@@ -33,8 +34,10 @@ class TestSettingLoader(unittest.TestCase):
                  'password_protected': True,
                  'password': 'secret', 'port': 5000},
             'default_trigger': 'snowboy',
+            'default_player': 'mplayer',
             'play_on_ready_notification': 'never',
             'triggers': [{'snowboy': {'pmdl_file': 'trigger/snowboy/resources/kalliope-FR-6samples.pmdl'}}],
+            'players': [{'mplayer': {}}, {'pyalsaaudio': {"device": "default"}}],
             'speech_to_text': [{'google': {'language': 'fr-FR'}}],
             'on_ready_answers': ['Kalliope is ready'],
             'cache_path': '/tmp/kalliope_tts_cache',
@@ -83,6 +86,7 @@ class TestSettingLoader(unittest.TestCase):
         settings_object.default_tts_name = "pico2wave"
         settings_object.default_stt_name = "google"
         settings_object.default_trigger_name = "snowboy"
+        settings_object.default_player_name = "mplayer"
         tts1 = Tts(name="pico2wave", parameters={'cache': True, 'language': 'fr-FR'})
         tts2 = Tts(name="voxygen", parameters={'voice': 'Agnes', 'cache': True})
         settings_object.ttss = [tts1, tts2]
@@ -96,6 +100,9 @@ class TestSettingLoader(unittest.TestCase):
         trigger1 = Trigger(name="snowboy",
                            parameters={'pmdl_file': 'trigger/snowboy/resources/kalliope-FR-6samples.pmdl'})
         settings_object.triggers = [trigger1]
+        player1 = Player(name="mplayer", parameters={})
+        player2 = Player(name="pyalsaaudio", parameters={"device": "default"})
+        settings_object.players = [player1, player2]
         settings_object.rest_api = RestAPI(password_protected=True, active=True,
                                            login="admin", password="secret", port=5000,
                                            allowed_cors_origin=False)
@@ -150,6 +157,14 @@ class TestSettingLoader(unittest.TestCase):
         sl = SettingLoader(file_path=self.settings_file_to_test)
         self.assertEqual([trigger1], sl._get_triggers(self.settings_dict))
 
+    def test_get_players(self):
+        player1 = Player(name="mplayer",
+                         parameters={})
+        player2 = Player(name="pyalsaaudio",
+                         parameters={'device': 'default'})
+        sl = SettingLoader(file_path=self.settings_file_to_test)
+        self.assertEqual([player1, player2], sl._get_players(self.settings_dict))
+
     def test_get_random_wake_up_answers(self):
         expected_random_wake_up_answers = ['Oui monsieur?']
         sl = SettingLoader(file_path=self.settings_file_to_test)

+ 21 - 5
Tests/test_trigger_launcher.py

@@ -1,6 +1,7 @@
 import unittest
 import mock
 
+from kalliope.core.Models.Settings import Settings
 from kalliope.core.TriggerLauncher import TriggerLauncher
 
 from kalliope.core.Models.Trigger import Trigger
@@ -8,7 +9,7 @@ from kalliope.core.Models.Trigger import Trigger
 
 class TestTriggerLauncher(unittest.TestCase):
     """
-    Class to test Launchers Classes (TriggerLauncher, SynapseLauncher, NeuronLauncher) and methods
+    Class to test Launchers Classes (TriggerLauncher) and methods
     """
 
     def setUp(self):
@@ -20,12 +21,27 @@ class TestTriggerLauncher(unittest.TestCase):
         """
         Test the Trigger Launcher trying to run the trigger
         """
-        trigger = Trigger("Trigger", {})
+        trigger1 = Trigger("Trigger", {})
+        trigger2 = Trigger("Trigger2", {'pmdl_file': "trigger/snowboy/resources/kalliope-FR-6samples.pmdl"})
+        settings = Settings()
+        settings.triggers = [trigger1, trigger2]
         with mock.patch("kalliope.core.Utils.get_dynamic_class_instantiation") as mock_get_class_instantiation:
-            TriggerLauncher.get_trigger(trigger=trigger,
+            # Get the trigger 1
+            settings.default_trigger_name = "Trigger"
+            TriggerLauncher.get_trigger(settings=settings,
                                         callback=None)
 
             mock_get_class_instantiation.assert_called_once_with(package_name="trigger",
-                                                                 module_name=trigger.name,
-                                                                 parameters=trigger.parameters)
+                                                                 module_name=trigger1.name,
+                                                                 parameters=trigger1.parameters)
+            mock_get_class_instantiation.reset_mock()
+
+            # Get the trigger 2
+            settings.default_trigger_name = "Trigger2"
+            TriggerLauncher.get_trigger(settings=settings,
+                                        callback=None)
+
+            mock_get_class_instantiation.assert_called_once_with(package_name="trigger",
+                                                                 module_name=trigger2.name,
+                                                                 parameters=trigger2.parameters)
             mock_get_class_instantiation.reset_mock()

+ 3 - 0
install/files/python_requirements.txt

@@ -19,5 +19,8 @@ apscheduler==3.3.0
 GitPython==2.1.1
 packaging>=16.8
 transitions>=0.4.3
+sounddevice>=0.3.7
+SoundFile>=0.9.0
+pyalsaaudio>=0.8.4
 RPi.GPIO>=0.6.3
 

+ 0 - 0
kalliope/players/mplayer/tests/__init__.py


+ 10 - 0
kalliope/players/mplayer/tests/test_mplayer.py

@@ -0,0 +1,10 @@
+import unittest
+
+
+class TestMplayer(unittest.TestCase):
+
+    def test_play(self):
+        pass
+
+if __name__ == '__main__':
+    unittest.main()

+ 0 - 0
kalliope/players/pyalsaaudio/tests/__init__.py


+ 11 - 0
kalliope/players/pyalsaaudio/tests/test_pyalsaaudio.py

@@ -0,0 +1,11 @@
+import unittest
+
+
+class TestPyAlsaAudio(unittest.TestCase):
+
+    def test_play(self):
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()

+ 0 - 0
kalliope/players/pyaudioplayer/tests/__init__.py


+ 10 - 0
kalliope/players/pyaudioplayer/tests/test_pyaudioplayer.py

@@ -0,0 +1,10 @@
+import unittest
+
+
+class TestPyAudioPlayer(unittest.TestCase):
+    def test_play(self):
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()

+ 0 - 0
kalliope/players/sounddeviceplayer/tests/__init__.py


+ 10 - 0
kalliope/players/sounddeviceplayer/tests/test_sounddeviceplayer.py

@@ -0,0 +1,10 @@
+import unittest
+
+
+class TestSoundDevicePlayer(unittest.TestCase):
+    def test_play(self):
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()

+ 2 - 1
setup.py

@@ -84,7 +84,8 @@ setup(
         'packaging>=16.8',
         'transitions>=0.4.3',
         'sounddevice>=0.3.7',
-        'SoundFile>=0.9.0'
+        'SoundFile>=0.9.0',
+        'pyalsaaudio>=0.8.4',
         'RPi.GPIO>=0.6.3'
     ],