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