diff UnitTestsSources/MultiThreadingTests.cpp @ 2666:2540ac79ab6c jobs

SequenceOfOperationsJob serialization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 08 Jun 2018 15:05:32 +0200
parents 389d050a2e66
children 5fa2f2ce74f0
line wrap: on
line diff
--- a/UnitTestsSources/MultiThreadingTests.cpp	Fri Jun 08 13:51:31 2018 +0200
+++ b/UnitTestsSources/MultiThreadingTests.cpp	Fri Jun 08 15:05:32 2018 +0200
@@ -36,6 +36,7 @@
 
 #include "../Core/FileStorage/MemoryStorageArea.h"
 #include "../Core/JobsEngine/JobsEngine.h"
+#include "../Core/Logging.h"
 #include "../Core/MultiThreading/SharedMessageQueue.h"
 #include "../Core/OrthancException.h"
 #include "../Core/SerializationToolbox.h"
@@ -744,6 +745,81 @@
 }
 
 
+static bool CheckSameJson(const Json::Value& a,
+                          const Json::Value& b)
+{
+  std::string s = a.toStyledString();
+  std::string t = b.toStyledString();
+
+  if (s == t)
+  {
+    return true;
+  }
+  else
+  {
+    LOG(ERROR) << "Expected serialization: " << s;
+    LOG(ERROR) << "Actual serialization: " << t;
+    return false;
+  }
+}
+
+
+static bool CheckIdempotentSerialization(IJobUnserializer& unserializer,
+                                         IJob& job)
+{
+  Json::Value a = 42;
+  
+  if (!job.Serialize(a))
+  {
+    return false;
+  }
+  else
+  {
+    std::auto_ptr<IJob> unserialized(unserializer.UnserializeJob(a));
+  
+    Json::Value b = 43;
+    if (unserialized->Serialize(b))
+    {
+      return CheckSameJson(a, b);
+    }
+    else
+    {
+      return false;
+    }
+  }
+}
+
+
+static bool CheckIdempotentSerialization(IJobUnserializer& unserializer,
+                                         IJobOperation& operation)
+{
+  Json::Value a = 42;
+  operation.Serialize(a);
+  
+  std::auto_ptr<IJobOperation> unserialized(unserializer.UnserializeOperation(a));
+  
+  Json::Value b = 43;
+  unserialized->Serialize(b);
+
+  return CheckSameJson(a, b);
+}
+
+
+static bool CheckIdempotentSerialization(IJobUnserializer& unserializer,
+                                         JobOperationValue& value)
+{
+  Json::Value a = 42;
+  value.Serialize(a);
+  
+  std::auto_ptr<JobOperationValue> unserialized(unserializer.UnserializeValue(a));
+  
+  Json::Value b = 43;
+  unserialized->Serialize(b);
+
+  return CheckSameJson(a, b);
+}
+
+
 TEST(JobsSerialization, BadFileFormat)
 {
   GenericJobUnserializer unserializer;
@@ -802,16 +878,16 @@
 
 TEST(JobsSerialization, GenericValues)
 {
+  GenericJobUnserializer unserializer;
   Json::Value s;
 
   {
     NullOperationValue null;
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, null));
     null.Serialize(s);
   }
 
-  GenericJobUnserializer unserializer;
   ASSERT_THROW(unserializer.UnserializeJob(s), OrthancException);
   ASSERT_THROW(unserializer.UnserializeOperation(s), OrthancException);
 
@@ -823,7 +899,7 @@
   {
     StringOperationValue str("Hello");
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, str));
     str.Serialize(s);
   }
 
@@ -838,16 +914,16 @@
 
 TEST(JobsSerialization, GenericOperations)
 {   
+  DummyUnserializer unserializer;
   Json::Value s;
 
   {
     LogJobOperation operation;
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
     operation.Serialize(s);
   }
 
-  DummyUnserializer unserializer;
   ASSERT_THROW(unserializer.UnserializeJob(s), OrthancException);
   ASSERT_THROW(unserializer.UnserializeValue(s), OrthancException);
 
@@ -880,7 +956,11 @@
     job.ExecuteStep();
     job.ExecuteStep();
 
-    s = 42;
+    {
+      DummyUnserializer unserializer;
+      ASSERT_TRUE(CheckIdempotentSerialization(unserializer, job));
+    }
+    
     ASSERT_TRUE(job.Serialize(s));
   }
 
@@ -904,6 +984,46 @@
     ASSERT_EQ("world", tmp.GetInstance(2));
     ASSERT_TRUE(tmp.IsFailedInstance("nope"));
   }
