Ejemplo n.º 1
0
    def run(self):

        print '''
        A_7001_04:
        '''

        global tempRoot
        global mesaDir
        global mesaToolDir
        global dataRoot
        global dcm4CheDir

        self.verifyEnvironment()

        testName = 'A_7001_04'
        numberOfSeriesPerStudy = 3
        numberOfSOPsPerSeries = 3
        # This is the number of dicom images sent per unique series

        ## Testing Hosts ##
        edgeHost = '172.20.175.63'

        ## PACS Host ##
        pacsAeTitle = 'DCM4CHEE'
        pacsHost = 'localhost'
        pacsPort = '11112'

        ## MIRTH HL7 Connection
        mirthHl7Host = edgeHost
        mirthHl7Port = '20000'

        ## XDS Clearinghouse Connections
        nistScriptDirectory = '/usr/local/tomcat1/bin'
        registryURL = 'http://localhost:9080/axis2/services/xdsregistryb'
        repositoryURL = 'http://localhost:9080/axis2/services/xdsrepositoryb'
        repositoryUID = '1.19.6.24.109.42.1.5'
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1'
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO'

        testDataDir = dataRoot + '/A-7001/A-7001-01'
        baseTest = A_7001_01(testName, tempRoot, dcm4CheDir, mesaDir,
                             mesaToolDir, edgeHost)

        ## XDS HL7 Connection
        xdsHl7JarPath = os.path.normpath(os.getcwd() +
                                         '/../util/HL7Receiver.jar')
        xdsHl7Port = 9082

        ## --------------------------------------------------------- ##
        print 'Starting XDS HL7 Receiver'
        ## --------------------------------------------------------- ##
        self.xdsHl7 = HL7ReceiverManager(xdsHl7JarPath, xdsHl7Port, False,
                                         False)
        if self.xdsHl7.isAnInstanceRunning():
            return (
                False,
                'HL7 Receiver already running.  Kill process before testing.')
        success = self.xdsHl7.startServer()
        if not success:
            return (False, 'Failed to start HL7 Receiver')

        ## --------------------------------------------------------- ##
        print 'Starting NIST Repository as Clearinghouse'
        ## --------------------------------------------------------- ##
        self.nist = NistRepositoryManager(nistScriptDirectory)
        success = self.nist.startServer()
        if not success:
            return (False, 'Failed to start NIST Repository')

        ## --------------------------------------------------------- ##
        print 'Generate unique Study Instance UID'
        ## --------------------------------------------------------- ##
        studyUID = '9999.' + strftime('%Y%m%d%H%M%S', localtime())

        ## --------------------------------------------------------- ##
        print 'Generate dictionary used to fill hl7 message templates'
        ## --------------------------------------------------------- ##
        customFieldsDictionary = baseTest.generateCustomFields(studyUID)
        patientName = customFieldsDictionary['PATIENT_NAME']
        print 'patientName:' + patientName
        patientID = customFieldsDictionary['PATIENT_ID']
        print 'patientID:' + patientID
        accessionNumber = customFieldsDictionary['ACCESSION_NUMBER']
        print 'accessionNumber:' + accessionNumber
        studyUID = customFieldsDictionary['STUDY_INSTANCE_UID']
        print 'studyUID:' + studyUID

        # Create test directorys
        testTempDir = tempRoot + '/' + accessionNumber
        os.makedirs(testTempDir)
        retreivedFilesDirectory = testTempDir + '/retrieved'
        os.makedirs(retreivedFilesDirectory)
        sentFilesDirectory = testTempDir + '/sent'
        os.makedirs(sentFilesDirectory)

        ## --------------------------------------------------------- ##
        print 'Generate ORM HL7 message and send to HL7 receiver - Creates Exam & Patient entries via MIRTH'
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOrm(testDataDir,
                                             customFieldsDictionary,
                                             mirthHl7Host, mirthHl7Port)
        if (status != 'SCHEDULED'):
            return (False, 'Failed to schedule exam')

        ## --------------------------------------------------------- ##
        print 'Generate ORU HL7 message and send to HL7 receiver'
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOru(testDataDir,
                                             customFieldsDictionary,
                                             mirthHl7Host, mirthHl7Port)
        if (status != 'FINALIZED'):
            return (False, 'Failed to finalize exam')

        ## --------------------------------------------------------- ##
        print 'Prepare DICOM files to with Study, Series, SOP UIDs'
        ## --------------------------------------------------------- ##
        studySeriesSopUIDs = []
        # SeriesUID format - StudyUID.N
        # SopUID format    - StudyUID.Series.N
        #   where N is a reasonably unique int
        n = int(strftime('%H%M%S', localtime()))
        for seriesIndex in range(numberOfSeriesPerStudy):
            seriesN = seriesIndex + n
            seriesUID = str(studyUID) + '.' + str(seriesN)
            for sopIndex in range(numberOfSOPsPerSeries):
                sopN = sopIndex + n
                sopUID = str(seriesUID) + '.' + str(sopN)
                studySeriesSopUIDs.append([studyUID, seriesUID, sopUID])
        success = baseTest.generateCustomDicomFiles(
            studySeriesSopUIDs, customFieldsDictionary,
            testDataDir + '/dicom_files/MR.dcm', sentFilesDirectory)
        if not success:
            return (False, 'Failed to generate custom dicom files')

        ## --------------------------------------------------------- ##
        print 'Send DICOM files to PACS'
        ## --------------------------------------------------------- ##
        baseTest.sendDicomFileToPacs(pacsAeTitle, pacsHost, pacsPort,
                                     sentFilesDirectory,
                                     customFieldsDictionary)

        ## --------------------------------------------------------- ##
        print 'Instruct EDGE to retrieve DICOM files for pid & accession - Job, JobSet, Transactions entries in rsnadb'
        ## --------------------------------------------------------- ##
        jobID = baseTest.startNewJobAndTransactionOnEdge(
            patientID, accessionNumber)

        ## --------------------------------------------------------- ##
        print 'Wait for EDGE to complete transfer to Clearinghouse'
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForCompletedXdsXfer(jobID, 240)

        if (statusCode != 40):
            return (False,
                    'Transaction status code set to: ' + str(statusCode))

        ## --------------------------------------------------------- ##
        print 'Retrieve XDS documents from Clearinghouse repository'
        ## --------------------------------------------------------- ##
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1'
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO'
        singleUsePatientID = EdgeDbManager(
            'rsnadb', edgeHost, 'edge',
            'd17bK4#M').getSingleUsePatientID(jobID)
        fullPatientID = singleUsePatientID + r'^^^&' + PATIENT_ID_ASSIGNING_AUTHORITY + r'&' + PATIENT_ID_ASSIGNING_AUTHORITY_TYPE
        baseTest.retrieveXdsDocuments(fullPatientID, registryURL,
                                      repositoryURL, repositoryUID,
                                      retreivedFilesDirectory)
        if len(os.listdir(retreivedFilesDirectory)) == 0:
            return (False, 'Zero documents retrieved')

        ## --------------------------------------------------------- ##
        print 'Validate retrieved documents'
        ## --------------------------------------------------------- ##
        success = baseTest.validateRetrievedMetaDataLegality(
            retreivedFilesDirectory)
        if not success:
            return (False, "Failed due to illegal meta-data.")

        success = baseTest.validateRetrievedMetaDataMatch(
            retreivedFilesDirectory, customFieldsDictionary)
        if not success:
            return (False, "Failed due to meta-data mismatch.")

        success = baseTest.validateDcmSentDcmRetrievedBinaryMatch(
            sentFilesDirectory, retreivedFilesDirectory)
        if not success:
            return (False,
                    "Failed due to sent-retrieved file binary mismatch.")

        success = baseTest.validateKosDcmMatch(retreivedFilesDirectory)
        if not success:
            return (False, "Failed due to manifest - retrieved file mismatch.")

        return (True, 'Passed Tests')
