Home | History | Annotate | Download | only in adb
      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.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.
     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:
     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 
     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 
     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 
     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 
     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 
    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 
    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 
    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 
    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 
    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