18e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert#!/usr/bin/env python
28e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert#
38e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# Copyright (C) 2015 The Android Open Source Project
48e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert#
58e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# Licensed under the Apache License, Version 2.0 (the "License");
68e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# you may not use this file except in compliance with the License.
78e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# You may obtain a copy of the License at
88e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert#
98e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert#      http://www.apache.org/licenses/LICENSE-2.0
108e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert#
118e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# Unless required by applicable law or agreed to in writing, software
128e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# distributed under the License is distributed on an "AS IS" BASIS,
138e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# See the License for the specific language governing permissions and
158e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert# limitations under the License.
168e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert#
178e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert"""Tests for the adb program itself.
188e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
198e1fdd7806363af51d7bfa7134fcef66523bcc56Dan AlbertThis differs from things in test_device.py in that there is no API for these
208e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertthings. Most of these tests involve specific error messages or the help text.
218e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert"""
228e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertfrom __future__ import print_function
238e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
24351ecd15b29f0ce528ffac119640b9c01874562bSpencer Lowimport contextlib
251ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Lowimport os
268e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertimport random
27351ecd15b29f0ce528ffac119640b9c01874562bSpencer Lowimport socket
28351ecd15b29f0ce528ffac119640b9c01874562bSpencer Lowimport struct
298e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertimport subprocess
301ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Lowimport threading
318e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertimport unittest
328e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
338e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertimport adb
348e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
358e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
368e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertclass NonApiTest(unittest.TestCase):
378e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert    """Tests for ADB that aren't a part of the AndroidDevice API."""
388e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
398e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert    def test_help(self):
408e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        """Make sure we get _something_ out of help."""
418e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        out = subprocess.check_output(
428e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert            ['adb', 'help'], stderr=subprocess.STDOUT)
438e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        self.assertGreater(len(out), 0)
448e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
458e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert    def test_version(self):
468e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        """Get a version number out of the output of adb."""
478e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        lines = subprocess.check_output(['adb', 'version']).splitlines()
488e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        version_line = lines[0]
498e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        self.assertRegexpMatches(
508e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert            version_line, r'^Android Debug Bridge version \d+\.\d+\.\d+$')
518e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        if len(lines) == 2:
528e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert            # Newer versions of ADB have a second line of output for the
538e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert            # version that includes a specific revision (git SHA).
548e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert            revision_line = lines[1]
558e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert            self.assertRegexpMatches(
568e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert                revision_line, r'^Revision [0-9a-f]{12}-android$')
578e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
588e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert    def test_tcpip_error_messages(self):
598e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        p = subprocess.Popen(['adb', 'tcpip'], stdout=subprocess.PIPE,
608e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert                             stderr=subprocess.STDOUT)
618e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        out, _ = p.communicate()
628e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        self.assertEqual(1, p.returncode)
638e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        self.assertIn('help message', out)
648e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
658e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        p = subprocess.Popen(['adb', 'tcpip', 'foo'], stdout=subprocess.PIPE,
668e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert                             stderr=subprocess.STDOUT)
678e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        out, _ = p.communicate()
688e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        self.assertEqual(1, p.returncode)
698e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        self.assertIn('error', out)
708e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
711ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low    # Helper method that reads a pipe until it is closed, then sets the event.
721ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low    def _read_pipe_and_set_event(self, pipe, event):
731ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        x = pipe.read()
741ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        event.set()
751ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
761ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low    # Test that launch_server() does not let the adb server inherit
771ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low    # stdin/stdout/stderr handles which can cause callers of adb.exe to hang.
781ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low    # This test also runs fine on unix even though the impetus is an issue
791ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low    # unique to Windows.
801ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low    def test_handle_inheritance(self):
811ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # This test takes 5 seconds to run on Windows: if there is no adb server
821ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # running on the the port used below, adb kill-server tries to make a
831ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # TCP connection to a closed port and that takes 1 second on Windows;
841ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # adb start-server does the same TCP connection which takes another
851ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # second, and it waits 3 seconds after starting the server.
861ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
871ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # Start adb client with redirected stdin/stdout/stderr to check if it
881ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # passes those redirections to the adb server that it starts. To do
891ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # this, run an instance of the adb server on a non-default port so we
901ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # don't conflict with a pre-existing adb server that may already be
911ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # setup with adb TCP/emulator connections. If there is a pre-existing
921ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # adb server, this also tests whether multiple instances of the adb
931ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # server conflict on adb.log.
941ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
951ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        port = 5038
961ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        # Kill any existing server on this non-default port.
971ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        subprocess.check_output(['adb', '-P', str(port), 'kill-server'],
981ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                                stderr=subprocess.STDOUT)
991ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
1001ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        try:
1011ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # Run the adb client and have it start the adb server.
1021ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            p = subprocess.Popen(['adb', '-P', str(port), 'start-server'],
1031ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                                 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
1041ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                                 stderr=subprocess.PIPE)
1051ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
1061ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # Start threads that set events when stdout/stderr are closed.
1071ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            stdout_event = threading.Event()
1081ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            stdout_thread = threading.Thread(
1091ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                    target=self._read_pipe_and_set_event,
1101ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                    args=(p.stdout, stdout_event))
1111ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            stdout_thread.daemon = True
1121ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            stdout_thread.start()
1131ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
1141ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            stderr_event = threading.Event()
1151ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            stderr_thread = threading.Thread(
1161ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                    target=self._read_pipe_and_set_event,
1171ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                    args=(p.stderr, stderr_event))
1181ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            stderr_thread.daemon = True
1191ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            stderr_thread.start()
1201ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
1211ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # Wait for the adb client to finish. Once that has occurred, if
1221ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # stdin/stderr/stdout are still open, it must be open in the adb
1231ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # server.
1241ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            p.wait()
1251ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
1261ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # Try to write to stdin which we expect is closed. If it isn't
1271ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # closed, we should get an IOError. If we don't get an IOError,
1281ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # stdin must still be open in the adb server. The adb client is
1291ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # probably letting the adb server inherit stdin which would be
1301ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # wrong.
1311ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            with self.assertRaises(IOError):
1321ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                p.stdin.write('x')
1331ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low
1341ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # Wait a few seconds for stdout/stderr to be closed (in the success
1351ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # case, this won't wait at all). If there is a timeout, that means
1361ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # stdout/stderr were not closed and and they must be open in the adb
1371ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # server, suggesting that the adb client is letting the adb server
1381ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # inherit stdout/stderr which would be wrong.
1391ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            self.assertTrue(stdout_event.wait(5), "adb stdout not closed")
1401ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            self.assertTrue(stderr_event.wait(5), "adb stderr not closed")
1411ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low        finally:
1421ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            # If we started a server, kill it.
1431ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low            subprocess.check_output(['adb', '-P', str(port), 'kill-server'],
1441ce06087db2f7c7e39e30cdff6d307e38a24fc9eSpencer Low                                    stderr=subprocess.STDOUT)
1458e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
146351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low    # Use SO_LINGER to cause TCP RST segment to be sent on socket close.
147351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low    def _reset_socket_on_close(self, sock):
148351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        # The linger structure is two shorts on Windows, but two ints on Unix.
149351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        linger_format = 'hh' if os.name == 'nt' else 'ii'
150351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        l_onoff = 1
151351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        l_linger = 0
152351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
153351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
154351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                        struct.pack(linger_format, l_onoff, l_linger))
155351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        # Verify that we set the linger structure properly by retrieving it.
156351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        linger = sock.getsockopt(socket.SOL_SOCKET, socket.SO_LINGER, 16)
157351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        self.assertEqual((l_onoff, l_linger),
158351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                         struct.unpack_from(linger_format, linger))
159351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
160351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low    def test_emu_kill(self):
161351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        """Ensure that adb emu kill works.
162351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
163351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        Bug: https://code.google.com/p/android/issues/detail?id=21021
164351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        """
165351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        port = 12345
166351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
167351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low        with contextlib.closing(
168351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as listener:
169351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            # Use SO_REUSEADDR so subsequent runs of the test can grab the port
170351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            # even if it is in TIME_WAIT.
171351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
172351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            listener.bind(('127.0.0.1', port))
173351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            listener.listen(4)
174351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
175351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            # Now that listening has started, start adb emu kill, telling it to
176351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            # connect to our mock emulator.
177351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            p = subprocess.Popen(
178351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                ['adb', '-s', 'emulator-' + str(port), 'emu', 'kill'],
179351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                stderr=subprocess.STDOUT)
180351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
181351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            accepted_connection, addr = listener.accept()
182351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            with contextlib.closing(accepted_connection) as conn:
183351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                # If WSAECONNABORTED (10053) is raised by any socket calls,
184351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                # then adb probably isn't reading the data that we sent it.
185351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                conn.sendall('Android Console: type \'help\' for a list ' +
186351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                                'of commands\r\n')
187351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                conn.sendall('OK\r\n')
188351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
189351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                with contextlib.closing(conn.makefile()) as f:
190351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                    self.assertEqual('kill\n', f.readline())
191351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                    self.assertEqual('quit\n', f.readline())
192351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
193351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                conn.sendall('OK: killing emulator, bye bye\r\n')
194351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
195351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                # Use SO_LINGER to send TCP RST segment to test whether adb
196351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                # ignores WSAECONNRESET on Windows. This happens with the
197351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                # real emulator because it just calls exit() without closing
198351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                # the socket or calling shutdown(SD_SEND). At process
199351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                # termination, Windows sends a TCP RST segment for every
200351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                # open socket that shutdown(SD_SEND) wasn't used on.
201351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low                self._reset_socket_on_close(conn)
202351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
203351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            # Wait for adb to finish, so we can check return code.
204351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            p.communicate()
205351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
206351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            # If this fails, adb probably isn't ignoring WSAECONNRESET when
207351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            # reading the response from the adb emu kill command (on Windows).
208351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low            self.assertEqual(0, p.returncode)
209351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
21078cc20f00730c5f017550bec2e494523bc052c42Josh Gao    def test_connect_ipv4_ipv6(self):
21178cc20f00730c5f017550bec2e494523bc052c42Josh Gao        """Ensure that `adb connect localhost:1234` will try both IPv4 and IPv6.
21278cc20f00730c5f017550bec2e494523bc052c42Josh Gao
21378cc20f00730c5f017550bec2e494523bc052c42Josh Gao        Bug: http://b/30313466
21478cc20f00730c5f017550bec2e494523bc052c42Josh Gao        """
21578cc20f00730c5f017550bec2e494523bc052c42Josh Gao        ipv4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21678cc20f00730c5f017550bec2e494523bc052c42Josh Gao        ipv4.bind(('127.0.0.1', 0))
21778cc20f00730c5f017550bec2e494523bc052c42Josh Gao        ipv4.listen(1)
21878cc20f00730c5f017550bec2e494523bc052c42Josh Gao
21978cc20f00730c5f017550bec2e494523bc052c42Josh Gao        ipv6 = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
22078cc20f00730c5f017550bec2e494523bc052c42Josh Gao        ipv6.bind(('::1', ipv4.getsockname()[1] + 1))
22178cc20f00730c5f017550bec2e494523bc052c42Josh Gao        ipv6.listen(1)
22278cc20f00730c5f017550bec2e494523bc052c42Josh Gao
22378cc20f00730c5f017550bec2e494523bc052c42Josh Gao        for s in (ipv4, ipv6):
22478cc20f00730c5f017550bec2e494523bc052c42Josh Gao            port = s.getsockname()[1]
22578cc20f00730c5f017550bec2e494523bc052c42Josh Gao            output = subprocess.check_output(
22678cc20f00730c5f017550bec2e494523bc052c42Josh Gao                ['adb', 'connect', 'localhost:{}'.format(port)])
22778cc20f00730c5f017550bec2e494523bc052c42Josh Gao
22878cc20f00730c5f017550bec2e494523bc052c42Josh Gao            self.assertEqual(
22978cc20f00730c5f017550bec2e494523bc052c42Josh Gao                output.strip(), 'connected to localhost:{}'.format(port))
23078cc20f00730c5f017550bec2e494523bc052c42Josh Gao            s.close()
23178cc20f00730c5f017550bec2e494523bc052c42Josh Gao
232351ecd15b29f0ce528ffac119640b9c01874562bSpencer Low
2338e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertdef main():
2348e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert    random.seed(0)
2358e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert    if len(adb.get_devices()) > 0:
2368e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        suite = unittest.TestLoader().loadTestsFromName(__name__)
2378e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        unittest.TextTestRunner(verbosity=3).run(suite)
2388e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert    else:
2398e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert        print('Test suite must be run with attached devices')
2408e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
2418e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert
2428e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albertif __name__ == '__main__':
2438e1fdd7806363af51d7bfa7134fcef66523bcc56Dan Albert    main()
244