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