class A_7001_14():
    def run(self):

        print '''
        A_7001_14:
        '''

        global tempRoot
        global mesaDir
        global mesaToolDir
        global dataRoot
        global dcm4CheDir

        self.verifyEnvironment()

        testName = 'A_7001_14'
        numberOfSeriesPerStudy = 1
        numberOfSOPsPerSeries = 200
        # This is the number of dicom images sent per unique series

        ## Testing Hosts ##
        edgeHost = '172.20.175.63'

        ## PACS Host ##
        pacsAeTitle = 'DCM4CHEE'
        pacsHost = 'localhost'
        pacsPort = '11112'

        ## MIRTH HL7 Connection
        mirthHl7Host = edgeHost
        mirthHl7Port = '20000'

        ## XDS Clearinghouse Connections
        nistScriptDirectory = '/usr/local/tomcat1/bin'
        registryURL = 'http://localhost:9080/axis2/services/xdsregistryb'
        repositoryURL = 'http://localhost:9080/axis2/services/xdsrepositoryb'
        repositoryUID = '1.19.6.24.109.42.1.5'
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1'
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO'

        testDataDir = dataRoot + '/A-7001/A-7001-01'
        baseTest = A_7001_01(testName, tempRoot, dcm4CheDir, mesaDir,
                             mesaToolDir, edgeHost)

        ## XDS HL7 Connection
        xdsHl7JarPath = os.path.normpath(os.getcwd() +
                                         '/../util/HL7Receiver.jar')
        xdsHl7Port = 9082

        ## --------------------------------------------------------- ##
        print 'Starting XDS HL7 Receiver'
        ## --------------------------------------------------------- ##
        self.xdsHl7 = HL7ReceiverManager(xdsHl7JarPath, xdsHl7Port, False,
                                         False)
        if self.xdsHl7.isAnInstanceRunning():
            return (
                False,
                'HL7 Receiver already running.  Kill process before testing.')
        success = self.xdsHl7.startServer()
        if not success:
            return (False, 'Failed to start HL7 Receiver')

        ## --------------------------------------------------------- ##
        print 'Starting NIST Repository as Clearinghouse'
        ## --------------------------------------------------------- ##
        self.nist = NistRepositoryManager(nistScriptDirectory)
        success = self.nist.startServer()
        if not success:
            return (False, 'Failed to start NIST Repository')

        ## --------------------------------------------------------- ##
        print 'Generate unique Study Instance UID'
        ## --------------------------------------------------------- ##
        studyUID = '9999.' + strftime('%Y%m%d%H%M%S', localtime())

        ## --------------------------------------------------------- ##
        print 'Generate dictionary used to fill hl7 message templates'
        ## --------------------------------------------------------- ##
        customFieldsDictionary = baseTest.generateCustomFields(studyUID)
        patientName = customFieldsDictionary['PATIENT_NAME']
        print 'patientName:' + patientName
        patientID = customFieldsDictionary['PATIENT_ID']
        print 'patientID:' + patientID
        accessionNumber = customFieldsDictionary['ACCESSION_NUMBER']
        print 'accessionNumber:' + accessionNumber
        studyUID = customFieldsDictionary['STUDY_INSTANCE_UID']
        print 'studyUID:' + studyUID

        # Create test directorys
        testTempDir = tempRoot + '/' + accessionNumber
        os.makedirs(testTempDir)
        retreivedFilesDirectory = testTempDir + '/retrieved'
        os.makedirs(retreivedFilesDirectory)
        sentFilesDirectory = testTempDir + '/sent'
        os.makedirs(sentFilesDirectory)

        ## --------------------------------------------------------- ##
        print 'Generate ORM HL7 message and send to HL7 receiver - Creates Exam & Patient entries via MIRTH'
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOrm(testDataDir,
                                             customFieldsDictionary,
                                             mirthHl7Host, mirthHl7Port)
        if (status != 'SCHEDULED'):
            return (False, 'Failed to schedule exam')

        ## --------------------------------------------------------- ##
        print 'Generate ORU HL7 message and send to HL7 receiver'
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOru(testDataDir,
                                             customFieldsDictionary,
                                             mirthHl7Host, mirthHl7Port)
        if (status != 'FINALIZED'):
            return (False, 'Failed to finalize exam')

        ## --------------------------------------------------------- ##
        print 'Prepare DICOM files to with Study, Series, SOP UIDs'
        ## --------------------------------------------------------- ##
        studySeriesSopUIDs = []
        # SeriesUID format - StudyUID.N
        # SopUID format    - StudyUID.Series.N
        #   where N is a reasonably unique int
        n = int(strftime('%H%M%S', localtime()))
        for seriesIndex in range(numberOfSeriesPerStudy):
            seriesN = seriesIndex + n
            seriesUID = str(studyUID) + '.' + str(seriesN)
            for sopIndex in range(numberOfSOPsPerSeries):
                sopN = sopIndex + n
                sopUID = str(seriesUID) + '.' + str(sopN)
                studySeriesSopUIDs.append([studyUID, seriesUID, sopUID])
        success = baseTest.generateCustomDicomFiles(
            studySeriesSopUIDs, customFieldsDictionary,
            testDataDir + '/dicom_files/MR.dcm', sentFilesDirectory)
        if not success:
            return (False, 'Failed to generate custom dicom files')

        ## --------------------------------------------------------- ##
        print 'Send DICOM files to PACS'
        ## --------------------------------------------------------- ##
        baseTest.sendDicomFileToPacs(pacsAeTitle, pacsHost, pacsPort,
                                     sentFilesDirectory,
                                     customFieldsDictionary)

        ## --------------------------------------------------------- ##
        print 'Instruct EDGE to retrieve DICOM files for pid & accession - Job, JobSet, Transactions entries in rsnadb'
        ## --------------------------------------------------------- ##
        jobID = baseTest.startNewJobAndTransactionOnEdge(
            patientID, accessionNumber)

        ## --------------------------------------------------------- ##
        print 'Wait for EDGE to start transfer to Clearinghouse - status code = 34'
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForTransactionStatusCode(jobID, 34, 240)

        if (statusCode != 34):
            return (False, 'Transaction status code set to: ' +
                    str(statusCode) + ' Expected 34.')

        sleep(10)

        ## --------------------------------------------------------- ##
        print 'Shutdown NIST repository - mid-transfer'
        ## --------------------------------------------------------- ##
        success = self.nist.stopServer()
        if not success:
            return (False, 'Failed to stop NIST Repository')

        ## --------------------------------------------------------- ##
        print 'Wait for EDGE to fail out of transfer to Clearinghouse - status code = -34'
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForTransactionStatusCode(jobID, -34, 240)

        if (statusCode != -34):
            return (False, 'Transaction status code set to: ' +
                    str(statusCode) + ' Expected -34.')

        ## --------------------------------------------------------- ##
        print 'Restart repository and attempt to retrieve XDS documents from Clearinghouse repository'
        ## --------------------------------------------------------- ##
        success = self.nist.startServer()
        if not success:
            return (False, 'Failed to restart NIST Repository')

        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1'
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO'
        singleUsePatientID = EdgeDbManager('rsnadb').getSingleUsePatientID(
            jobID)
        fullPatientID = singleUsePatientID + r'^^^&' + PATIENT_ID_ASSIGNING_AUTHORITY + r'&' + PATIENT_ID_ASSIGNING_AUTHORITY_TYPE
        baseTest.retrieveXdsDocuments(fullPatientID, registryURL,
                                      repositoryURL, repositoryUID,
                                      retreivedFilesDirectory)

        ## --------------------------------------------------------- ##
        print 'Expect transaction status code -34 and zero matching documents.'
        ## --------------------------------------------------------- ##
        if (statusCode != -34):
            return (False,
                    'Transaction status code set to: ' + str(statusCode))
        elif len(os.listdir(retreivedFilesDirectory)) > 0:
            return (False, 'Unexpected documents retrieved')
        else:
            print 'Transaction status:', statusCode, 'Zero matching documents retrieved.'

        return (True, 'Passed Tests')

    def cleanup(self):
        self.xdsHl7.stopServer()
        self.nist.stopServer()

    def verifyEnvironment(self):
        global tempRoot
        global mesaDir
        global mesaToolDir
        global dataRoot
        global dcm4CheDir
        ## Verify environment
        if not 'MESA_TARGET' in os.environ:
            print "Missing MESA_TARGET"
            exit(1)
        else:
            mesaDir = os.environ['MESA_TARGET']
            mesaToolDir = mesaDir + '/bin'

        if not 'VERIF_VALID_HOME' in os.environ:
            print "Missing VERIF_VALID_HOME"
            exit(1)
        else:
            dataRoot = os.environ['VERIF_VALID_HOME'] + '/data'

        if not 'DCM4CHE_HOME' in os.environ:
            print "Missing DCM4CHE_HOME"
            exit(1)
        else:
            dcm4CheDir = os.environ['DCM4CHE_HOME']

        if not 'TEMP' in os.environ:
            tempRoot = '/tmp'
        else:
            tempRoot = os.environ['TEMP']
    def run(self):
    
        print '''
        A_7001_02:
        '''
        
        global tempRoot;
        global mesaDir;
        global mesaToolDir;
        global dataRoot;
        global dcm4CheDir;
        
        self.verifyEnvironment();
        
        testName = 'A_7001_02';
        numberOfSeriesPerStudy = 1;
        numberOfSOPsPerSeries = 1;  # This is the number of dicom images sent per unique series
        
        ## Testing Hosts ##
        edgeHost = '10.242.100.64'
        
        
        ## PACS Host ##
        pacsAeTitle = 'DCM4CHEE';
        pacsHost = 'localhost';
        pacsPort = '11112';
        
        ## MIRTH HL7 Connection
        mirthHl7Host = edgeHost;
        mirthHl7Port = '20000';
        
        ## XDS Clearinghouse Connections
        nistScriptDirectory = '/usr/local/tomcat/apache-tomcat-7.0.62'
        registryURL = 'http://localhost:9080/axis2/services/xdsregistryb';
        repositoryURL = 'http://localhost:9080/axis2/services/xdsrepositoryb';
        repositoryUID = '1.19.6.24.109.42.1.5';
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1';
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO';
        
        testDataDir = dataRoot + '/A-7001/A-7001-01';
        baseTest = A_7001_01(testName, tempRoot, dcm4CheDir, mesaDir, mesaToolDir, edgeHost);
    
        ## XDS HL7 Connection
        xdsHl7JarPath = os.path.normpath(os.getcwd() + '/../util/HL7Receiver.jar');
        xdsHl7Port = 9082;
        
        ## --------------------------------------------------------- ##
        print 'Starting XDS HL7 Receiver'
        ## --------------------------------------------------------- ##
        self.xdsHl7 = HL7ReceiverManager(xdsHl7JarPath, xdsHl7Port, False, False);
        if self.xdsHl7.isAnInstanceRunning():
            return (False, 'HL7 Receiver already running.  Kill process before testing.');
        success = self.xdsHl7.startServer();
        if not success:
            return (False, 'Failed to start HL7 Receiver');
    
        ## --------------------------------------------------------- ##
        print 'Starting NIST Repository as Clearinghouse'
        ## --------------------------------------------------------- ##
        self.nist = NistRepositoryManager(nistScriptDirectory);
        success = self.nist.startServer();
        if not success:
            return (False, 'Failed to start NIST Repository');

        ## --------------------------------------------------------- ##
        print 'Generate unique Study Instance UID'
        ## --------------------------------------------------------- ##
        studyUID = '9999.' + strftime('%Y%m%d%H%M%S', localtime());
        
        ## --------------------------------------------------------- ##
        print 'Generate dictionary used to fill hl7 message templates'
        ## --------------------------------------------------------- ##
        customFieldsDictionary = baseTest.generateCustomFields(studyUID);
        patientName = customFieldsDictionary['PATIENT_NAME'];
        print 'patientName:' + patientName;
        patientID = customFieldsDictionary['PATIENT_ID'];
        print 'patientID:' + patientID;
        accessionNumber = customFieldsDictionary['ACCESSION_NUMBER'];
        print 'accessionNumber:' + accessionNumber;
        studyUID = customFieldsDictionary['STUDY_INSTANCE_UID'];
        print 'studyUID:' + studyUID;
    
        # Create test directorys
        testTempDir = tempRoot + '/' + accessionNumber;
        os.makedirs(testTempDir);
        retreivedFilesDirectory = testTempDir + '/retrieved'; 
        os.makedirs(retreivedFilesDirectory);
        sentFilesDirectory = testTempDir + '/sent'; 
        os.makedirs(sentFilesDirectory);
    
        ## --------------------------------------------------------- ##
        print 'Generate ORM HL7 message and send to HL7 receiver - Creates Exam & Patient entries via MIRTH' 
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOrm(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port);
        if(status != 'SCHEDULED'):
            return (False, 'Failed to schedule exam');
        
        ## --------------------------------------------------------- ##
        print 'Generate ORU HL7 message and send to HL7 receiver' 
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOru(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port);
        if(status != 'FINALIZED'):
            return (False, 'Failed to finalize exam');
        
        ## --------------------------------------------------------- ##
        print 'Prepare DICOM files to with Study, Series, SOP UIDs' 
        ## --------------------------------------------------------- ##
        studySeriesSopUIDs = [];
        # SeriesUID format - StudyUID.N
        # SopUID format    - StudyUID.Series.N
        #   where N is a reasonably unique int
        n = int(strftime('%H%M%S', localtime()));
        for seriesIndex in range(numberOfSeriesPerStudy):
            seriesN = seriesIndex + n;
            seriesUID = str(studyUID) + '.' + str(seriesN)
            for sopIndex in range(numberOfSOPsPerSeries):
                sopN = sopIndex + n;
                sopUID = str(seriesUID) + '.'+ str(sopN)
                studySeriesSopUIDs.append([studyUID, seriesUID, sopUID]);
        success = baseTest.generateCustomDicomFiles(studySeriesSopUIDs, customFieldsDictionary, testDataDir + '/dicom_files/CT.dcm', sentFilesDirectory)
        if not success:
            return (False, 'Failed to generate custom dicom files');
        
        ## --------------------------------------------------------- ##
        print 'Send DICOM files to PACS' 
        ## --------------------------------------------------------- ##
        baseTest.sendDicomFileToPacs(pacsAeTitle, pacsHost, pacsPort, sentFilesDirectory, customFieldsDictionary);
        
        
        ## --------------------------------------------------------- ##
        print 'Instruct EDGE to retrieve DICOM files for pid & accession - Job, JobSet, Transactions entries in rsnadb';  
        ## --------------------------------------------------------- ##
        jobID = baseTest.startNewJobAndTransactionOnEdge(patientID, accessionNumber);
        

        
        ## --------------------------------------------------------- ##
        print 'Wait for EDGE to complete transfer to Clearinghouse' 
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForCompletedXdsXfer(jobID, 240);
        
        if(statusCode != 40):
            return (False, 'Transaction status code set to: ' +  str(statusCode));
            
        ## --------------------------------------------------------- ##
        print 'Retrieve XDS documents from Clearinghouse repository'  
        ## --------------------------------------------------------- ##
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1';
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO';
        singleUsePatientID = EdgeDbManager('rsnadb', edgeHost, 'edge', 'd17bK4#M').getSingleUsePatientID(jobID);
        fullPatientID = singleUsePatientID + r'^^^&' + PATIENT_ID_ASSIGNING_AUTHORITY + r'&' + PATIENT_ID_ASSIGNING_AUTHORITY_TYPE;
        baseTest.retrieveXdsDocuments(fullPatientID, registryURL, repositoryURL, repositoryUID, retreivedFilesDirectory);
        if len(os.listdir(retreivedFilesDirectory)) == 0 :
            return (False, 'Zero documents retrieved');
          
        ## --------------------------------------------------------- ##
        print 'Validate retrieved documents'  
        ## --------------------------------------------------------- ##
        success = baseTest.validateRetrievedMetaDataLegality(retreivedFilesDirectory);
        if not success:
            return (False, "Failed due to illegal meta-data.");
        
        success = baseTest.validateRetrievedMetaDataMatch(retreivedFilesDirectory, customFieldsDictionary);
        if not success:
            return (False, "Failed due to meta-data mismatch.");
    
        success = baseTest.validateDcmSentDcmRetrievedBinaryMatch(sentFilesDirectory, retreivedFilesDirectory);
        if not success:
            return (False, "Failed due to sent-retrieved file binary mismatch.");
        
        success = baseTest.validateKosDcmMatch(retreivedFilesDirectory);
        if not success:
            return (False, "Failed due to manifest - retrieved file mismatch.");
            
            
        return (True, 'Passed Tests'); 
