1 /*
2 * Copyright 2025 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 "bta/include/bta_ras_api.h"
20 #include "bta/ras/ras_types.h"
21
22 class RasUtilsTest : public ::testing::Test {};
23
TEST(RasUtilsTest,GetUuidName)24 TEST(RasUtilsTest, GetUuidName) {
25 // Test known UUIDs
26 EXPECT_EQ(ras::uuid::getUuidName(bluetooth::Uuid::From16Bit(ras::uuid::kRangingService16Bit)),
27 "Ranging Service");
28 EXPECT_EQ(ras::uuid::getUuidName(
29 bluetooth::Uuid::From16Bit(ras::uuid::kRasFeaturesCharacteristic16bit)),
30 "RAS Features");
31 EXPECT_EQ(ras::uuid::getUuidName(bluetooth::Uuid::From16Bit(
32 ras::uuid::kRasRealTimeRangingDataCharacteristic16bit)),
33 "Real-time Ranging Data");
34 EXPECT_EQ(ras::uuid::getUuidName(
35 bluetooth::Uuid::From16Bit(ras::uuid::kRasOnDemandDataCharacteristic16bit)),
36 "On-demand Ranging Data");
37 EXPECT_EQ(ras::uuid::getUuidName(
38 bluetooth::Uuid::From16Bit(ras::uuid::kRasControlPointCharacteristic16bit)),
39 "RAS Control Point (RAS-CP)");
40 EXPECT_EQ(ras::uuid::getUuidName(
41 bluetooth::Uuid::From16Bit(ras::uuid::kRasRangingDataReadyCharacteristic16bit)),
42 "Ranging Data Ready");
43 EXPECT_EQ(ras::uuid::getUuidName(bluetooth::Uuid::From16Bit(
44 ras::uuid::kRasRangingDataOverWrittenCharacteristic16bit)),
45 "Ranging Data Overwritten");
46 EXPECT_EQ(ras::uuid::getUuidName(
47 bluetooth::Uuid::From16Bit(ras::uuid::kClientCharacteristicConfiguration16bit)),
48 "Client Characteristic Configuration");
49
50 // Test unknown UUID
51 EXPECT_EQ(ras::uuid::getUuidName(
52 bluetooth::Uuid::FromString("00001101-0000-1000-8000-00805F9B34FB")),
53 "Unknown UUID");
54 }
55
TEST(RasUtilsTest,ParseControlPointCommand)56 TEST(RasUtilsTest, ParseControlPointCommand) {
57 // Test successful parsing of valid commands
58 uint8_t valid_data_get_ranging_data[] = {0x00, 0x01, 0x02};
59 ras::ControlPointCommand command_get_ranging_data;
60 ASSERT_TRUE(ras::ParseControlPointCommand(&command_get_ranging_data, valid_data_get_ranging_data,
61 sizeof(valid_data_get_ranging_data)));
62 ASSERT_EQ(command_get_ranging_data.opcode_, ras::Opcode::GET_RANGING_DATA);
63 ASSERT_EQ(command_get_ranging_data.parameter_[0], 0x01);
64 ASSERT_EQ(command_get_ranging_data.parameter_[1], 0x02);
65
66 uint8_t valid_data_ack_ranging_data[] = {0x01, 0x03, 0x04};
67 ras::ControlPointCommand command_ack_ranging_data;
68 ASSERT_TRUE(ras::ParseControlPointCommand(&command_ack_ranging_data, valid_data_ack_ranging_data,
69 sizeof(valid_data_ack_ranging_data)));
70 ASSERT_EQ(command_ack_ranging_data.opcode_, ras::Opcode::ACK_RANGING_DATA);
71 ASSERT_EQ(command_ack_ranging_data.parameter_[0], 0x03);
72 ASSERT_EQ(command_ack_ranging_data.parameter_[1], 0x04);
73
74 uint8_t valid_data_retrieve_lost_ranging_data_segments[] = {0x02, 0x05, 0x06, 0x07, 0x08};
75 ras::ControlPointCommand command_retrieve_lost_ranging_data_segments;
76 ASSERT_TRUE(
77 ras::ParseControlPointCommand(&command_retrieve_lost_ranging_data_segments,
78 valid_data_retrieve_lost_ranging_data_segments,
79 sizeof(valid_data_retrieve_lost_ranging_data_segments)));
80 ASSERT_EQ(command_retrieve_lost_ranging_data_segments.opcode_,
81 ras::Opcode::RETRIEVE_LOST_RANGING_DATA_SEGMENTS);
82 ASSERT_EQ(command_retrieve_lost_ranging_data_segments.parameter_[0], 0x05);
83 ASSERT_EQ(command_retrieve_lost_ranging_data_segments.parameter_[1], 0x06);
84 ASSERT_EQ(command_retrieve_lost_ranging_data_segments.parameter_[2], 0x07);
85 ASSERT_EQ(command_retrieve_lost_ranging_data_segments.parameter_[3], 0x08);
86
87 uint8_t valid_data_abort_operation[] = {0x03};
88 ras::ControlPointCommand command_abort_operation;
89 ASSERT_TRUE(ras::ParseControlPointCommand(&command_abort_operation, valid_data_abort_operation,
90 sizeof(valid_data_abort_operation)));
91 ASSERT_EQ(command_abort_operation.opcode_, ras::Opcode::ABORT_OPERATION);
92
93 uint8_t valid_data_filter[] = {0x04, 0x09, 0x0A};
94 ras::ControlPointCommand command_filter;
95 ASSERT_TRUE(ras::ParseControlPointCommand(&command_filter, valid_data_filter,
96 sizeof(valid_data_filter)));
97 ASSERT_EQ(command_filter.opcode_, ras::Opcode::FILTER);
98 ASSERT_EQ(command_filter.parameter_[0], 0x09);
99 ASSERT_EQ(command_filter.parameter_[1], 0x0A);
100
101 // Test failed parsing of invalid commands
102 uint8_t invalid_data_short_get_ranging_data[] = {0x00, 0x01};
103 ras::ControlPointCommand command_invalid_short_get_ranging_data;
104 ASSERT_FALSE(ras::ParseControlPointCommand(&command_invalid_short_get_ranging_data,
105 invalid_data_short_get_ranging_data,
106 sizeof(invalid_data_short_get_ranging_data)));
107
108 uint8_t invalid_data_long_get_ranging_data[] = {0x00, 0x01, 0x02, 0x03};
109 ras::ControlPointCommand command_invalid_long_get_ranging_data;
110 ASSERT_FALSE(ras::ParseControlPointCommand(&command_invalid_long_get_ranging_data,
111 invalid_data_long_get_ranging_data,
112 sizeof(invalid_data_long_get_ranging_data)));
113
114 uint8_t invalid_data_unknown_opcode[] = {0x05, 0x01, 0x02};
115 ras::ControlPointCommand command_invalid_unknown_opcode;
116 ASSERT_FALSE(ras::ParseControlPointCommand(&command_invalid_unknown_opcode,
117 invalid_data_unknown_opcode,
118 sizeof(invalid_data_unknown_opcode)));
119 }
120
TEST(RasUtilsTest,GetOpcodeText)121 TEST(RasUtilsTest, GetOpcodeText) {
122 // Test known opcodes
123 EXPECT_EQ(ras::GetOpcodeText(ras::Opcode::GET_RANGING_DATA), "GET_RANGING_DATA");
124 EXPECT_EQ(ras::GetOpcodeText(ras::Opcode::ACK_RANGING_DATA), "ACK_RANGING_DATA");
125 EXPECT_EQ(ras::GetOpcodeText(ras::Opcode::RETRIEVE_LOST_RANGING_DATA_SEGMENTS),
126 "RETRIEVE_LOST_RANGING_DATA_SEGMENTS");
127 EXPECT_EQ(ras::GetOpcodeText(ras::Opcode::ABORT_OPERATION), "ABORT_OPERATION");
128 EXPECT_EQ(ras::GetOpcodeText(ras::Opcode::FILTER), "FILTER");
129
130 // Test unknown opcode (casting an invalid value to Opcode)
131 EXPECT_EQ(ras::GetOpcodeText(static_cast<ras::Opcode>(0x05)), "Unknown Opcode");
132 }
133
TEST(RasUtilsTest,GetResponseOpcodeValueText)134 TEST(RasUtilsTest, GetResponseOpcodeValueText) {
135 // Test known response code values
136 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::RESERVED_FOR_FUTURE_USE),
137 "RESERVED_FOR_FUTURE_USE");
138 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::SUCCESS), "SUCCESS");
139 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::OP_CODE_NOT_SUPPORTED),
140 "OP_CODE_NOT_SUPPORTED");
141 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::INVALID_PARAMETER),
142 "INVALID_PARAMETER");
143 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::PERSISTED), "PERSISTED");
144 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::ABORT_UNSUCCESSFUL),
145 "ABORT_UNSUCCESSFUL");
146 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::PROCEDURE_NOT_COMPLETED),
147 "PROCEDURE_NOT_COMPLETED");
148 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::SERVER_BUSY), "SERVER_BUSY");
149 EXPECT_EQ(ras::GetResponseOpcodeValueText(ras::ResponseCodeValue::NO_RECORDS_FOUND),
150 "NO_RECORDS_FOUND");
151
152 // Test unknown response code value (casting an invalid value to ResponseCodeValue)
153 EXPECT_EQ(ras::GetResponseOpcodeValueText(static_cast<ras::ResponseCodeValue>(0x09)),
154 "Reserved for Future Use");
155 }
156
TEST(RasUtilsTest,IsRangingServiceCharacteristic)157 TEST(RasUtilsTest, IsRangingServiceCharacteristic) {
158 // Test true cases for Ranging Service characteristics
159 EXPECT_TRUE(ras::IsRangingServiceCharacteristic(
160 bluetooth::Uuid::From16Bit(ras::uuid::kRangingService16Bit)));
161 EXPECT_TRUE(ras::IsRangingServiceCharacteristic(
162 bluetooth::Uuid::From16Bit(ras::uuid::kRasFeaturesCharacteristic16bit)));
163 EXPECT_TRUE(ras::IsRangingServiceCharacteristic(
164 bluetooth::Uuid::From16Bit(ras::uuid::kRasRealTimeRangingDataCharacteristic16bit)));
165 EXPECT_TRUE(ras::IsRangingServiceCharacteristic(
166 bluetooth::Uuid::From16Bit(ras::uuid::kRasOnDemandDataCharacteristic16bit)));
167 EXPECT_TRUE(ras::IsRangingServiceCharacteristic(
168 bluetooth::Uuid::From16Bit(ras::uuid::kRasControlPointCharacteristic16bit)));
169 EXPECT_TRUE(ras::IsRangingServiceCharacteristic(
170 bluetooth::Uuid::From16Bit(ras::uuid::kRasRangingDataReadyCharacteristic16bit)));
171 EXPECT_TRUE(ras::IsRangingServiceCharacteristic(
172 bluetooth::Uuid::From16Bit(ras::uuid::kRasRangingDataOverWrittenCharacteristic16bit)));
173
174 // Test false cases for non-Ranging Service characteristics
175 EXPECT_FALSE(ras::IsRangingServiceCharacteristic(
176 bluetooth::Uuid::From16Bit(ras::uuid::kClientCharacteristicConfiguration16bit)));
177 EXPECT_FALSE(ras::IsRangingServiceCharacteristic(
178 bluetooth::Uuid::FromString("00001101-0000-1000-8000-00805F9B34FB"))); // Random UUID
179 }
180