blob: aa1bc9a8bfae8a2e8080bf3c73f160caec15fa5f [file] [log] [blame]
#!/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 blueberry.tests.gd.cert.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)