Ejemplo n.º 4
0
    def run(self):

        print """
        A_7001_06:
        """

        global tempRoot
        global mesaDir
        global mesaToolDir
        global dataRoot
        global dcm4CheDir

        self.verifyEnvironment()

        testName = "A_7001_06"
        numberOfSeriesPerStudy = 2
        numberOfSOPsPerSeries = 5
        # This is the number of dicom images sent per unique series

        ## Testing Hosts ##
        edgeHost = "172.20.175.63"

        ## PACS Host ##
        pacsAeTitle = "DCM4CHEE"
        pacsHost = "localhost"
        pacsPort = "11112"

        ## MIRTH HL7 Connection
        mirthHl7Host = edgeHost
        mirthHl7Port = "20000"

        ## XDS Clearinghouse Connections
        nistScriptDirectory = "/usr/local/tomcat1/bin"
        registryURL = "http://localhost:9080/axis2/services/xdsregistryb"
        repositoryURL = "http://localhost:9080/axis2/services/xdsrepositoryb"
        repositoryUID = "1.19.6.24.109.42.1.5"
        PATIENT_ID_ASSIGNING_AUTHORITY = "1.3.6.1.4.1.19376.2.840.1.1.1.1"
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = "ISO"

        testDataDir = dataRoot + "/A-7001/A-7001-01"
        baseTest = A_7001_01(testName, tempRoot, dcm4CheDir, mesaDir, mesaToolDir, edgeHost)

        ## XDS HL7 Connection
        xdsHl7JarPath = os.path.normpath(os.getcwd() + "/../util/HL7Receiver.jar")
        xdsHl7Port = 9082

        ## --------------------------------------------------------- ##
        print "Starting XDS HL7 Receiver"
        ## --------------------------------------------------------- ##
        self.xdsHl7 = HL7ReceiverManager(xdsHl7JarPath, xdsHl7Port, False, False)
        if self.xdsHl7.isAnInstanceRunning():
            return (False, "HL7 Receiver already running.  Kill process before testing.")
        success = self.xdsHl7.startServer()
        if not success:
            return (False, "Failed to start HL7 Receiver")

        ## --------------------------------------------------------- ##
        print "Starting NIST Repository as Clearinghouse"
        ## --------------------------------------------------------- ##
        self.nist = NistRepositoryManager(nistScriptDirectory)
        success = self.nist.startServer()
        if not success:
            return (False, "Failed to start NIST Repository")

        ## --------------------------------------------------------- ##
        print "Generate unique Study Instance UID"
        ## --------------------------------------------------------- ##
        studyUID = "9999." + strftime("%Y%m%d%H%M%S", localtime())

        ## --------------------------------------------------------- ##
        print "Generate dictionary used to fill hl7 message templates"
        ## --------------------------------------------------------- ##
        customFieldsDictionary = baseTest.generateCustomFields(studyUID)
        patientName = customFieldsDictionary["PATIENT_NAME"]
        print "patientName:" + patientName
        patientID = customFieldsDictionary["PATIENT_ID"]
        print "patientID:" + patientID
        accessionNumber = customFieldsDictionary["ACCESSION_NUMBER"]
        print "accessionNumber:" + accessionNumber
        studyUID = customFieldsDictionary["STUDY_INSTANCE_UID"]
        print "studyUID:" + studyUID

        # Create test directorys
        testTempDir = tempRoot + "/" + accessionNumber
        os.makedirs(testTempDir)
        retreivedFilesDirectory = testTempDir + "/retrieved"
        os.makedirs(retreivedFilesDirectory)
        sentFilesDirectory = testTempDir + "/sent"
        os.makedirs(sentFilesDirectory)

        ## --------------------------------------------------------- ##
        print "Generate ORM HL7 message and send to HL7 receiver - Creates Exam & Patient entries via MIRTH"
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOrm(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port)
        if status != "SCHEDULED":
            return (False, "Failed to schedule exam")

        ## --------------------------------------------------------- ##
        print "Generate ORU HL7 message and send to HL7 receiver"
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOru(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port)
        if status != "FINALIZED":
            return (False, "Failed to finalize exam")

        ## --------------------------------------------------------- ##
        print "Prepare DICOM MR & CT files to with Study, Series, SOP UIDs"
        ## --------------------------------------------------------- ##
        studySeriesSopUIDs = []
        # SeriesUID format - StudyUID.N
        # SopUID format    - StudyUID.Series.N
        #   where N is a reasonably unique int
        n = int(strftime("%H%M%S", localtime()))
        for seriesIndex in range(numberOfSeriesPerStudy):
            seriesN = seriesIndex + n
            seriesUID = str(studyUID) + "." + str(seriesN)
            for sopIndex in range(numberOfSOPsPerSeries):
                sopN = sopIndex + n
                sopUID = str(seriesUID) + "." + str(sopN)
                studySeriesSopUIDs.append([studyUID, seriesUID, sopUID])
        ## For this test, generate two sets of files from two different templates
        mrStudySeriesSopUIDs = studySeriesSopUIDs[:5]
        success = baseTest.generateCustomDicomFiles(
            mrStudySeriesSopUIDs, customFieldsDictionary, testDataDir + "/dicom_files/MR.dcm", sentFilesDirectory
        )
        if not success:
            return (False, "Failed to generate custom dicom MR files")
        ctStudySeriesSopUIDs = studySeriesSopUIDs[5:]
        success = baseTest.generateCustomDicomFiles(
            ctStudySeriesSopUIDs, customFieldsDictionary, testDataDir + "/dicom_files/CT.dcm", sentFilesDirectory
        )
        if not success:
            return (False, "Failed to generate custom dicom CT files")

        ## --------------------------------------------------------- ##
        print "Send DICOM files to PACS"
        ## --------------------------------------------------------- ##
        baseTest.sendDicomFileToPacs(pacsAeTitle, pacsHost, pacsPort, sentFilesDirectory, customFieldsDictionary)

        ## --------------------------------------------------------- ##
        print "Instruct EDGE to retrieve DICOM files for pid & accession - Job, JobSet, Transactions entries in rsnadb"
        ## --------------------------------------------------------- ##
        jobID = baseTest.startNewJobAndTransactionOnEdge(patientID, accessionNumber)

        ## --------------------------------------------------------- ##
        print "Wait for EDGE to complete transfer to Clearinghouse"
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForCompletedXdsXfer(jobID, 240)

        if statusCode != 40:
            return (False, "Transaction status code set to: " + str(statusCode))

        ## --------------------------------------------------------- ##
        print "Retrieve XDS documents from Clearinghouse repository"
        ## --------------------------------------------------------- ##
        PATIENT_ID_ASSIGNING_AUTHORITY = "1.3.6.1.4.1.19376.2.840.1.1.1.1"
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = "ISO"
        singleUsePatientID = EdgeDbManager("rsnadb", edgeHost, "edge", "d17bK4#M").getSingleUsePatientID(jobID)
        fullPatientID = (
            singleUsePatientID + r"^^^&" + PATIENT_ID_ASSIGNING_AUTHORITY + r"&" + PATIENT_ID_ASSIGNING_AUTHORITY_TYPE
        )
        baseTest.retrieveXdsDocuments(fullPatientID, registryURL, repositoryURL, repositoryUID, retreivedFilesDirectory)
        if len(os.listdir(retreivedFilesDirectory)) == 0:
            return (False, "Zero documents retrieved")

        ## --------------------------------------------------------- ##
        print "Validate retrieved documents"
        ## --------------------------------------------------------- ##
        success = baseTest.validateRetrievedMetaDataLegality(retreivedFilesDirectory)
        if not success:
            return (False, "Failed due to illegal meta-data.")

        success = baseTest.validateRetrievedMetaDataMatch(retreivedFilesDirectory, customFieldsDictionary)
        if not success:
            return (False, "Failed due to meta-data mismatch.")

        success = baseTest.validateDcmSentDcmRetrievedBinaryMatch(sentFilesDirectory, retreivedFilesDirectory)
        if not success:
            return (False, "Failed due to sent-retrieved file binary mismatch.")

        success = baseTest.validateKosDcmMatch(retreivedFilesDirectory)
        if not success:
            return (False, "Failed due to manifest - retrieved file mismatch.")

        return (True, "Passed Tests")
