1 /******************************************************************************
2 *
3 * Copyright 2014 Google, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19 #include "btcore/include/property.h"
20
21 #include <arpa/inet.h>
22 #include <gtest/gtest.h>
23
24 #include "osi/test/AllocationTestHarness.h"
25 #include "types/bluetooth/uuid.h"
26 #include "types/raw_address.h"
27
28 using bluetooth::Uuid;
29
30 class PropertyTest : public AllocationTestHarness {};
31
TEST_F(PropertyTest,addr)32 TEST_F(PropertyTest, addr) {
33 RawAddress addr0 = {{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}};
34 bt_property_t* property = property_new_addr(&addr0);
35
36 EXPECT_EQ(addr0.address[0], ((uint8_t*)property->val)[0]);
37 EXPECT_EQ(addr0.address[1], ((uint8_t*)property->val)[1]);
38 EXPECT_EQ(addr0.address[2], ((uint8_t*)property->val)[2]);
39 EXPECT_EQ(addr0.address[3], ((uint8_t*)property->val)[3]);
40 EXPECT_EQ(addr0.address[4], ((uint8_t*)property->val)[4]);
41 EXPECT_EQ(addr0.address[5], ((uint8_t*)property->val)[5]);
42 EXPECT_EQ(BT_PROPERTY_BDADDR, property->type);
43 EXPECT_EQ((int)sizeof(RawAddress), property->len);
44
45 const RawAddress* addr1 = property_as_addr(property);
46 EXPECT_EQ(addr0.address[0], addr1->address[0]);
47
48 property_free(property);
49 }
50
TEST_F(PropertyTest,device_class)51 TEST_F(PropertyTest, device_class) {
52 bt_device_class_t dc0 = {{0x01, 0x23, 0x45}};
53 bt_property_t* property = property_new_device_class(&dc0);
54
55 EXPECT_EQ(dc0._[0], ((uint8_t*)property->val)[0]);
56 EXPECT_EQ(dc0._[1], ((uint8_t*)property->val)[1]);
57 EXPECT_EQ(dc0._[2], ((uint8_t*)property->val)[2]);
58 EXPECT_EQ(BT_PROPERTY_CLASS_OF_DEVICE, property->type);
59 EXPECT_EQ((int)sizeof(bt_device_class_t), property->len);
60
61 const bt_device_class_t* dc1 = property_as_device_class(property);
62 int dc_int = device_class_to_int(dc1);
63 EXPECT_EQ(0x452301, dc_int);
64
65 property_free(property);
66 }
67
TEST_F(PropertyTest,device_type)68 TEST_F(PropertyTest, device_type) {
69 bt_device_type_t dt0 = (bt_device_type_t)1;
70 bt_property_t* property = property_new_device_type(dt0);
71
72 EXPECT_EQ((int)dt0, *(int*)property->val);
73 EXPECT_EQ(BT_PROPERTY_TYPE_OF_DEVICE, property->type);
74 EXPECT_EQ((int)sizeof(bt_device_type_t), property->len);
75
76 bt_device_type_t dt1 = property_as_device_type(property);
77 EXPECT_EQ(1, (int)dt1);
78
79 property_free(property);
80 }
81
TEST_F(PropertyTest,discovery_timeout)82 TEST_F(PropertyTest, discovery_timeout) {
83 uint32_t timeout0 = 12345;
84 bt_property_t* property = property_new_discoverable_timeout(timeout0);
85
86 EXPECT_EQ(timeout0, *(uint32_t*)property->val);
87 EXPECT_EQ(BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT, property->type);
88 EXPECT_EQ((int)sizeof(uint32_t), property->len);
89
90 uint32_t timeout1 = property_as_discoverable_timeout(property);
91 EXPECT_EQ(timeout0, timeout1);
92
93 property_free(property);
94 }
95
TEST_F(PropertyTest,name)96 TEST_F(PropertyTest, name) {
97 const char* name0 = "My btcore name";
98 bt_property_t* property = property_new_name(name0);
99
100 EXPECT_EQ(0, strcmp((char*)name0, (char*)property->val));
101 EXPECT_EQ(BT_PROPERTY_BDNAME, property->type);
102 EXPECT_EQ((int)sizeof(bt_bdname_t), property->len);
103
104 const bt_bdname_t* name1 = property_as_name(property);
105 EXPECT_EQ(0, strcmp((char*)name0, (char*)name1->name));
106
107 property_free(property);
108 }
109
TEST_F(PropertyTest,rssi)110 TEST_F(PropertyTest, rssi) {
111 int8_t rssi0 = -56;
112 bt_property_t* property = property_new_rssi(rssi0);
113
114 EXPECT_EQ(*(int8_t*)property->val, rssi0);
115 EXPECT_EQ(BT_PROPERTY_REMOTE_RSSI, property->type);
116 EXPECT_EQ((int)sizeof(int8_t), property->len);
117
118 int8_t rss1 = property_as_rssi(property);
119 EXPECT_EQ(rssi0, rss1);
120
121 property_free(property);
122 }
123
TEST_F(PropertyTest,scan_mode)124 TEST_F(PropertyTest, scan_mode) {
125 bt_scan_mode_t mode0 = (bt_scan_mode_t)3;
126 bt_property_t* property = property_new_scan_mode(mode0);
127
128 EXPECT_EQ(*(int*)property->val, mode0);
129 EXPECT_EQ(BT_PROPERTY_ADAPTER_SCAN_MODE, property->type);
130 EXPECT_EQ((int)sizeof(int), property->len);
131
132 bt_scan_mode_t mode1 = property_as_scan_mode(property);
133 EXPECT_EQ((int)mode0, (int)mode1);
134
135 property_free(property);
136 }
137
TEST_F(PropertyTest,uuids)138 TEST_F(PropertyTest, uuids) {
139 Uuid uuid0 = Uuid::From128BitBE({{
140 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
141 0xcc, 0xdd, 0xee, 0xff,
142 }});
143 bt_property_t* property = property_new_uuids(&uuid0, 1);
144
145 EXPECT_EQ(0, memcmp(uuid0.To128BitBE().data(), property->val, sizeof(Uuid)));
146 EXPECT_EQ(BT_PROPERTY_UUIDS, property->type);
147 EXPECT_EQ((int)sizeof(Uuid), property->len);
148
149 size_t uuid_cnt1;
150 const Uuid* uuid1 = property_as_uuids(property, &uuid_cnt1);
151 EXPECT_EQ(uuid0, *uuid1);
152
153 property_free(property);
154 }
155
TEST_F(PropertyTest,copy)156 TEST_F(PropertyTest, copy) {
157 {
158 Uuid uuids[] = {
159 Uuid::From128BitBE({{
160 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa,
161 0xbb, 0xcc, 0xdd, 0xee, 0xff,
162 }}),
163 Uuid::From128BitBE({{
164 0xf0, 0xe1, 0xd2, 0xc3, 0xf4, 0xe5, 0xd6, 0xc7, 0xf8, 0xe9, 0xda,
165 0xcb, 0xfc, 0xed, 0xde, 0xcf,
166 }}),
167 };
168
169 bt_property_t* property0 =
170 property_new_uuids(uuids, sizeof(uuids) / sizeof(Uuid));
171
172 bt_property_t property1;
173 property_copy(&property1, property0);
174 EXPECT_TRUE(property_equals(property0, &property1));
175
176 property_free(property0);
177 }
178 }
179
TEST_F(PropertyTest,equals)180 TEST_F(PropertyTest, equals) {
181 {
182 RawAddress addr0 = {{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}};
183 bt_property_t* property0 = property_new_addr(&addr0);
184
185 bt_device_class_t dc0 = {{0x01, 0x23, 0x45}};
186 bt_property_t* property1 = property_new_device_class(&dc0);
187
188 EXPECT_FALSE(property_equals(property0, property1));
189
190 property_free(property0);
191 property_free(property1);
192 }
193
194 {
195 RawAddress addr = {{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}};
196 bt_property_t* property0 = property_new_addr(&addr);
197 bt_property_t* property1 = property_new_addr(&addr);
198
199 EXPECT_TRUE(property_equals(property0, property1));
200
201 property_free(property0);
202 property_free(property1);
203 }
204
205 {
206 RawAddress addr0 = {{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}};
207 bt_property_t* property0 = property_new_addr(&addr0);
208
209 RawAddress addr1 = {{0x1, 0x2, 0x3, 0x4, 0x5, 0xff}};
210 bt_property_t* property1 = property_new_addr(&addr1);
211
212 EXPECT_FALSE(property_equals(property0, property1));
213
214 property_free(property0);
215 property_free(property1);
216 }
217
218 {
219 const char* name0 = "My btcore name";
220 bt_property_t* property0 = property_new_name(name0);
221
222 const char* name1 = "My btcore name";
223 bt_property_t* property1 = property_new_name(name1);
224
225 EXPECT_TRUE(property_equals(property0, property1));
226
227 property_free(property0);
228 property_free(property1);
229 }
230
231 {
232 const char* name0 = "My btcore name";
233 bt_property_t* property0 = property_new_name(name0);
234
235 const char* name1 = "My btcore name ";
236 bt_property_t* property1 = property_new_name(name1);
237
238 EXPECT_FALSE(property_equals(property0, property1));
239
240 property_free(property0);
241 property_free(property1);
242 }
243 }
244