+
+  // SequenceOfOperationsJob
+
+  {
+    SequenceOfOperationsJob job;
+    job.SetDescription("hello");
+
+    {
+      SequenceOfOperationsJob::Lock lock(job);
+      size_t a = lock.AddOperation(new LogJobOperation);
+      size_t b = lock.AddOperation(new LogJobOperation);
+      lock.Connect(a, b);
+      lock.AddInput(a, StringOperationValue("hello"));
+      lock.AddInput(a, StringOperationValue("world"));
+      lock.SetDicomAssociationTimeout(200);
+      lock.SetTrailingOperationTimeout(300);
+    }
+
+    ASSERT_EQ(JobStepCode_Continue, job.ExecuteStep().GetCode());
+
+    {
+      GenericJobUnserializer unserializer;
+      ASSERT_TRUE(CheckIdempotentSerialization(unserializer, job));
+    }
+    
+    ASSERT_TRUE(job.Serialize(s));
+  }
+
+  {
+    GenericJobUnserializer unserializer;
+    ASSERT_THROW(unserializer.UnserializeValue(s), OrthancException);
+    ASSERT_THROW(unserializer.UnserializeOperation(s), OrthancException);
+
+    std::auto_ptr<IJob> job;
+    job.reset(unserializer.UnserializeJob(s));
+
+    std::string tmp;
+    dynamic_cast<SequenceOfOperationsJob&>(*job).GetDescription(tmp);
+    ASSERT_EQ("hello", tmp);
+  }  
 }
 
 
@@ -1044,12 +1164,6 @@
 }
 
 
-TEST(JobsSerialization, Registry)
-{   
-  // TODO : Test serialization of JobsRegistry
-}
-
-
 namespace
 {
   class OrthancJobsSerialization : public testing::Test
@@ -1101,16 +1215,15 @@
   ASSERT_TRUE(CreateInstance(id));
 
   Json::Value s;
-
+  OrthancJobUnserializer unserializer(GetContext());
+    
   {
     DicomInstanceOperationValue instance(GetContext(), id);
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, instance));
     instance.Serialize(s);
   }
 
-  OrthancJobUnserializer unserializer(GetContext());
-    
   std::auto_ptr<JobOperationValue> value;
   value.reset(unserializer.UnserializeValue(s));
   ASSERT_EQ(JobOperationValue::Type_DicomInstance, value->GetType());
@@ -1133,17 +1246,17 @@
   ASSERT_TRUE(CreateInstance(id));
 
   Json::Value s;
+  OrthancJobUnserializer unserializer(GetContext()); 
 
   // DeleteResourceOperation
   
   {
     DeleteResourceOperation operation(GetContext());
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
     operation.Serialize(s);
   }
 
-  OrthancJobUnserializer unserializer(GetContext()); 
   std::auto_ptr<IJobOperation> operation;
 
   {
@@ -1164,7 +1277,7 @@
 
     StorePeerOperation operation(peer);
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
     operation.Serialize(s);
   }
 
@@ -1189,7 +1302,7 @@
 
     StoreScuOperation operation("TEST", modality);
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
     operation.Serialize(s);
   }
 
@@ -1212,7 +1325,7 @@
     operation.AddPreArgument("b");
     operation.AddPostArgument("c");
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
     operation.Serialize(s);
   }
 
@@ -1236,7 +1349,7 @@
     
     ModifyInstanceOperation operation(GetContext(), RequestOrigin_Lua, modification.release());
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, operation));
     operation.Serialize(s);
   }
 
@@ -1264,6 +1377,8 @@
 
   // DicomModalityStoreJob
 
+  OrthancJobUnserializer unserializer(GetContext()); 
+
   {
     RemoteModalityParameters modality;
     modality.SetApplicationEntityTitle("REMOTE");
@@ -1276,12 +1391,10 @@
     job.SetRemoteModality(modality);
     job.SetMoveOriginator("MOVESCU", 42);
 
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, job));
     ASSERT_TRUE(job.Serialize(s));
   }
 
-  OrthancJobUnserializer unserializer(GetContext()); 
-
   {
     std::auto_ptr<IJob> job;
     job.reset(unserializer.UnserializeJob(s));
@@ -1309,7 +1422,7 @@
     OrthancPeerStoreJob job(GetContext());
     job.SetPeer(peer);
     
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, job));
     ASSERT_TRUE(job.Serialize(s));
   }
 
@@ -1334,7 +1447,7 @@
     job.SetModification(modification.release(), true);
     job.SetOrigin(DicomInstanceOrigin::FromLua());
     
-    s = 42;
+    ASSERT_TRUE(CheckIdempotentSerialization(unserializer, job));
     ASSERT_TRUE(job.Serialize(s));
   }
 
@@ -1347,15 +1460,10 @@
     ASSERT_EQ(RequestOrigin_Lua, tmp.GetOrigin().GetRequestOrigin());
     ASSERT_TRUE(tmp.GetModification().IsRemoved(DICOM_TAG_STUDY_DESCRIPTION));
   }
+}
 
-  // SequenceOfOperationsJob.h
 
-  {
-    SequenceOfOperationsJob job;
-    
-    s = 42;
-    ASSERT_TRUE(job.Serialize(s));
-  }
-
-  std::cout << s;
+TEST(JobsSerialization, Registry)
+{   
+  // TODO : Test serialization of JobsRegistry
 }