Ejemplo n.º 5
0
class A_7001_14:
    def run(self):

        print """
        A_7001_14:
        """

        global tempRoot
        global mesaDir
        global mesaToolDir
        global dataRoot
        global dcm4CheDir

        self.verifyEnvironment()

        testName = "A_7001_14"
        numberOfSeriesPerStudy = 1
        numberOfSOPsPerSeries = 200
        # This is the number of dicom images sent per unique series

        ## Testing Hosts ##
        edgeHost = "172.20.175.63"

        ## PACS Host ##
        pacsAeTitle = "DCM4CHEE"
        pacsHost = "localhost"
        pacsPort = "11112"

        ## MIRTH HL7 Connection
        mirthHl7Host = edgeHost
        mirthHl7Port = "20000"

        ## XDS Clearinghouse Connections
        nistScriptDirectory = "/usr/local/tomcat1/bin"
        registryURL = "http://localhost:9080/axis2/services/xdsregistryb"
        repositoryURL = "http://localhost:9080/axis2/services/xdsrepositoryb"
        repositoryUID = "1.19.6.24.109.42.1.5"
        PATIENT_ID_ASSIGNING_AUTHORITY = "1.3.6.1.4.1.19376.2.840.1.1.1.1"
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = "ISO"

        testDataDir = dataRoot + "/A-7001/A-7001-01"
        baseTest = A_7001_01(testName, tempRoot, dcm4CheDir, mesaDir, mesaToolDir, edgeHost)

        ## XDS HL7 Connection
        xdsHl7JarPath = os.path.normpath(os.getcwd() + "/../util/HL7Receiver.jar")
        xdsHl7Port = 9082

        ## --------------------------------------------------------- ##
        print "Starting XDS HL7 Receiver"
        ## --------------------------------------------------------- ##
        self.xdsHl7 = HL7ReceiverManager(xdsHl7JarPath, xdsHl7Port, False, False)
        if self.xdsHl7.isAnInstanceRunning():
            return (False, "HL7 Receiver already running.  Kill process before testing.")
        success = self.xdsHl7.startServer()
        if not success:
            return (False, "Failed to start HL7 Receiver")

        ## --------------------------------------------------------- ##
        print "Starting NIST Repository as Clearinghouse"
        ## --------------------------------------------------------- ##
        self.nist = NistRepositoryManager(nistScriptDirectory)
        success = self.nist.startServer()
        if not success:
            return (False, "Failed to start NIST Repository")

        ## --------------------------------------------------------- ##
        print "Generate unique Study Instance UID"
        ## --------------------------------------------------------- ##
        studyUID = "9999." + strftime("%Y%m%d%H%M%S", localtime())

        ## --------------------------------------------------------- ##
        print "Generate dictionary used to fill hl7 message templates"
        ## --------------------------------------------------------- ##
        customFieldsDictionary = baseTest.generateCustomFields(studyUID)
        patientName = customFieldsDictionary["PATIENT_NAME"]
        print "patientName:" + patientName
        patientID = customFieldsDictionary["PATIENT_ID"]
        print "patientID:" + patientID
        accessionNumber = customFieldsDictionary["ACCESSION_NUMBER"]
        print "accessionNumber:" + accessionNumber
        studyUID = customFieldsDictionary["STUDY_INSTANCE_UID"]
        print "studyUID:" + studyUID

        # Create test directorys
        testTempDir = tempRoot + "/" + accessionNumber
        os.makedirs(testTempDir)
        retreivedFilesDirectory = testTempDir + "/retrieved"
        os.makedirs(retreivedFilesDirectory)
        sentFilesDirectory = testTempDir + "/sent"
        os.makedirs(sentFilesDirectory)

        ## --------------------------------------------------------- ##
        print "Generate ORM HL7 message and send to HL7 receiver - Creates Exam & Patient entries via MIRTH"
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOrm(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port)
        if status != "SCHEDULED":
            return (False, "Failed to schedule exam")

        ## --------------------------------------------------------- ##
        print "Generate ORU HL7 message and send to HL7 receiver"
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOru(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port)
        if status != "FINALIZED":
            return (False, "Failed to finalize exam")

        ## --------------------------------------------------------- ##
        print "Prepare DICOM files to with Study, Series, SOP UIDs"
        ## --------------------------------------------------------- ##
        studySeriesSopUIDs = []
        # SeriesUID format - StudyUID.N
        # SopUID format    - StudyUID.Series.N
        #   where N is a reasonably unique int
        n = int(strftime("%H%M%S", localtime()))
        for seriesIndex in range(numberOfSeriesPerStudy):
            seriesN = seriesIndex + n
            seriesUID = str(studyUID) + "." + str(seriesN)
            for sopIndex in range(numberOfSOPsPerSeries):
                sopN = sopIndex + n
                sopUID = str(seriesUID) + "." + str(sopN)
                studySeriesSopUIDs.append([studyUID, seriesUID, sopUID])
        success = baseTest.generateCustomDicomFiles(
            studySeriesSopUIDs, customFieldsDictionary, testDataDir + "/dicom_files/MR.dcm", sentFilesDirectory
        )
        if not success:
            return (False, "Failed to generate custom dicom files")

        ## --------------------------------------------------------- ##
        print "Send DICOM files to PACS"
        ## --------------------------------------------------------- ##
        baseTest.sendDicomFileToPacs(pacsAeTitle, pacsHost, pacsPort, sentFilesDirectory, customFieldsDictionary)

        ## --------------------------------------------------------- ##
        print "Instruct EDGE to retrieve DICOM files for pid & accession - Job, JobSet, Transactions entries in rsnadb"
        ## --------------------------------------------------------- ##
        jobID = baseTest.startNewJobAndTransactionOnEdge(patientID, accessionNumber)

        ## --------------------------------------------------------- ##
        print "Wait for EDGE to start transfer to Clearinghouse - status code = 34"
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForTransactionStatusCode(jobID, 34, 240)

        if statusCode != 34:
            return (False, "Transaction status code set to: " + str(statusCode) + " Expected 34.")

        sleep(10)

        ## --------------------------------------------------------- ##
        print "Shutdown NIST repository - mid-transfer"
        ## --------------------------------------------------------- ##
        success = self.nist.stopServer()
        if not success:
            return (False, "Failed to stop NIST Repository")

        ## --------------------------------------------------------- ##
        print "Wait for EDGE to fail out of transfer to Clearinghouse - status code = -34"
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForTransactionStatusCode(jobID, -34, 240)

        if statusCode != -34:
            return (False, "Transaction status code set to: " + str(statusCode) + " Expected -34.")

        ## --------------------------------------------------------- ##
        print "Restart repository and attempt to retrieve XDS documents from Clearinghouse repository"
        ## --------------------------------------------------------- ##
        success = self.nist.startServer()
        if not success:
            return (False, "Failed to restart NIST Repository")

        PATIENT_ID_ASSIGNING_AUTHORITY = "1.3.6.1.4.1.19376.2.840.1.1.1.1"
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = "ISO"
        singleUsePatientID = EdgeDbManager("rsnadb").getSingleUsePatientID(jobID)
        fullPatientID = (
            singleUsePatientID + r"^^^&" + PATIENT_ID_ASSIGNING_AUTHORITY + r"&" + PATIENT_ID_ASSIGNING_AUTHORITY_TYPE
        )
        baseTest.retrieveXdsDocuments(fullPatientID, registryURL, repositoryURL, repositoryUID, retreivedFilesDirectory)

        ## --------------------------------------------------------- ##
        print "Expect transaction status code -34 and zero matching documents."
        ## --------------------------------------------------------- ##
        if statusCode != -34:
            return (False, "Transaction status code set to: " + str(statusCode))
        elif len(os.listdir(retreivedFilesDirectory)) > 0:
            return (False, "Unexpected documents retrieved")
        else:
            print "Transaction status:", statusCode, "Zero matching documents retrieved."

        return (True, "Passed Tests")

    def cleanup(self):
        self.xdsHl7.stopServer()
        self.nist.stopServer()

    def verifyEnvironment(self):
        global tempRoot
        global mesaDir
        global mesaToolDir
        global dataRoot
        global dcm4CheDir
        ## Verify environment
        if not "MESA_TARGET" in os.environ:
            print "Missing MESA_TARGET"
            exit(1)
        else:
            mesaDir = os.environ["MESA_TARGET"]
            mesaToolDir = mesaDir + "/bin"

        if not "VERIF_VALID_HOME" in os.environ:
            print "Missing VERIF_VALID_HOME"
            exit(1)
        else:
            dataRoot = os.environ["VERIF_VALID_HOME"] + "/data"

        if not "DCM4CHE_HOME" in os.environ:
            print "Missing DCM4CHE_HOME"
            exit(1)
        else:
            dcm4CheDir = os.environ["DCM4CHE_HOME"]

        if not "TEMP" in os.environ:
            tempRoot = "/tmp"
        else:
            tempRoot = os.environ["TEMP"]
