Browse Source

Add ctkDICOMQueryTest2 to test network query communications

Julien Finet 14 years ago
parent
commit
6467b60172

+ 5 - 0
Libs/DICOM/Core/Testing/Cpp/CMakeLists.txt

@@ -7,6 +7,7 @@ CREATE_TEST_SOURCELIST(Tests ${KIT}CppTests.cpp
   ctkDICOMIndexerTest1.cpp
   ctkDICOMModelTest1.cpp
   ctkDICOMQueryTest1.cpp
+  ctkDICOMQueryTest2.cpp
   ctkDICOMPersonNameTest1.cpp
   ctkDICOMTest1.cpp
   ctkDICOMTesterTest1.cpp
@@ -46,7 +47,11 @@ ADD_TEST( ctkDICOMModelTest1 ${KIT_TESTS}
                              ${CMAKE_CURRENT_SOURCE_DIR}/../../Resources/dicom-sample.sql)
 SET_PROPERTY(TEST ctkDICOMModelTest1 PROPERTY LABELS ${PROJECT_NAME})
 
+# ctkDICOMQuery
 SIMPLE_TEST( ctkDICOMQueryTest1)
+ADD_TEST( ctkDICOMQueryTest2 ${KIT_TESTS}
+          ctkDICOMQueryTest2 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA ${CTKData_DIR}/Data/DICOM/MRHEAD/000056.IMA)
+SET_PROPERTY(TEST ctkDICOMQueryTest2 PROPERTY LABELS ${PROJECT_NAME})
 
 ADD_TEST( ctkDICOMTest1 ${KIT_TESTS}
           ctkDICOMTest1 ${CMAKE_CURRENT_BINARY_DIR}/dicom.db

+ 79 - 0
Libs/DICOM/Core/Testing/Cpp/ctkDICOMQueryTest2.cpp

@@ -0,0 +1,79 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+// Qt includes
+#include <QCoreApplication>
+#include <QDebug>
+#include <QStringList>
+#include <QVariant>
+
+// ctkDICOMCore includes
+#include "ctkDICOMDatabase.h"
+#include "ctkDICOMQuery.h"
+#include "ctkDICOMTester.h"
+
+// STD includes
+#include <iostream>
+
+void ctkDICOMQueryTest2PrintUsage()
+{
+  std::cout << " ctkDICOMQueryTest2 images" << std::endl;
+}
+
+// Test on a real local database
+int ctkDICOMQueryTest2( int argc, char * argv [] )
+{
+  QCoreApplication app(argc, argv);
+
+  ctkDICOMTester tester;
+  tester.startDCMQRSCP();
+  
+  QStringList arguments = app.arguments();
+  arguments.pop_front(); // remove application name
+  arguments.pop_front(); // remove test name
+  if (!arguments.count())
+    {
+    ctkDICOMQueryTest2PrintUsage();
+    return EXIT_FAILURE;
+    }
+  tester.storeData(arguments);
+
+  ctkDICOMDatabase database;
+
+  ctkDICOMQuery query;
+  query.setCallingAETitle("CTK_AE");
+  query.setCalledAETitle("CTK_AE");
+  query.setHost("localhost");
+  query.setPort(tester.dcmqrscpPort());
+
+  bool res = query.query(database);
+  if (!res)
+    {
+    std::cout << "ctkDICOMQuery::query() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  if (query.studyInstanceUIDQueried().count() == 0)
+    {
+    std::cout << "ctkDICOMQuery::query() failed."
+              << "No study instance retrieved" << std::endl;
+    return EXIT_FAILURE;
+    }
+  return EXIT_SUCCESS;
+}

+ 9 - 8
Libs/DICOM/Core/ctkDICOMQuery.cpp

@@ -190,7 +190,7 @@ QStringList ctkDICOMQuery::studyInstanceUIDQueried()const
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMQuery::query(ctkDICOMDatabase& database )
+bool ctkDICOMQuery::query(ctkDICOMDatabase& database )
 {
   // ctkDICOMDatabase::setDatabase ( database );
   Q_D(ctkDICOMQuery);
@@ -231,7 +231,7 @@ void ctkDICOMQuery::query(ctkDICOMDatabase& database )
     logger.error( "Error initializing the network" );
     emit progress("Error initializing the network");
     emit progress(100);
-    return;
+    return false;
     }
   logger.debug ( "Negotiating Association" );
   emit progress("Negatiating Association");
@@ -345,16 +345,16 @@ void ctkDICOMQuery::query(ctkDICOMDatabase& database )
   emit progress(40);
 
   OFCondition status = d->SCU.sendFINDRequest ( presentationContex, d->Query, responses );
-  if ( status.good() )
-    {
-    logger.debug ( "Find succeded" );
-    emit progress("Find succeded");
-    }
-  else
+  if ( !status.good() )
     {
     logger.error ( "Find failed" );
     emit progress("Find failed");
+    d->SCU.closeAssociation ( DUL_PEERREQUESTEDRELEASE );
+    emit progress(100);
+    return false;
     }
+  logger.debug ( "Find succeded" );
+  emit progress("Find succeded");
   emit progress(50);
 
   for ( OFListIterator(FINDResponse*) it = responses->begin(); it != responses->end(); it++ )
@@ -406,5 +406,6 @@ void ctkDICOMQuery::query(ctkDICOMDatabase& database )
     }
   d->SCU.closeAssociation ( DUL_PEERREQUESTEDRELEASE );
   emit progress(100);
+  return true;
 }
 

+ 1 - 1
Libs/DICOM/Core/ctkDICOMQuery.h

@@ -64,7 +64,7 @@ public:
   
   /// Query a remote DICOM Image Store SCP
   /// You must at least set the host and port before calling query()
-  void query(ctkDICOMDatabase& database);
+  bool query(ctkDICOMDatabase& database);
 
   /// Access the list of study instance UIDs from the last query
   QStringList studyInstanceUIDQueried()const;