test_neuron_launcher.py 8.7 KB

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