1153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov#include <gtest/gtest.h>
2153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
3153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov#include <climits>
4153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
5153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov#include "AllocationTestHarness.h"
6153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
7153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovextern "C" {
8153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov#include "osi/include/allocator.h"
9153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov#include "osi/include/fixed_queue.h"
10153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov#include "osi/include/future.h"
11153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov#include "osi/include/osi.h"
12153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov#include "osi/include/thread.h"
13153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
14153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
15153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovstatic const size_t TEST_QUEUE_SIZE = 10;
16153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovstatic const char *DUMMY_DATA_STRING = "Dummy data string";
17153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovstatic const char *DUMMY_DATA_STRING1 = "Dummy data string1";
18153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovstatic const char *DUMMY_DATA_STRING2 = "Dummy data string2";
19153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovstatic const char *DUMMY_DATA_STRING3 = "Dummy data string3";
20153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovstatic future_t *received_message_future = NULL;
21153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
22153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov// Test whether a file descriptor |fd| is readable.
23153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov// Return true if the file descriptor is readable, otherwise false.
24153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovstatic bool is_fd_readable(int fd)
25153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov{
26153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fd_set rfds;
27153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  struct timeval tv;
28153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
29153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  FD_ZERO(&rfds);
30153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  tv.tv_sec = 0;
31153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  tv.tv_usec = 0;
32153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  FD_SET(fd, &rfds);
33153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Only the enqueue_fd should be readable
34153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  int result = select(FD_SETSIZE, &rfds, NULL, NULL, &tv);
35153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(result >= 0);
36153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
37153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  return FD_ISSET(fd, &rfds);
38153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
39153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
40153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov// Function for performing dequeue operations from the queue when is ready
41153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovstatic void
42153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovfixed_queue_ready(fixed_queue_t *queue, UNUSED_ATTR void *context)
43153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov{
44153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  void *msg = fixed_queue_try_dequeue(queue);
45153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(msg != NULL);
46153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  future_ready(received_message_future, msg);
47153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
48153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
49153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavovclass FixedQueueTest : public AllocationTestHarness {};
50153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
51153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_new_free) {
52153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue;
53153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
54153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a corner case: queue of size 0
55153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new(0);
56153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(queue != NULL);
57153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
58153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
59153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a corner case: queue of size 1
60153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new(1);
61153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(queue != NULL);
62153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
63153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
64153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a corner case: queue of maximum size
65153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new((size_t)-1);
66153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(queue != NULL);
67153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
68153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
69153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a queue of some size
70153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new(TEST_QUEUE_SIZE);
71153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(queue != NULL);
72153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
73153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
74153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test free-ing a NULL queue
75153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(NULL, NULL);
76153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(NULL, osi_free);
77153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
78153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
79153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_is_empty) {
80153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue;
81153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
82153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a NULL queue
83153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(fixed_queue_is_empty(NULL));
84153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
85153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test an empty queue
86153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new(TEST_QUEUE_SIZE);
87153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
88153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(fixed_queue_is_empty(queue));
89153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
90153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a non-empty queue
91153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_try_enqueue(queue, (void *)DUMMY_DATA_STRING);
92153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_FALSE(fixed_queue_is_empty(queue));
93153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
94153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test an empty dequeued queue
95153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_EQ(DUMMY_DATA_STRING, fixed_queue_try_dequeue(queue));
96153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(fixed_queue_is_empty(queue));
97153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
98153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
99153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
100153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
101153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_length) {
102153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue;
103153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
104153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a NULL queue
105153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)0, fixed_queue_length(NULL));
106153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
107153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test an empty queue
108153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new(TEST_QUEUE_SIZE);
109153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
110153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)0, fixed_queue_length(queue));
111153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
112153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a non-empty queue
113153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_try_enqueue(queue, (void *)DUMMY_DATA_STRING);
114153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)1, fixed_queue_length(queue));
115153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
116153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test an empty dequeued queue
117153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_EQ(DUMMY_DATA_STRING, fixed_queue_try_dequeue(queue));
118153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)0, fixed_queue_length(queue));
119153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
120153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
121153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
122153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
123153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_capacity) {
124153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue;
125153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
126153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a corner case: queue of size 0
127153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new(0);
128153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
129153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)0, fixed_queue_capacity(queue));
130153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
131153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
132153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a corner case: queue of size 1
133153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new(1);
134153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
135153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)1, fixed_queue_capacity(queue));
136153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
137153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
138153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a corner case: queue of maximum size
139153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new((size_t)-1);
140153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
141153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)-1, fixed_queue_capacity(queue));
142153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
143153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
144153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test a queue of some size
145153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  queue = fixed_queue_new(TEST_QUEUE_SIZE);
146153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
147153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(TEST_QUEUE_SIZE, fixed_queue_capacity(queue));
148153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
149153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
150153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
151153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_enqueue_dequeue) {
152153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue = fixed_queue_new(TEST_QUEUE_SIZE);
153153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
154153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
155153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test blocking enqueue and blocking dequeue
156153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING);
157153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)1, fixed_queue_length(queue));
158153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING, fixed_queue_dequeue(queue));
159153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)0, fixed_queue_length(queue));
160153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
161153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test non-blocking enqueue and non-blocking dequeue
162153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(fixed_queue_try_enqueue(queue, (void *)DUMMY_DATA_STRING));
163153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)1, fixed_queue_length(queue));
164153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING, fixed_queue_try_dequeue(queue));
165153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)0, fixed_queue_length(queue));
166153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
167153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test non-blocking enqueue beyond queue capacity
168153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  for (size_t i = 0; i < TEST_QUEUE_SIZE; i++) {
169153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov    EXPECT_TRUE(fixed_queue_try_enqueue(queue, (void *)DUMMY_DATA_STRING));
170153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  }
171153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // The next enqueue operation is beyond the queue capacity, so it should fail
172153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_FALSE(fixed_queue_try_enqueue(queue, (void *)DUMMY_DATA_STRING));
173153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
174153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test non-blocking dequeue from a queue that is full to max capacity
175153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  for (size_t i = 0; i < TEST_QUEUE_SIZE; i++) {
176153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov    EXPECT_EQ(DUMMY_DATA_STRING, fixed_queue_try_dequeue(queue));
177153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  }
178153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
179153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test non-blocking dequeue from an empty queue
180153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_dequeue(queue));
181153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
182153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test non-blocking dequeue from a NULL queue
183153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_dequeue(NULL));
184153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
185153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
186153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
187153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
188153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_try_peek_first_last) {
189153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue = fixed_queue_new(TEST_QUEUE_SIZE);
190153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
191153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
192153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test peek first/last from a NULL queue
193153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_peek_first(NULL));
194153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_peek_last(NULL));
195153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
196153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test peek first/last from an empty queue
197153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_peek_first(queue));
198153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_peek_last(queue));
199153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
200153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test peek first/last from a queue with one element
201153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING1);
202153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING1, fixed_queue_try_peek_first(queue));
203153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING1, fixed_queue_try_peek_last(queue));
204153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
205153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test peek first/last from a queue with two elements
206153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING2);
207153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING1, fixed_queue_try_peek_first(queue));
208153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING2, fixed_queue_try_peek_last(queue));
209153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
210153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test peek first/last from a queue with three elements
211153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING3);
212153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING1, fixed_queue_try_peek_first(queue));
213153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING3, fixed_queue_try_peek_last(queue));
214153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
215153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
216153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
217153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
218153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_try_remove_from_queue) {
219153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue = fixed_queue_new(TEST_QUEUE_SIZE);
220153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
221153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
222153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test removing from a NULL queue
223153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_remove_from_queue(NULL,
224153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov                                        (void *)DUMMY_DATA_STRING));
225153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
226153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test removing from an empty queue
227153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_remove_from_queue(queue,
228153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov                                        (void *)DUMMY_DATA_STRING));
229153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
230153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test removing a queued string from a queue
231153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING1);
232153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING2);
233153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING3);
234153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)3, fixed_queue_length(queue));
235153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING2, fixed_queue_try_remove_from_queue(queue,
236153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov                                        (void *)DUMMY_DATA_STRING2));
237153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ((size_t)2, fixed_queue_length(queue));
238153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Removing again should fail
239153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_remove_from_queue(queue,
240153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov                                        (void *)DUMMY_DATA_STRING2));
241153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
242153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test removing a non-queued string from a queue
243153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(NULL, fixed_queue_try_remove_from_queue(queue,
244153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov                                        (void *)DUMMY_DATA_STRING));
245153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
246153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
247153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
248153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
249153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_get_enqueue_dequeue_fd) {
250153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue = fixed_queue_new(TEST_QUEUE_SIZE);
251153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
252153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
253153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test validity of enqueue and dequeue file descriptors
254153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  int enqueue_fd = fixed_queue_get_enqueue_fd(queue);
255153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  int dequeue_fd = fixed_queue_get_dequeue_fd(queue);
256153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(enqueue_fd >= 0);
257153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(dequeue_fd >= 0);
258153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(enqueue_fd < FD_SETSIZE);
259153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(dequeue_fd < FD_SETSIZE);
260153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
261153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test the file descriptors of an empty queue
262153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Only the enqueue_fd should be readable
263153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(is_fd_readable(enqueue_fd));
264153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_FALSE(is_fd_readable(dequeue_fd));
265153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
266153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test the file descriptors of a non-empty queue
267153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Both the enqueue_fd and dequeue_fd should be readable
268153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING);
269153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(is_fd_readable(enqueue_fd));
270153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(is_fd_readable(dequeue_fd));
271153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_dequeue(queue);
272153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
273153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Test the file descriptors of a full queue
274153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Only the dequeue_fd should be readable
275153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  for (size_t i = 0; i < TEST_QUEUE_SIZE; i++) {
276153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov    EXPECT_TRUE(fixed_queue_try_enqueue(queue, (void *)DUMMY_DATA_STRING));
277153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  }
278153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_FALSE(is_fd_readable(enqueue_fd));
279153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_TRUE(is_fd_readable(dequeue_fd));
280153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
281153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
282153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
283153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
284153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin RadoslavovTEST_F(FixedQueueTest, test_fixed_queue_register_dequeue) {
285153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_t *queue = fixed_queue_new(TEST_QUEUE_SIZE);
286153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(queue != NULL);
287153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
288153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  received_message_future = future_new();
289153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(received_message_future != NULL);
290153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
291153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  thread_t *worker_thread = thread_new("test_fixed_queue_worker_thread");
292153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  ASSERT_TRUE(worker_thread != NULL);
293153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
294153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_register_dequeue(queue,
295153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov                               thread_get_reactor(worker_thread),
296153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov                               fixed_queue_ready,
297153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov                               NULL);
298153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
299153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  // Add a message to the queue, and expect to receive it
300153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_enqueue(queue, (void *)DUMMY_DATA_STRING);
301153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  const char *msg = (const char *)future_await(received_message_future);
302153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  EXPECT_EQ(DUMMY_DATA_STRING, msg);
303153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov
304153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_unregister_dequeue(queue);
305153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  thread_free(worker_thread);
306153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov  fixed_queue_free(queue, NULL);
307153bdfb9784b21e235676508c75bf2f4ee2b937fPavlin Radoslavov}
308