def test_association_acse_timeout(self): """ Check that the Association timeouts are being set correctly """ self.scp = DummyVerificationSCP() self.scp.ae.acse_timeout = 0 self.scp.ae.dimse_timeout = 0 self.scp.start() ae = AE(scu_sop_class=[VerificationSOPClass]) ae.acse_timeout = 0 ae.dimse_timeout = 0 assoc = ae.associate('localhost', 11112) self.assertTrue(self.scp.ae.active_associations[0].acse_timeout == 0) self.assertTrue(self.scp.ae.active_associations[0].dimse_timeout == 0) self.assertTrue(assoc.acse_timeout == 0) self.assertTrue(assoc.dimse_timeout == 0) assoc.release() self.scp.ae.acse_timeout = 21 self.scp.ae.dimse_timeout = 22 ae.acse_timeout = 31 ae.dimse_timeout = 32 assoc = ae.associate('localhost', 11112) self.assertTrue(self.scp.ae.active_associations[0].acse_timeout == 21) self.assertTrue(self.scp.ae.active_associations[0].dimse_timeout == 22) self.assertTrue(assoc.acse_timeout == 31) self.assertTrue(assoc.dimse_timeout == 32) assoc.release() self.scp.stop()
def test_association_timeouts(self): """ Check that the Association timeouts are being set correctly and work """ self.scp = DummyVerificationSCP() self.scp.start() ae = AE(scu_sop_class=[VerificationSOPClass]) self.scp.ae.acse_timeout = 0 self.scp.ae.dimse_timeout = 0 self.scp.ae.network_timeout = 0.2 ae.acse_timeout = 30 ae.dimse_timeout = 30 assoc = ae.associate('localhost', 11112) time.sleep(1) self.assertTrue(len(self.scp.ae.active_associations) == 0) self.scp.ae.acse_timeout = None self.scp.ae.dimse_timeout = None self.scp.ae.network_timeout = None ae.acse_timeout = 30 ae.dimse_timeout = 0 self.scp.delay = 1 assoc = ae.associate('localhost', 11112) assoc.send_c_echo() time.sleep(2) self.assertTrue(len(self.scp.ae.active_associations) == 0) ae.acse_timeout = 0 ae.dimse_timeout = 30 assoc = ae.associate('localhost', 11112) time.sleep(1) self.assertTrue(len(self.scp.ae.active_associations) == 0) self.scp.ae.acse_timeout = 21 self.scp.ae.dimse_timeout = 22 ae.acse_timeout = 31 ae.dimse_timeout = 32 assoc = ae.associate('localhost', 11112) assoc.send_c_echo() time.sleep(2) self.assertTrue(self.scp.ae.active_associations[0].acse_timeout == 21) self.assertTrue(self.scp.ae.active_associations[0].dimse_timeout == 22) self.assertTrue(assoc.acse_timeout == 31) self.assertTrue(assoc.dimse_timeout == 32) assoc.release() self.scp.stop()
def test_acse_timeout(self): """ Check AE ACSE timeout change produces good value """ ae = AE(scu_sop_class=['1.2.840.10008.1.1']) self.assertTrue(ae.acse_timeout == 60) ae.acse_timeout = None self.assertTrue(ae.acse_timeout == None) ae.acse_timeout = -100 self.assertTrue(ae.acse_timeout == 60) ae.acse_timeout = 'a' self.assertTrue(ae.acse_timeout == 60) ae.acse_timeout = 0 self.assertTrue(ae.acse_timeout == 0) ae.acse_timeout = 30 self.assertTrue(ae.acse_timeout == 30)
def test_scp_callback_info(self): """Test on_c_store caontext parameter""" self.scp = DummyStorageSCP() self.scp.start() ae = AE(scu_sop_class=[CTImageStorage]) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established status = assoc.send_c_store(DATASET) assert status.Status == 0x0000 assoc.release() assert assoc.is_released assert self.scp.info['requestor']['address'] == '127.0.0.1' assert self.scp.info['requestor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['requestor']['called_aet'] == b'ANY-SCP ' assert isinstance(self.scp.info['requestor']['port'], int) assert self.scp.info['acceptor']['port'] == 11112 assert self.scp.info['acceptor']['address'] == '127.0.0.1' assert self.scp.info['acceptor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['parameters']['message_id'] == 1 assert self.scp.info['parameters']['priority'] == 2 assert self.scp.info['parameters']['originator_aet'] is None assert self.scp.info['parameters']['originator_message_id'] is None self.scp.stop()
def test_scp_callback_info(self): """Test on_c_echo info parameter.""" self.scp = DummyVerificationSCP() self.scp.start() ae = AE() ae.add_requested_context(VerificationSOPClass) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established rsp = assoc.send_c_echo() assert rsp.Status == 0x0000 assoc.release() assert assoc.is_released assert self.scp.info['requestor']['address'] == '127.0.0.1' assert self.scp.info['requestor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['requestor']['called_aet'] == b'ANY-SCP ' assert isinstance(self.scp.info['requestor']['port'], int) assert self.scp.info['acceptor']['port'] == 11112 assert self.scp.info['acceptor']['address'] == '127.0.0.1' assert self.scp.info['acceptor']['ae_title'] == b'PYNETDICOM ' self.scp.stop()
def __init__(self, dicom_home, port=11112, name="FINDSCP", prefer_uncompr=True, prefer_little=False, prefer_big=False, implicit=False, timeout=None, dimse_timeout=None, acse_timeout=60, pdu_max=16384, update_on_find=False, start=False): '''create a FindSCP (Service Class Provider) for query/retrieve and basic workflow management :param dicom_home: must be the base folder of dicom files **TODO: make this more robust :param port: TCP/IP port number to listen on :param name: the title/name for the ae. 'FINDSCP' is used if not defined. :param prefer_uncompr: prefer explicit VR local byte order (default) :param prefer_little: prefer explicit VR little endian TS :param perfer_big: prefer explicit VR big endian TS :param implicit: accept implicit VR little endian TS only :param timeout: timeout for connection requests (default None) :param acse_timeout: timeout for ACSE messages (default 60) :param dimse_timeout: timeout for the DIMSE messages (default None) :param pdu_max: set max receive pdu to n bytes (4096..131072) default 16382 :param update_on_find: if True, dicoms in dicom_home are updated on the find request ''' self.port = port # Base for dicom files (we can do better here) self.base = dicom_home self.dicoms = get_dicom_files(self.base) self.update_on_find = update_on_find # Update preferences self.update_transfer_syntax(prefer_uncompr=prefer_uncompr, prefer_little=prefer_little, prefer_big=prefer_big, implicit=implicit) ae = AE(scp_sop_class=QueryRetrieveSOPClassList, transfer_syntax=self.transfer_syntax, scu_sop_class=[], ae_title=name, port=self.port) # Set timeouts, name, transfer ae.maximum_pdu_size = pdu_max ae.network_timeout = timeout ae.acse_timeout = acse_timeout ae.dimse_timeout = dimse_timeout BaseSCP.__init__(self, ae=ae) self.status = self.pending_matches self.cancel = False if start is True: self.run()
def test_callback_status_dataset_multi(self): """Test on_c_find yielding a Dataset status with other elements""" self.scp = DummyFindSCP() self.scp.statuses = [Dataset()] self.scp.statuses[0].Status = 0xFF00 self.scp.statuses[0].ErrorComment = 'Test' self.scp.statuses[0].OffendingElement = 0x00010001 self.scp.identifiers = [self.query] self.scp.start() ae = AE() ae.add_requested_context( ProductCharacteristicsQueryInformationModelFind) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='PC') status, identifier = next(result) assert status.Status == 0xFF00 assert status.ErrorComment == 'Test' assert status.OffendingElement == 0x00010001 status, identifier = next(result) assert status.Status == 0x0000 assoc.release() self.scp.stop()
def test_pending_cancel(self): """Test on_c_find yielding pending then cancel status""" # Note: success should be second, cancel should get ignored self.scp = DummyFindSCP() self.scp.statuses = [0xFF00, 0xFE00] self.scp.identifiers = [self.query, None] self.scp.start() ae = AE() ae.add_requested_context(GeneralRelevantPatientInformationQuery) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='G') status, identifier = next(result) assert status.Status == 0xFF00 assert identifier == self.query status, identifier = next(result) assert status.Status == 0x0000 assert identifier is None pytest.raises(StopIteration, next, result) assoc.release() self.scp.stop()
def test_scp_callback_info_move_origin(self): """Test on_c_store caontext parameter""" self.scp = DummyStorageSCP() self.scp.start() ae = AE() ae.add_requested_context(HangingProtocolStorage) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established status = assoc.send_c_store(DATASET, originator_aet=b'ORIGIN', originator_id=888) assert status.Status == 0x0000 assoc.release() assert assoc.is_released assert self.scp.info['requestor']['address'] == '127.0.0.1' assert self.scp.info['requestor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['requestor']['called_aet'] == b'ANY-SCP ' assert isinstance(self.scp.info['requestor']['port'], int) assert self.scp.info['acceptor']['port'] == 11112 assert self.scp.info['acceptor']['address'] == '127.0.0.1' assert self.scp.info['acceptor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['parameters']['message_id'] == 1 assert self.scp.info['parameters']['priority'] == 2 assert self.scp.info['parameters']['originator_aet'] == b'ORIGIN ' assert self.scp.info['parameters']['originator_message_id'] == 888 self.scp.stop()
def test_multi_pending_failure(self): """Test on_c_find yielding multiple pending then failure status""" self.scp = DummyFindSCP() self.scp.statuses = [0xFF00, 0xFF01, 0xFF00, 0xA700, 0x0000] self.scp.identifiers = [self.query, self.query, self.query, None] self.scp.start() ae = AE() ae.add_requested_context( ProductCharacteristicsQueryInformationModelFind) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='PC') status, identifier = next(result) assert status.Status == 0xFF00 assert identifier == self.query status, identifier = next(result) assert status.Status == 0xFF01 assert identifier == self.query status, identifier = next(result) assert status.Status == 0xFF00 assert identifier == self.query status, identifier = next(result) assert status.Status == 0xA700 assert identifier is None pytest.raises(StopIteration, next, result) assoc.release() self.scp.stop()
def test_scp_callback_context(self): """Test on_c_store caontext parameter""" self.scp = DummyFindSCP() self.scp.statuses = [Dataset(), 0x0000] self.scp.statuses[0].Status = 0xFF00 self.identifiers = [self.query, None] self.scp.start() ae = AE() ae.add_requested_context( ProductCharacteristicsQueryInformationModelFind, '1.2.840.10008.1.2.1') ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='PC') status, identifier = next(result) assert status.Status == 0xFF00 status, identifier = next(result) assert status.Status == 0x0000 assoc.release() assert assoc.is_released assert self.scp.context.context_id == 1 assert self.scp.context.abstract_syntax == ProductCharacteristicsQueryInformationModelFind.uid assert self.scp.context.transfer_syntax == '1.2.840.10008.1.2.1' self.scp.stop()
def test_scp_callback_info(self): """Test on_c_store caontext parameter""" self.scp = DummyFindSCP() self.scp.statuses = [Dataset(), 0x0000] self.scp.statuses[0].Status = 0xFF00 self.identifiers = [self.query, None] self.scp.start() ae = AE() ae.add_requested_context( ProductCharacteristicsQueryInformationModelFind) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='PC') status, identifier = next(result) assert status.Status == 0xFF00 status, identifier = next(result) assert status.Status == 0x0000 assoc.release() assert assoc.is_released assert self.scp.info['requestor']['address'] == '127.0.0.1' assert self.scp.info['requestor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['requestor']['called_aet'] == b'ANY-SCP ' assert isinstance(self.scp.info['requestor']['port'], int) assert self.scp.info['acceptor']['port'] == 11112 assert self.scp.info['acceptor']['address'] == '127.0.0.1' assert self.scp.info['acceptor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['parameters']['message_id'] == 1 assert self.scp.info['parameters']['priority'] == 2 self.scp.stop()
def test_scp_callback_info(self): """Test on_n_get caontext parameter""" self.scp = DummyGetSCP() self.scp.start() ae = AE() ae.add_requested_context(DisplaySystemSOPClass) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established status, ds = assoc.send_n_get([(0x7fe0,0x0010)], DisplaySystemSOPClass, '1.2.840.10008.5.1.1.40.1') assert status.Status == 0x0000 assert 'PatientName' in ds assoc.release() assert assoc.is_released assert self.scp.info['requestor']['address'] == '127.0.0.1' assert self.scp.info['requestor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['requestor']['called_aet'] == b'ANY-SCP ' assert isinstance(self.scp.info['requestor']['port'], int) assert self.scp.info['acceptor']['port'] == 11112 assert self.scp.info['acceptor']['address'] == '127.0.0.1' assert self.scp.info['acceptor']['ae_title'] == b'PYNETDICOM ' assert self.scp.info['parameters']['message_id'] == 1 assert self.scp.info['parameters']['requested_sop_class_uid'] == DisplaySystemSOPClass assert self.scp.info['parameters']['requested_sop_instance_uid'] == '1.2.840.10008.5.1.1.40.1' self.scp.stop()
def test_bad_req_identifier(self): """Test SCP handles a bad request identifier""" self.scp = DummyFindSCP() self.scp.statuses = [0xFF00] self.scp.identifiers = [self.query] self.scp.start() ae = AE() ae.add_requested_context( ProductCharacteristicsQueryInformationModelFind, ExplicitVRLittleEndian) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established req = C_FIND() req.MessageID = 1 req.AffectedSOPClassUID = ProductCharacteristicsQueryInformationModelFind.uid req.Priority = 2 req.Identifier = BytesIO( b'\x08\x00\x01\x00\x04\x00\x00\x00\x00\x08\x00\x49') assoc.dimse.send_msg(req, 1) rsp, _ = assoc.dimse.receive_msg(True) assert rsp.Status == 0xC310 assoc.release() self.scp.stop()
def test_require_called_aet(self): """Test AE.require_called_aet""" self.scp = DummyVerificationSCP() self.scp.start() ae = AE(scu_sop_class=[VerificationSOPClass]) ae.acse_timeout = 5 ae.dimse_timeout = 5 # Test that we can associate OK initially assoc = ae.associate('localhost', 11112) assert assoc.is_established assoc.release() assert assoc.is_released assert not assoc.is_established self.scp.ae.require_called_aet = b'MYAE' assert self.scp.ae.require_called_aet == b'MYAE ' assoc = ae.associate('localhost', 11112) assert assoc.is_rejected self.scp.ae.require_called_aet = b'ANY-SCP ' assert self.scp.ae.require_called_aet == b'ANY-SCP ' assoc = ae.associate('localhost', 11112) assert assoc.is_established assoc.release() self.scp.ae.require_called_aet = b'' assert self.scp.ae.require_called_aet == b'' assoc = ae.associate('localhost', 11112) assert assoc.is_established assoc.release() self.scp.stop()
def test_associate_max_pdu(self): """ Check Association has correct max PDUs on either end """ self.scp = DummyVerificationSCP() self.scp.ae.maximum_pdu_size = 54321 self.scp.start() ae = AE(scu_sop_class=[VerificationSOPClass]) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112, max_pdu=12345) self.assertTrue( self.scp.ae.active_associations[0].local_max_pdu == 54321) self.assertTrue( self.scp.ae.active_associations[0].peer_max_pdu == 12345) self.assertTrue(assoc.local_max_pdu == 12345) self.assertTrue(assoc.peer_max_pdu == 54321) assoc.release() # Check 0 max pdu value assoc = ae.associate('localhost', 11112, max_pdu=0) self.assertTrue(assoc.local_max_pdu == 0) self.assertTrue(self.scp.ae.active_associations[0].peer_max_pdu == 0) assoc.release() self.scp.stop()
def __init__(self, port=11112, peer=None, to_port=None, to_name="ANY-SCP", name='STORESCU', prefer_uncompr=True, prefer_little=False, repeat=1, prefer_big=False, implicit=False, timeout=None, dimse_timeout=None, acse_timeout=60, pdu_max=16382, start=False): ''' :param port: the port to use, default is 11112. :param peer: the hostname of DICOM peer (not required) :param toport: the port of the peer to send to :parm toname: the name of the peer to send to :param repeat: repeat N times (default is 1) :param name: the title/name for the ae. 'ECHOSCU' is used if not defined. :param prefer_uncompr: prefer explicit VR local byte order (default) :param prefer_little: prefer explicit VR little endian TS :param perfer_big: prefer explicit VR big endian TS :param implicit: accept implicit VR little endian TS only :param timeout: timeout for connection requests (default None) :param acse_timeout: timeout for ACSE messages (default 60) :param dimse_timeout: timeout for the DIMSE messages (default None) :param pdu_max: set max receive pdu to n bytes (4096..131072) default 16382 :param start: if True, start the ae. (default False) :param abort: if True, abort the association after releasing it (default False) ''' self.port = port self.repeat = repeat self.abort = abort self.update_peer(peer=peer, port=to_port, name=to_name) # Update preferences self.update_transfer_syntax(prefer_uncompr=prefer_uncompr, prefer_little=prefer_little, prefer_big=prefer_big, implicit=implicit) ae = AE(ae_title=name, port=self.port, scu_sop_class=StorageSOPClassList, scp_sop_class=[], transfer_syntax=self.transfer_syntax) # Set timeouts, name, transfer ae.ae_title=name ae.maximum_pdu_size = pdu_max ae.network_timeout = timeout ae.acse_timeout = acse_timeout ae.dimse_timeout = dimse_timeout BaseSCU.__init__(self,ae=ae) self.status = self.success
def test_associate_establish_release(self): """ Check SCU Association with SCP """ self.scp = DummyVerificationSCP() self.scp.start() ae = AE(scu_sop_class=[VerificationSOPClass]) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established assoc.release() assert not assoc.is_established assert assoc.is_released self.scp.stop()
def __init__(self, port=11112, name="ECHOSCP", prefer_uncompr=True, prefer_little=False, prefer_big=False, implicit=False, timeout=None, dimse_timeout=None, acse_timeout=60, pdu_max=16384, start=False): ''' :param port: the port to use, default is 11112. :param name: the title/name for the ae. 'ECHOSCP' is used if not defined. :param prefer_uncompr: prefer explicit VR local byte order (default) :param prefer_little: prefer explicit VR little endian TS :param perfer_big: prefer explicit VR big endian TS :param implicit: accept implicit VR little endian TS only :param timeout: timeout for connection requests (default None) :param acse_timeout: timeout for ACSE messages (default 60) :param dimse_timeout: timeout for the DIMSE messages (default None) :param pdu_max: set max receive pdu to n bytes (4096..131072) default 16382 :param start: if True, start the ae. ''' self.port = port # Update preferences self.update_transfer_syntax(prefer_uncompr=prefer_uncompr, prefer_little=prefer_little, prefer_big=prefer_big, implicit=implicit) ae = AE(scp_sop_class=[VerificationSOPClass], scu_sop_class=[], port=self.port, transfer_syntax=self.transfer_syntax) # Set timeouts, name, transfer ae.ae_title = name ae.maximum_pdu_size = pdu_max ae.network_timeout = timeout ae.acse_timeout = acse_timeout ae.dimse_timeout = dimse_timeout BaseSCP.__init__(self, ae=ae) if start is True: self.run()
def test_callback_status_none(self): """Test SCP handles on_c_find not yielding a status""" self.scp = DummyFindSCP() self.scp.statuses = [None] self.scp.start() ae = AE() ae.add_requested_context(GeneralRelevantPatientInformationQuery) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='G') status, identifier = next(result) assert status.Status == 0xC002 pytest.raises(StopIteration, next, result) assoc.release() self.scp.stop()
def test_on_c_get_called(self): """ Check that SCP AE.on_c_get(dataset) was called """ self.scp = DummyGetSCP() self.scp.start() ds = Dataset() ds.PatientName = '*' ds.QueryRetrieveLevel = "PATIENT" ae = AE(scu_sop_class=[PatientRootQueryRetrieveInformationModelGet]) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established for (status, ds) in assoc.send_c_get(ds, query_model='P'): assert status.Status == 0x0000 assoc.release() self.scp.stop()
def test_callback_exception(self): """Test SCP handles on_c_find yielding an exception""" self.scp = DummyFindSCP() def on_c_find(ds, context, info): raise ValueError self.scp.ae.on_c_find = on_c_find self.scp.start() ae = AE() ae.add_requested_context(GeneralRelevantPatientInformationQuery) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='G') status, identifier = next(result) assert status.Status == 0xC311 pytest.raises(StopIteration, next, result) assoc.release() self.scp.stop()
def test_callback_status_invalid(self): """Test SCP handles on_c_find yielding a invalid status""" self.scp = DummyFindSCP() self.scp.statuses = ['Failure'] self.scp.start() ae = AE() ae.add_requested_context( ProductCharacteristicsQueryInformationModelFind) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='PC') status, identifier = next(result) assert status.Status == 0xC002 pytest.raises(StopIteration, next, result) assoc.release() self.scp.stop()
def test_on_c_echo_called(self): """ Check that SCP AE.on_c_echo() was called """ self.scp = DummyVerificationSCP() self.scp.start() ae = AE(scu_sop_class=[VerificationSOPClass]) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established status = assoc.send_c_echo() assert isinstance(status, Dataset) assert 'Status' in status assert status.Status == 0x0000 assoc.release() assert assoc.is_released assert not assoc.is_established self.scp.stop()
def test_scp_callback_context(self): """Test on_c_echo context parameter.""" self.scp = DummyVerificationSCP() self.scp.start() ae = AE(scu_sop_class=[VerificationSOPClass]) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established rsp = assoc.send_c_echo() assert rsp.Status == 0x0000 assoc.release() assert assoc.is_released assert self.scp.context.context_id == 1 assert self.scp.context.abstract_syntax == '1.2.840.10008.1.1' assert self.scp.context.transfer_syntax == '1.2.840.10008.1.2.1' self.scp.stop()
def test_on_c_store_called(self): """ Check that SCP AE.on_c_store(dataset) was called """ self.scp = DummyStorageSCP() self.scp.start() ae = AE(scu_sop_class=[RTImageStorage]) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established status = assoc.send_c_store(DATASET) assert isinstance(status, Dataset) assert 'Status' in status assert status.Status == 0x0000 assoc.release() assert assoc.is_released assert not assoc.is_established self.scp.stop()
def test_scp_callback_context(self): """Test on_c_store caontext parameter""" self.scp = DummyStorageSCP() self.scp.start() ae = AE(scu_sop_class=[CTImageStorage]) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established status = assoc.send_c_store(DATASET) assert status.Status == 0x0000 assoc.release() assert assoc.is_released assert self.scp.context.context_id == 1 assert self.scp.context.abstract_syntax == CTImageStorage.UID assert self.scp.context.transfer_syntax == '1.2.840.10008.1.2.1' self.scp.stop()
def test_no_response(self): """Test on_c_find yielding success status""" self.scp = DummyFindSCP() self.scp.statuses = [] self.scp.identifiers = [] self.scp.start() ae = AE() ae.add_requested_context(GeneralRelevantPatientInformationQuery) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='G') status, identifier = next(result) assert status.Status == 0x0000 assert identifier is None pytest.raises(StopIteration, next, result) assoc.release() self.scp.stop()
def test_callback_status_int(self): """Test on_c_find yielding an int status""" self.scp = DummyFindSCP() self.scp.statuses = [0xFF00] self.scp.identifiers = [self.query] self.scp.start() ae = AE() ae.add_requested_context(GeneralRelevantPatientInformationQuery) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='G') status, identifier = next(result) assert status.Status == 0xFF00 status, identifier = next(result) assert status.Status == 0x0000 assoc.release() self.scp.stop()
def test_callback_bad_identifier(self): """Test SCP handles a bad callback identifier""" self.scp = DummyFindSCP() self.scp.statuses = [0xFF00, 0xFE00] self.scp.identifiers = [None, None] self.scp.start() ae = AE() ae.add_requested_context( ProductCharacteristicsQueryInformationModelFind) ae.acse_timeout = 5 ae.dimse_timeout = 5 assoc = ae.associate('localhost', 11112) assert assoc.is_established result = assoc.send_c_find(self.query, query_model='PC') status, identifier = next(result) assert status.Status == 0xC312 pytest.raises(StopIteration, next, result) assoc.release() self.scp.stop()