#!/usr/bin/env python3 # # Copyright 2019 - 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. import functools import inspect from mobly import asserts from acts.test_decorators import test_info def _fail_decorator(msg): def fail_decorator(func): @functools.wraps(func) def fail(*args, **kwargs): asserts.fail(msg) return fail return fail_decorator def metadata(_do_not_use=None, pts_test_id=None, pts_test_name=None): """ Record a piece of test metadata in the Extra section of the test Record in the test summary file. The metadata will come with a timestamp, but there is no guarantee on the order of when the metadata will be written Note: - Metadata is recorded per test case as key-value pairs. - Metadata is only guaranteed to be written when the test result is PASS, FAIL or SKIPPED. When there are test infrastructural errors, metadata might not be written successfully :param _do_not_use: a positional argument with default value. This argument is to ensure that @metadata(key=value) is used in a functional form instead of @metadata or @metadata(a) :param pts_test_id: A fully qualified PTS test ID such as L2CAP/COS/IEX/BV-01-C :param pts_test_name: A human readable test name such as "Request Connection" for the above example :return: decorated test case function object """ if _do_not_use is not None: def fail(*args, **kwargs): asserts.fail("@metadata must be used in functional form such " "as @metadta(key=value)") return fail # Create a dictionary of optional parameters values = locals() args = {arg: values[arg] for arg in inspect.getfullargspec(metadata).args} del args["_do_not_use"] # Check if at least one optional parameter is valid if not any(args.values()): return _fail_decorator("at least one optional argument should be valid") # Validate pts_test_id and pts_test_name if any((pts_test_id, pts_test_name)) and \ not all((pts_test_id, pts_test_name)): return _fail_decorator("pts_test_id and pts_test_name must both " "be valid if one of them is valid") return test_info(**args)