changeset 7122:22a427e39060

unit test exceptions in data sources
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 14 Aug 2026 15:12:33 +0200
parents cf1f10a22505
children c9b580d5ef03
files OrthancFramework/UnitTestsSources/DataSourceTests.cpp
diffstat 1 files changed, 133 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancFramework/UnitTestsSources/DataSourceTests.cpp	Fri Aug 14 14:57:42 2026 +0200
+++ b/OrthancFramework/UnitTestsSources/DataSourceTests.cpp	Fri Aug 14 15:12:33 2026 +0200
@@ -79,7 +79,7 @@
       if (fails_)
       {
         throw OrthancException(ErrorCode_Database /* some random error code */,
-                               "This was value " + boost::lexical_cast<std::string>(value_));
+                               "This was value " + boost::lexical_cast<std::string>(value_), false /* don't log */);
       }
       else
       {
@@ -197,38 +197,100 @@
 
     boost::shared_ptr<DataSourceAnswer> answer;
 
+    std::unique_ptr<DataSourceRequest> request(new DataSourceRequest);
+    for (int i = 0; i < 10; i++)
     {
-      std::unique_ptr<DataSourceRequest> request(new DataSourceRequest);
-      for (int i = 0; i < 10; i++)
+      request->Enqueue(new IntegerIdentifier(false, 10 + i, 10 - i));  // Produces out-of-order values
+    }
+
+    answer = reader.Submit(request.release());
+
+    std::set<int> values;
+
+    while (true)
+    {
+      std::unique_ptr<DataSourceAnswer::Item> item(answer->Dequeue());
+      if (item)
       {
-        request->Enqueue(new IntegerIdentifier(false, 10 + i, 10 - i));  // Produces out-of-order values
+        const IntegerIdentifier& id = dynamic_cast<const IntegerIdentifier&>(item->GetId());
+        const SingleValueObject<int>& value = dynamic_cast<const SingleValueObject<int>&>(*item->GetValue());
+        ASSERT_EQ(id.GetValue(), value.GetValue());
+        values.insert(value.GetValue());
+      }
+      else
+      {
+        break;
       }
+    }
 
-      answer = reader.Submit(request.release());
+    ASSERT_EQ(10u, values.size());
+
+    for (int i = 0; i < 10; i++)
+    {
+      ASSERT_TRUE(values.find(10 + i) != values.end());
+    }
+  }
 
-      std::set<int> values;
+  {
+    DataSourceReader reader(service, new IntegerDataSource);
+
+    boost::shared_ptr<DataSourceAnswer> answer;
+
+    std::unique_ptr<DataSourceRequest> request(new DataSourceRequest);
+    unsigned int countValues = 0;
 
-      while (true)
+    for (int i = 0; i < 100; i++)
+    {
+      if (i % 3 == 1)
+      {
+        request->Enqueue(new IntegerIdentifier(true, i, 0));  // Produces exceptions
+      }
+      else
       {
-        std::unique_ptr<DataSourceAnswer::Item> item(answer->Dequeue());
-        if (item)
+        countValues++;
+        request->Enqueue(new IntegerIdentifier(false, i, 0));
+      }
+    }
+
+    answer = reader.Submit(request.release());
+
+    std::set<int> values;
+
+    while (true)
+    {
+      std::unique_ptr<DataSourceAnswer::Item> item(answer->Dequeue());
+      if (item)
+      {
+        const IntegerIdentifier& id = dynamic_cast<const IntegerIdentifier&>(item->GetId());
+
+        try
         {
-          const IntegerIdentifier& id = dynamic_cast<const IntegerIdentifier&>(item->GetId());
           const SingleValueObject<int>& value = dynamic_cast<const SingleValueObject<int>&>(*item->GetValue());
+          ASSERT_TRUE(id.GetValue() % 3 != 1);
           ASSERT_EQ(id.GetValue(), value.GetValue());
           values.insert(value.GetValue());
         }
-        else
+        catch (const OrthancException& e)
         {
-          break;
+          ASSERT_TRUE(id.GetValue() % 3 == 1);
+          ASSERT_EQ(ErrorCode_Database, e.GetErrorCode());
+          ASSERT_TRUE(e.HasDetails());
+          ASSERT_EQ("This was value " + boost::lexical_cast<std::string>(id.GetValue()), std::string(e.GetDetails()));
         }
       }
-
-      ASSERT_EQ(10u, values.size());
+      else
+      {
+        break;
+      }
+    }
 
-      for (int i = 0; i < 10; i++)
+    ASSERT_EQ(countValues, values.size());
+
+    for (int i = 0; i < 100; i++)
+    {
+      if (i % 3 != 1)
       {
-        ASSERT_TRUE(values.find(10 + i) != values.end());
+        ASSERT_TRUE(values.find(i) != values.end());
       }
     }
   }
@@ -276,4 +338,59 @@
     ASSERT_FALSE(seq.HasNext());
     ASSERT_THROW(seq.Next(), OrthancException);
   }
+
+  {
+    boost::shared_ptr<DataSourceReader> reader(new DataSourceReader(serviceSource, new IntegerDataSource));
+
+    DataSourceSequentialReader seq(serviceSequential, reader, new IntegerDisconnector, 4, 0);
+
+    for (int i = 0; i < 100; i++)
+    {
+      if (i % 3 == 1)
+      {
+        seq.Submit(new IntegerIdentifier(true, i, 0));  // Produces exceptions
+      }
+      else
+      {
+        seq.Submit(new IntegerIdentifier(false, i, 0));
+      }
+    }
+
+    seq.Start();
+
+    for (int i = 0; i < 100; i++)
+    {
+      ASSERT_TRUE(seq.HasNext());
+
+      std::unique_ptr<DataSourceSequentialReader::Item> item(seq.Next());
+      ASSERT_TRUE(item.get() != NULL);
+
+      if (i % 3 == 1)
+      {
+        bool hasThrown = false;
+
+        try
+        {
+          item->GetValue();
+        }
+        catch (const OrthancException& e)
+        {
+          hasThrown = true;
+          ASSERT_EQ(ErrorCode_Database, e.GetErrorCode());
+          ASSERT_TRUE(e.HasDetails());
+          ASSERT_EQ("This was value " + boost::lexical_cast<std::string>(i), std::string(e.GetDetails()));
+        }
+
+        ASSERT_TRUE(hasThrown);
+      }
+      else
+      {
+        const SingleValueObject<int>& value = dynamic_cast<const SingleValueObject<int>&>(item->GetValue());
+        ASSERT_EQ(i, value.GetValue());
+      }
+    }
+
+    ASSERT_FALSE(seq.HasNext());
+    ASSERT_THROW(seq.Next(), OrthancException);
+  }
 }