test_powerwindow.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import unittest
  2. from utils import *
  3. import sys
  4. import os
  5. import shutil
  6. sys.path.append("wrappers")
  7. from modelverse import *
  8. import threading
  9. import uuid
  10. import glob
  11. def traceability_CTRL2EPN(model):
  12. instantiate(model, "Association", ("PW_Control/State", "Encapsulated_PetriNet/Place"), ID="CTRL2EPN_link")
  13. instantiate(model, "Association", ("PW_Control/Transition", "Encapsulated_PetriNet/Transition"), ID="CTRL2EPN_tlink")
  14. def traceability_PLANT2EPN(model):
  15. instantiate(model, "Association", ("PW_Plant/State", "Encapsulated_PetriNet/Place"), ID="PLANT2EPN_link")
  16. instantiate(model, "Association", ("PW_Plant/Transition", "Encapsulated_PetriNet/Transition"), ID="PLANT2EPN_tlink")
  17. def traceability_ENV2EPN(model):
  18. instantiate(model, "Association", ("PW_Environment/Event", "Encapsulated_PetriNet/Place"), ID="ENV2EPN_link")
  19. def traceability_EPN2PN(model):
  20. instantiate(model, "Association", ("Encapsulated_PetriNet/Place", "PetriNet/Place"), ID="EPN2PN_transition_link")
  21. instantiate(model, "Association", ("Encapsulated_PetriNet/Transition", "PetriNet/Transition"), ID="EPN2PN_place_link")
  22. def upload_req_debug(model):
  23. model_overwrite(model, open("models/PowerWindow/models/requirements.mvc", "r").read())
  24. open(".TEST_POWER_WINDOW/req_%s" % uuid.uuid4(), 'w').close()
  25. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 11
  26. def upload_plant_debug(model):
  27. model_overwrite(model, open("models/PowerWindow/models/plant.mvc", "r").read())
  28. open(".TEST_POWER_WINDOW/plant_%s" % uuid.uuid4(), 'w').close()
  29. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 11
  30. def upload_env_debug(model):
  31. model_overwrite(model, open("models/PowerWindow/models/environment.mvc", "r").read())
  32. open(".TEST_POWER_WINDOW/env_%s" % uuid.uuid4(), 'w').close()
  33. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 11
  34. def upload_ctrl_debug(model):
  35. if (len(glob.glob(".TEST_POWER_WINDOW/ctrl_*")) == 0):
  36. model_overwrite(model, open("models/PowerWindow/models/control_wrong.mvc", "r").read())
  37. else:
  38. model_overwrite(model, open("models/PowerWindow/models/control.mvc", "r").read())
  39. open(".TEST_POWER_WINDOW/ctrl_%s" % uuid.uuid4(), 'w').close()
  40. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 11
  41. def upload_query_debug(model):
  42. model_overwrite(model, open("models/SafetyQuery/models/powerwindow_safe.mvc", "r").read())
  43. open(".TEST_POWER_WINDOW/query_%s" % uuid.uuid4(), 'w').close()
  44. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 11
  45. def upload_arch_debug(model):
  46. model_overwrite(model, open("models/PowerWindow/models/architecture.mvc", "r").read())
  47. open(".TEST_POWER_WINDOW/arch_%s" % uuid.uuid4(), 'w').close()
  48. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 11
  49. def upload_req_fast(model):
  50. model_overwrite(model, open("models/PowerWindow/models/requirements.mvc", "r").read())
  51. open(".TEST_POWER_WINDOW/req_%s" % uuid.uuid4(), 'w').close()
  52. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 6
  53. def upload_plant_fast(model):
  54. model_overwrite(model, open("models/PowerWindow/models/plant.mvc", "r").read())
  55. open(".TEST_POWER_WINDOW/plant_%s" % uuid.uuid4(), 'w').close()
  56. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 6
  57. def upload_env_fast(model):
  58. model_overwrite(model, open("models/PowerWindow/models/environment.mvc", "r").read())
  59. open(".TEST_POWER_WINDOW/env_%s" % uuid.uuid4(), 'w').close()
  60. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 6
  61. def upload_ctrl_fast(model):
  62. model_overwrite(model, open("models/PowerWindow/models/control.mvc", "r").read())
  63. open(".TEST_POWER_WINDOW/ctrl_%s" % uuid.uuid4(), 'w').close()
  64. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 6
  65. def upload_query_fast(model):
  66. model_overwrite(model, open("models/SafetyQuery/models/powerwindow_safe.mvc", "r").read())
  67. open(".TEST_POWER_WINDOW/query_%s" % uuid.uuid4(), 'w').close()
  68. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 6
  69. def upload_arch_fast(model):
  70. model_overwrite(model, open("models/PowerWindow/models/architecture.mvc", "r").read())
  71. open(".TEST_POWER_WINDOW/arch_%s" % uuid.uuid4(), 'w').close()
  72. assert len(glob.glob(".TEST_POWER_WINDOW/*")) <= 6
  73. class TestPowerWindow(unittest.TestCase):
  74. def setUp(self):
  75. self.proc, self.address = start_mvc()
  76. init(self.address)
  77. login("admin", "admin")
  78. def tearDown(self):
  79. kill(self.proc)
  80. def test_process_powerwindow_fast(self):
  81. model_add("formalisms/ReachabilityGraph", "formalisms/SimpleClassDiagrams", open("models/ReachabilityGraph/metamodels/reachability_graph.mvc", "r").read())
  82. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("models/PetriNets/metamodels/PetriNets.mvc", 'r').read())
  83. model_add("formalisms/Encapsulated_PetriNet", "formalisms/SimpleClassDiagrams", open("models/EncapsulatedPetriNets/metamodels/epn.mvc", 'r').read())
  84. model_add("formalisms/PW_Plant", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/plant.mvc", 'r').read())
  85. model_add("formalisms/PW_Environment", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/environment.mvc", 'r').read())
  86. model_add("formalisms/PW_Control", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/control.mvc", 'r').read())
  87. model_add("formalisms/Requirements", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/requirements.mvc", 'r').read())
  88. model_add("formalisms/Query", "formalisms/SimpleClassDiagrams", open("models/SafetyQuery/metamodels/query.mvc", 'r').read())
  89. model_add("formalisms/Architecture", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/architecture.mvc", 'r').read())
  90. model_add("models/pm_powerwindow", "formalisms/ProcessModel", open("models/PowerWindow/PM_analyze.mvc", 'r').read())
  91. transformation_add_MANUAL({"Requirements": "formalisms/Requirements"}, {"Requirements": "formalisms/Requirements"}, "models/revise_req")
  92. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Environment": "formalisms/PW_Environment"}, {"PW_Environment": "formalisms/PW_Environment"}, "models/revise_environment")
  93. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Plant": "formalisms/PW_Plant"}, {"PW_Plant": "formalisms/PW_Plant"}, "models/revise_plant")
  94. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Control": "formalisms/PW_Control"}, {"PW_Control": "formalisms/PW_Control"}, "models/revise_control")
  95. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "Query": "formalisms/Query"}, {"Query": "formalisms/Query"}, "models/revise_query")
  96. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "Architecture": "formalisms/Architecture"}, {"Architecture": "formalisms/Architecture"}, "models/revise_architecture")
  97. transformation_add_MT({}, {"PW_Plant": "formalisms/PW_Plant", "PW_Environment": "formalisms/PW_Environment", "PW_Control": "formalisms/PW_Control", "Query": "formalisms/Query", "Architecture": "formalisms/Architecture", "Requirements": "formalisms/Requirements"}, "models/make_initial_models", open("models/PowerWindow/transformations/initialize.mvc", 'r').read())
  98. transformation_add_MT({"PW_Plant": "formalisms/PW_Plant"}, {"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, "models/plant_to_EPN", open("models/PowerWindow/transformations/plant_to_EPN.mvc", 'r').read(), traceability_PLANT2EPN)
  99. transformation_add_MT({"PW_Control": "formalisms/PW_Control"}, {"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, "models/control_to_EPN", open("models/PowerWindow/transformations/control_to_EPN.mvc", 'r').read(), traceability_CTRL2EPN)
  100. transformation_add_MT({"PW_Environment": "formalisms/PW_Environment"}, {"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, "models/environment_to_EPN", open("models/PowerWindow/transformations/environment_to_EPN.mvc", 'r').read(), traceability_ENV2EPN)
  101. transformation_add_MT({"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet", "Architecture": "formalisms/Architecture"}, {"PetriNet": "formalisms/PetriNet"}, "models/combine_EPN", open("models/EncapsulatedPetriNets/transformations/combine.mvc", 'r').read(), traceability_EPN2PN)
  102. transformation_add_MT({"ReachabilityGraph": "formalisms/ReachabilityGraph", "Query": "formalisms/Query"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/match", open("models/ReachabilityGraph/transformations/match_query.mvc", 'r').read())
  103. transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/reachability", open("models/PetriNets/transformations/reachability.alc", 'r').read())
  104. transformation_add_AL({"ReachabilityGraph": "formalisms/ReachabilityGraph"}, {}, "models/bfs", open("models/ReachabilityGraph/transformations/bfs.alc", 'r').read())
  105. transformation_add_AL({"EPN_Plant": "formalisms/Encapsulated_PetriNet", "EPN_Control": "formalisms/Encapsulated_PetriNet", "EPN_Environment": "formalisms/Encapsulated_PetriNet"}, {"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, "models/merge_EPN", open("models/EncapsulatedPetriNets/transformations/merge.alc", 'r').read())
  106. try:
  107. shutil.rmtree(".TEST_POWER_WINDOW")
  108. except:
  109. pass
  110. os.makedirs(".TEST_POWER_WINDOW")
  111. callbacks = {
  112. "models/revise_req": upload_req_fast,
  113. "models/revise_plant": upload_plant_fast,
  114. "models/revise_environment": upload_env_fast,
  115. "models/revise_control": upload_ctrl_fast,
  116. "models/revise_query": upload_query_fast,
  117. "models/revise_architecture": upload_arch_fast,
  118. }
  119. try:
  120. process_execute("models/pm_powerwindow", {}, callbacks)
  121. except:
  122. import traceback
  123. print(traceback.format_exc())
  124. called = len(os.listdir(".TEST_POWER_WINDOW/"))
  125. shutil.rmtree(".TEST_POWER_WINDOW")
  126. if called != 6:
  127. print(called)
  128. raise Exception("Not executed sufficiently:" + str(called))
  129. @slow
  130. def test_process_powerwindow_debug(self):
  131. model_add("formalisms/ReachabilityGraph", "formalisms/SimpleClassDiagrams", open("models/ReachabilityGraph/metamodels/reachability_graph.mvc", "r").read())
  132. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("models/PetriNets/metamodels/PetriNets.mvc", 'r').read())
  133. model_add("formalisms/Encapsulated_PetriNet", "formalisms/SimpleClassDiagrams", open("models/EncapsulatedPetriNets/metamodels/epn.mvc", 'r').read())
  134. model_add("formalisms/PW_Plant", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/plant.mvc", 'r').read())
  135. model_add("formalisms/PW_Environment", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/environment.mvc", 'r').read())
  136. model_add("formalisms/PW_Control", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/control.mvc", 'r').read())
  137. model_add("formalisms/Requirements", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/requirements.mvc", 'r').read())
  138. model_add("formalisms/Query", "formalisms/SimpleClassDiagrams", open("models/SafetyQuery/metamodels/query.mvc", 'r').read())
  139. model_add("formalisms/Architecture", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/architecture.mvc", 'r').read())
  140. model_add("models/pm_powerwindow", "formalisms/ProcessModel", open("models/PowerWindow/PM_analyze.mvc", 'r').read())
  141. transformation_add_MANUAL({"Requirements": "formalisms/Requirements"}, {"Requirements": "formalisms/Requirements"}, "models/revise_req")
  142. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Environment": "formalisms/PW_Environment"}, {"PW_Environment": "formalisms/PW_Environment"}, "models/revise_environment")
  143. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Plant": "formalisms/PW_Plant"}, {"PW_Plant": "formalisms/PW_Plant"}, "models/revise_plant")
  144. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Control": "formalisms/PW_Control"}, {"PW_Control": "formalisms/PW_Control"}, "models/revise_control")
  145. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "Query": "formalisms/Query"}, {"Query": "formalisms/Query"}, "models/revise_query")
  146. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "Architecture": "formalisms/Architecture"}, {"Architecture": "formalisms/Architecture"}, "models/revise_architecture")
  147. transformation_add_MT({}, {"PW_Plant": "formalisms/PW_Plant", "PW_Environment": "formalisms/PW_Environment", "PW_Control": "formalisms/PW_Control", "Query": "formalisms/Query", "Architecture": "formalisms/Architecture", "Requirements": "formalisms/Requirements"}, "models/make_initial_models", open("models/PowerWindow/transformations/initialize.mvc", 'r').read())
  148. transformation_add_MT({"PW_Plant": "formalisms/PW_Plant"}, {"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, "models/plant_to_EPN", open("models/PowerWindow/transformations/plant_to_EPN.mvc", 'r').read(), traceability_PLANT2EPN)
  149. transformation_add_MT({"PW_Control": "formalisms/PW_Control"}, {"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, "models/control_to_EPN", open("models/PowerWindow/transformations/control_to_EPN.mvc", 'r').read(), traceability_CTRL2EPN)
  150. transformation_add_MT({"PW_Environment": "formalisms/PW_Environment"}, {"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, "models/environment_to_EPN", open("models/PowerWindow/transformations/environment_to_EPN.mvc", 'r').read(), traceability_ENV2EPN)
  151. transformation_add_MT({"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet", "Architecture": "formalisms/Architecture"}, {"PetriNet": "formalisms/PetriNet"}, "models/combine_EPN", open("models/EncapsulatedPetriNets/transformations/combine.mvc", 'r').read(), traceability_EPN2PN)
  152. transformation_add_MT({"ReachabilityGraph": "formalisms/ReachabilityGraph", "Query": "formalisms/Query"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/match", open("models/ReachabilityGraph/transformations/match_query.mvc", 'r').read())
  153. transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/reachability", open("models/PetriNets/transformations/reachability.alc", 'r').read())
  154. transformation_add_AL({"ReachabilityGraph": "formalisms/ReachabilityGraph"}, {}, "models/bfs", open("models/ReachabilityGraph/transformations/bfs.alc", 'r').read())
  155. transformation_add_AL({"EPN_Plant": "formalisms/Encapsulated_PetriNet", "EPN_Control": "formalisms/Encapsulated_PetriNet", "EPN_Environment": "formalisms/Encapsulated_PetriNet"}, {"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, "models/merge_EPN", open("models/EncapsulatedPetriNets/transformations/merge.alc", 'r').read())
  156. try:
  157. shutil.rmtree(".TEST_POWER_WINDOW")
  158. except:
  159. pass
  160. os.makedirs(".TEST_POWER_WINDOW")
  161. import log_output
  162. error_path = []
  163. ctrl = log_output.Controller(error_path, keep_running=False)
  164. thrd = threading.Thread(target=ctrl.start)
  165. thrd.daemon = True
  166. thrd.start()
  167. callbacks = {
  168. "models/revise_req": upload_req_debug,
  169. "models/revise_plant": upload_plant_debug,
  170. "models/revise_environment": upload_env_debug,
  171. "models/revise_control": upload_ctrl_debug,
  172. "models/revise_query": upload_query_debug,
  173. "models/revise_architecture": upload_arch_debug,
  174. "models/bfs": (ctrl, "inp", "outp"),
  175. }
  176. process_execute("models/pm_powerwindow", {}, callbacks)
  177. thrd.join()
  178. called = len(os.listdir(".TEST_POWER_WINDOW"))
  179. shutil.rmtree(".TEST_POWER_WINDOW")
  180. if called != 11:
  181. print(called)
  182. raise Exception("Not executed sufficiently:" + str(called))
  183. assert len(error_path) == 10