ctkDICOMApplicationTest1.cpp 5.4 KB

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