comparison UnitTestsSources/MultiThreadingTests.cpp @ 3786:3801435e34a1 SylvainRouquette/fix-issue169-95b752c

integration Orthanc-1.6.0->SylvainRouquette
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 19 Mar 2020 11:48:30 +0100
parents 763533d6dd67 56f2397f027a
children
comparison
equal deleted inserted replaced
3785:763533d6dd67 3786:3801435e34a1
1 /** 1 /**
2 * Orthanc - A Lightweight, RESTful DICOM Store 2 * Orthanc - A Lightweight, RESTful DICOM Store
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4 * Department, University Hospital of Liege, Belgium 4 * Department, University Hospital of Liege, Belgium
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium 5 * Copyright (C) 2017-2020 Osimis S.A., Belgium
6 * 6 *
7 * This program is free software: you can redistribute it and/or 7 * This program is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as 8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation, either version 3 of the 9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version. 10 * License, or (at your option) any later version.
32 32
33 33
34 #include "PrecompiledHeadersUnitTests.h" 34 #include "PrecompiledHeadersUnitTests.h"
35 #include "gtest/gtest.h" 35 #include "gtest/gtest.h"
36 36
37 #include "../Core/Compatibility.h"
37 #include "../Core/FileStorage/MemoryStorageArea.h" 38 #include "../Core/FileStorage/MemoryStorageArea.h"
38 #include "../Core/JobsEngine/JobsEngine.h" 39 #include "../Core/JobsEngine/JobsEngine.h"
39 #include "../Core/Logging.h" 40 #include "../Core/Logging.h"
40 #include "../Core/MultiThreading/SharedMessageQueue.h" 41 #include "../Core/MultiThreading/SharedMessageQueue.h"
41 #include "../Core/OrthancException.h" 42 #include "../Core/OrthancException.h"
99 100
100 virtual void Reset() ORTHANC_OVERRIDE 101 virtual void Reset() ORTHANC_OVERRIDE
101 { 102 {
102 } 103 }
103 104
104 virtual JobStepResult Step() ORTHANC_OVERRIDE 105 virtual JobStepResult Step(const std::string& jobId) ORTHANC_OVERRIDE
105 { 106 {
106 if (fails_) 107 if (fails_)
107 { 108 {
108 return JobStepResult::Failure(ErrorCode_ParameterOutOfRange, NULL); 109 return JobStepResult::Failure(ErrorCode_ParameterOutOfRange, NULL);
109 } 110 }
270 ASSERT_FALSE(q.WaitEmpty(1)); 271 ASSERT_FALSE(q.WaitEmpty(1));
271 q.Enqueue(new DynamicInteger(20, s)); 272 q.Enqueue(new DynamicInteger(20, s));
272 q.Enqueue(new DynamicInteger(30, s)); 273 q.Enqueue(new DynamicInteger(30, s));
273 q.Enqueue(new DynamicInteger(40, s)); 274 q.Enqueue(new DynamicInteger(40, s));
274 275
275 std::auto_ptr<DynamicInteger> i; 276 std::unique_ptr<DynamicInteger> i;
276 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(10, i->GetValue()); 277 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(10, i->GetValue());
277 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(20, i->GetValue()); 278 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(20, i->GetValue());
278 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(30, i->GetValue()); 279 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(30, i->GetValue());
279 ASSERT_FALSE(q.WaitEmpty(1)); 280 ASSERT_FALSE(q.WaitEmpty(1));
280 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(40, i->GetValue()); 281 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(40, i->GetValue());
745 746
746 std::string id; 747 std::string id;
747 SequenceOfOperationsJob* job = NULL; 748 SequenceOfOperationsJob* job = NULL;
748 749
749 { 750 {
750 std::auto_ptr<SequenceOfOperationsJob> a(new SequenceOfOperationsJob); 751 std::unique_ptr<SequenceOfOperationsJob> a(new SequenceOfOperationsJob);
751 job = a.get(); 752 job = a.get();
752 engine.GetRegistry().Submit(id, a.release(), 0); 753 engine.GetRegistry().Submit(id, a.release(), 0);
753 } 754 }
754 755
755 boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 756 boost::this_thread::sleep(boost::posix_time::milliseconds(500));
835 { 836 {
836 return false; 837 return false;
837 } 838 }
838 else 839 else
839 { 840 {
840 std::auto_ptr<IJob> unserialized(unserializer.UnserializeJob(a)); 841 std::unique_ptr<IJob> unserialized(unserializer.UnserializeJob(a));
841 842
842 Json::Value b = 43; 843 Json::Value b = 43;
843 if (unserialized->Serialize(b)) 844 if (unserialized->Serialize(b))
844 { 845 {
845 return (CheckSameJson(a, b)); 846 return (CheckSameJson(a, b));
861 { 862 {
862 return false; 863 return false;
863 } 864 }
864 else 865 else
865 { 866 {
866 std::auto_ptr<SetOfInstancesJob> unserialized 867 std::unique_ptr<SetOfInstancesJob> unserialized
867 (dynamic_cast<SetOfInstancesJob*>(unserializer.UnserializeJob(a))); 868 (dynamic_cast<SetOfInstancesJob*>(unserializer.UnserializeJob(a)));
868 869
869 Json::Value b = 43; 870 Json::Value b = 43;
870 if (unserialized->Serialize(b)) 871 if (unserialized->Serialize(b))
871 { 872 {
887 IJobOperation& operation) 888 IJobOperation& operation)
888 { 889 {
889 Json::Value a = 42; 890 Json::Value a = 42;
890 operation.Serialize(a); 891 operation.Serialize(a);
891 892
892 std::auto_ptr<IJobOperation> unserialized(unserializer.UnserializeOperation(a)); 893 std::unique_ptr<IJobOperation> unserialized(unserializer.UnserializeOperation(a));
893 894
894 Json::Value b = 43; 895 Json::Value b = 43;
895 unserialized->Serialize(b); 896 unserialized->Serialize(b);
896 897
897 return CheckSameJson(a, b); 898 return CheckSameJson(a, b);
902 JobOperationValue& value) 903 JobOperationValue& value)
903 { 904 {
904 Json::Value a = 42; 905 Json::Value a = 42;
905 value.Serialize(a); 906 value.Serialize(a);
906 907
907 std::auto_ptr<JobOperationValue> unserialized(unserializer.UnserializeValue(a)); 908 std::unique_ptr<JobOperationValue> unserialized(unserializer.UnserializeValue(a));
908 909
909 Json::Value b = 43; 910 Json::Value b = 43;
910 unserialized->Serialize(b); 911 unserialized->Serialize(b);
911 912
912 return CheckSameJson(a, b); 913 return CheckSameJson(a, b);
955 values.Serialize(s); 956 values.Serialize(s);
956 } 957 }
957 958
958 { 959 {
959 GenericJobUnserializer unserializer; 960 GenericJobUnserializer unserializer;
960 std::auto_ptr<JobOperationValues> values(JobOperationValues::Unserialize(unserializer, s)); 961 std::unique_ptr<JobOperationValues> values(JobOperationValues::Unserialize(unserializer, s));
961 ASSERT_EQ(3u, values->GetSize()); 962 ASSERT_EQ(3u, values->GetSize());
962 ASSERT_EQ(JobOperationValue::Type_Null, values->GetValue(0).GetType()); 963 ASSERT_EQ(JobOperationValue::Type_Null, values->GetValue(0).GetType());
963 ASSERT_EQ(JobOperationValue::Type_String, values->GetValue(1).GetType()); 964 ASSERT_EQ(JobOperationValue::Type_String, values->GetValue(1).GetType());
964 ASSERT_EQ(JobOperationValue::Type_String, values->GetValue(2).GetType()); 965 ASSERT_EQ(JobOperationValue::Type_String, values->GetValue(2).GetType());
965 966
982 } 983 }
983 984
984 ASSERT_THROW(unserializer.UnserializeJob(s), OrthancException); 985 ASSERT_THROW(unserializer.UnserializeJob(s), OrthancException);
985 ASSERT_THROW(unserializer.UnserializeOperation(s), OrthancException); 986 ASSERT_THROW(unserializer.UnserializeOperation(s), OrthancException);
986 987
987 std::auto_ptr<JobOperationValue> value; 988 std::unique_ptr<JobOperationValue> value;
988 value.reset(unserializer.UnserializeValue(s)); 989 value.reset(unserializer.UnserializeValue(s));
989 990
990 ASSERT_EQ(JobOperationValue::Type_Null, value->GetType()); 991 ASSERT_EQ(JobOperationValue::Type_Null, value->GetType());
991 992
992 { 993 {
1019 1020
1020 ASSERT_THROW(unserializer.UnserializeJob(s), OrthancException); 1021 ASSERT_THROW(unserializer.UnserializeJob(s), OrthancException);
1021 ASSERT_THROW(unserializer.UnserializeValue(s), OrthancException); 1022 ASSERT_THROW(unserializer.UnserializeValue(s), OrthancException);
1022 1023
1023 { 1024 {
1024 std::auto_ptr<IJobOperation> operation; 1025 std::unique_ptr<IJobOperation> operation;
1025 operation.reset(unserializer.UnserializeOperation(s)); 1026 operation.reset(unserializer.UnserializeOperation(s));
1026 1027
1027 // Make sure that we have indeed unserialized a log operation 1028 // Make sure that we have indeed unserialized a log operation
1028 Json::Value dummy; 1029 Json::Value dummy;
1029 ASSERT_THROW(dynamic_cast<DeleteResourceOperation&>(*operation).Serialize(dummy), std::bad_cast); 1030 ASSERT_THROW(dynamic_cast<DeleteResourceOperation&>(*operation).Serialize(dummy), std::bad_cast);
1043 job.SetDescription("description"); 1044 job.SetDescription("description");
1044 job.AddInstance("hello"); 1045 job.AddInstance("hello");
1045 job.AddInstance("nope"); 1046 job.AddInstance("nope");
1046 job.AddInstance("world"); 1047 job.AddInstance("world");
1047 job.SetPermissive(true); 1048 job.SetPermissive(true);
1048 ASSERT_THROW(job.Step(), OrthancException); // Not started yet 1049 ASSERT_THROW(job.Step("jobId"), OrthancException); // Not started yet
1049 ASSERT_FALSE(job.HasTrailingStep()); 1050 ASSERT_FALSE(job.HasTrailingStep());
1050 ASSERT_FALSE(job.IsTrailingStepDone()); 1051 ASSERT_FALSE(job.IsTrailingStepDone());
1051 job.Start(); 1052 job.Start();
1052 ASSERT_EQ(JobStepCode_Continue, job.Step().GetCode()); 1053 ASSERT_EQ(JobStepCode_Continue, job.Step("jobId").GetCode());
1053 ASSERT_EQ(JobStepCode_Continue, job.Step().GetCode()); 1054 ASSERT_EQ(JobStepCode_Continue, job.Step("jobId").GetCode());
1054 1055
1055 { 1056 {
1056 DummyUnserializer unserializer; 1057 DummyUnserializer unserializer;
1057 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1058 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1058 } 1059 }
1063 { 1064 {
1064 DummyUnserializer unserializer; 1065 DummyUnserializer unserializer;
1065 ASSERT_THROW(unserializer.UnserializeValue(s), OrthancException); 1066 ASSERT_THROW(unserializer.UnserializeValue(s), OrthancException);
1066 ASSERT_THROW(unserializer.UnserializeOperation(s), OrthancException); 1067 ASSERT_THROW(unserializer.UnserializeOperation(s), OrthancException);
1067 1068
1068 std::auto_ptr<IJob> job; 1069 std::unique_ptr<IJob> job;
1069 job.reset(unserializer.UnserializeJob(s)); 1070 job.reset(unserializer.UnserializeJob(s));
1070 1071
1071 const DummyInstancesJob& tmp = dynamic_cast<const DummyInstancesJob&>(*job); 1072 const DummyInstancesJob& tmp = dynamic_cast<const DummyInstancesJob&>(*job);
1072 ASSERT_FALSE(tmp.IsStarted()); 1073 ASSERT_FALSE(tmp.IsStarted());
1073 ASSERT_TRUE(tmp.IsPermissive()); 1074 ASSERT_TRUE(tmp.IsPermissive());
1099 lock.AddInput(a, s2); 1100 lock.AddInput(a, s2);
1100 lock.SetDicomAssociationTimeout(200); 1101 lock.SetDicomAssociationTimeout(200);
1101 lock.SetTrailingOperationTimeout(300); 1102 lock.SetTrailingOperationTimeout(300);
1102 } 1103 }
1103 1104
1104 ASSERT_EQ(JobStepCode_Continue, job.Step().GetCode()); 1105 ASSERT_EQ(JobStepCode_Continue, job.Step("jobId").GetCode());
1105 1106
1106 { 1107 {
1107 GenericJobUnserializer unserializer; 1108 GenericJobUnserializer unserializer;
1108 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, job)); 1109 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, job));
1109 } 1110 }
1114 { 1115 {
1115 GenericJobUnserializer unserializer; 1116 GenericJobUnserializer unserializer;
1116 ASSERT_THROW(unserializer.UnserializeValue(s), OrthancException); 1117 ASSERT_THROW(unserializer.UnserializeValue(s), OrthancException);
1117 ASSERT_THROW(unserializer.UnserializeOperation(s), OrthancException); 1118 ASSERT_THROW(unserializer.UnserializeOperation(s), OrthancException);
1118 1119
1119 std::auto_ptr<IJob> job; 1120 std::unique_ptr<IJob> job;
1120 job.reset(unserializer.UnserializeJob(s)); 1121 job.reset(unserializer.UnserializeJob(s));
1121 1122
1122 std::string tmp; 1123 std::string tmp;
1123 dynamic_cast<SequenceOfOperationsJob&>(*job).GetDescription(tmp); 1124 dynamic_cast<SequenceOfOperationsJob&>(*job).GetDescription(tmp);
1124 ASSERT_EQ("hello", tmp); 1125 ASSERT_EQ("hello", tmp);
1141 TEST(JobsSerialization, DicomModification) 1142 TEST(JobsSerialization, DicomModification)
1142 { 1143 {
1143 Json::Value s; 1144 Json::Value s;
1144 1145
1145 ParsedDicomFile source(true); 1146 ParsedDicomFile source(true);
1146 source.Insert(DICOM_TAG_STUDY_DESCRIPTION, "Test 1", false); 1147 source.Insert(DICOM_TAG_STUDY_DESCRIPTION, "Test 1", false, "");
1147 source.Insert(DICOM_TAG_SERIES_DESCRIPTION, "Test 2", false); 1148 source.Insert(DICOM_TAG_SERIES_DESCRIPTION, "Test 2", false, "");
1148 source.Insert(DICOM_TAG_PATIENT_NAME, "Test 3", false); 1149 source.Insert(DICOM_TAG_PATIENT_NAME, "Test 3", false, "");
1149 1150
1150 std::auto_ptr<ParsedDicomFile> modified(source.Clone(true)); 1151 std::unique_ptr<ParsedDicomFile> modified(source.Clone(true));
1151 1152
1152 { 1153 {
1153 DicomModification modification; 1154 DicomModification modification;
1154 modification.SetLevel(ResourceType_Series); 1155 modification.SetLevel(ResourceType_Series);
1155 modification.Clear(DICOM_TAG_STUDY_DESCRIPTION); 1156 modification.Clear(DICOM_TAG_STUDY_DESCRIPTION);
1164 1165
1165 { 1166 {
1166 DicomModification modification(s); 1167 DicomModification modification(s);
1167 ASSERT_EQ(ResourceType_Series, modification.GetLevel()); 1168 ASSERT_EQ(ResourceType_Series, modification.GetLevel());
1168 1169
1169 std::auto_ptr<ParsedDicomFile> second(source.Clone(true)); 1170 std::unique_ptr<ParsedDicomFile> second(source.Clone(true));
1170 modification.Apply(*second); 1171 modification.Apply(*second);
1171 1172
1172 std::string s; 1173 std::string s;
1173 ASSERT_TRUE(second->GetTagValue(s, DICOM_TAG_STUDY_DESCRIPTION)); 1174 ASSERT_TRUE(second->GetTagValue(s, DICOM_TAG_STUDY_DESCRIPTION));
1174 ASSERT_TRUE(s.empty()); 1175 ASSERT_TRUE(s.empty());
1280 class OrthancJobsSerialization : public testing::Test 1281 class OrthancJobsSerialization : public testing::Test
1281 { 1282 {
1282 private: 1283 private:
1283 MemoryStorageArea storage_; 1284 MemoryStorageArea storage_;
1284 SQLiteDatabaseWrapper db_; // The SQLite DB is in memory 1285 SQLiteDatabaseWrapper db_; // The SQLite DB is in memory
1285 std::auto_ptr<ServerContext> context_; 1286 std::unique_ptr<ServerContext> context_;
1286 TimeoutDicomConnectionManager manager_; 1287 TimeoutDicomConnectionManager manager_;
1287 1288
1288 public: 1289 public:
1289 OrthancJobsSerialization() 1290 OrthancJobsSerialization()
1290 { 1291 {
1308 bool CreateInstance(std::string& id) 1309 bool CreateInstance(std::string& id)
1309 { 1310 {
1310 // Create a sample DICOM file 1311 // Create a sample DICOM file
1311 ParsedDicomFile dicom(true); 1312 ParsedDicomFile dicom(true);
1312 dicom.Replace(DICOM_TAG_PATIENT_NAME, std::string("JODOGNE"), 1313 dicom.Replace(DICOM_TAG_PATIENT_NAME, std::string("JODOGNE"),
1313 false, DicomReplaceMode_InsertIfAbsent); 1314 false, DicomReplaceMode_InsertIfAbsent, "");
1314 1315
1315 DicomInstanceToStore toStore; 1316 DicomInstanceToStore toStore;
1316 toStore.SetParsedDicomFile(dicom); 1317 toStore.SetParsedDicomFile(dicom);
1317 1318
1318 return (context_->Store(id, toStore) == StoreStatus_Success); 1319 return (context_->Store(id, toStore) == StoreStatus_Success);
1334 1335
1335 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, instance)); 1336 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, instance));
1336 instance.Serialize(s); 1337 instance.Serialize(s);
1337 } 1338 }
1338 1339
1339 std::auto_ptr<JobOperationValue> value; 1340 std::unique_ptr<JobOperationValue> value;
1340 value.reset(unserializer.UnserializeValue(s)); 1341 value.reset(unserializer.UnserializeValue(s));
1341 ASSERT_EQ(JobOperationValue::Type_DicomInstance, value->GetType()); 1342 ASSERT_EQ(JobOperationValue::Type_DicomInstance, value->GetType());
1342 ASSERT_EQ(id, dynamic_cast<DicomInstanceOperationValue&>(*value).GetId()); 1343 ASSERT_EQ(id, dynamic_cast<DicomInstanceOperationValue&>(*value).GetId());
1343 1344
1344 { 1345 {
1367 1368
1368 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation)); 1369 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
1369 operation.Serialize(s); 1370 operation.Serialize(s);
1370 } 1371 }
1371 1372
1372 std::auto_ptr<IJobOperation> operation; 1373 std::unique_ptr<IJobOperation> operation;
1373 1374
1374 { 1375 {
1375 operation.reset(unserializer.UnserializeOperation(s)); 1376 operation.reset(unserializer.UnserializeOperation(s));
1376 1377
1377 Json::Value dummy; 1378 Json::Value dummy;
1409 RemoteModalityParameters modality; 1410 RemoteModalityParameters modality;
1410 modality.SetApplicationEntityTitle("REMOTE"); 1411 modality.SetApplicationEntityTitle("REMOTE");
1411 modality.SetHost("192.168.1.1"); 1412 modality.SetHost("192.168.1.1");
1412 modality.SetPortNumber(1000); 1413 modality.SetPortNumber(1000);
1413 modality.SetManufacturer(ModalityManufacturer_StoreScp); 1414 modality.SetManufacturer(ModalityManufacturer_StoreScp);
1414 modality.SetPreferredTransferSyntax("1.2.840.10008.1.2"); 1415 ASSERT_EQ("1.2.840.10008.1.2", modality.GetPreferredTransferSyntax());
1416 modality.SetPreferredTransferSyntax("1.2.840.10008.1.2.1");
1417 ASSERT_EQ("1.2.840.10008.1.2.1", modality.GetPreferredTransferSyntax());
1415 1418
1416 StoreScuOperation operation("TEST", modality); 1419 StoreScuOperation operation("TEST", modality);
1417 1420
1418 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation)); 1421 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
1419 operation.Serialize(s); 1422 operation.Serialize(s);
1455 } 1458 }
1456 1459
1457 // ModifyInstanceOperation 1460 // ModifyInstanceOperation
1458 1461
1459 { 1462 {
1460 std::auto_ptr<DicomModification> modification(new DicomModification); 1463 std::unique_ptr<DicomModification> modification(new DicomModification);
1461 modification->SetupAnonymization(DicomVersion_2008); 1464 modification->SetupAnonymization(DicomVersion_2008);
1462 1465
1463 ModifyInstanceOperation operation(GetContext(), RequestOrigin_Lua, modification.release()); 1466 ModifyInstanceOperation operation(GetContext(), RequestOrigin_Lua, modification.release());
1464 1467
1465 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation)); 1468 ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
1495 RemoteModalityParameters modality; 1498 RemoteModalityParameters modality;
1496 modality.SetApplicationEntityTitle("REMOTE"); 1499 modality.SetApplicationEntityTitle("REMOTE");
1497 modality.SetHost("192.168.1.1"); 1500 modality.SetHost("192.168.1.1");
1498 modality.SetPortNumber(1000); 1501 modality.SetPortNumber(1000);
1499 modality.SetManufacturer(ModalityManufacturer_StoreScp); 1502 modality.SetManufacturer(ModalityManufacturer_StoreScp);
1500 modality.SetPreferredTransferSyntax("1.2.840.10008.1.2"); 1503 ASSERT_EQ("1.2.840.10008.1.2", modality.GetPreferredTransferSyntax());
1504 modality.SetPreferredTransferSyntax("1.2.840.10008.1.2.1");
1505 ASSERT_EQ("1.2.840.10008.1.2.1", modality.GetPreferredTransferSyntax());
1501 1506
1502 DicomModalityStoreJob job(GetContext()); 1507 DicomModalityStoreJob job(GetContext());
1503 job.SetLocalAet("LOCAL"); 1508 job.SetLocalAet("LOCAL");
1504 job.SetRemoteModality(modality); 1509 job.SetRemoteModality(modality);
1505 job.SetMoveOriginator("MOVESCU", 42); 1510 job.SetMoveOriginator("MOVESCU", 42);
1507 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1512 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1508 ASSERT_TRUE(job.Serialize(s)); 1513 ASSERT_TRUE(job.Serialize(s));
1509 } 1514 }
1510 1515
1511 { 1516 {
1512 std::auto_ptr<IJob> job; 1517 std::unique_ptr<IJob> job;
1513 job.reset(unserializer.UnserializeJob(s)); 1518 job.reset(unserializer.UnserializeJob(s));
1514 1519
1515 DicomModalityStoreJob& tmp = dynamic_cast<DicomModalityStoreJob&>(*job); 1520 DicomModalityStoreJob& tmp = dynamic_cast<DicomModalityStoreJob&>(*job);
1516 ASSERT_EQ("LOCAL", tmp.GetLocalAet()); 1521 ASSERT_EQ("LOCAL", tmp.GetLocalAet());
1517 ASSERT_EQ("REMOTE", tmp.GetRemoteModality().GetApplicationEntityTitle()); 1522 ASSERT_EQ("REMOTE", tmp.GetRemoteModality().GetApplicationEntityTitle());
1537 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1542 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1538 ASSERT_TRUE(job.Serialize(s)); 1543 ASSERT_TRUE(job.Serialize(s));
1539 } 1544 }
1540 1545
1541 { 1546 {
1542 std::auto_ptr<IJob> job; 1547 std::unique_ptr<IJob> job;
1543 job.reset(unserializer.UnserializeJob(s)); 1548 job.reset(unserializer.UnserializeJob(s));
1544 1549
1545 OrthancPeerStoreJob& tmp = dynamic_cast<OrthancPeerStoreJob&>(*job); 1550 OrthancPeerStoreJob& tmp = dynamic_cast<OrthancPeerStoreJob&>(*job);
1546 ASSERT_EQ("http://localhost/", tmp.GetPeer().GetUrl()); 1551 ASSERT_EQ("http://localhost/", tmp.GetPeer().GetUrl());
1547 ASSERT_EQ("username", tmp.GetPeer().GetUsername()); 1552 ASSERT_EQ("username", tmp.GetPeer().GetUsername());
1550 } 1555 }
1551 1556
1552 // ResourceModificationJob 1557 // ResourceModificationJob
1553 1558
1554 { 1559 {
1555 std::auto_ptr<DicomModification> modification(new DicomModification); 1560 std::unique_ptr<DicomModification> modification(new DicomModification);
1556 modification->SetupAnonymization(DicomVersion_2008); 1561 modification->SetupAnonymization(DicomVersion_2008);
1557 1562
1558 ResourceModificationJob job(GetContext()); 1563 ResourceModificationJob job(GetContext());
1559 job.SetModification(modification.release(), ResourceType_Patient, true); 1564 job.SetModification(modification.release(), ResourceType_Patient, true);
1560 job.SetOrigin(DicomInstanceOrigin::FromLua()); 1565 job.SetOrigin(DicomInstanceOrigin::FromLua());
1562 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1567 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1563 ASSERT_TRUE(job.Serialize(s)); 1568 ASSERT_TRUE(job.Serialize(s));
1564 } 1569 }
1565 1570
1566 { 1571 {
1567 std::auto_ptr<IJob> job; 1572 std::unique_ptr<IJob> job;
1568 job.reset(unserializer.UnserializeJob(s)); 1573 job.reset(unserializer.UnserializeJob(s));
1569 1574
1570 ResourceModificationJob& tmp = dynamic_cast<ResourceModificationJob&>(*job); 1575 ResourceModificationJob& tmp = dynamic_cast<ResourceModificationJob&>(*job);
1571 ASSERT_TRUE(tmp.IsAnonymization()); 1576 ASSERT_TRUE(tmp.IsAnonymization());
1572 ASSERT_EQ(RequestOrigin_Lua, tmp.GetOrigin().GetRequestOrigin()); 1577 ASSERT_EQ(RequestOrigin_Lua, tmp.GetOrigin().GetRequestOrigin());
1618 a = job.GetTargetStudyUid(); 1623 a = job.GetTargetStudyUid();
1619 ASSERT_TRUE(job.LookupTargetSeriesUid(b, series)); 1624 ASSERT_TRUE(job.LookupTargetSeriesUid(b, series));
1620 1625
1621 job.AddTrailingStep(); 1626 job.AddTrailingStep();
1622 job.Start(); 1627 job.Start();
1623 ASSERT_EQ(JobStepCode_Continue, job.Step().GetCode()); 1628 ASSERT_EQ(JobStepCode_Continue, job.Step("jobId").GetCode());
1624 ASSERT_EQ(JobStepCode_Success, job.Step().GetCode()); 1629 ASSERT_EQ(JobStepCode_Success, job.Step("jobId").GetCode());
1625 1630
1626 study2 = job.GetTargetStudy(); 1631 study2 = job.GetTargetStudy();
1627 ASSERT_FALSE(study2.empty()); 1632 ASSERT_FALSE(study2.empty());
1628 1633
1629 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1634 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1630 ASSERT_TRUE(job.Serialize(s)); 1635 ASSERT_TRUE(job.Serialize(s));
1631 } 1636 }
1632 1637
1633 { 1638 {
1634 std::auto_ptr<IJob> job; 1639 std::unique_ptr<IJob> job;
1635 job.reset(unserializer.UnserializeJob(s)); 1640 job.reset(unserializer.UnserializeJob(s));
1636 1641
1637 SplitStudyJob& tmp = dynamic_cast<SplitStudyJob&>(*job); 1642 SplitStudyJob& tmp = dynamic_cast<SplitStudyJob&>(*job);
1638 ASSERT_TRUE(tmp.IsKeepSource()); 1643 ASSERT_TRUE(tmp.IsKeepSource());
1639 ASSERT_EQ(study, tmp.GetSourceStudy()); 1644 ASSERT_EQ(study, tmp.GetSourceStudy());
1677 1682
1678 ASSERT_EQ(job.GetTargetStudy(), study); 1683 ASSERT_EQ(job.GetTargetStudy(), study);
1679 1684
1680 job.AddTrailingStep(); 1685 job.AddTrailingStep();
1681 job.Start(); 1686 job.Start();
1682 ASSERT_EQ(JobStepCode_Continue, job.Step().GetCode()); 1687 ASSERT_EQ(JobStepCode_Continue, job.Step("jobId").GetCode());
1683 ASSERT_EQ(JobStepCode_Success, job.Step().GetCode()); 1688 ASSERT_EQ(JobStepCode_Success, job.Step("jobId").GetCode());
1684 1689
1685 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1690 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1686 ASSERT_TRUE(job.Serialize(s)); 1691 ASSERT_TRUE(job.Serialize(s));
1687 } 1692 }
1688 1693
1693 GetContext().GetIndex().GetAllUuids(tmp, ResourceType_Series); 1698 GetContext().GetIndex().GetAllUuids(tmp, ResourceType_Series);
1694 ASSERT_EQ(3u, tmp.size()); 1699 ASSERT_EQ(3u, tmp.size());
1695 } 1700 }
1696 1701
1697 { 1702 {
1698 std::auto_ptr<IJob> job; 1703 std::unique_ptr<IJob> job;
1699 job.reset(unserializer.UnserializeJob(s)); 1704 job.reset(unserializer.UnserializeJob(s));
1700 1705
1701 MergeStudyJob& tmp = dynamic_cast<MergeStudyJob&>(*job); 1706 MergeStudyJob& tmp = dynamic_cast<MergeStudyJob&>(*job);
1702 ASSERT_TRUE(tmp.IsKeepSource()); 1707 ASSERT_TRUE(tmp.IsKeepSource());
1703 ASSERT_EQ(study, tmp.GetTargetStudy()); 1708 ASSERT_EQ(study, tmp.GetTargetStudy());
1746 { 1751 {
1747 DummyUnserializer unserializer; 1752 DummyUnserializer unserializer;
1748 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1753 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1749 } 1754 }
1750 1755
1751 ASSERT_EQ(JobStepCode_Success, job.Step().GetCode()); 1756 ASSERT_EQ(JobStepCode_Success, job.Step("jobId").GetCode());
1752 ASSERT_EQ(1u, job.GetPosition()); 1757 ASSERT_EQ(1u, job.GetPosition());
1753 ASSERT_FALSE(job.IsTrailingStepDone()); 1758 ASSERT_FALSE(job.IsTrailingStepDone());
1754 1759
1755 { 1760 {
1756 DummyUnserializer unserializer; 1761 DummyUnserializer unserializer;
1757 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1762 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1758 } 1763 }
1759 1764
1760 ASSERT_THROW(job.Step(), OrthancException); 1765 ASSERT_THROW(job.Step("jobId"), OrthancException);
1761 } 1766 }
1762 1767
1763 { 1768 {
1764 Json::Value s; 1769 Json::Value s;
1765 1770
1777 { 1782 {
1778 DummyUnserializer unserializer; 1783 DummyUnserializer unserializer;
1779 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1784 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1780 } 1785 }
1781 1786
1782 ASSERT_EQ(JobStepCode_Continue, job.Step().GetCode()); 1787 ASSERT_EQ(JobStepCode_Continue, job.Step("jobId").GetCode());
1783 ASSERT_EQ(1u, job.GetPosition()); 1788 ASSERT_EQ(1u, job.GetPosition());
1784 ASSERT_FALSE(job.IsTrailingStepDone()); 1789 ASSERT_FALSE(job.IsTrailingStepDone());
1785 1790
1786 { 1791 {
1787 DummyUnserializer unserializer; 1792 DummyUnserializer unserializer;
1788 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1793 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1789 } 1794 }
1790 1795
1791 ASSERT_EQ(JobStepCode_Success, job.Step().GetCode()); 1796 ASSERT_EQ(JobStepCode_Success, job.Step("jobId").GetCode());
1792 ASSERT_EQ(2u, job.GetPosition()); 1797 ASSERT_EQ(2u, job.GetPosition());
1793 ASSERT_FALSE(job.IsTrailingStepDone()); 1798 ASSERT_FALSE(job.IsTrailingStepDone());
1794 1799
1795 { 1800 {
1796 DummyUnserializer unserializer; 1801 DummyUnserializer unserializer;
1797 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1802 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1798 } 1803 }
1799 1804
1800 ASSERT_THROW(job.Step(), OrthancException); 1805 ASSERT_THROW(job.Step("jobId"), OrthancException);
1801 } 1806 }
1802 1807
1803 { 1808 {
1804 Json::Value s; 1809 Json::Value s;
1805 1810
1818 { 1823 {
1819 DummyUnserializer unserializer; 1824 DummyUnserializer unserializer;
1820 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1825 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1821 } 1826 }
1822 1827
1823 ASSERT_EQ(JobStepCode_Success, job.Step().GetCode()); 1828 ASSERT_EQ(JobStepCode_Success, job.Step("jobId").GetCode());
1824 ASSERT_EQ(1u, job.GetPosition()); 1829 ASSERT_EQ(1u, job.GetPosition());
1825 ASSERT_TRUE(job.IsTrailingStepDone()); 1830 ASSERT_TRUE(job.IsTrailingStepDone());
1826 1831
1827 { 1832 {
1828 DummyUnserializer unserializer; 1833 DummyUnserializer unserializer;
1829 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1834 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1830 } 1835 }
1831 1836
1832 ASSERT_THROW(job.Step(), OrthancException); 1837 ASSERT_THROW(job.Step("jobId"), OrthancException);
1833 } 1838 }
1834 1839
1835 { 1840 {
1836 Json::Value s; 1841 Json::Value s;
1837 1842
1852 { 1857 {
1853 DummyUnserializer unserializer; 1858 DummyUnserializer unserializer;
1854 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1859 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1855 } 1860 }
1856 1861
1857 ASSERT_EQ(JobStepCode_Continue, job.Step().GetCode()); 1862 ASSERT_EQ(JobStepCode_Continue, job.Step("jobId").GetCode());
1858 ASSERT_EQ(1u, job.GetPosition()); 1863 ASSERT_EQ(1u, job.GetPosition());
1859 ASSERT_FALSE(job.IsTrailingStepDone()); 1864 ASSERT_FALSE(job.IsTrailingStepDone());
1860 1865
1861 { 1866 {
1862 DummyUnserializer unserializer; 1867 DummyUnserializer unserializer;
1863 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1868 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1864 } 1869 }
1865 1870
1866 ASSERT_EQ(JobStepCode_Success, job.Step().GetCode()); 1871 ASSERT_EQ(JobStepCode_Success, job.Step("jobId").GetCode());
1867 ASSERT_EQ(2u, job.GetPosition()); 1872 ASSERT_EQ(2u, job.GetPosition());
1868 ASSERT_TRUE(job.IsTrailingStepDone()); 1873 ASSERT_TRUE(job.IsTrailingStepDone());
1869 1874
1870 { 1875 {
1871 DummyUnserializer unserializer; 1876 DummyUnserializer unserializer;
1872 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job)); 1877 ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
1873 } 1878 }
1874 1879
1875 ASSERT_THROW(job.Step(), OrthancException); 1880 ASSERT_THROW(job.Step("jobId"), OrthancException);
1876 } 1881 }
1877 } 1882 }
1878 1883
1879 1884
1880 TEST(JobsSerialization, RemoteModalityParameters) 1885 TEST(JobsSerialization, RemoteModalityParameters)
1897 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Echo)); 1902 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Echo));
1898 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Find)); 1903 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Find));
1899 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Get)); 1904 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Get));
1900 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Store)); 1905 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Store));
1901 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Move)); 1906 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Move));
1907 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_NAction));
1908 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_NEventReport));
1902 } 1909 }
1903 1910
1904 s = Json::nullValue; 1911 s = Json::nullValue;
1905 1912
1906 { 1913 {
1909 ASSERT_THROW(modality.SetPortNumber(0), OrthancException); 1916 ASSERT_THROW(modality.SetPortNumber(0), OrthancException);
1910 ASSERT_THROW(modality.SetPortNumber(65535), OrthancException); 1917 ASSERT_THROW(modality.SetPortNumber(65535), OrthancException);
1911 modality.SetApplicationEntityTitle("HELLO"); 1918 modality.SetApplicationEntityTitle("HELLO");
1912 modality.SetHost("world"); 1919 modality.SetHost("world");
1913 modality.SetPortNumber(45); 1920 modality.SetPortNumber(45);
1914 modality.SetManufacturer(ModalityManufacturer_Dcm4Chee); 1921 modality.SetManufacturer(ModalityManufacturer_GenericNoWildcardInDates);
1915 modality.SetPreferredTransferSyntax("1.2.840.10008.1.2"); 1922 ASSERT_EQ("1.2.840.10008.1.2", modality.GetPreferredTransferSyntax());
1923 modality.SetPreferredTransferSyntax("1.2.840.10008.1.2.1");
1924 ASSERT_EQ("1.2.840.10008.1.2.1", modality.GetPreferredTransferSyntax());
1916 modality.Serialize(s, true); 1925 modality.Serialize(s, true);
1917 ASSERT_EQ(Json::objectValue, s.type()); 1926 ASSERT_EQ(Json::objectValue, s.type());
1918 } 1927 }
1919 1928
1920 { 1929 {
1921 RemoteModalityParameters modality(s); 1930 RemoteModalityParameters modality(s);
1922 ASSERT_EQ("HELLO", modality.GetApplicationEntityTitle()); 1931 ASSERT_EQ("HELLO", modality.GetApplicationEntityTitle());
1923 ASSERT_EQ("world", modality.GetHost()); 1932 ASSERT_EQ("world", modality.GetHost());
1924 ASSERT_EQ(45u, modality.GetPortNumber()); 1933 ASSERT_EQ(45u, modality.GetPortNumber());
1925 ASSERT_EQ(ModalityManufacturer_Dcm4Chee, modality.GetManufacturer()); 1934 ASSERT_EQ(ModalityManufacturer_GenericNoWildcardInDates, modality.GetManufacturer());
1926 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Echo)); 1935 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Echo));
1927 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Find)); 1936 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Find));
1928 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Get)); 1937 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Get));
1929 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Store)); 1938 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Store));
1930 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Move)); 1939 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_Move));
1940 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_NAction));
1941 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_NEventReport));
1931 } 1942 }
1932 1943
1933 s["Port"] = "46"; 1944 s["Port"] = "46";
1934 1945
1935 { 1946 {
1945 operations.insert(DicomRequestType_Echo); 1956 operations.insert(DicomRequestType_Echo);
1946 operations.insert(DicomRequestType_Find); 1957 operations.insert(DicomRequestType_Find);
1947 operations.insert(DicomRequestType_Get); 1958 operations.insert(DicomRequestType_Get);
1948 operations.insert(DicomRequestType_Move); 1959 operations.insert(DicomRequestType_Move);
1949 operations.insert(DicomRequestType_Store); 1960 operations.insert(DicomRequestType_Store);
1950 1961 operations.insert(DicomRequestType_NAction);
1951 ASSERT_EQ(5u, operations.size()); 1962 operations.insert(DicomRequestType_NEventReport);
1963
1964 ASSERT_EQ(7u, operations.size());
1952 1965
1953 for (std::set<DicomRequestType>::const_iterator 1966 for (std::set<DicomRequestType>::const_iterator
1954 it = operations.begin(); it != operations.end(); ++it) 1967 it = operations.begin(); it != operations.end(); ++it)
1955 { 1968 {
1956 { 1969 {
1975 ASSERT_TRUE(modality.IsRequestAllowed(*it2)); 1988 ASSERT_TRUE(modality.IsRequestAllowed(*it2));
1976 } 1989 }
1977 } 1990 }
1978 } 1991 }
1979 } 1992 }
1980 } 1993
1994 {
1995 Json::Value s;
1996 s["AllowStorageCommitment"] = false;
1997 s["AET"] = "AET";
1998 s["Host"] = "host";
1999 s["Port"] = "104";
2000
2001 RemoteModalityParameters modality(s);
2002 ASSERT_TRUE(modality.IsAdvancedFormatNeeded());
2003 ASSERT_EQ("AET", modality.GetApplicationEntityTitle());
2004 ASSERT_EQ("host", modality.GetHost());
2005 ASSERT_EQ(104u, modality.GetPortNumber());
2006 ASSERT_FALSE(modality.IsRequestAllowed(DicomRequestType_NAction));
2007 ASSERT_FALSE(modality.IsRequestAllowed(DicomRequestType_NEventReport));
2008 }
2009
2010 {
2011 Json::Value s;
2012 s["AllowNAction"] = false;
2013 s["AllowNEventReport"] = true;
2014 s["AET"] = "AET";
2015 s["Host"] = "host";
2016 s["Port"] = "104";
2017
2018 RemoteModalityParameters modality(s);
2019 ASSERT_TRUE(modality.IsAdvancedFormatNeeded());
2020 ASSERT_EQ("AET", modality.GetApplicationEntityTitle());
2021 ASSERT_EQ("host", modality.GetHost());
2022 ASSERT_EQ(104u, modality.GetPortNumber());
2023 ASSERT_FALSE(modality.IsRequestAllowed(DicomRequestType_NAction));
2024 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_NEventReport));
2025 }
2026
2027 {
2028 Json::Value s;
2029 s["AllowNAction"] = true;
2030 s["AllowNEventReport"] = true;
2031 s["AET"] = "AET";
2032 s["Host"] = "host";
2033 s["Port"] = "104";
2034
2035 RemoteModalityParameters modality(s);
2036 ASSERT_FALSE(modality.IsAdvancedFormatNeeded());
2037 ASSERT_EQ("AET", modality.GetApplicationEntityTitle());
2038 ASSERT_EQ("host", modality.GetHost());
2039 ASSERT_EQ(104u, modality.GetPortNumber());
2040 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_NAction));
2041 ASSERT_TRUE(modality.IsRequestAllowed(DicomRequestType_NEventReport));
2042 }
2043 }