1 /******************************************************************************
2 *
3 * Copyright 2016 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 "adapter/bluetooth_test.h"
20 #include "rfcomm/rfcomm_test.h"
21
22 #include <sys/socket.h>
23 #include <unistd.h>
24
25 namespace {
26 static const char HANDSHAKE_COMMAND[] = "AT+BRSF=29\r";
27 } // namespace
28
29 namespace bttest {
30
TEST_F(RFCommTest,RfcommConnectPairedDevice)31 TEST_F(RFCommTest, RfcommConnectPairedDevice) {
32 int fd = -1;
33 int error = 0;
34 size_t len = 0;
35
36 error = socket_interface()->connect(&bt_remote_bdaddr_, BTSOCK_RFCOMM,
37 &HFP_UUID, 0, &fd, 0, getuid());
38 EXPECT_TRUE(error == BT_STATUS_SUCCESS) << "Error creating RFCOMM socket: "
39 << error;
40 EXPECT_TRUE(fd != -1) << "Error creating RFCOMM socket: invalid fd";
41
42 int channel;
43 sock_connect_signal_t signal;
44 len = read(fd, &channel, sizeof(channel));
45 EXPECT_TRUE(len == sizeof(channel))
46 << "Channel not read from RFCOMM socket. Bytes read: " << len;
47 len = read(fd, &signal, sizeof(signal));
48 EXPECT_TRUE(len == sizeof(signal))
49 << "Connection signal not read from RFCOMM socket. Bytes read: " << len;
50
51 EXPECT_TRUE(signal.bd_addr == bt_remote_bdaddr_)
52 << "Connected to a different bdaddr than expected.";
53 EXPECT_TRUE(channel == signal.channel)
54 << "Inconsistent channels returned: " << channel << " and "
55 << signal.channel;
56
57 len = write(fd, HANDSHAKE_COMMAND, sizeof(HANDSHAKE_COMMAND));
58 EXPECT_TRUE(len == sizeof(HANDSHAKE_COMMAND))
59 << "Unable to send HFP handshake. Bytes written: " << len;
60
61 char response[1024];
62 len = read(fd, response, sizeof(response));
63 EXPECT_TRUE(len > 0) << "Read " << len << " bytes";
64
65 close(fd);
66 }
67
TEST_F(RFCommTest,RfcommRepeatedConnectPairedDevice)68 TEST_F(RFCommTest, RfcommRepeatedConnectPairedDevice) {
69 static const int max_iterations = 128;
70 int channel_fail = 0, signal_fail = 0, handshake_fail = 0, read_fail = 0;
71
72 for (int i = 0; i < max_iterations; ++i) {
73 int fd = -1;
74 int error = 0;
75 size_t len = 0;
76
77 error = socket_interface()->connect(&bt_remote_bdaddr_, BTSOCK_RFCOMM,
78 &HFP_UUID, 0, &fd, 0, getuid());
79 ASSERT_TRUE(error == BT_STATUS_SUCCESS) << "Error creating RFCOMM socket: "
80 << error;
81 ASSERT_TRUE(fd != -1) << "Error creating RFCOMM socket: invalid fd";
82
83 int channel;
84 sock_connect_signal_t signal;
85 len = read(fd, &channel, sizeof(channel));
86 if (len != sizeof(channel)) {
87 ADD_FAILURE() << "Channel not read from RFCOMM socket. Bytes read: "
88 << len << ", Sizeof channel: " << sizeof(channel);
89 channel_fail++;
90 }
91
92 len = read(fd, &signal, sizeof(signal));
93 if (len != sizeof(signal)) {
94 ADD_FAILURE()
95 << "Connection signal not read from RFCOMM socket. Bytes read: "
96 << len;
97 signal_fail++;
98 }
99
100 EXPECT_TRUE(signal.bd_addr == bt_remote_bdaddr_)
101 << "Connected to a different bdaddr than expected.";
102 EXPECT_TRUE(channel == signal.channel)
103 << "Inconsistent channels returned: " << channel << " and "
104 << signal.channel;
105 len = write(fd, HANDSHAKE_COMMAND, sizeof(HANDSHAKE_COMMAND));
106 if (len != sizeof(HANDSHAKE_COMMAND)) {
107 ADD_FAILURE() << "Unable to send HFP handshake. Bytes written: " << len;
108 handshake_fail++;
109 }
110
111 char response[1024];
112 len = read(fd, response, sizeof(response));
113 if (len <= 0) {
114 ADD_FAILURE() << "Read " << len << " bytes";
115 read_fail++;
116 }
117
118 close(fd);
119 }
120
121 if (channel_fail > 0 || signal_fail > 0 || handshake_fail > 0 ||
122 read_fail > 0) {
123 ADD_FAILURE() << "Number of channel read fails: " << channel_fail << "\n"
124 << "Number of signal read fails: " << signal_fail << "\n"
125 << "Number of handshake send fails: " << handshake_fail
126 << "\n"
127 << "Number of read response fails: " << read_fail;
128 }
129 }
130
131 } // bttest
132