1 /*
2 * Copyright (C) 2016 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 "adb_listeners.h"
18
19 #include <gtest/gtest.h>
20
21 #include <android-base/stringprintf.h>
22 #include <android-base/strings.h>
23
24 #include "fdevent/fdevent.h"
25 #include "sysdeps.h"
26 #include "transport.h"
27
28 // Returns true if the given listener is present in format_listeners(). Empty parameters will
29 // be ignored.
listener_is_installed(const std::string & serial,const std::string & source,const std::string & dest)30 static bool listener_is_installed(const std::string& serial, const std::string& source,
31 const std::string& dest) {
32 // format_listeners() gives lines of "<serial> <source> <dest>\n".
33 for (const std::string& line : android::base::Split(format_listeners(), "\n")) {
34 std::vector<std::string> info = android::base::Split(line, " ");
35 if (info.size() == 3 &&
36 (serial.empty() || info[0] == serial) &&
37 (source.empty() || info[1] == source) &&
38 (dest.empty() || info[2] == dest)) {
39 return true;
40 }
41 }
42
43 return false;
44 }
45
46 class AdbListenersTest : public ::testing::Test {
47 public:
SetUp()48 void SetUp() override {
49 // We don't need an fdevent loop, but adding/removing listeners must be done from the
50 // fdevent thread if one exists. Since previously run tests may have created an fdevent
51 // thread, we need to reset to prevent the thread check.
52 fdevent_reset();
53 }
54
TearDown()55 void TearDown() override {
56 // Clean up any listeners that may have been installed.
57 remove_all_listeners();
58
59 // Make sure we didn't leave any dangling events.
60 ASSERT_EQ(0u, fdevent_installed_count());
61 }
62
63 protected:
64 atransport transport_;
65 };
66
TEST_F(AdbListenersTest,test_install_listener)67 TEST_F(AdbListenersTest, test_install_listener) {
68 std::string error;
69
70 ASSERT_EQ(INSTALL_STATUS_OK,
71 install_listener("tcp:9000", "tcp:9000", &transport_, false, nullptr, &error));
72 ASSERT_TRUE(error.empty());
73
74 ASSERT_TRUE(listener_is_installed("", "tcp:9000", "tcp:9000"));
75 }
76
TEST_F(AdbListenersTest,test_install_listener_rebind)77 TEST_F(AdbListenersTest, test_install_listener_rebind) {
78 std::string error;
79
80 ASSERT_EQ(INSTALL_STATUS_OK,
81 install_listener("tcp:9000", "tcp:9000", &transport_, false, nullptr, &error));
82 ASSERT_TRUE(error.empty());
83
84 ASSERT_EQ(INSTALL_STATUS_OK,
85 install_listener("tcp:9000", "tcp:9001", &transport_, false, nullptr, &error));
86 ASSERT_TRUE(error.empty());
87
88 ASSERT_TRUE(listener_is_installed("", "tcp:9000", "tcp:9001"));
89 }
90
TEST_F(AdbListenersTest,test_install_listener_no_rebind)91 TEST_F(AdbListenersTest, test_install_listener_no_rebind) {
92 std::string error;
93
94 ASSERT_EQ(INSTALL_STATUS_OK,
95 install_listener("tcp:9000", "tcp:9000", &transport_, true, nullptr, &error));
96 ASSERT_TRUE(error.empty());
97
98 ASSERT_EQ(INSTALL_STATUS_CANNOT_REBIND,
99 install_listener("tcp:9000", "tcp:9001", &transport_, true, nullptr, &error));
100 ASSERT_FALSE(error.empty());
101
102 ASSERT_TRUE(listener_is_installed("", "tcp:9000", "tcp:9000"));
103 }
104
TEST_F(AdbListenersTest,test_install_listener_tcp_port_0)105 TEST_F(AdbListenersTest, test_install_listener_tcp_port_0) {
106 int port = 0;
107 std::string error;
108
109 ASSERT_EQ(INSTALL_STATUS_OK,
110 install_listener("tcp:0", "tcp:9000", &transport_, true, &port, &error));
111 ASSERT_TRUE(error.empty());
112
113 ASSERT_TRUE(listener_is_installed("", android::base::StringPrintf("tcp:%d", port), "tcp:9000"));
114 }
115
TEST_F(AdbListenersTest,test_remove_listener)116 TEST_F(AdbListenersTest, test_remove_listener) {
117 std::string error;
118
119 ASSERT_EQ(INSTALL_STATUS_OK,
120 install_listener("tcp:9000", "tcp:9000", &transport_, false, nullptr, &error));
121 ASSERT_TRUE(error.empty());
122
123 ASSERT_EQ(INSTALL_STATUS_OK, remove_listener("tcp:9000", &transport_));
124 ASSERT_TRUE(format_listeners().empty());
125 }
126
TEST_F(AdbListenersTest,test_remove_nonexistent_listener)127 TEST_F(AdbListenersTest, test_remove_nonexistent_listener) {
128 std::string error;
129
130 ASSERT_EQ(INSTALL_STATUS_OK,
131 install_listener("tcp:9000", "tcp:9000", &transport_, false, nullptr, &error));
132 ASSERT_TRUE(error.empty());
133
134 ASSERT_EQ(INSTALL_STATUS_LISTENER_NOT_FOUND, remove_listener("tcp:1", &transport_));
135 ASSERT_TRUE(listener_is_installed("", "tcp:9000", "tcp:9000"));
136 }
137
TEST_F(AdbListenersTest,test_remove_all_listeners)138 TEST_F(AdbListenersTest, test_remove_all_listeners) {
139 std::string error;
140
141 ASSERT_EQ(INSTALL_STATUS_OK,
142 install_listener("tcp:9000", "tcp:9000", &transport_, false, nullptr, &error));
143 ASSERT_TRUE(error.empty());
144
145 ASSERT_EQ(INSTALL_STATUS_OK,
146 install_listener("tcp:9001", "tcp:9001", &transport_, false, nullptr, &error));
147 ASSERT_TRUE(error.empty());
148
149 remove_all_listeners();
150 ASSERT_TRUE(format_listeners().empty());
151 }
152
TEST_F(AdbListenersTest,test_transport_disconnect)153 TEST_F(AdbListenersTest, test_transport_disconnect) {
154 std::string error;
155
156 ASSERT_EQ(INSTALL_STATUS_OK,
157 install_listener("tcp:9000", "tcp:9000", &transport_, false, nullptr, &error));
158 ASSERT_TRUE(error.empty());
159
160 ASSERT_EQ(INSTALL_STATUS_OK,
161 install_listener("tcp:9001", "tcp:9001", &transport_, false, nullptr, &error));
162 ASSERT_TRUE(error.empty());
163
164 transport_.RunDisconnects();
165 ASSERT_TRUE(format_listeners().empty());
166 }
167