Ejemplo n.º 6
0
    def run(self):
    
        print '''
        A_7001_13:
        '''
        
        global tempRoot;
        global mesaDir;
        global mesaToolDir;
        global dataRoot;
        global dcm4CheDir;
        
        self.verifyEnvironment();
        
        testName = 'A_7001_13';
        numberOfSeriesPerStudy = 1;
        numberOfSOPsPerSeries = 1;  # This is the number of dicom images sent per unique series
        
        ## Testing Hosts ##
        edgeHost = '172.20.175.63'
        
        
        ## PACS Host ##
        pacsAeTitle = 'DCM4CHEE';
        pacsHost = 'localhost';
        pacsPort = '11112';
        
        ## MIRTH HL7 Connection
        mirthHl7Host = edgeHost;
        mirthHl7Port = '20000';
        
        ## XDS Clearinghouse Connections
        nistScriptDirectory = '/usr/local/tomcat1/bin'
        registryURL = 'http://localhost:9080/axis2/services/xdsregistryb';
        repositoryURL = 'http://localhost:9080/axis2/services/xdsrepositoryb';
        repositoryUID = '1.19.6.24.109.42.1.5';
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1';
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO';
        
        testDataDir = dataRoot + '/A-7001/A-7001-01';
        baseTest = A_7001_01(testName, tempRoot, dcm4CheDir, mesaDir, mesaToolDir, edgeHost);
    
        ## XDS HL7 Connection
        xdsHl7JarPath = os.path.normpath(os.getcwd() + '/../util/HL7Receiver.jar');
        xdsHl7Port = 9082;
        
        ## --------------------------------------------------------- ##
        print 'Starting XDS HL7 Receiver'
        ## --------------------------------------------------------- ##
        self.xdsHl7 = HL7ReceiverManager(xdsHl7JarPath, xdsHl7Port, False, False);
        if self.xdsHl7.isAnInstanceRunning():
            return (False, 'HL7 Receiver already running.  Kill process before testing.');
        success = self.xdsHl7.startServer();
        if not success:
            return (False, 'Failed to start HL7 Receiver');
    
        ## --------------------------------------------------------- ##
        print 'Skip starting NIST Repository as Clearinghouse'
        ## --------------------------------------------------------- ##
        self.nist = NistRepositoryManager(nistScriptDirectory);

        ## --------------------------------------------------------- ##
        print 'Generate unique Study Instance UID'
        ## --------------------------------------------------------- ##
        studyUID = '9999.' + strftime('%Y%m%d%H%M%S', localtime());
        
        ## --------------------------------------------------------- ##
        print 'Generate dictionary used to fill hl7 message templates'
        ## --------------------------------------------------------- ##
        customFieldsDictionary = baseTest.generateCustomFields(studyUID);
        patientName = customFieldsDictionary['PATIENT_NAME'];
        print 'patientName:' + patientName;
        patientID = customFieldsDictionary['PATIENT_ID'];
        print 'patientID:' + patientID;
        accessionNumber = customFieldsDictionary['ACCESSION_NUMBER'];
        print 'accessionNumber:' + accessionNumber;
        studyUID = customFieldsDictionary['STUDY_INSTANCE_UID'];
        print 'studyUID:' + studyUID;
    
        # Create test directorys
        testTempDir = tempRoot + '/' + accessionNumber;
        os.makedirs(testTempDir);
        retreivedFilesDirectory = testTempDir + '/retrieved'; 
        os.makedirs(retreivedFilesDirectory);
        sentFilesDirectory = testTempDir + '/sent'; 
        os.makedirs(sentFilesDirectory);
    
        ## --------------------------------------------------------- ##
        print 'Generate ORM HL7 message and send to HL7 receiver - Creates Exam & Patient entries via MIRTH' 
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOrm(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port);
        if(status != 'SCHEDULED'):
            return (False, 'Failed to schedule exam');
        
        ## --------------------------------------------------------- ##
        print 'Generate ORU HL7 message and send to HL7 receiver' 
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOru(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port);
        if(status != 'FINALIZED'):
            return (False, 'Failed to finalize exam');
        
        ## --------------------------------------------------------- ##
        print 'Prepare DICOM files to with Study, Series, SOP UIDs' 
        ## --------------------------------------------------------- ##
        studySeriesSopUIDs = [];
        # SeriesUID format - StudyUID.N
        # SopUID format    - StudyUID.Series.N
        #   where N is a reasonably unique int
        n = int(strftime('%H%M%S', localtime()));
        for seriesIndex in range(numberOfSeriesPerStudy):
            seriesN = seriesIndex + n;
            seriesUID = str(studyUID) + '.' + str(seriesN)
            for sopIndex in range(numberOfSOPsPerSeries):
                sopN = sopIndex + n;
                sopUID = str(seriesUID) + '.'+ str(sopN)
                studySeriesSopUIDs.append([studyUID, seriesUID, sopUID]);
        success = baseTest.generateCustomDicomFiles(studySeriesSopUIDs, customFieldsDictionary, testDataDir + '/dicom_files/MR.dcm', sentFilesDirectory)
        if not success:
            return (False, 'Failed to generate custom dicom files');
        
        ## --------------------------------------------------------- ##
        print 'Send DICOM files to PACS' 
        ## --------------------------------------------------------- ##
        baseTest.sendDicomFileToPacs(pacsAeTitle, pacsHost, pacsPort, sentFilesDirectory, customFieldsDictionary);
        
        
        ## --------------------------------------------------------- ##
        print 'Instruct EDGE to retrieve DICOM files for pid & accession - Job, JobSet, Transactions entries in rsnadb';  
        ## --------------------------------------------------------- ##
        jobID = baseTest.startNewJobAndTransactionOnEdge(patientID, accessionNumber);
        

        
        ## --------------------------------------------------------- ##
        print 'Wait for EDGE to fail on communication with Clearinghouse' 
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForTransactionStatusCode(jobID, -34, 240);

            
        ## --------------------------------------------------------- ##
        print 'Retrieve XDS documents from Clearinghouse repository'  
        ## --------------------------------------------------------- ##
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1';
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO';
        singleUsePatientID = EdgeDbManager('rsnadb', edgeHost, 'edge', 'd17bK4#M').getSingleUsePatientID(jobID);
        fullPatientID = singleUsePatientID + r'^^^&' + PATIENT_ID_ASSIGNING_AUTHORITY + r'&' + PATIENT_ID_ASSIGNING_AUTHORITY_TYPE;
        baseTest.retrieveXdsDocuments(fullPatientID, registryURL, repositoryURL, repositoryUID, retreivedFilesDirectory);
          
        ## --------------------------------------------------------- ##
        print 'Expect transaction status code -34 and zero matching documents.'  
        ## --------------------------------------------------------- ##
        if(statusCode != -34):
            return (False, 'Transaction status code set to: ' +  str(statusCode));
        elif len(os.listdir(retreivedFilesDirectory)) > 0 :
            return (False, 'Failed Tests: Unexpected documents retrieved');
        else:
            print 'Transaction status:', statusCode, 'Zero matching documents retrieved.'
            
            
        return (True, 'Passed Tests'); 
