ctkDICOMApplicationTest1.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. // Qt includes
  2. #include <QTextStream>
  3. #include <QCoreApplication>
  4. #include <QProcess>
  5. // STD includes
  6. #include <iostream>
  7. #include <cstdlib>
  8. /*
  9. * This test performs a full dicom store, query, and retrieve.
  10. *
  11. * To recreate the parts, from the CTK-superbuild directory, run:
  12. *
  13. ./CMakeExternals/Install/bin/dcmqrscp -c ./CTK-build/Testing/Temporary/dcmqrscp.cfg -d -v
  14. ./CMakeExternals/Install/bin/storescu -aec CTK_AE -aet CTK_AE localhost 11112 ./CMakeExternals/Source/CTKData/Data/DICOM/MRHEAD/*.IMA
  15. ./CMakeExternals/Install/bin/findscu -aet CTK_AE -aec COMMONTK -P -k 0010,0010=\* localhost 11112 patqry.dcm
  16. ./CTK-build/bin/ctkDICOMQuery /tmp/test.db CTK_AE CTK_AE localhost 11112
  17. ./CTK-build/bin/ctkDICOMRetrieve 1.2.840.113619.2.135.3596.6358736.5118.1115807980.182 /tmp/hoot CTK_AE 11113 CTK_AE localhost 11112 CTK_CLIENT_AE
  18. As invoked by ctest:
  19. % ./CTK-build/bin/CTKApplicationCppTests ctkDICOMApplicationTest1 \
  20. ./CMakeExternals/Install/bin/dcmqrscp ./CTK-build/Testing/Temporary/dcmqrscp.cfg \
  21. ./CMakeExternals/Source/CTKData/Data/DICOM/MRHEAD/000055.IMA \
  22. ./CMakeExternals/Source/CTKData/Data/DICOM/MRHEAD/000056.IMA \
  23. ./CMakeExternals/Install/bin/storescu \
  24. ./CTK-build/bin/ctkDICOMQuery \
  25. ./CTK-build/Testing/Temporary/ctkDICOMApplicationTest1.db \
  26. ./CTK-build/bin/ctkDICOMRetrieve \
  27. ./CTK-build/Testing/Temporary/ctkDICOMRetrieveStorage
  28. */
  29. int ctkDICOMApplicationTest1(int argc, char * argv []) {
  30. QCoreApplication app(argc, argv);
  31. QTextStream out(stdout);
  32. if ( argc < 10 )
  33. {
  34. out << "ERROR: invalid arguments. Should be:\n";
  35. out << " ctkDICOMApplicationTest1 <dcmqrscp> <configfile> <dicomData1> <dcmData2> <storescu> <ctkDICOMQuery> <ctkDICOMRetrieve> <retrieveDirectory>\n";
  36. return EXIT_FAILURE;
  37. }
  38. QString dcmqrscp_exe (argv[1]);
  39. QString dcmqrscp_cfg (argv[2]);
  40. QString dicomData1 (argv[3]);
  41. QString dicomData2 (argv[4]);
  42. QString storescu_exe (argv[5]);
  43. QString ctkDICOMQuery_exe (argv[6]);
  44. QString ctkDICOMQuery_db_file (argv[7]);
  45. QString ctkDICOMRetrieve_exe (argv[8]);
  46. QString ctkDICOMRetrieve_directory (argv[9]);
  47. //
  48. // first, start the server process
  49. //
  50. QProcess *dcmqrscp = new QProcess(0);
  51. QStringList dcmqrscp_args;
  52. dcmqrscp_args << "--config" << dcmqrscp_cfg;
  53. dcmqrscp_args << "--debug" << "--verbose";
  54. dcmqrscp_args << "11112";
  55. try
  56. {
  57. out << "starting server" << dcmqrscp_exe << "\n";
  58. out << "with args " << dcmqrscp_args.join(" ") << "\n";
  59. dcmqrscp->start(dcmqrscp_exe, dcmqrscp_args);
  60. dcmqrscp->waitForStarted();
  61. }
  62. catch (std::exception e)
  63. {
  64. out << "ERROR: could not start server" << e.what();
  65. return EXIT_FAILURE;
  66. }
  67. //
  68. // now push some dicom data in using storescu
  69. //
  70. QProcess *storescu = new QProcess(0);
  71. QStringList storescu_args;
  72. storescu_args << "-aec" << "CTK_AE";
  73. storescu_args << "-aet" << "CTK_AE";
  74. storescu_args << "localhost" << "11112";
  75. storescu_args << dicomData1;
  76. storescu_args << dicomData2;
  77. try
  78. {
  79. out << "running client" << storescu_exe << "\n";
  80. out << "with args" << storescu_args.join(" ") << "\n";
  81. storescu->start(storescu_exe, storescu_args);
  82. storescu->waitForFinished();
  83. out << "storescu Finished.\n";
  84. out << "Standard Output:\n";
  85. out << storescu->readAllStandardOutput();
  86. out << "Standard Error:\n";
  87. out << storescu->readAllStandardError();
  88. }
  89. catch (std::exception e)
  90. {
  91. out << "ERROR: could not start client" << e.what();
  92. return EXIT_FAILURE;
  93. }
  94. //
  95. // now query the server to see if the data arrived okay
  96. // - our database file will be updated with metadata from the query
  97. //
  98. QProcess *ctkDICOMQuery = new QProcess(0);
  99. QStringList ctkDICOMQuery_args;
  100. ctkDICOMQuery_args << ctkDICOMQuery_db_file;
  101. ctkDICOMQuery_args << "CTK_AE" << "CTK_AE";
  102. ctkDICOMQuery_args << "localhost" << "11112";
  103. try
  104. {
  105. out << "running client" << ctkDICOMQuery_exe << "\n";
  106. out << "with args" << ctkDICOMQuery_args.join(" ") << "\n";
  107. ctkDICOMQuery->start(ctkDICOMQuery_exe, ctkDICOMQuery_args);
  108. ctkDICOMQuery->waitForFinished();
  109. out << "ctkDICOMQuery Finished.\n";
  110. out << "Standard Output:\n";
  111. out << ctkDICOMQuery->readAllStandardOutput();
  112. out << "Standard Error:\n";
  113. out << ctkDICOMQuery->readAllStandardError();
  114. }
  115. catch (std::exception e)
  116. {
  117. out << "ERROR: could not start client" << e.what();
  118. return EXIT_FAILURE;
  119. }
  120. //
  121. // now do a retrieve into our download directory
  122. //
  123. // this is the study id of the dicom files we load from CTKData
  124. QString studyUID("1.2.840.113619.2.135.3596.6358736.5118.1115807980.182");
  125. QProcess *ctkDICOMRetrieve = new QProcess(0);
  126. QStringList ctkDICOMRetrieve_args;
  127. ctkDICOMRetrieve_args << studyUID;
  128. ctkDICOMRetrieve_args << ctkDICOMRetrieve_directory;
  129. ctkDICOMRetrieve_args << "CTK_AE" << "11113";
  130. ctkDICOMRetrieve_args << "CTK_AE";
  131. ctkDICOMRetrieve_args << "localhost" << "11112" << "CTK_CLIENT_AE";
  132. try
  133. {
  134. out << "running client" << ctkDICOMRetrieve_exe << "\n";
  135. out << "with args" << ctkDICOMRetrieve_args.join(" ") << "\n";
  136. ctkDICOMRetrieve->start(ctkDICOMRetrieve_exe, ctkDICOMRetrieve_args);
  137. ctkDICOMRetrieve->waitForFinished();
  138. out << "ctkDICOMRetrieve Finished.\n";
  139. out << "Standard Output:\n";
  140. out << ctkDICOMRetrieve->readAllStandardOutput();
  141. out << "Standard Error:\n";
  142. out << ctkDICOMRetrieve->readAllStandardError();
  143. }
  144. catch (std::exception e)
  145. {
  146. out << "ERROR: could not start client" << e.what();
  147. return EXIT_FAILURE;
  148. }
  149. //
  150. // clients are finished, not kill server and print output
  151. //
  152. try
  153. {
  154. dcmqrscp->kill();
  155. dcmqrscp->waitForFinished();
  156. out << "dcmqrscp Finished.\n";
  157. out << "Standard Output:\n";
  158. out << dcmqrscp->readAllStandardOutput();
  159. out << "Standard Error:\n";
  160. out << dcmqrscp->readAllStandardError();
  161. }
  162. catch (std::exception e)
  163. {
  164. out << "ERROR: could not start client" << e.what();
  165. return EXIT_FAILURE;
  166. }
  167. return EXIT_SUCCESS;
  168. }