# HG changeset patch # User Sebastien Jodogne # Date 1786713153 -7200 # Node ID 22a427e39060086a187e21736258e9f9419f022e # Parent cf1f10a22505a52f5170497a65ac06394f21eff4 unit test exceptions in data sources diff -r cf1f10a22505 -r 22a427e39060 OrthancFramework/UnitTestsSources/DataSourceTests.cpp --- 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(value_)); + "This was value " + boost::lexical_cast(value_), false /* don't log */); } else { @@ -197,38 +197,100 @@ boost::shared_ptr answer; + std::unique_ptr request(new DataSourceRequest); + for (int i = 0; i < 10; i++) { - std::unique_ptr 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 values; + + while (true) + { + std::unique_ptr item(answer->Dequeue()); + if (item) { - request->Enqueue(new IntegerIdentifier(false, 10 + i, 10 - i)); // Produces out-of-order values + const IntegerIdentifier& id = dynamic_cast(item->GetId()); + const SingleValueObject& value = dynamic_cast&>(*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 values; + { + DataSourceReader reader(service, new IntegerDataSource); + + boost::shared_ptr answer; + + std::unique_ptr 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 item(answer->Dequeue()); - if (item) + countValues++; + request->Enqueue(new IntegerIdentifier(false, i, 0)); + } + } + + answer = reader.Submit(request.release()); + + std::set values; + + while (true) + { + std::unique_ptr item(answer->Dequeue()); + if (item) + { + const IntegerIdentifier& id = dynamic_cast(item->GetId()); + + try { - const IntegerIdentifier& id = dynamic_cast(item->GetId()); const SingleValueObject& value = dynamic_cast&>(*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(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 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 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(i), std::string(e.GetDetails())); + } + + ASSERT_TRUE(hasThrown); + } + else + { + const SingleValueObject& value = dynamic_cast&>(item->GetValue()); + ASSERT_EQ(i, value.GetValue()); + } + } + + ASSERT_FALSE(seq.HasNext()); + ASSERT_THROW(seq.Next(), OrthancException); + } }