def test_assignment_and_exceptions(self): """ Check incorrect types/values for implementation_class_uid raise exceptions """ primitive = ImplementationClassUIDNotification() ## Check assignment reference_uid = UID('1.2.826.0.1.3680043.9.3811.0.9.0') # bytes primitive.implementation_class_uid = b'1.2.826.0.1.3680043.9.3811.0.9.0' self.assertTrue(primitive.implementation_class_uid == reference_uid) # str primitive.implementation_class_uid = '1.2.826.0.1.3680043.9.3811.0.9.0' self.assertTrue(primitive.implementation_class_uid == reference_uid) # UID primitive.implementation_class_uid = UID( '1.2.826.0.1.3680043.9.3811.0.9.0') self.assertTrue(primitive.implementation_class_uid == reference_uid) ## Check exceptions primitive = ImplementationClassUIDNotification() # No value set with pytest.raises(ValueError): item = primitive.from_primitive() # Non UID, bytes or str with pytest.raises(TypeError): primitive.implementation_class_uid = 45.2 with pytest.raises(TypeError): primitive.implementation_class_uid = 100
def test_string(self): """Check the string output.""" primitive = ImplementationClassUIDNotification() primitive.implementation_class_uid = UID( '1.2.826.0.1.3680043.9.3811.0.9.0') self.assertTrue( '1.2.826.0.1.3680043.9.3811.0.9.0' in primitive.__str__())
def test_conversion(self): """ Check converting to PDU item works correctly """ primitive = ImplementationClassUIDNotification() primitive.implementation_class_uid = UID('1.2.826.0.1.3680043.9.3811.0.9.0') item = primitive.from_primitive() self.assertTrue(item.encode() == b"\x52\x00\x00\x20\x31\x2e\x32\x2e\x38\x32\x36\x2e\x30\x2e\x31" \ b"\x2e\x33\x36\x38\x30\x30\x34\x33\x2e\x39\x2e\x33\x38\x31\x31\x2e" \ b"\x30\x2e\x39\x2e\x30")
def request_assoc(self, local_ae, peer_ae, max_pdu_size, pcdl, userspdu=None): """Request an Association with a peer Application Entity SCP. Issues an A-ASSOCIATE request primitive to the DICOM UL service provider Requests an association with a remote AE and waits for association response (local AE is acting as an SCU) Parameters ---------- local_ae : dict Contains information about the local AE, keys 'ae_title', 'port', 'address', 'pdv_size', 'propsed_contexts'. peer_ae : dict Contains information about the peer AE, keys 'ae_title', 'port', 'address'. max_pdu_size : int Maximum PDU size in bytes pcdl : list of pynetdicom3.presentation.PresentationContext A list of the proposed Presentation Contexts for the association If local_ae is ApplicationEntity then this is doubled up unnecessarily userpdu : List of UserInformation objects List of items to be added to the requests user information for use in extended negotiation. See PS3.7 Annex D.3.3 Returns ------- bool True if the Association was accepted, False if rejected or aborted """ self.local_ae = local_ae self.local_ae['pdv_size'] = max_pdu_size self.remote_ae = peer_ae self.local_max_pdu = max_pdu_size ## Build an A-ASSOCIATE request primitive # # The following parameters must be set for a request primitive # ApplicationContextName # CallingAETitle # CalledAETitle # UserInformation # Maximum PDV Length (required) # Implementation Identification - Class UID (required) # CallingPresentationAddress # CalledPresentationAddress # PresentationContextDefinitionList assoc_rq = A_ASSOCIATE() assoc_rq.application_context_name = self.application_context_name assoc_rq.calling_ae_title = self.local_ae['ae_title'] assoc_rq.called_ae_title = self.remote_ae['ae_title'] # Build User Information - PS3.7 Annex D.3.3 # # Maximum Length Negotiation (required) max_length = MaximumLengthNegotiation() max_length.maximum_length_received = self.local_ae['pdv_size'] assoc_rq.user_information = [max_length] # Implementation Identification Notification (required) # Class UID (required) implementation_class_uid = ImplementationClassUIDNotification() implementation_class_uid.implementation_class_uid = UID( pynetdicom_implementation_uid) assoc_rq.user_information.append(implementation_class_uid) # Version Name (optional) implementation_version_name = ImplementationVersionNameNotification() implementation_version_name.implementation_version_name = ( pynetdicom_version) assoc_rq.user_information.append(implementation_version_name) # Add the extended negotiation information (optional) if userspdu is not None: assoc_rq.user_information += userspdu assoc_rq.calling_presentation_address = (self.local_ae['address'], self.local_ae['port']) assoc_rq.called_presentation_address = (self.remote_ae['address'], self.remote_ae['port']) assoc_rq.presentation_context_definition_list = pcdl # ## A-ASSOCIATE request primitive is now complete # Send the A-ASSOCIATE request primitive to the peer via the # DICOM UL service LOGGER.info("Requesting Association") self.dul.send_pdu(assoc_rq) ## Receive the response from the peer # This may be an A-ASSOCIATE confirmation primitive or an # A-ABORT or A-P-ABORT request primitive # assoc_rsp = self.dul.receive_pdu(wait=True, timeout=self.acse_timeout) # Association accepted or rejected if isinstance(assoc_rsp, A_ASSOCIATE): # Accepted if assoc_rsp.result == 0x00: # Get maximum pdu length from answer self.peer_max_pdu = assoc_rsp.maximum_length_received self.parent.peer_ae['pdv_size'] = ( assoc_rsp.maximum_length_received) # FIXME self.parent.peer_max_pdu = assoc_rsp.maximum_length_received # Get accepted presentation contexts using the manager self.context_manager.requestor_contexts = pcdl self.context_manager.acceptor_contexts = ( assoc_rsp.presentation_context_definition_results_list) # Once the context manager gets both sets of contexts it # automatically determines which are accepted and refused self.accepted_contexts = self.context_manager.accepted self.rejected_contexts = self.context_manager.rejected return True, assoc_rsp # Rejected elif assoc_rsp.result in [0x01, 0x02]: # 0x01 is rejected (permanent) # 0x02 is rejected (transient) return False, assoc_rsp # Invalid Result value elif assoc_rsp.result is None: return False, assoc_rsp else: LOGGER.error( "ACSE received an invalid result value from " "the peer AE: '%s'", assoc_rsp.result) raise ValueError("ACSE received an invalid result value from " "the peer AE: '{}'".format(assoc_rsp.result)) # Association aborted elif isinstance(assoc_rsp, (A_ABORT, A_P_ABORT)): return False, assoc_rsp elif assoc_rsp is None: return False, assoc_rsp else: raise ValueError("Unexpected response by the peer AE to the " "ACSE association request")