1 /******************************************************************************
2 *
3 * Copyright (C) 2015 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 <stdlib.h>
20 #include <time.h>
21 #include <unistd.h>
22
23 #include "gatt/gatt_test.h"
24
25 #define DEFAULT_RANDOM_SEED 42
26
27 namespace {
28
create_random_uuid(bt_uuid_t * uuid,int seed)29 static void create_random_uuid(bt_uuid_t *uuid, int seed) {
30 srand(seed < 0 ? time(NULL) : seed);
31 for (int i = 0; i < 16; ++i) {
32 uuid->uu[i] = (uint8_t) (rand() % 256);
33 }
34 }
35
36 } // namespace
37
38 namespace bttest {
39
TEST_F(GattTest,GattClientRegister)40 TEST_F(GattTest, GattClientRegister) {
41 // Registers gatt client.
42 bt_uuid_t gatt_client_uuid;
43 create_random_uuid(&gatt_client_uuid, DEFAULT_RANDOM_SEED);
44 gatt_client_interface()->register_client(&gatt_client_uuid);
45 semaphore_wait(register_client_callback_sem_);
46 EXPECT_TRUE(status() == BT_STATUS_SUCCESS)
47 << "Error registering GATT client app callback.";
48
49 // Unregisters gatt client. No callback is expected.
50 gatt_client_interface()->unregister_client(client_interface_id());
51 }
52
TEST_F(GattTest,GattClientScanRemoteDevice)53 TEST_F(GattTest, GattClientScanRemoteDevice) {
54 // Starts BLE scan. NB: This test assumes there is a BLE beacon advertising nearby.
55 gatt_client_interface()->scan(true);
56 semaphore_wait(scan_result_callback_sem_);
57
58 // Ends BLE scan. No callback is expected.
59 gatt_client_interface()->scan(false);
60 }
61
TEST_F(GattTest,GattClientAdvertise)62 TEST_F(GattTest, GattClientAdvertise) {
63 // Registers a new client app.
64 bt_uuid_t gatt_client_uuid;
65 create_random_uuid(&gatt_client_uuid, DEFAULT_RANDOM_SEED);
66 gatt_client_interface()->register_client(&gatt_client_uuid);
67 semaphore_wait(register_client_callback_sem_);
68 EXPECT_TRUE(status() == BT_STATUS_SUCCESS)
69 << "Error registering GATT client app callback.";
70
71 // Starts advertising.
72 gatt_client_interface()->listen(client_interface_id(), true);
73 semaphore_wait(listen_callback_sem_);
74 EXPECT_TRUE(status() == BT_STATUS_SUCCESS)
75 << "Error starting BLE advertisement.";
76
77 // Stops advertising.
78 gatt_client_interface()->listen(client_interface_id(), false);
79 semaphore_wait(listen_callback_sem_);
80 EXPECT_TRUE(status() == BT_STATUS_SUCCESS)
81 << "Error stopping BLE advertisement.";
82
83 // Unregisters gatt server. No callback is expected.
84 gatt_client_interface()->unregister_client(client_interface_id());
85 }
86
TEST_F(GattTest,GattServerRegister)87 TEST_F(GattTest, GattServerRegister) {
88 // Registers gatt server.
89 bt_uuid_t gatt_server_uuid;
90 create_random_uuid(&gatt_server_uuid, DEFAULT_RANDOM_SEED);
91 gatt_server_interface()->register_server(&gatt_server_uuid);
92 semaphore_wait(register_server_callback_sem_);
93 EXPECT_TRUE(status() == BT_STATUS_SUCCESS)
94 << "Error registering GATT server app callback.";
95
96 // Unregisters gatt server. No callback is expected.
97 gatt_server_interface()->unregister_server(server_interface_id());
98 }
99
TEST_F(GattTest,GattServerBuild)100 TEST_F(GattTest, GattServerBuild) {
101 // Registers gatt server.
102 bt_uuid_t gatt_server_uuid;
103 create_random_uuid(&gatt_server_uuid, DEFAULT_RANDOM_SEED);
104 gatt_server_interface()->register_server(&gatt_server_uuid);
105 semaphore_wait(register_server_callback_sem_);
106 EXPECT_TRUE(status() == BT_STATUS_SUCCESS)
107 << "Error registering GATT server app callback.";
108
109 // Service UUID.
110 btgatt_srvc_id_t srvc_id;
111 srvc_id.id.inst_id = 0; // there is only one instance of this service.
112 srvc_id.is_primary = 1; // this service is primary.
113 create_random_uuid(&srvc_id.id.uuid, -1);
114
115 // Characteristics UUID.
116 bt_uuid_t char_uuid;
117 create_random_uuid(&char_uuid, -1);
118
119 // Descriptor UUID.
120 bt_uuid_t desc_uuid;
121 create_random_uuid(&desc_uuid, -1);
122
123 // Adds service.
124 int server_if = server_interface_id();
125 gatt_server_interface()->add_service(server_if, &srvc_id, 4 /* # handles */);
126 semaphore_wait(service_added_callback_sem_);
127 EXPECT_TRUE(status() == BT_STATUS_SUCCESS) << "Error adding service.";
128
129 // Adds characteristics.
130 int srvc_handle = service_handle();
131 gatt_server_interface()->add_characteristic(server_if, srvc_handle,
132 &char_uuid, 0x10 /* notification */, 0x01 /* read only */);
133 semaphore_wait(characteristic_added_callback_sem_);
134 EXPECT_TRUE(status() == BT_STATUS_SUCCESS)
135 << "Error adding characteristics.";
136
137 // Adds descriptor.
138 gatt_server_interface()->add_descriptor(server_if, srvc_handle,
139 &desc_uuid, 0x01);
140 semaphore_wait(descriptor_added_callback_sem_);
141 EXPECT_TRUE(status() == BT_STATUS_SUCCESS)
142 << "Error adding descriptor.";
143
144 // Starts server.
145 gatt_server_interface()->start_service(server_if, srvc_handle, 2 /*BREDR/LE*/);
146 semaphore_wait(service_started_callback_sem_);
147 EXPECT_TRUE(status() == BT_STATUS_SUCCESS) << "Error starting server.";
148
149 // Stops server.
150 gatt_server_interface()->stop_service(server_if, srvc_handle);
151 semaphore_wait(service_stopped_callback_sem_);
152 EXPECT_TRUE(status() == BT_STATUS_SUCCESS) << "Error stopping server.";
153
154 // Deletes service.
155 gatt_server_interface()->delete_service(server_if, srvc_handle);
156 semaphore_wait(service_deleted_callback_sem_);
157 EXPECT_TRUE(status() == BT_STATUS_SUCCESS) << "Error deleting service.";
158
159 // Unregisters gatt server. No callback is expected.
160 gatt_server_interface()->unregister_server(server_if);
161 }
162
163 } // bttest
164