You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Lint as: python3
#
# Copyright 2020, 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.
"""CSuite-specific automated unit test functionality."""
import argparse
import sys
from typing import Any, Sequence, Text
import unittest
# Export the TestCase class to reduce the number of imports tests have to list.
TestCase = unittest.TestCase
_DEVICE_SERIAL = None
def get_device_serial() -> Text:
"""Returns the serial of the connected device."""
if not _DEVICE_SERIAL:
raise RuntimeError(
'Device serial is unset, did you call main in your test?')
return _DEVICE_SERIAL
def create_arg_parser(add_help: bool = False) -> argparse.ArgumentParser:
"""Creates a new parser that can handle the default command-line flags.
The object returned by this function can be used by other modules that want to
add their own command-line flags. The returned parser is intended to be passed
to the 'parents' argument of ArgumentParser and extend the set of default
flags with additional ones.
Args:
add_help: whether to add an option which simply displays the parsers help
message; this is typically false when used from other modules that want to
use the returned parser as a parent argument parser.
Returns:
A new arg parser that can handle the default flags expected by this module.
"""
# The below flags are passed in by the TF Python test runner.
parser = argparse.ArgumentParser(add_help=add_help)
parser.add_argument('-s', '--serial', help='the device serial')
parser.add_argument(
'--test-output-file',
help='the file in which to store the test results',
required=True)
return parser
def run_tests(args: Any, unittest_argv: Sequence[Text]) -> None:
"""Executes a set of Python unit tests.
This function is typically used by modules that extend command-line flags.
Callers create their own argument parser with this module's parser as a parent
and parse the command-line. The resulting object is will contain the
attributes expected by this module and is used to call this method.
Args:
args: an object that contains at least the set of attributes defined in
objects returned when using the default argument parser.
unittest_argv: the list of command-line arguments to forward to
unittest.main.
"""
global _DEVICE_SERIAL
_DEVICE_SERIAL = args.serial
with open(args.test_output_file, 'w') as test_output_file:
# Note that we use a type and not an instance for 'testRunner' since
# TestProgram forwards its constructor arguments when creating an instance
# of the runner type. Not doing so would require us to make sure that the
# parameters passed to TestProgram are aligned with those for creating a
# runner instance.
class TestRunner(unittest.TextTestRunner):
"""A test runner that writes test results to the TF-provided file."""
def __init__(self, *args, **kwargs):
super(TestRunner, self).__init__(
stream=test_output_file, *args, **kwargs)
# Setting verbosity is required to generate output that the TradeFed test
# runner can parse.
unittest.TestProgram(verbosity=3, testRunner=TestRunner, argv=unittest_argv)
def main():
"""Executes a set of Python unit tests."""
args, unittest_argv = create_arg_parser(add_help=True).parse_known_args(
sys.argv)
run_tests(args, unittest_argv)