feat(app): add graceful shutdown support to MessageQueue
This commit is contained in:
@@ -17,8 +17,9 @@ void testPushAndPop() {
|
||||
|
||||
auto message = queue.pop();
|
||||
|
||||
assert(message.level == logger::LogLevel::info());
|
||||
assert(message.message == "Hello");
|
||||
assert(message.has_value());
|
||||
assert(message->level == logger::LogLevel::info());
|
||||
assert(message->message == "Hello");
|
||||
}
|
||||
|
||||
void testFifoOrder() {
|
||||
@@ -28,9 +29,9 @@ void testFifoOrder() {
|
||||
queue.push({logger::LogLevel::info(), "second"});
|
||||
queue.push({logger::LogLevel::error(), "third"});
|
||||
|
||||
assert(queue.pop().message == "first");
|
||||
assert(queue.pop().message == "second");
|
||||
assert(queue.pop().message == "third");
|
||||
assert(queue.pop()->message == "first");
|
||||
assert(queue.pop()->message == "second");
|
||||
assert(queue.pop()->message == "third");
|
||||
}
|
||||
|
||||
void testPopWaitsForMessage() {
|
||||
@@ -41,8 +42,9 @@ void testPopWaitsForMessage() {
|
||||
std::thread worker([&]() {
|
||||
auto message = queue.pop();
|
||||
|
||||
assert(message.level == logger::LogLevel::error());
|
||||
assert(message.message == "Delayed");
|
||||
assert(message.has_value());
|
||||
assert(message->level == logger::LogLevel::error());
|
||||
assert(message->message == "Delayed");
|
||||
|
||||
received = true;
|
||||
});
|
||||
@@ -74,12 +76,14 @@ void testConcurrentPushAndPop() {
|
||||
producers.emplace_back(
|
||||
helpers::createProducer(queue, i, messagesPerThread));
|
||||
}
|
||||
|
||||
const auto expectedMessages = threadCount * messagesPerThread;
|
||||
|
||||
for (std::size_t i = 0; i < expectedMessages; ++i) {
|
||||
auto message = queue.pop();
|
||||
|
||||
assert(!message.message.empty());
|
||||
assert(message.has_value());
|
||||
assert(!message->message.empty());
|
||||
}
|
||||
|
||||
for (auto &producer : producers) {
|
||||
@@ -89,11 +93,44 @@ void testConcurrentPushAndPop() {
|
||||
assert(queue.empty());
|
||||
}
|
||||
|
||||
void testStopReturnsNullopt() {
|
||||
MessageQueue queue;
|
||||
|
||||
queue.stop();
|
||||
|
||||
auto message = queue.pop();
|
||||
|
||||
assert(!message.has_value());
|
||||
}
|
||||
|
||||
void testStopReturnsRemainingMessages() {
|
||||
MessageQueue queue;
|
||||
|
||||
queue.push({logger::LogLevel::info(), "first"});
|
||||
queue.push({logger::LogLevel::error(), "second"});
|
||||
|
||||
queue.stop();
|
||||
|
||||
auto first = queue.pop();
|
||||
auto second = queue.pop();
|
||||
auto third = queue.pop();
|
||||
|
||||
assert(first.has_value());
|
||||
assert(first->message == "first");
|
||||
|
||||
assert(second.has_value());
|
||||
assert(second->message == "second");
|
||||
|
||||
assert(!third.has_value());
|
||||
}
|
||||
|
||||
void runTests() {
|
||||
testPushAndPop();
|
||||
testFifoOrder();
|
||||
testPopWaitsForMessage();
|
||||
testConcurrentPushAndPop();
|
||||
testStopReturnsNullopt();
|
||||
testStopReturnsRemainingMessages();
|
||||
}
|
||||
|
||||
} // namespace app::tests
|
||||
|
||||
Reference in New Issue
Block a user