class A_7001_13():
    def run(self):
    
        print '''
        A_7001_13:
        '''
        
        global tempRoot;
        global mesaDir;
        global mesaToolDir;
        global dataRoot;
        global dcm4CheDir;
        
        self.verifyEnvironment();
        
        testName = 'A_7001_13';
        numberOfSeriesPerStudy = 1;
        numberOfSOPsPerSeries = 1;  # This is the number of dicom images sent per unique series
        
        ## Testing Hosts ##
        edgeHost = '172.20.175.63'
        
        
        ## PACS Host ##
        pacsAeTitle = 'DCM4CHEE';
        pacsHost = 'localhost';
        pacsPort = '11112';
        
        ## MIRTH HL7 Connection
        mirthHl7Host = edgeHost;
        mirthHl7Port = '20000';
        
        ## XDS Clearinghouse Connections
        nistScriptDirectory = '/usr/local/tomcat1/bin'
        registryURL = 'http://localhost:9080/axis2/services/xdsregistryb';
        repositoryURL = 'http://localhost:9080/axis2/services/xdsrepositoryb';
        repositoryUID = '1.19.6.24.109.42.1.5';
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1';
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO';
        
        testDataDir = dataRoot + '/A-7001/A-7001-01';
        baseTest = A_7001_01(testName, tempRoot, dcm4CheDir, mesaDir, mesaToolDir, edgeHost);
    
        ## XDS HL7 Connection
        xdsHl7JarPath = os.path.normpath(os.getcwd() + '/../util/HL7Receiver.jar');
        xdsHl7Port = 9082;
        
        ## --------------------------------------------------------- ##
        print 'Starting XDS HL7 Receiver'
        ## --------------------------------------------------------- ##
        self.xdsHl7 = HL7ReceiverManager(xdsHl7JarPath, xdsHl7Port, False, False);
        if self.xdsHl7.isAnInstanceRunning():
            return (False, 'HL7 Receiver already running.  Kill process before testing.');
        success = self.xdsHl7.startServer();
        if not success:
            return (False, 'Failed to start HL7 Receiver');
    
        ## --------------------------------------------------------- ##
        print 'Skip starting NIST Repository as Clearinghouse'
        ## --------------------------------------------------------- ##
        self.nist = NistRepositoryManager(nistScriptDirectory);

        ## --------------------------------------------------------- ##
        print 'Generate unique Study Instance UID'
        ## --------------------------------------------------------- ##
        studyUID = '9999.' + strftime('%Y%m%d%H%M%S', localtime());
        
        ## --------------------------------------------------------- ##
        print 'Generate dictionary used to fill hl7 message templates'
        ## --------------------------------------------------------- ##
        customFieldsDictionary = baseTest.generateCustomFields(studyUID);
        patientName = customFieldsDictionary['PATIENT_NAME'];
        print 'patientName:' + patientName;
        patientID = customFieldsDictionary['PATIENT_ID'];
        print 'patientID:' + patientID;
        accessionNumber = customFieldsDictionary['ACCESSION_NUMBER'];
        print 'accessionNumber:' + accessionNumber;
        studyUID = customFieldsDictionary['STUDY_INSTANCE_UID'];
        print 'studyUID:' + studyUID;
    
        # Create test directorys
        testTempDir = tempRoot + '/' + accessionNumber;
        os.makedirs(testTempDir);
        retreivedFilesDirectory = testTempDir + '/retrieved'; 
        os.makedirs(retreivedFilesDirectory);
        sentFilesDirectory = testTempDir + '/sent'; 
        os.makedirs(sentFilesDirectory);
    
        ## --------------------------------------------------------- ##
        print 'Generate ORM HL7 message and send to HL7 receiver - Creates Exam & Patient entries via MIRTH' 
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOrm(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port);
        if(status != 'SCHEDULED'):
            return (False, 'Failed to schedule exam');
        
        ## --------------------------------------------------------- ##
        print 'Generate ORU HL7 message and send to HL7 receiver' 
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOru(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port);
        if(status != 'FINALIZED'):
            return (False, 'Failed to finalize exam');
        
        ## --------------------------------------------------------- ##
        print 'Prepare DICOM files to with Study, Series, SOP UIDs' 
        ## --------------------------------------------------------- ##
        studySeriesSopUIDs = [];
        # SeriesUID format - StudyUID.N
        # SopUID format    - StudyUID.Series.N
        #   where N is a reasonably unique int
        n = int(strftime('%H%M%S', localtime()));
        for seriesIndex in range(numberOfSeriesPerStudy):
            seriesN = seriesIndex + n;
            seriesUID = str(studyUID) + '.' + str(seriesN)
            for sopIndex in range(numberOfSOPsPerSeries):
                sopN = sopIndex + n;
                sopUID = str(seriesUID) + '.'+ str(sopN)
                studySeriesSopUIDs.append([studyUID, seriesUID, sopUID]);
        success = baseTest.generateCustomDicomFiles(studySeriesSopUIDs, customFieldsDictionary, testDataDir + '/dicom_files/MR.dcm', sentFilesDirectory)
        if not success:
            return (False, 'Failed to generate custom dicom files');
        
        ## --------------------------------------------------------- ##
        print 'Send DICOM files to PACS' 
        ## --------------------------------------------------------- ##
        baseTest.sendDicomFileToPacs(pacsAeTitle, pacsHost, pacsPort, sentFilesDirectory, customFieldsDictionary);
        
        
        ## --------------------------------------------------------- ##
        print 'Instruct EDGE to retrieve DICOM files for pid & accession - Job, JobSet, Transactions entries in rsnadb';  
        ## --------------------------------------------------------- ##
        jobID = baseTest.startNewJobAndTransactionOnEdge(patientID, accessionNumber);
        

        
        ## --------------------------------------------------------- ##
        print 'Wait for EDGE to fail on communication with Clearinghouse' 
        ## --------------------------------------------------------- ##
        statusCode = baseTest.waitForTransactionStatusCode(jobID, -34, 240);

            
        ## --------------------------------------------------------- ##
        print 'Retrieve XDS documents from Clearinghouse repository'  
        ## --------------------------------------------------------- ##
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1';
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO';
        singleUsePatientID = EdgeDbManager('rsnadb', edgeHost, 'edge', 'd17bK4#M').getSingleUsePatientID(jobID);
        fullPatientID = singleUsePatientID + r'^^^&' + PATIENT_ID_ASSIGNING_AUTHORITY + r'&' + PATIENT_ID_ASSIGNING_AUTHORITY_TYPE;
        baseTest.retrieveXdsDocuments(fullPatientID, registryURL, repositoryURL, repositoryUID, retreivedFilesDirectory);
          
        ## --------------------------------------------------------- ##
        print 'Expect transaction status code -34 and zero matching documents.'  
        ## --------------------------------------------------------- ##
        if(statusCode != -34):
            return (False, 'Transaction status code set to: ' +  str(statusCode));
        elif len(os.listdir(retreivedFilesDirectory)) > 0 :
            return (False, 'Failed Tests: Unexpected documents retrieved');
        else:
            print 'Transaction status:', statusCode, 'Zero matching documents retrieved.'
            
            
        return (True, 'Passed Tests'); 
    
    def cleanup(self):
        self.xdsHl7.stopServer();
        self.nist.stopServer();
        
    def verifyEnvironment(self):
        global tempRoot;
        global mesaDir;
        global mesaToolDir;
        global dataRoot;
        global dcm4CheDir;
        ## Verify environment
        if not 'MESA_TARGET' in os.environ:
            print "Missing MESA_TARGET"
            exit(1)
        else:
            mesaDir = os.environ['MESA_TARGET'];
            mesaToolDir = mesaDir + '/bin';
    
        if not 'VERIF_VALID_HOME' in os.environ:
            print "Missing VERIF_VALID_HOME"
            exit(1)
        else:
            dataRoot = os.environ['VERIF_VALID_HOME'] + '/data';
    
        if not 'DCM4CHE_HOME' in os.environ:
            print "Missing DCM4CHE_HOME"
            exit(1)
        else:
            dcm4CheDir = os.environ['DCM4CHE_HOME'];
            
        if not 'TEMP' in os.environ:
            tempRoot = '/tmp';
        else:
            tempRoot = os.environ['TEMP'];
    def run(self):
    
        print '''
        A_5001_X8:
        Designed to run 7001-02 test as normal, with a breakpoint substituted
        for the job start code.  This should be completed with the token app.
        Afterward, this code should be allowed to complete. 
        '''
        
        global tempRoot;
        global mesaDir;
        global mesaToolDir;
        global dataRoot;
        global dcm4CheDir;
        
        self.verifyEnvironment();
        
        testName = 'A_5001_X8';
        numberOfSeriesPerStudy = 2;
        numberOfSOPsPerSeries = 2;  # This is the number of dicom images sent per unique series
        
        ## Testing Hosts ##
        edgeHost = '172.20.175.61'
        
        
        ## PACS Host ##
        pacsAeTitle = 'DCM4CHEE';
        pacsHost = 'localhost';
        pacsPort = '11112';
        
        ## MIRTH HL7 Connection
        mirthHl7Host = edgeHost;
        mirthHl7Port = '20000';
        
        ## XDS Clearinghouse Connections
        nistScriptDirectory = '/usr/local/tomcat1/bin'
        registryURL = 'http://localhost:9080/axis2/services/xdsregistryb';
        repositoryURL = 'http://localhost:9080/axis2/services/xdsrepositoryb';
        repositoryUID = '1.19.6.24.109.42.1.5';
        PATIENT_ID_ASSIGNING_AUTHORITY = '1.3.6.1.4.1.19376.2.840.1.1.1.1';
        PATIENT_ID_ASSIGNING_AUTHORITY_TYPE = 'ISO';
        
        testDataDir = dataRoot + '/A-7001/A-7001-01';
        baseTest = A_7001_01(testName, tempRoot, dcm4CheDir, mesaDir, mesaToolDir, edgeHost);
    
        ## XDS HL7 Connection
        xdsHl7JarPath = os.path.normpath(os.getcwd() + '/../util/HL7Receiver.jar');
        xdsHl7Port = 9082;
        
        ## --------------------------------------------------------- ##
        print 'Starting XDS HL7 Receiver'
        ## --------------------------------------------------------- ##
        self.xdsHl7 = HL7ReceiverManager(xdsHl7JarPath, xdsHl7Port, False, False);
        if self.xdsHl7.isAnInstanceRunning():
            return (False, 'HL7 Receiver already running.  Kill process before testing.');
        success = self.xdsHl7.startServer();
        if not success:
            return (False, 'Failed to start HL7 Receiver');
    
        ## --------------------------------------------------------- ##
        print 'Starting NIST Repository as Clearinghouse'
        ## --------------------------------------------------------- ##
        self.nist = NistRepositoryManager(nistScriptDirectory);
        success = self.nist.startServer();
        if not success:
            return (False, 'Failed to start NIST Repository');

        ## --------------------------------------------------------- ##
        print 'Generate unique Study Instance UID'
        ## --------------------------------------------------------- ##
        studyUID = '9999.' + strftime('%Y%m%d%H%M%S', localtime());
        
        ## --------------------------------------------------------- ##
        print 'Generate dictionary used to fill hl7 message templates'
        ## --------------------------------------------------------- ##
        customFieldsDictionary = baseTest.generateCustomFields(studyUID);
        patientName = customFieldsDictionary['PATIENT_NAME'];
        print 'patientName:' + patientName;
        patientID = customFieldsDictionary['PATIENT_ID'];
        print 'patientID:' + patientID;
        accessionNumber = customFieldsDictionary['ACCESSION_NUMBER'];
        print 'accessionNumber:' + accessionNumber;
        studyUID = customFieldsDictionary['STUDY_INSTANCE_UID'];
        print 'studyUID:' + studyUID;
    
        # Create test directorys
        testTempDir = tempRoot + '/' + accessionNumber;
        os.makedirs(testTempDir);
        retreivedFilesDirectory = testTempDir + '/retrieved'; 
        os.makedirs(retreivedFilesDirectory);
        sentFilesDirectory = testTempDir + '/sent'; 
        os.makedirs(sentFilesDirectory);
    
        ## --------------------------------------------------------- ##
        print 'Generate ORM HL7 message and send to HL7 receiver - Creates Exam & Patient entries via MIRTH' 
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOrm(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port);
        if(status != 'SCHEDULED'):
            return (False, 'Failed to schedule exam');
        
        ## --------------------------------------------------------- ##
        print 'Generate ORU HL7 message and send to HL7 receiver' 
        ## --------------------------------------------------------- ##
        status = baseTest.generateAndSendOru(testDataDir, customFieldsDictionary, mirthHl7Host, mirthHl7Port);
        if(status != 'FINALIZED'):
            return (False, 'Failed to finalize exam');
        
        ## --------------------------------------------------------- ##
        print 'Prepare DICOM files to with Study, Series, SOP UIDs' 
        ## --------------------------------------------------------- ##
        studySeriesSopUIDs = [];
        # SeriesUID format - StudyUID.N
        # SopUID format    - StudyUID.Series.N
        #   where N is a reasonably unique int
        n = int(strftime('%H%M%S', localtime()));
        for seriesIndex in range(numberOfSeriesPerStudy):
            seriesN = seriesIndex + n;
            seriesUID = str(studyUID) + '.' + str(seriesN)
            for sopIndex in range(numberOfSOPsPerSeries):
                sopN = sopIndex + n;
                sopUID = str(seriesUID) + '.'+ str(sopN)
                studySeriesSopUIDs.append([studyUID, seriesUID, sopUID]);
        success = baseTest.generateCustomDicomFiles(studySeriesSopUIDs, customFieldsDictionary, testDataDir + '/dicom_files/CT.dcm', sentFilesDirectory)
        if not success:
            return (False, 'Failed to generate custom dicom files');
        
        ## --------------------------------------------------------- ##
        print 'Send DICOM files to PACS' 
        ## --------------------------------------------------------- ##
        baseTest.sendDicomFileToPacs(pacsAeTitle, pacsHost, pacsPort, sentFilesDirectory, customFieldsDictionary);
        
        
        ## --------------------------------------------------------- ##
        print 'Insert breakpoint, wait for transaction status to change to 40';  
        ## --------------------------------------------------------- ##
            
        print 'patientName:' + patientName;
        print 'patientID:' + patientID;
        print 'accessionNumber:' + accessionNumber;
        print 'studyUID:' + studyUID;
            
            
        return (True, 'Passed Tests');