ctkDICOMApplicationTest1.cpp 6.7 KB

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