Skip to content

Commit e713822

Browse files
Added blocking_queue::clear. Improved unit tests for signal_handler::wait_for_quit return codes.
1 parent 09a1ac4 commit e713822

File tree

3 files changed

+84
-5
lines changed

3 files changed

+84
-5
lines changed

sdk/include/teiacare/sdk/blocking_queue.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,24 @@ class blocking_queue : private non_copyable, private non_moveable
189189
return _capacity;
190190
}
191191

192+
/*!
193+
* \brief Clear the queue
194+
*
195+
* Removes all items from the queue.
196+
*/
197+
void clear()
198+
{
199+
std::lock_guard lock(_mutex);
200+
if (is_empty())
201+
return;
202+
203+
while (!_queue.empty())
204+
_queue.pop();
205+
206+
_last_item_popped.notify_all();
207+
_first_item_pushed.notify_all();
208+
}
209+
192210
private:
193211
std::queue<T> _queue;
194212
mutable std::mutex _mutex;
@@ -218,6 +236,7 @@ class blocking_queue : private non_copyable, private non_moveable
218236
{
219237
return _queue.empty();
220238
}
239+
221240
inline bool is_full() const
222241
{
223242
return _queue.size() >= _capacity;

sdk/tests/src/test_blocking_queue.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,64 @@
1515
#include "test_blocking_queue.hpp"
1616

1717
#include <gtest/gtest.h>
18+
#include <semaphore>
1819

1920
using namespace std::string_literals;
2021

2122
namespace tc::sdk::tests
2223
{
24+
constexpr size_t QUEUE_CAPACITY = 3;
25+
26+
TEST(test_blocking_queue_clear, clear_after_construction)
27+
{
28+
tc::sdk::blocking_queue<int> queue = tc::sdk::blocking_queue<int>(QUEUE_CAPACITY);
29+
30+
queue.clear();
31+
32+
EXPECT_EQ(queue.size(), 0);
33+
EXPECT_EQ(queue.capacity(), QUEUE_CAPACITY);
34+
}
35+
36+
TEST(test_blocking_queue_clear, clear_after_push)
37+
{
38+
tc::sdk::blocking_queue<int> queue = tc::sdk::blocking_queue<int>(QUEUE_CAPACITY);
39+
40+
queue.push(1);
41+
queue.push(2);
42+
queue.push(3);
43+
queue.clear();
44+
45+
EXPECT_EQ(queue.size(), 0);
46+
EXPECT_EQ(queue.capacity(), QUEUE_CAPACITY);
47+
}
48+
49+
TEST(test_blocking_queue_clear, push_after_clear)
50+
{
51+
tc::sdk::blocking_queue<int> queue = tc::sdk::blocking_queue<int>(QUEUE_CAPACITY);
52+
53+
std::thread push_thread([&queue]() {
54+
queue.push(1);
55+
queue.push(2);
56+
queue.push(3);
57+
queue.push(4);
58+
});
59+
60+
std::thread clear_thread([&queue]() {
61+
while (queue.size() < QUEUE_CAPACITY)
62+
{
63+
std::this_thread::yield();
64+
}
65+
66+
queue.clear();
67+
});
68+
69+
clear_thread.join();
70+
push_thread.join();
71+
72+
EXPECT_EQ(queue.size(), 1);
73+
EXPECT_EQ(queue.capacity(), QUEUE_CAPACITY);
74+
}
75+
2376
class test_blocking_queue_push_int : public test_blocking_queue<int>
2477
{
2578
};

sdk/tests/src/test_signal_handler.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ TEST_P(test_signal_handler, raise)
4545
std::raise(params.signal);
4646
});
4747

48-
tc::sdk::wait_for_quit();
48+
int ret = tc::sdk::wait_for_quit();
49+
EXPECT_EQ(ret, params.signal);
4950
}
5051

5152
// NOLINTNEXTLINE
@@ -58,7 +59,8 @@ TEST_P(test_signal_handler, quit)
5859
tc::sdk::quit(params.name, params.signal);
5960
});
6061

61-
tc::sdk::wait_for_quit();
62+
int ret = tc::sdk::wait_for_quit();
63+
EXPECT_EQ(ret, params.signal);
6264
}
6365

6466
// NOLINTNEXTLINE
@@ -73,7 +75,9 @@ TEST_F(test_signal_handler_shutdown, null_callback)
7375
});
7476

7577
auto arrival_token = sync.arrive();
76-
tc::sdk::wait_for_quit();
78+
int ret = tc::sdk::wait_for_quit();
79+
EXPECT_EQ(ret, 0);
80+
7781
(void)arrival_token;
7882
}
7983

@@ -93,7 +97,9 @@ TEST_F(test_signal_handler_shutdown, quit_arguments)
9397
});
9498

9599
auto arrival_token = sync.arrive();
96-
tc::sdk::wait_for_quit();
100+
int ret = tc::sdk::wait_for_quit();
101+
EXPECT_EQ(ret, 1234);
102+
97103
(void)arrival_token;
98104
}
99105

@@ -118,7 +124,8 @@ TEST_F(test_signal_handler_shutdown, multiple_quit)
118124
for (auto i = 0; i < total_count; ++i)
119125
{
120126
auto arrival_token = sync.arrive();
121-
tc::sdk::wait_for_quit();
127+
int ret = tc::sdk::wait_for_quit();
128+
EXPECT_EQ(ret, 0);
122129
(void)arrival_token;
123130
}
124131

0 commit comments

Comments
 (0)