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.
72 lines
2.7 KiB
72 lines
2.7 KiB
4 months ago
|
# Copyright 2017 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.
|
||
|
|
||
|
def GetPadLength(block_size, length):
|
||
|
return (block_size - (length % block_size)) % block_size
|
||
|
|
||
|
|
||
|
def InjectParameterizedTest(cls, param_list, name_generator):
|
||
|
"""Injects parameterized tests into the provided class
|
||
|
|
||
|
This method searches for all tests that start with the name "ParamTest",
|
||
|
and injects a test method for each set of parameters in param_list. Names
|
||
|
are generated via the use of the name_generator.
|
||
|
|
||
|
Args:
|
||
|
cls: the class for which to inject all parameterized tests
|
||
|
param_list: a list of tuples, where each tuple is a combination of
|
||
|
of parameters to test (i.e. representing a single test case)
|
||
|
name_generator: A function that takes a combination of parameters and
|
||
|
returns a string that identifies the test case.
|
||
|
"""
|
||
|
param_test_names = [name for name in dir(cls) if name.startswith("ParamTest")]
|
||
|
|
||
|
# Force param_list to an actual list; otherwise itertools.Product will hit
|
||
|
# the end, resulting in only the first ParamTest* method actually being
|
||
|
# parameterized
|
||
|
param_list = list(param_list)
|
||
|
|
||
|
# Parameterize each test method starting with "ParamTest"
|
||
|
for test_name in param_test_names:
|
||
|
func = getattr(cls, test_name)
|
||
|
|
||
|
for params in param_list:
|
||
|
# Give the test method a readable, debuggable name.
|
||
|
param_string = name_generator(*params)
|
||
|
new_name = "%s_%s" % (func.__name__.replace("ParamTest", "test"),
|
||
|
param_string)
|
||
|
new_name = new_name.replace("(", "-").replace(")", "") # remove parens
|
||
|
|
||
|
# Inject the test method
|
||
|
setattr(cls, new_name, _GetTestClosure(func, params))
|
||
|
|
||
|
|
||
|
def _GetTestClosure(func, params):
|
||
|
""" Creates a no-argument test method for the given function and parameters.
|
||
|
|
||
|
This is required to be separate from the InjectParameterizedTest method, due
|
||
|
to some interesting scoping issues with internal function declarations. If
|
||
|
left in InjectParameterizedTest, all the tests end up using the same
|
||
|
instance of TestClosure
|
||
|
|
||
|
Args:
|
||
|
func: the function for which this test closure should run
|
||
|
params: the parameters for the run of this test function
|
||
|
"""
|
||
|
|
||
|
def TestClosure(self):
|
||
|
func(self, *params)
|
||
|
|
||
|
return TestClosure
|