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.
79 lines
2.8 KiB
79 lines
2.8 KiB
#!/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)
|