diff OrthancServer/UnitTestsSources/ServerJobsTests.cpp @ 4693:45bce660ce3a

added routes for bulk anonymization/modification
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 16 Jun 2021 16:44:04 +0200
parents 2e850edf03d6
children f0038043fb97 7826ac059c31
line wrap: on
line diff
--- a/OrthancServer/UnitTestsSources/ServerJobsTests.cpp	Fri Jun 11 10:48:28 2021 +0200
+++ b/OrthancServer/UnitTestsSources/ServerJobsTests.cpp	Wed Jun 16 16:44:04 2021 +0200
@@ -819,11 +819,16 @@
 
   {
     std::unique_ptr<DicomModification> modification(new DicomModification);
-    modification->SetupAnonymization(DicomVersion_2008);    
+    modification->SetupAnonymization(DicomVersion_2008);
+    modification->SetLevel(ResourceType_Series);
 
     ResourceModificationJob job(GetContext());
-    job.SetModification(modification.release(), ResourceType_Patient, true);
+    ASSERT_THROW(job.IsSingleResourceModification(), OrthancException);
+    job.SetSingleResourceModification(modification.release(), ResourceType_Patient, true);
     job.SetOrigin(DicomInstanceOrigin::FromLua());
+    ASSERT_TRUE(job.IsAnonymization());
+    ASSERT_TRUE(job.IsSingleResourceModification());
+    ASSERT_EQ(ResourceType_Patient, job.GetOutputLevel());
 
     job.AddTrailingStep();  // Necessary since 1.7.0
     ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
@@ -840,12 +845,32 @@
     ASSERT_THROW(tmp.GetTransferSyntax(), OrthancException);
     ASSERT_EQ(RequestOrigin_Lua, tmp.GetOrigin().GetRequestOrigin());
     ASSERT_TRUE(tmp.GetModification().IsRemoved(DICOM_TAG_STUDY_DESCRIPTION));
+    ASSERT_TRUE(tmp.IsSingleResourceModification());
+    ASSERT_EQ(ResourceType_Patient, tmp.GetOutputLevel());
+    ASSERT_EQ(ResourceType_Series, tmp.GetModification().GetLevel());
+  }
+
+  {
+    // Backward compatibility with Orthanc 1.9.3
+    ASSERT_TRUE(s.isMember("OutputLevel"));
+    ASSERT_TRUE(s.isMember("IsSingleResource"));
+    s.removeMember("OutputLevel");
+    s.removeMember("IsSingleResource");
+    
+    std::unique_ptr<IJob> job;
+    job.reset(unserializer.UnserializeJob(s));
+
+    ResourceModificationJob& tmp = dynamic_cast<ResourceModificationJob&>(*job);
+    ASSERT_TRUE(tmp.IsSingleResourceModification());
+    ASSERT_EQ(ResourceType_Series, tmp.GetOutputLevel());  // old, incorrect behavior
+    ASSERT_EQ(ResourceType_Series, tmp.GetModification().GetLevel());
   }
 
   {
     ResourceModificationJob job(GetContext());
     ASSERT_THROW(job.SetTranscode("nope"), OrthancException);
     job.SetTranscode(DicomTransferSyntax_JPEGProcess1);
+    job.SetSingleResourceModification(new DicomModification, ResourceType_Study, false);
 
     job.AddTrailingStep();  // Necessary since 1.7.0
     ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
@@ -861,6 +886,72 @@
     ASSERT_TRUE(tmp.IsTranscode());
     ASSERT_EQ(DicomTransferSyntax_JPEGProcess1, tmp.GetTransferSyntax());
     ASSERT_EQ(RequestOrigin_Unknown, tmp.GetOrigin().GetRequestOrigin());
+    ASSERT_TRUE(tmp.IsSingleResourceModification());
+    ASSERT_EQ(ResourceType_Study, tmp.GetOutputLevel());
+    ASSERT_EQ(ResourceType_Instance, tmp.GetModification().GetLevel());
+  }
+
+  {
+    ResourceModificationJob job(GetContext());
+    job.SetMultipleResourcesModification(new DicomModification, true);
+    job.AddInstance("toto");
+    job.AddInstance("tutu");
+    job.AddTrailingStep();  // Necessary since 1.7.0
+    ASSERT_TRUE(CheckIdempotentSetOfInstances(unserializer, job));
+    ASSERT_TRUE(job.Serialize(s));
+  }
+
+  {
+    std::unique_ptr<IJob> job;
+    job.reset(unserializer.UnserializeJob(s));
+
+    ResourceModificationJob& tmp = dynamic_cast<ResourceModificationJob&>(*job);
+
+    std::set<std::string> instances;
+    for (size_t i = 0; i < tmp.GetInstancesCount(); i++)
+    {
+      instances.insert(tmp.GetInstance(i));
+    }
+    
+    ASSERT_EQ(2u, instances.size());
+    ASSERT_TRUE(instances.find("toto") != instances.end());
+    ASSERT_TRUE(instances.find("tutu") != instances.end());
+
+    ASSERT_TRUE(tmp.IsAnonymization());
+    ASSERT_FALSE(tmp.IsSingleResourceModification());
+    ASSERT_THROW(tmp.GetOutputLevel(), OrthancException);
+    ASSERT_EQ(ResourceType_Instance, tmp.GetModification().GetLevel());
+  }
+
+  {
+    // Test behavior on broken serialization
+    ASSERT_FALSE(s.isMember("OutputLevel"));
+    ASSERT_TRUE(s.isMember("IsSingleResource"));
+    s.removeMember("IsSingleResource");
+
+    {
+      std::unique_ptr<IJob> job;
+      job.reset(unserializer.UnserializeJob(s));
+
+      ResourceModificationJob& tmp = dynamic_cast<ResourceModificationJob&>(*job);
+      ASSERT_TRUE(tmp.IsAnonymization());
+      ASSERT_TRUE(tmp.IsSingleResourceModification());
+      ASSERT_EQ(ResourceType_Patient, tmp.GetOutputLevel());
+      ASSERT_EQ(ResourceType_Instance, tmp.GetModification().GetLevel());
+    }
+
+    s["Modification"]["Level"] = "Series";
+
+    {
+      std::unique_ptr<IJob> job;
+      job.reset(unserializer.UnserializeJob(s));
+
+      ResourceModificationJob& tmp = dynamic_cast<ResourceModificationJob&>(*job);
+      ASSERT_TRUE(tmp.IsAnonymization());
+      ASSERT_TRUE(tmp.IsSingleResourceModification());
+      ASSERT_EQ(ResourceType_Series, tmp.GetOutputLevel());
+      ASSERT_EQ(ResourceType_Series, tmp.GetModification().GetLevel());
+    }
   }
 
   // SplitStudyJob