1 /*
2  * Copyright 2024 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 "stack/include/port_api.h"
20 #include "stack/rfcomm/rfc_int.h"
21 #include "types/raw_address.h"
22 
23 namespace {
24 const RawAddress kRawAddress = RawAddress({0x11, 0x22, 0x33, 0x44, 0x55, 0x66});
25 const RawAddress kRawAddress2 = RawAddress({0x01, 0x02, 0x03, 0x04, 0x05, 0x06});
26 }  // namespace
27 
28 class StackRfcommPortTest : public ::testing::Test {
29 protected:
SetUp()30   void SetUp() override {}
TearDown()31   void TearDown() override {}
32 
33 private:
34 };
35 
TEST_F(StackRfcommPortTest,PORT_IsOpening__basic)36 TEST_F(StackRfcommPortTest, PORT_IsOpening__basic) {
37   RawAddress bd_addr(kRawAddress);
38 
39   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_IDLE;
40   ASSERT_FALSE(PORT_IsOpening(&bd_addr));
41   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_WAIT_CONN_CNF;
42   ASSERT_TRUE(PORT_IsOpening(&bd_addr));
43   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_CONFIGURE;
44   ASSERT_TRUE(PORT_IsOpening(&bd_addr));
45   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_SABME_WAIT_UA;
46   ASSERT_TRUE(PORT_IsOpening(&bd_addr));
47   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_WAIT_SABME;
48   ASSERT_TRUE(PORT_IsOpening(&bd_addr));
49   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_CONNECTED;
50   rfc_cb.port.port[0].rfc.p_mcb = &rfc_cb.port.rfc_mcb[0];
51   rfc_cb.port.port[0].rfc.state = RFC_STATE_OPENED;
52   ASSERT_FALSE(PORT_IsOpening(&bd_addr));
53   rfc_cb.port.port[0].rfc.state = RFC_STATE_TERM_WAIT_SEC_CHECK;
54   ASSERT_TRUE(PORT_IsOpening(&bd_addr));
55   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_DISC_WAIT_UA;
56   ASSERT_FALSE(PORT_IsOpening(&bd_addr));
57 }
58 
TEST_F(StackRfcommPortTest,PORT_IsCollisionDetected__basic)59 TEST_F(StackRfcommPortTest, PORT_IsCollisionDetected__basic) {
60   RawAddress test_bd_addr(kRawAddress);
61   RawAddress different_bd_addr(kRawAddress2);
62 
63   rfc_cb.port.rfc_mcb[0].bd_addr = test_bd_addr;
64   // no collisions will happen if the bd_addr don't match, regardless of state
65   for (int state_int = RFC_MX_STATE_IDLE; state_int <= RFC_MX_STATE_DISC_WAIT_UA; state_int++) {
66     rfc_cb.port.rfc_mcb[0].state = tRFC_MX_STATE(state_int);
67     ASSERT_FALSE(PORT_IsCollisionDetected(different_bd_addr));
68   }
69 
70   rfc_cb.port.rfc_mcb[0].is_initiator = false;
71   // no collisions will happen if not initiator, regardless of state
72   for (int state_int = RFC_MX_STATE_IDLE; state_int <= RFC_MX_STATE_DISC_WAIT_UA; state_int++) {
73     rfc_cb.port.rfc_mcb[0].state = tRFC_MX_STATE(state_int);
74     ASSERT_FALSE(PORT_IsCollisionDetected(test_bd_addr));
75   }
76 
77   // possible collisions if bd_addr match and is initiator
78   rfc_cb.port.rfc_mcb[0].is_initiator = true;
79 
80   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_IDLE;
81   ASSERT_FALSE(PORT_IsCollisionDetected(test_bd_addr));
82   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_WAIT_CONN_CNF;
83   ASSERT_TRUE(PORT_IsCollisionDetected(test_bd_addr));
84   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_CONFIGURE;
85   ASSERT_TRUE(PORT_IsCollisionDetected(test_bd_addr));
86   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_SABME_WAIT_UA;
87   ASSERT_TRUE(PORT_IsCollisionDetected(test_bd_addr));
88   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_WAIT_SABME;
89   ASSERT_TRUE(PORT_IsCollisionDetected(test_bd_addr));
90   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_CONNECTED;
91 
92   rfc_cb.port.port[0].rfc.p_mcb = &rfc_cb.port.rfc_mcb[0];
93   rfc_cb.port.port[0].rfc.state = RFC_STATE_OPENED;
94   ASSERT_FALSE(PORT_IsCollisionDetected(test_bd_addr));
95   rfc_cb.port.port[0].rfc.state = RFC_STATE_TERM_WAIT_SEC_CHECK;
96   ASSERT_TRUE(PORT_IsCollisionDetected(test_bd_addr));
97   rfc_cb.port.rfc_mcb[0].state = RFC_MX_STATE_DISC_WAIT_UA;
98   ASSERT_FALSE(PORT_IsCollisionDetected(test_bd_addr));
99 }
100