ctkDICOMApplicationTest1.cpp 6.7 KB

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