1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <gtest/gtest.h>
18 
19 #include "DataQueue.h"
20 
21 // Define a test fixture class
22 class DataQueueTest : public ::testing::Test {
23  protected:
24   DataQueue queue;
25 };
26 
27 // Test isEmpty() when the queue is empty
TEST_F(DataQueueTest,IsEmptyInitially)28 TEST_F(DataQueueTest, IsEmptyInitially) { ASSERT_TRUE(queue.isEmpty()); }
29 
30 // Test enqueue() and dequeue() with a single element
TEST_F(DataQueueTest,EnqueueDequeueOneElement)31 TEST_F(DataQueueTest, EnqueueDequeueOneElement) {
32   uint8_t data[] = {1, 2, 3};
33   ASSERT_TRUE(queue.enqueue(data, sizeof(data)));
34   ASSERT_FALSE(queue.isEmpty());
35 
36   uint8_t buffer[10];
37   uint16_t actualLen;
38   ASSERT_TRUE(queue.dequeue(buffer, sizeof(buffer), actualLen));
39   ASSERT_EQ(actualLen, sizeof(data));
40   ASSERT_EQ(memcmp(buffer, data, sizeof(data)), 0);
41   ASSERT_TRUE(queue.isEmpty());
42 }
43 
44 // Test enqueue() and dequeue() with multiple elements
TEST_F(DataQueueTest,EnqueueDequeueMultipleElements)45 TEST_F(DataQueueTest, EnqueueDequeueMultipleElements) {
46   uint8_t data1[] = {1, 2, 3};
47   uint8_t data2[] = {4, 5, 6, 7};
48   ASSERT_TRUE(queue.enqueue(data1, sizeof(data1)));
49   ASSERT_TRUE(queue.enqueue(data2, sizeof(data2)));
50 
51   uint8_t buffer[10];
52   uint16_t actualLen;
53   ASSERT_TRUE(queue.dequeue(buffer, sizeof(buffer), actualLen));
54   ASSERT_EQ(actualLen, sizeof(data1));
55   ASSERT_EQ(memcmp(buffer, data1, sizeof(data1)), 0);
56 
57   ASSERT_TRUE(queue.dequeue(buffer, sizeof(buffer), actualLen));
58   ASSERT_EQ(actualLen, sizeof(data2));
59   ASSERT_EQ(memcmp(buffer, data2, sizeof(data2)), 0);
60   ASSERT_TRUE(queue.isEmpty());
61 }
62 
63 // Test dequeue() with a buffer smaller than the data size
TEST_F(DataQueueTest,DequeuePartial)64 TEST_F(DataQueueTest, DequeuePartial) {
65   uint8_t data[] = {1, 2, 3, 4, 5};
66   ASSERT_TRUE(queue.enqueue(data, sizeof(data)));
67 
68   uint8_t buffer[3];  // Smaller buffer
69   uint16_t actualLen;
70   ASSERT_TRUE(queue.dequeue(buffer, sizeof(buffer), actualLen));
71   ASSERT_EQ(actualLen, sizeof(buffer));
72   ASSERT_EQ(memcmp(buffer, data, sizeof(buffer)), 0);
73 
74   ASSERT_TRUE(queue.dequeue(buffer, sizeof(buffer), actualLen));
75   ASSERT_EQ(actualLen, 2);  // Remaining 2 bytes
76   ASSERT_EQ(memcmp(buffer, data + 3, 2), 0);
77   ASSERT_TRUE(queue.isEmpty());
78 }
79 
80 // Test dequeue() with an empty queue
TEST_F(DataQueueTest,DequeueEmpty)81 TEST_F(DataQueueTest, DequeueEmpty) {
82   uint8_t buffer[10];
83   uint16_t actualLen;
84   ASSERT_FALSE(queue.dequeue(buffer, sizeof(buffer), actualLen));
85 }
86 
87 // Test enqueue() with NULL data and zero data length
TEST_F(DataQueueTest,EnqueueInvalidInput)88 TEST_F(DataQueueTest, EnqueueInvalidInput) {
89   ASSERT_FALSE(queue.enqueue(nullptr, 10));
90   ASSERT_FALSE(queue.enqueue(reinterpret_cast<uint8_t*>(0x1234), 0));
91 }