test_launchers.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. import unittest
  2. import mock
  3. from kalliope.core.Models.Resources import Resources
  4. from kalliope.core.NeuronLauncher import NeuronLauncher
  5. from kalliope.core.SynapseLauncher import SynapseLauncher, SynapseNameNotFound
  6. from kalliope.core.TriggerLauncher import TriggerLauncher
  7. from kalliope.core.ConfigurationManager import SettingLoader
  8. from kalliope.core.Models.Settings import Settings
  9. from kalliope.core.Models.Trigger import Trigger
  10. from kalliope.core.Models.Neuron import Neuron
  11. from kalliope.core.Models.Order import Order
  12. from kalliope.core.Models.Brain import Brain
  13. from kalliope.core.Models.Synapse import Synapse
  14. class TestLaunchers(unittest.TestCase):
  15. """
  16. Class to test Launchers Classes (TriggerLauncher, SynapseLauncher, NeuronLauncher) and methods
  17. """
  18. def setUp(self):
  19. pass
  20. ####
  21. # Trigger Launcher
  22. def test_get_trigger(self):
  23. """
  24. Test the Trigger Launcher trying to run the trigger
  25. """
  26. trigger = Trigger("Trigger", {})
  27. with mock.patch("kalliope.core.Utils.get_dynamic_class_instantiation") as mock_get_class_instantiation:
  28. TriggerLauncher.get_trigger(trigger=trigger,
  29. callback=None)
  30. mock_get_class_instantiation.assert_called_once_with(package_name="trigger",
  31. module_name=trigger.name,
  32. parameters=trigger.parameters)
  33. mock_get_class_instantiation.reset_mock()
  34. ####
  35. # Synapse Launcher
  36. def test_start_synapse(self):
  37. """
  38. Test the Synapse launcher trying to start synapse
  39. """
  40. # Init
  41. neuron1 = Neuron(name='neurone1', parameters={'var1': 'val1'})
  42. neuron2 = Neuron(name='neurone2', parameters={'var2': 'val2'})
  43. neuron3 = Neuron(name='neurone3', parameters={'var3': 'val3'})
  44. neuron4 = Neuron(name='neurone4', parameters={'var4': 'val4'})
  45. signal1 = Order(sentence="this is the sentence")
  46. signal2 = Order(sentence="this is the second sentence")
  47. signal3 = Order(sentence="that is part of the third sentence")
  48. synapse1 = Synapse(name="Synapse1", neurons=[neuron1, neuron2], signals=[signal1])
  49. synapse2 = Synapse(name="Synapse2", neurons=[neuron3, neuron4], signals=[signal2])
  50. synapse3 = Synapse(name="Synapse3", neurons=[neuron2, neuron4], signals=[signal3])
  51. all_synapse_list = [synapse1,
  52. synapse2,
  53. synapse3]
  54. br = Brain(synapses=all_synapse_list)
  55. sl = SettingLoader()
  56. r = Resources(neuron_folder="/var/tmp/test/resources")
  57. sl.settings.resources = r
  58. with mock.patch("kalliope.core.Utils.get_dynamic_class_instantiation") as mock_get_class_instantiation:
  59. # Success
  60. SynapseLauncher.start_synapse("Synapse1", brain=br)
  61. calls = [mock.call(package_name="neurons",
  62. module_name=neuron1.name,
  63. parameters=neuron1.parameters,
  64. resources_dir='/var/tmp/test/resources'),
  65. mock.call(package_name="neurons",
  66. module_name=neuron2.name,
  67. parameters=neuron2.parameters,
  68. resources_dir='/var/tmp/test/resources')]
  69. mock_get_class_instantiation.assert_has_calls(calls=calls)
  70. mock_get_class_instantiation.reset_mock()
  71. # Fail
  72. with self.assertRaises(SynapseNameNotFound):
  73. SynapseLauncher.start_synapse("Synapse4", brain=br)
  74. def test_run_synapse(self):
  75. """
  76. Test to run a Synapse
  77. """
  78. neuron1 = Neuron(name='neurone1', parameters={'var1': 'val1'})
  79. neuron2 = Neuron(name='neurone2', parameters={'var2': 'val2'})
  80. signal1 = Order(sentence="this is the sentence")
  81. synapse1 = Synapse(name="Synapse1", neurons=[neuron1, neuron2], signals=[signal1])
  82. synapse_empty = Synapse(name="Synapse_empty", neurons=[], signals=[signal1])
  83. sl = SettingLoader()
  84. resources = Resources(neuron_folder='/var/tmp/test/resources')
  85. sl.settings.resources = resources
  86. with mock.patch("kalliope.core.Utils.get_dynamic_class_instantiation") as mock_get_class_instantiation:
  87. SynapseLauncher._run_synapse(synapse=synapse1)
  88. calls = [mock.call(package_name="neurons",
  89. module_name=neuron1.name,
  90. parameters=neuron1.parameters,
  91. resources_dir="/var/tmp/test/resources"),
  92. mock.call(package_name="neurons",
  93. module_name=neuron2.name,
  94. parameters=neuron2.parameters,
  95. resources_dir="/var/tmp/test/resources")]
  96. mock_get_class_instantiation.assert_has_calls(calls=calls)
  97. mock_get_class_instantiation.reset_mock()
  98. # Do not any Neurons
  99. SynapseLauncher._run_synapse(synapse=synapse_empty)
  100. mock_get_class_instantiation.assert_not_called()
  101. mock_get_class_instantiation.reset_mock()
  102. ####
  103. # Neurons Launcher
  104. def test_start_neuron(self):
  105. """
  106. Test the Neuron Launcher trying to start a Neuron
  107. """
  108. neuron = Neuron(name='neurone1', parameters={'var1': 'val1'})
  109. sl = SettingLoader()
  110. resources = Resources(neuron_folder='/var/tmp/test/resources')
  111. sl.settings.resources = resources
  112. with mock.patch("kalliope.core.Utils.get_dynamic_class_instantiation") as mock_get_class_instantiation:
  113. NeuronLauncher.start_neuron(neuron=neuron)
  114. mock_get_class_instantiation.assert_called_once_with(package_name="neurons",
  115. module_name=neuron.name,
  116. parameters=neuron.parameters,
  117. resources_dir=sl.settings.resources.neuron_folder)
  118. mock_get_class_instantiation.reset_mock()
  119. def test_replace_global_variables(self):
  120. """
  121. Testing the _replace_global_variables function from the NeuronLauncher.
  122. Scenarii:
  123. - 1/ only one global variable
  124. - 2/ global variable with string after
  125. - 3/ global variable with int after
  126. - 4/ multiple global variables
  127. - 5/ parameter value is a list
  128. """
  129. # 1/ only one global variable
  130. neuron1 = Neuron(name='neuron1', parameters={'var1': '{{hello}}'})
  131. variables = {
  132. "hello": "test",
  133. "hello2": "test2",
  134. }
  135. st = Settings(variables=variables)
  136. expected_neuron_result = Neuron(name='neuron1', parameters={'var1': 'test'})
  137. # assign global variable to neuron1
  138. NeuronLauncher._replace_global_variables(neuron=neuron1,
  139. settings=st)
  140. self.assertEquals(neuron1,
  141. expected_neuron_result,
  142. "Fail to assign a single global variable to neuron")
  143. # 2/ global variable with string after
  144. neuron1 = Neuron(name='neuron1', parameters={'var1': '{{hello}} Sispheor'})
  145. variables = {
  146. "hello": "test",
  147. "hello2": "test2",
  148. }
  149. st = Settings(variables=variables)
  150. expected_neuron_result = Neuron(name='neuron1', parameters={'var1': 'test Sispheor'})
  151. # assign global variable to neuron1
  152. NeuronLauncher._replace_global_variables(neuron=neuron1,
  153. settings=st)
  154. self.assertEquals(neuron1,
  155. expected_neuron_result,
  156. "Fail to assign a global variable with string after to neuron")
  157. # 3/ global variable with int after
  158. neuron1 = Neuron(name='neuron1', parameters={'var1': '{{hello}}0'})
  159. variables = {
  160. "hello": 60,
  161. "hello2": "test2",
  162. }
  163. st = Settings(variables=variables)
  164. expected_neuron_result = Neuron(name='neuron1', parameters={'var1': '600'})
  165. # assign global variable to neuron1
  166. NeuronLauncher._replace_global_variables(neuron=neuron1,
  167. settings=st)
  168. self.assertEquals(neuron1,
  169. expected_neuron_result,
  170. "Fail to assign global variable with int after to neuron")
  171. # 4/ multiple global variables
  172. neuron1 = Neuron(name='neuron1', parameters={'var1': '{{hello}} {{me}}'})
  173. variables = {
  174. "hello": "hello",
  175. "me": "LaMonf"
  176. }
  177. st = Settings(variables=variables)
  178. expected_neuron_result = Neuron(name='neuron1', parameters={'var1': 'hello LaMonf'})
  179. # assign global variable to neuron1
  180. NeuronLauncher._replace_global_variables(neuron=neuron1,
  181. settings=st)
  182. self.assertEquals(neuron1,
  183. expected_neuron_result,
  184. "Fail to assign multiple global variables to neuron")
  185. # 5/ parameter value is a list
  186. neuron1 = Neuron(name='neuron1', parameters={'var1': '[hello {{name}}, bonjour {{name}}]'})
  187. variables = {
  188. "name": "LaMonf",
  189. "hello2": "test2",
  190. }
  191. st = Settings(variables=variables)
  192. expected_neuron_result = Neuron(name='neuron1', parameters={'var1': '[hello LaMonf, bonjour LaMonf]'})
  193. # assign global variable to neuron1
  194. NeuronLauncher._replace_global_variables(neuron=neuron1,
  195. settings=st)
  196. self.assertEquals(neuron1,
  197. expected_neuron_result,
  198. "Fail to assign a single global when parameter value is a list to neuron")
  199. def test_get_global_variable(self):
  200. """
  201. Test the get_global_variable of the OrderAnalyser Class
  202. """
  203. sentence = "i am {{name2}}"
  204. variables = {
  205. "name": "LaMonf",
  206. "name2": "kalliope",
  207. }
  208. st = Settings(variables=variables)
  209. expected_result = "i am kalliope"
  210. self.assertEquals(NeuronLauncher._get_global_variable(sentence=sentence,
  211. settings=st),
  212. expected_result,
  213. "Fail to get the global variable from the sentence")