transport_test.cpp revision d2b588e23901538f4b459a71fefdac6fc2748f7e
1055f1aa4ff58ba71133d506b202ad46612758dedDan Albert/*
2055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * Copyright (C) 2015 The Android Open Source Project
3055f1aa4ff58ba71133d506b202ad46612758dedDan Albert *
4055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * Licensed under the Apache License, Version 2.0 (the "License");
5055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * you may not use this file except in compliance with the License.
6055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * You may obtain a copy of the License at
7055f1aa4ff58ba71133d506b202ad46612758dedDan Albert *
8055f1aa4ff58ba71133d506b202ad46612758dedDan Albert *      http://www.apache.org/licenses/LICENSE-2.0
9055f1aa4ff58ba71133d506b202ad46612758dedDan Albert *
10055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * Unless required by applicable law or agreed to in writing, software
11055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * distributed under the License is distributed on an "AS IS" BASIS,
12055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * See the License for the specific language governing permissions and
14055f1aa4ff58ba71133d506b202ad46612758dedDan Albert * limitations under the License.
15055f1aa4ff58ba71133d506b202ad46612758dedDan Albert */
16055f1aa4ff58ba71133d506b202ad46612758dedDan Albert
17055f1aa4ff58ba71133d506b202ad46612758dedDan Albert#include "transport.h"
18055f1aa4ff58ba71133d506b202ad46612758dedDan Albert
19055f1aa4ff58ba71133d506b202ad46612758dedDan Albert#include <gtest/gtest.h>
20055f1aa4ff58ba71133d506b202ad46612758dedDan Albert
21055f1aa4ff58ba71133d506b202ad46612758dedDan Albert#include "adb.h"
22055f1aa4ff58ba71133d506b202ad46612758dedDan Albert
23c7915a3470292349017f94ca066ed515babfcc23Dan Albertclass TestTransport : public atransport {
24c7915a3470292349017f94ca066ed515babfcc23Dan Albertpublic:
25c7915a3470292349017f94ca066ed515babfcc23Dan Albert    bool operator==(const atransport& rhs) const {
26c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(read_from_remote, rhs.read_from_remote);
27c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(write_to_remote, rhs.write_to_remote);
28c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(close, rhs.close);
29c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(kick, rhs.kick);
30c7915a3470292349017f94ca066ed515babfcc23Dan Albert
31c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(fd, rhs.fd);
32c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(transport_socket, rhs.transport_socket);
33c7915a3470292349017f94ca066ed515babfcc23Dan Albert
34c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(
35c7915a3470292349017f94ca066ed515babfcc23Dan Albert            0, memcmp(&transport_fde, &rhs.transport_fde, sizeof(fdevent)));
36c7915a3470292349017f94ca066ed515babfcc23Dan Albert
37c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(ref_count, rhs.ref_count);
38c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(sync_token, rhs.sync_token);
39c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(connection_state, rhs.connection_state);
40c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(online, rhs.online);
41c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(type, rhs.type);
42c7915a3470292349017f94ca066ed515babfcc23Dan Albert
43c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(usb, rhs.usb);
44c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(sfd, rhs.sfd);
45c7915a3470292349017f94ca066ed515babfcc23Dan Albert
46c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(serial, rhs.serial);
47c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(product, rhs.product);
48c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(model, rhs.model);
49c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(device, rhs.device);
50c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(devpath, rhs.devpath);
51c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(adb_port, rhs.adb_port);
52c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(kicked, rhs.kicked);
53c7915a3470292349017f94ca066ed515babfcc23Dan Albert
54c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(key, rhs.key);
55c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(0, memcmp(token, rhs.token, TOKEN_SIZE));
56c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(0, memcmp(&auth_fde, &rhs.auth_fde, sizeof(fdevent)));
57c7915a3470292349017f94ca066ed515babfcc23Dan Albert        EXPECT_EQ(failed_auth_attempts, rhs.failed_auth_attempts);
58c7915a3470292349017f94ca066ed515babfcc23Dan Albert
591792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert        EXPECT_EQ(features(), rhs.features());
601792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
61c7915a3470292349017f94ca066ed515babfcc23Dan Albert        return true;
62c7915a3470292349017f94ca066ed515babfcc23Dan Albert    }
63c7915a3470292349017f94ca066ed515babfcc23Dan Albert};
64c7915a3470292349017f94ca066ed515babfcc23Dan Albert
65cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Lowclass TransportSetup {
66cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Lowpublic:
67cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low  TransportSetup() {
68cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low#ifdef _WIN32
69cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low    // Use extern instead of including sysdeps.h which brings in various macros
70cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low    // that conflict with APIs used in this file.
71cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low    extern void adb_sysdeps_init(void);
72cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low    adb_sysdeps_init();
73cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low#else
74cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low    // adb_sysdeps_init() is an inline function that we cannot link against.
75cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low#endif
76cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low  }
77cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low};
78cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low
79cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low// Static initializer will call adb_sysdeps_init() before main() to initialize
80cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low// the transport mutex before it is used in the tests. Alternatives would be to
81cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low// use __attribute__((constructor)) here or to use that or a static initializer
82cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low// for adb_sysdeps_init() itself in sysdeps_win32.cpp (caveats of unclear
83cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low// init order), or to use a test fixture whose SetUp() could do the init once.
84cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Lowstatic TransportSetup g_TransportSetup;
85cf168a82e99e97e3ad95e37b7065f6b8e7f7390bSpencer Low
86055f1aa4ff58ba71133d506b202ad46612758dedDan AlbertTEST(transport, kick_transport) {
87c7915a3470292349017f94ca066ed515babfcc23Dan Albert  TestTransport t;
88c7915a3470292349017f94ca066ed515babfcc23Dan Albert
89055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  // Mutate some member so we can test that the function is run.
90055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  t.kick = [](atransport* trans) { trans->fd = 42; };
91c7915a3470292349017f94ca066ed515babfcc23Dan Albert
92c7915a3470292349017f94ca066ed515babfcc23Dan Albert  TestTransport expected;
93c7915a3470292349017f94ca066ed515babfcc23Dan Albert  expected.kick = t.kick;
94055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  expected.fd = 42;
95055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  expected.kicked = 1;
96c7915a3470292349017f94ca066ed515babfcc23Dan Albert
97055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  kick_transport(&t);
98055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  ASSERT_EQ(42, t.fd);
99055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  ASSERT_EQ(1, t.kicked);
100c7915a3470292349017f94ca066ed515babfcc23Dan Albert  ASSERT_EQ(expected, t);
101055f1aa4ff58ba71133d506b202ad46612758dedDan Albert}
102055f1aa4ff58ba71133d506b202ad46612758dedDan Albert
103055f1aa4ff58ba71133d506b202ad46612758dedDan AlbertTEST(transport, kick_transport_already_kicked) {
104055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  // Ensure that the transport is not modified if the transport has already been
105055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  // kicked.
106c7915a3470292349017f94ca066ed515babfcc23Dan Albert  TestTransport t;
107055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  t.kicked = 1;
108055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  t.kick = [](atransport*) { FAIL() << "Kick should not have been called"; };
109c7915a3470292349017f94ca066ed515babfcc23Dan Albert
110c7915a3470292349017f94ca066ed515babfcc23Dan Albert  TestTransport expected;
111c7915a3470292349017f94ca066ed515babfcc23Dan Albert  expected.kicked = 1;
112c7915a3470292349017f94ca066ed515babfcc23Dan Albert  expected.kick = t.kick;
113c7915a3470292349017f94ca066ed515babfcc23Dan Albert
114055f1aa4ff58ba71133d506b202ad46612758dedDan Albert  kick_transport(&t);
115c7915a3470292349017f94ca066ed515babfcc23Dan Albert  ASSERT_EQ(expected, t);
116055f1aa4ff58ba71133d506b202ad46612758dedDan Albert}
117055f1aa4ff58ba71133d506b202ad46612758dedDan Albert
118b329824e6c5373ae303269dca285d835ce57e514Yabin Cuistatic void DisconnectFunc(void* arg, atransport*) {
119b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    int* count = reinterpret_cast<int*>(arg);
120b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    ++*count;
121b329824e6c5373ae303269dca285d835ce57e514Yabin Cui}
122b329824e6c5373ae303269dca285d835ce57e514Yabin Cui
123b329824e6c5373ae303269dca285d835ce57e514Yabin CuiTEST(transport, RunDisconnects) {
1241792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    atransport t;
125b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    // RunDisconnects() can be called with an empty atransport.
126b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    t.RunDisconnects();
127b329824e6c5373ae303269dca285d835ce57e514Yabin Cui
128b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    int count = 0;
129b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    adisconnect disconnect;
130b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    disconnect.func = DisconnectFunc;
131b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    disconnect.opaque = &count;
132b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    t.AddDisconnect(&disconnect);
133b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    t.RunDisconnects();
134b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    ASSERT_EQ(1, count);
135b329824e6c5373ae303269dca285d835ce57e514Yabin Cui
136b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    // disconnect should have been removed automatically.
137b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    t.RunDisconnects();
138b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    ASSERT_EQ(1, count);
139b329824e6c5373ae303269dca285d835ce57e514Yabin Cui
140b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    count = 0;
141b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    t.AddDisconnect(&disconnect);
142b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    t.RemoveDisconnect(&disconnect);
143b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    t.RunDisconnects();
144b329824e6c5373ae303269dca285d835ce57e514Yabin Cui    ASSERT_EQ(0, count);
1451792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert}
1461792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1474e2fd36bc8c16147cab323b0418a7666812d3bc7David PursellTEST(transport, SetFeatures) {
1481792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    atransport t;
1491792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(0U, t.features().size());
1501792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1514e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell    t.SetFeatures(FeatureSetToString(FeatureSet{"foo"}));
1521792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(1U, t.features().size());
1531792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_TRUE(t.has_feature("foo"));
1541792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1554e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell    t.SetFeatures(FeatureSetToString(FeatureSet{"foo", "bar"}));
1561792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(2U, t.features().size());
1571792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_TRUE(t.has_feature("foo"));
1581792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_TRUE(t.has_feature("bar"));
1591792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1604e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell    t.SetFeatures(FeatureSetToString(FeatureSet{"foo", "bar", "foo"}));
1611792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(2U, t.features().size());
1621792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_TRUE(t.has_feature("foo"));
1631792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_TRUE(t.has_feature("bar"));
1644e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell
1654e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell    t.SetFeatures(FeatureSetToString(FeatureSet{"bar", "baz"}));
1664e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell    ASSERT_EQ(2U, t.features().size());
1674e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell    ASSERT_FALSE(t.has_feature("foo"));
1684e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell    ASSERT_TRUE(t.has_feature("bar"));
1694e2fd36bc8c16147cab323b0418a7666812d3bc7David Pursell    ASSERT_TRUE(t.has_feature("baz"));
170d2b588e23901538f4b459a71fefdac6fc2748f7eDavid Pursell
171d2b588e23901538f4b459a71fefdac6fc2748f7eDavid Pursell    t.SetFeatures("");
172d2b588e23901538f4b459a71fefdac6fc2748f7eDavid Pursell    ASSERT_EQ(0U, t.features().size());
1731792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert}
1741792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1751792c23cb892ab58590b2cdfce0d0ece30c21787Dan AlbertTEST(transport, parse_banner_no_features) {
1761792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    atransport t;
1771792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1781792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    parse_banner("host::", &t);
1791792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1801792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(0U, t.features().size());
1811792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(kCsHost, t.connection_state);
1821792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1831792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(nullptr, t.product);
1841792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(nullptr, t.model);
1851792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(nullptr, t.device);
1861792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert}
1871792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1881792c23cb892ab58590b2cdfce0d0ece30c21787Dan AlbertTEST(transport, parse_banner_product_features) {
1891792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    atransport t;
1901792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1911792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    const char banner[] =
1921792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert        "host::ro.product.name=foo;ro.product.model=bar;ro.product.device=baz;";
1931792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    parse_banner(banner, &t);
1941792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1951792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(kCsHost, t.connection_state);
1961792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1971792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(0U, t.features().size());
1981792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
1991792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(std::string("foo"), t.product);
2001792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(std::string("bar"), t.model);
2011792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(std::string("baz"), t.device);
2021792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert}
2031792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
2041792c23cb892ab58590b2cdfce0d0ece30c21787Dan AlbertTEST(transport, parse_banner_features) {
2051792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    atransport t;
2061792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
2071792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    const char banner[] =
2081792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert        "host::ro.product.name=foo;ro.product.model=bar;ro.product.device=baz;"
2091792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert        "features=woodly,doodly";
2101792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    parse_banner(banner, &t);
2111792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
2121792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(kCsHost, t.connection_state);
2131792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
2141792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(2U, t.features().size());
2151792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_TRUE(t.has_feature("woodly"));
2161792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_TRUE(t.has_feature("doodly"));
2171792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert
2181792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(std::string("foo"), t.product);
2191792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(std::string("bar"), t.model);
2201792c23cb892ab58590b2cdfce0d0ece30c21787Dan Albert    ASSERT_EQ(std::string("baz"), t.device);
221055f1aa4ff58ba71133d506b202ad46612758dedDan Albert}
222