• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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