test_powerwindow.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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. def traceability_CTRL2EPN(model):
  10. instantiate(model, "Association", ("PW_Control/State", "Encapsulated_PetriNet/Place"), ID="CTRL2EPN_link")
  11. instantiate(model, "Association", ("PW_Control/Transition", "Encapsulated_PetriNet/Transition"), ID="CTRL2EPN_tlink")
  12. def traceability_PLANT2EPN(model):
  13. instantiate(model, "Association", ("PW_Plant/State", "Encapsulated_PetriNet/Place"), ID="PLANT2EPN_link")
  14. instantiate(model, "Association", ("PW_Plant/Transition", "Encapsulated_PetriNet/Transition"), ID="PLANT2EPN_tlink")
  15. def traceability_ENV2EPN(model):
  16. instantiate(model, "Association", ("PW_Environment/Event", "Encapsulated_PetriNet/Place"), ID="ENV2EPN_link")
  17. def traceability_EPN2PN(model):
  18. instantiate(model, "Association", ("Encapsulated_PetriNet/Place", "PetriNet/Place"), ID="EPN2PN_transition_link")
  19. instantiate(model, "Association", ("Encapsulated_PetriNet/Transition", "PetriNet/Transition"), ID="EPN2PN_place_link")
  20. class TestPowerWindow(unittest.TestCase):
  21. def setUp(self):
  22. self.proc, self.address = start_mvc()
  23. init(self.address)
  24. login("admin", "admin")
  25. def tearDown(self):
  26. kill(self.proc)
  27. def test_process_powerwindow_fast(self):
  28. model_add("formalisms/ReachabilityGraph", "formalisms/SimpleClassDiagrams", open("models/ReachabilityGraph/metamodels/reachability_graph.mvc", "r").read())
  29. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("models/PetriNets/metamodels/PetriNets.mvc", 'r').read())
  30. model_add("formalisms/Encapsulated_PetriNet", "formalisms/SimpleClassDiagrams", open("models/EncapsulatedPetriNets/metamodels/epn.mvc", 'r').read())
  31. model_add("formalisms/PW_Plant", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/plant.mvc", 'r').read())
  32. model_add("formalisms/PW_Environment", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/environment.mvc", 'r').read())
  33. model_add("formalisms/PW_Control", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/control.mvc", 'r').read())
  34. model_add("formalisms/Requirements", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/requirements.mvc", 'r').read())
  35. model_add("formalisms/Query", "formalisms/SimpleClassDiagrams", open("models/SafetyQuery/metamodels/query.mvc", 'r').read())
  36. model_add("formalisms/Architecture", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/architecture.mvc", 'r').read())
  37. model_add("models/pm_powerwindow", "formalisms/ProcessModel", open("models/PowerWindow/PM_analyze.mvc", 'r').read())
  38. transformation_add_MANUAL({"Requirements": "formalisms/Requirements"}, {"Requirements": "formalisms/Requirements"}, "models/revise_req")
  39. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Environment": "formalisms/PW_Environment"}, {"PW_Environment": "formalisms/PW_Environment"}, "models/revise_environment")
  40. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Plant": "formalisms/PW_Plant"}, {"PW_Plant": "formalisms/PW_Plant"}, "models/revise_plant")
  41. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Control": "formalisms/PW_Control"}, {"PW_Control": "formalisms/PW_Control"}, "models/revise_control")
  42. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "Query": "formalisms/Query"}, {"Query": "formalisms/Query"}, "models/revise_query")
  43. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "Architecture": "formalisms/Architecture"}, {"Architecture": "formalisms/Architecture"}, "models/revise_architecture")
  44. 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())
  45. 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)
  46. 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)
  47. 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)
  48. 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)
  49. transformation_add_MT({"ReachabilityGraph": "formalisms/ReachabilityGraph", "Query": "formalisms/Query"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/match", open("models/ReachabilityGraph/transformations/match_query.mvc", 'r').read())
  50. transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/reachability", open("models/PetriNets/transformations/reachability.alc", 'r').read())
  51. transformation_add_AL({"ReachabilityGraph": "formalisms/ReachabilityGraph"}, {}, "models/bfs", open("models/ReachabilityGraph/transformations/bfs.alc", 'r').read())
  52. 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())
  53. nr_of_operations = 6
  54. try:
  55. shutil.rmtree(".TEST_POWER_WINDOW")
  56. except:
  57. pass
  58. os.makedirs(".TEST_POWER_WINDOW")
  59. def get_function(filename):
  60. def func(model):
  61. import uuid
  62. import os
  63. called = len(os.listdir(".TEST_POWER_WINDOW/"))
  64. if called > nr_of_operations:
  65. raise Exception("Seemingly called some operation twice!")
  66. else:
  67. f = open(".TEST_POWER_WINDOW/%s" % str(uuid.uuid4()), 'w')
  68. f.write(filename)
  69. f.close()
  70. model_overwrite(model, open(filename, "r").read())
  71. return func
  72. cb_req = get_function( "models/PowerWindow/models/requirements.mvc")
  73. cb_plant = get_function("models/PowerWindow/models/plant.mvc")
  74. cb_env = get_function( "models/PowerWindow/models/environment.mvc")
  75. cb_ctrl = get_function( "models/PowerWindow/models/control.mvc")
  76. cb_query = get_function("models/SafetyQuery/models/powerwindow_safe.mvc")
  77. cb_arch = get_function( "models/PowerWindow/models/architecture.mvc")
  78. callbacks = {
  79. "models/revise_req": cb_req,
  80. "models/revise_plant": cb_plant,
  81. "models/revise_environment": cb_env,
  82. "models/revise_control": cb_ctrl,
  83. "models/revise_query": cb_query,
  84. "models/revise_architecture": cb_arch,
  85. }
  86. try:
  87. process_execute("models/pm_powerwindow", {}, callbacks)
  88. except:
  89. import traceback
  90. print(traceback.format_exc())
  91. called = len(os.listdir(".TEST_POWER_WINDOW/"))
  92. shutil.rmtree(".TEST_POWER_WINDOW")
  93. if called != 6:
  94. print(called)
  95. raise Exception("Not executed sufficiently:" + str(called))
  96. @slow
  97. def test_process_powerwindow_debug(self):
  98. model_add("formalisms/ReachabilityGraph", "formalisms/SimpleClassDiagrams", open("models/ReachabilityGraph/metamodels/reachability_graph.mvc", "r").read())
  99. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("models/PetriNets/metamodels/PetriNets.mvc", 'r').read())
  100. model_add("formalisms/Encapsulated_PetriNet", "formalisms/SimpleClassDiagrams", open("models/EncapsulatedPetriNets/metamodels/epn.mvc", 'r').read())
  101. model_add("formalisms/PW_Plant", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/plant.mvc", 'r').read())
  102. model_add("formalisms/PW_Environment", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/environment.mvc", 'r').read())
  103. model_add("formalisms/PW_Control", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/control.mvc", 'r').read())
  104. model_add("formalisms/Requirements", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/requirements.mvc", 'r').read())
  105. model_add("formalisms/Query", "formalisms/SimpleClassDiagrams", open("models/SafetyQuery/metamodels/query.mvc", 'r').read())
  106. model_add("formalisms/Architecture", "formalisms/SimpleClassDiagrams", open("models/PowerWindow/metamodels/architecture.mvc", 'r').read())
  107. model_add("models/pm_powerwindow", "formalisms/ProcessModel", open("models/PowerWindow/PM_analyze.mvc", 'r').read())
  108. transformation_add_MANUAL({"Requirements": "formalisms/Requirements"}, {"Requirements": "formalisms/Requirements"}, "models/revise_req")
  109. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Environment": "formalisms/PW_Environment"}, {"PW_Environment": "formalisms/PW_Environment"}, "models/revise_environment")
  110. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Plant": "formalisms/PW_Plant"}, {"PW_Plant": "formalisms/PW_Plant"}, "models/revise_plant")
  111. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "PW_Control": "formalisms/PW_Control"}, {"PW_Control": "formalisms/PW_Control"}, "models/revise_control")
  112. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "Query": "formalisms/Query"}, {"Query": "formalisms/Query"}, "models/revise_query")
  113. transformation_add_MANUAL({"Requirements": "formalisms/Requirements", "Architecture": "formalisms/Architecture"}, {"Architecture": "formalisms/Architecture"}, "models/revise_architecture")
  114. 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())
  115. 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)
  116. 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)
  117. 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)
  118. 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)
  119. transformation_add_MT({"ReachabilityGraph": "formalisms/ReachabilityGraph", "Query": "formalisms/Query"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/match", open("models/ReachabilityGraph/transformations/match_query.mvc", 'r').read())
  120. transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/reachability", open("models/PetriNets/transformations/reachability.alc", 'r').read())
  121. transformation_add_AL({"ReachabilityGraph": "formalisms/ReachabilityGraph"}, {}, "models/bfs", open("models/ReachabilityGraph/transformations/bfs.alc", 'r').read())
  122. 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())
  123. try:
  124. shutil.rmtree(".TEST_POWER_WINDOW")
  125. except:
  126. pass
  127. os.makedirs(".TEST_POWER_WINDOW")
  128. executed = set([])
  129. def get_function(filename, fixed=None):
  130. def func(model):
  131. import uuid
  132. import os
  133. import glob
  134. nr_operations = 11
  135. called = len(os.listdir(".TEST_POWER_WINDOW/"))
  136. if (len(os.listdir(".TEST_POWER_WINDOW")) > nr_operations):
  137. raise Exception("Seemingly called some operation twice!")
  138. elif (len(glob.glob(".TEST_POWER_WINDOW/%s_*" % str(filename.rsplit("/", 1)[-1]))) == 0) or fixed is None:
  139. model_overwrite(model, open(filename, "r").read())
  140. else:
  141. model_overwrite(model, open(fixed, "r").read())
  142. open(".TEST_POWER_WINDOW/%s_%s" % (filename.rsplit("/", 1)[-1], uuid.uuid4()), 'w').close()
  143. return func
  144. cb_req = get_function( "models/PowerWindow/models/requirements.mvc")
  145. cb_plant = get_function("models/PowerWindow/models/plant.mvc")
  146. cb_env = get_function( "models/PowerWindow/models/environment.mvc")
  147. cb_ctrl = get_function( "models/PowerWindow/models/control_wrong.mvc", fixed="models/PowerWindow/models/control.mvc")
  148. cb_query = get_function("models/SafetyQuery/models/powerwindow_safe.mvc")
  149. cb_arch = get_function( "models/PowerWindow/models/architecture.mvc")
  150. import log_output
  151. error_path = []
  152. ctrl = log_output.Controller(error_path, keep_running=False)
  153. thrd = threading.Thread(target=ctrl.start)
  154. thrd.daemon = True
  155. thrd.start()
  156. callbacks = {
  157. "models/revise_req": cb_req,
  158. "models/revise_plant": cb_plant,
  159. "models/revise_environment": cb_env,
  160. "models/revise_control": cb_ctrl,
  161. "models/revise_query": cb_query,
  162. "models/revise_architecture": cb_arch,
  163. "models/bfs": (ctrl, "inp", "outp"),
  164. }
  165. process_execute("models/pm_powerwindow", {}, callbacks)
  166. thrd.join()
  167. called = len(os.listdir(".TEST_POWER_WINDOW"))
  168. shutil.rmtree(".TEST_POWER_WINDOW")
  169. if called != 11:
  170. print(called)
  171. raise Exception("Not executed sufficiently:" + str(called))
  172. assert len(error_path) == 10