diff --git a/fastboot/Android.bp b/fastboot/Android.bp index 56cac88d3..f85d1dea4 100644 --- a/fastboot/Android.bp +++ b/fastboot/Android.bp @@ -446,3 +446,14 @@ cc_library_headers { host_supported: true, export_include_dirs: ["."], } + +python_test_host { + name: "fastboot_integration_test", + main: "test_fastboot.py", + srcs: ["test_fastboot.py"], + data: [":fastboot"], + test_config: "fastboot_integration_test.xml", + test_options: { + unit_test: false, + }, +} diff --git a/fastboot/fastboot_integration_test.xml b/fastboot/fastboot_integration_test.xml new file mode 100644 index 000000000..ad14caba1 --- /dev/null +++ b/fastboot/fastboot_integration_test.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/fastboot/test_fastboot.py b/fastboot/test_fastboot.py new file mode 100644 index 000000000..adcaec769 --- /dev/null +++ b/fastboot/test_fastboot.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2023 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""Tests for the fastboot command line utility. +""" + +import re +import subprocess +import unittest + + +class DevicesTest(unittest.TestCase): + """Tests for `fastboot devices`.""" + + + def test_devices(self): + """Ensure that the format of `fastboot devices` does not change. + + `fastboot devices` should alternate between a line containing the + device's serial number and fastboot state and an empty line + """ + output = subprocess.check_output(["fastboot", "devices"]) + + previous_line_was_empty = True + for line in output.decode().splitlines(): + if previous_line_was_empty: + if not re.match(r"[a-zA-Z\d]+\s+(bootloader|fastbootd)", line): + self.fail("%s does not match the expected format \\s+(bootloader|fastbootd)" % line) + previous_line_was_empty = False + else: + if line: + self.fail("Expected an empty line. Received '%s'" % line) + previous_line_was_empty = True + + if len(output) == 0: + self.fail("Output is empty. Are any devices connected?") + + +if __name__ == '__main__': + unittest.main()