test_neuron_launcher.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. # coding: utf-8
  2. import unittest
  3. import mock
  4. from kalliope.core.Models.Resources import Resources
  5. from kalliope.core.NeuronLauncher import NeuronLauncher, NeuronParameterNotAvailable
  6. from kalliope.core.ConfigurationManager import SettingLoader
  7. from kalliope.core.Models.Neuron import Neuron
  8. class TestNeuronLauncher(unittest.TestCase):
  9. """
  10. Class to test Launchers Classes (TriggerLauncher, SynapseLauncher, NeuronLauncher) and methods
  11. """
  12. def setUp(self):
  13. pass
  14. ####
  15. # Neurons Launcher
  16. def test_launch_neuron(self):
  17. """
  18. Test the Neuron Launcher trying to start a Neuron
  19. """
  20. neuron = Neuron(name='neurone1', parameters={'var1': 'val1'})
  21. sl = SettingLoader()
  22. resources = Resources(neuron_folder='/var/tmp/test/resources')
  23. sl.settings.resources = resources
  24. with mock.patch("kalliope.core.Utils.get_dynamic_class_instantiation") as mock_get_class_instantiation:
  25. NeuronLauncher.launch_neuron(neuron=neuron)
  26. mock_get_class_instantiation.assert_called_once_with(package_name="neurons",
  27. module_name=neuron.name,
  28. parameters=neuron.parameters,
  29. resources_dir=sl.settings.resources.neuron_folder)
  30. mock_get_class_instantiation.reset_mock()
  31. def test_start_neuron(self):
  32. """
  33. Testing params association and starting a Neuron
  34. """
  35. with mock.patch("kalliope.core.NeuronLauncher.launch_neuron") as mock_launch_neuron_method:
  36. # Assert to the neuron is launched with not parameter from order
  37. neuron1 = Neuron(name='neurone1', parameters={'var1': 'val1'})
  38. NeuronLauncher.start_neuron(neuron=neuron1)
  39. mock_launch_neuron_method.assert_called_with(neuron1)
  40. mock_launch_neuron_method.reset_mock()
  41. # Assert the params are well passed to the neuron
  42. neuron2 = Neuron(name='neurone2', parameters={'var2': 'val2', 'var3': "{{ var3 }}"})
  43. params = {
  44. 'var3': 'value3'
  45. }
  46. NeuronLauncher.start_neuron(neuron=neuron2,
  47. parameters_dict=params)
  48. neuron2_params = Neuron(name='neurone2', parameters={'var2': 'val2', 'var3': 'value3'})
  49. mock_launch_neuron_method.assert_called_with(neuron2_params)
  50. mock_launch_neuron_method.reset_mock()
  51. # Assert the Neuron is not started when missing args
  52. neuron3 = Neuron(name='neurone3', parameters={'var3': 'val3', 'var4': '{{val4}}'})
  53. params = {
  54. 'not_exist': 'test'
  55. }
  56. NeuronLauncher.start_neuron(neuron=neuron3,
  57. parameters_dict=params)
  58. mock_launch_neuron_method.assert_not_called()
  59. mock_launch_neuron_method.reset_mock()
  60. # Assert no neuron is launched when waiting for args and none are given
  61. neuron4 = Neuron(name='neurone4', parameters={'var5': 'val5', 'var6': '{{val6}}'})
  62. NeuronLauncher.start_neuron(neuron=neuron4)
  63. mock_launch_neuron_method.assert_not_called()
  64. mock_launch_neuron_method.reset_mock()
  65. def test_replace_brackets_by_loaded_parameter(self):
  66. # -------------------
  67. # test with string
  68. # -------------------
  69. # the target value to replace is present in the loaded parameter dict
  70. neuron_parameters = {
  71. "param1": "this is a value {{ replaced }}"
  72. }
  73. loaded_parameters = {
  74. "replaced": "replaced successfully"
  75. }
  76. expected_result = {
  77. "param1": "this is a value replaced successfully"
  78. }
  79. self.assertEqual(expected_result, NeuronLauncher._replace_brackets_by_loaded_parameter(neuron_parameters,
  80. loaded_parameters))
  81. # the target value with unicode to replace is present in the loaded parameter dict
  82. neuron_parameters = {
  83. "param1": "this is a value {{ replaced }}"
  84. }
  85. loaded_parameters = {
  86. "replaced": u"rêmpläcée successfülly"
  87. }
  88. expected_result = {
  89. "param1": "this is a value rêmpläcée successfülly"
  90. }
  91. self.assertEqual(expected_result, NeuronLauncher._replace_brackets_by_loaded_parameter(neuron_parameters,
  92. loaded_parameters))
  93. # the target value to replace is NOT present in the loaded parameter dict
  94. neuron_parameters = {
  95. "param1": "this is a value {{ replaced }}"
  96. }
  97. loaded_parameters = {
  98. "not_exist": "replaced successfully"
  99. }
  100. with self.assertRaises(NeuronParameterNotAvailable):
  101. NeuronLauncher._replace_brackets_by_loaded_parameter(neuron_parameters, loaded_parameters)
  102. # one parameter doesn't contains bracket, the other one do
  103. neuron_parameters = {
  104. "param1": "this is a value {{ replaced }}",
  105. "param2": "value"
  106. }
  107. loaded_parameters = {
  108. "replaced": "replaced successfully"
  109. }
  110. expected_result = {
  111. "param1": "this is a value replaced successfully",
  112. "param2": "value"
  113. }
  114. self.assertEqual(expected_result, NeuronLauncher._replace_brackets_by_loaded_parameter(neuron_parameters,
  115. loaded_parameters))
  116. # parameters are integer or boolean
  117. neuron_parameters = {
  118. "param1": 1,
  119. "param2": True
  120. }
  121. loaded_parameters = {
  122. "replaced": "replaced successfully"
  123. }
  124. expected_result = {
  125. "param1": 1,
  126. "param2": True
  127. }
  128. self.assertEqual(expected_result, NeuronLauncher._replace_brackets_by_loaded_parameter(neuron_parameters,
  129. loaded_parameters))
  130. # parameters are say_template or file template. Should not be altered by the loader
  131. neuron_parameters = {
  132. "say_template": "{{output}}",
  133. "file_template": "here is a file"
  134. }
  135. loaded_parameters = {
  136. "output": "should not be used"
  137. }
  138. expected_result = {
  139. "say_template": "{{output}}",
  140. "file_template": "here is a file"
  141. }
  142. self.assertEqual(expected_result, NeuronLauncher._replace_brackets_by_loaded_parameter(neuron_parameters,
  143. loaded_parameters))
  144. def test_parameters_are_available_in_loaded_parameters(self):
  145. # the parameter in bracket is available in the dict
  146. string_parameters = "this is a {{ parameter1 }}"
  147. loaded_parameters = {"parameter1": "value"}
  148. self.assertTrue(NeuronLauncher._neuron_parameters_are_available_in_loaded_parameters(string_parameters,
  149. loaded_parameters))
  150. # the parameter in bracket is NOT available in the dict
  151. string_parameters = "this is a {{ parameter1 }}"
  152. loaded_parameters = {"parameter2": "value"}
  153. self.assertFalse(NeuronLauncher._neuron_parameters_are_available_in_loaded_parameters(string_parameters,
  154. loaded_parameters))
  155. # the string_parameters doesn't contains bracket in bracket is available in the dict
  156. string_parameters = "this is a {{ parameter1 }}"
  157. loaded_parameters = {"parameter1": "value"}
  158. self.assertTrue(NeuronLauncher._neuron_parameters_are_available_in_loaded_parameters(string_parameters,
  159. loaded_parameters))
  160. # the string_parameters contains 2 parameters available in the dict
  161. string_parameters = "this is a {{ parameter1 }} and this is {{ parameter2 }}"
  162. loaded_parameters = {"parameter1": "value", "parameter2": "other value"}
  163. self.assertTrue(NeuronLauncher._neuron_parameters_are_available_in_loaded_parameters(string_parameters,
  164. loaded_parameters))
  165. # the string_parameters contains 2 parameters and one of them is not available in the dict
  166. string_parameters = "this is a {{ parameter1 }} and this is {{ parameter2 }}"
  167. loaded_parameters = {"parameter1": "value", "parameter3": "other value"}
  168. self.assertFalse(NeuronLauncher._neuron_parameters_are_available_in_loaded_parameters(string_parameters,
  169. loaded_parameters))
  170. if __name__ == '__main__':
  171. unittest.main()
  172. # suite = unittest.TestSuite()
  173. # suite.addTest(TestNeuronLauncher("test_start_neuron"))
  174. # runner = unittest.TextTestRunner()
  175. # runner.run(suite)