def test_replicated_ids(): replicator = ProtocolReplicator("replicator-a") protocol_a = DummyProtocol("protocol-a") protocol_a.input_value = 1 group_a = ProtocolGroup(f"group-a-{replicator.placeholder_id}") group_a.add_protocols(protocol_a) schema = WorkflowSchema() schema.protocol_schemas = [group_a.schema] schema.protocol_replicators = [replicator] with pytest.raises(ValueError) as error_info: schema.validate() assert ( f"The children of replicated protocol {group_a.id} must also contain the " "replicators placeholder" in str(error_info.value))
def build_protocols(prefix): # .-------------------. # | / i - j -|- b # a - | g - h - | | # | \ k - l -|- c # .-------------------. protocol_a = DummyInputOutputProtocol(prefix + "protocol_a") protocol_a.input_value = 1 fork_protocols = build_fork(prefix) fork_protocols[0].input_value = ProtocolPath("output_value", protocol_a.id) protocol_group = ProtocolGroup(prefix + "protocol_group") protocol_group.add_protocols(*fork_protocols) protocol_b = DummyInputOutputProtocol(prefix + "protocol_b") protocol_b.input_value = ProtocolPath("output_value", protocol_group.id, "protocol_j") protocol_c = DummyInputOutputProtocol(prefix + "protocol_c") protocol_c.input_value = ProtocolPath("output_value", protocol_group.id, "protocol_l") return [protocol_a, protocol_group, protocol_b, protocol_c]
def test_protocol_group_resume(): """A test that protocol groups can recover after being killed (e.g. by a worker being killed due to hitting a wallclock limit) """ compute_resources = ComputeResources() # Fake a protocol group which executes the first # two protocols and then 'gets killed'. protocol_a = DummyInputOutputProtocol("protocol_a") protocol_a.input_value = 1 protocol_b = DummyInputOutputProtocol("protocol_b") protocol_b.input_value = ProtocolPath("output_value", protocol_a.id) protocol_group_a = ProtocolGroup("group_a") protocol_group_a.add_protocols(protocol_a, protocol_b) protocol_graph = ProtocolGraph() protocol_graph.add_protocols(protocol_group_a) protocol_graph.execute("graph_a", compute_resources=compute_resources) # Remove the output file so it appears the the protocol group had not # completed. os.unlink( os.path.join("graph_a", protocol_group_a.id, f"{protocol_group_a.id}_output.json")) # Build the 'full' group with the last two protocols which # 'had not been exited' after the group was 'killed' protocol_a = DummyInputOutputProtocol("protocol_a") protocol_a.input_value = 1 protocol_b = DummyInputOutputProtocol("protocol_b") protocol_b.input_value = ProtocolPath("output_value", protocol_a.id) protocol_c = DummyInputOutputProtocol("protocol_c") protocol_c.input_value = ProtocolPath("output_value", protocol_b.id) protocol_d = DummyInputOutputProtocol("protocol_d") protocol_d.input_value = ProtocolPath("output_value", protocol_c.id) protocol_group_a = ProtocolGroup("group_a") protocol_group_a.add_protocols(protocol_a, protocol_b, protocol_c, protocol_d) protocol_graph = ProtocolGraph() protocol_graph.add_protocols(protocol_group_a) protocol_graph.execute("graph_a", compute_resources=compute_resources) assert all(x != UNDEFINED for x in protocol_group_a.outputs.values())
def test_protocol_group_exceptions(): exception_protocol = ExceptionProtocol("exception_protocol") protocol_group = ProtocolGroup("protocol_group") protocol_group.add_protocols(exception_protocol) with tempfile.TemporaryDirectory() as directory: with pytest.raises(RuntimeError): protocol_group.execute(directory, ComputeResources())
def test_unique_ids(): protocol_a = DummyProtocol("protocol-a") protocol_a.input_value = 1 group_a = ProtocolGroup("group-a") group_a.add_protocols(protocol_a) group_b = ProtocolGroup("group-b") group_b.add_protocols(protocol_a) schema = WorkflowSchema() schema.protocol_schemas = [group_a.schema, group_b.schema] with pytest.raises(ValueError) as error_info: schema.validate() assert "Several protocols in the schema have the same id" in str( error_info.value) assert "protocol-a" in str(error_info.value)
def test_protocol_group_execution(): protocol_a = DummyInputOutputProtocol("protocol_a") protocol_a.input_value = 1 protocol_b = DummyInputOutputProtocol("protocol_b") protocol_b.input_value = ProtocolPath("output_value", protocol_a.id) protocol_group = ProtocolGroup("protocol_group") protocol_group.add_protocols(protocol_a, protocol_b) with tempfile.TemporaryDirectory() as directory: protocol_group.execute(directory, ComputeResources()) value_path = ProtocolPath("output_value", protocol_group.id, protocol_b.id) final_value = protocol_group.get_value(value_path) assert final_value == protocol_a.input_value