121 lines
4.7 KiB
Python
121 lines
4.7 KiB
Python
# 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.
|
|
|
|
"""Utility functions for unit tests."""
|
|
|
|
# pylint: disable=line-too-long
|
|
|
|
import os
|
|
|
|
import constants
|
|
import unittest_constants as uc
|
|
|
|
def assert_strict_equal(test_class, first, second):
|
|
"""Check for strict equality and strict equality of nametuple elements.
|
|
|
|
assertEqual considers types equal to their subtypes, but we want to
|
|
not consider set() and frozenset() equal for testing.
|
|
"""
|
|
# Allow 2 lists with different order but the same content equal.
|
|
if isinstance(first, list) and isinstance(second, list):
|
|
first.sort()
|
|
second.sort()
|
|
test_class.assertEqual(first, second)
|
|
# allow byte and unicode string equality.
|
|
if not (isinstance(first, str) and
|
|
isinstance(second, str)):
|
|
test_class.assertIsInstance(first, type(second))
|
|
test_class.assertIsInstance(second, type(first))
|
|
# Recursively check elements of namedtuples for strict equals.
|
|
if isinstance(first, tuple) and hasattr(first, '_fields'):
|
|
# pylint: disable=invalid-name
|
|
for f in first._fields:
|
|
assert_strict_equal(test_class, getattr(first, f),
|
|
getattr(second, f))
|
|
|
|
def assert_equal_testinfos(test_class, test_info_a, test_info_b):
|
|
"""Check that the passed in TestInfos are equal."""
|
|
# Use unittest.assertEqual to do checks when None is involved.
|
|
if test_info_a is None or test_info_b is None:
|
|
test_class.assertEqual(test_info_a, test_info_b)
|
|
return
|
|
|
|
for attr in test_info_a.__dict__:
|
|
test_info_a_attr = getattr(test_info_a, attr)
|
|
test_info_b_attr = getattr(test_info_b, attr)
|
|
test_class.assertEqual(test_info_a_attr, test_info_b_attr,
|
|
msg=('TestInfo.%s mismatch: %s != %s' %
|
|
(attr, test_info_a_attr, test_info_b_attr)))
|
|
|
|
def assert_equal_testinfo_sets(test_class, test_info_set_a, test_info_set_b):
|
|
"""Check that the sets of TestInfos are equal."""
|
|
test_class.assertEqual(len(test_info_set_a), len(test_info_set_b),
|
|
msg=('mismatch # of TestInfos: %d != %d' %
|
|
(len(test_info_set_a), len(test_info_set_b))))
|
|
# Iterate over a set and pop them out as you compare them.
|
|
while test_info_set_a:
|
|
test_info_a = test_info_set_a.pop()
|
|
test_info_b_to_remove = None
|
|
for test_info_b in test_info_set_b:
|
|
try:
|
|
assert_equal_testinfos(test_class, test_info_a, test_info_b)
|
|
test_info_b_to_remove = test_info_b
|
|
break
|
|
except AssertionError:
|
|
pass
|
|
if test_info_b_to_remove:
|
|
test_info_set_b.remove(test_info_b_to_remove)
|
|
else:
|
|
# We haven't found a match, raise an assertion error.
|
|
raise AssertionError('No matching TestInfo (%s) in [%s]' %
|
|
(test_info_a, ';'.join([str(t) for t in test_info_set_b])))
|
|
|
|
# pylint: disable=too-many-return-statements
|
|
def isfile_side_effect(value):
|
|
"""Mock return values for os.path.isfile."""
|
|
if value == '/%s/%s' % (uc.CC_MODULE_DIR, constants.MODULE_CONFIG):
|
|
return True
|
|
if value == '/%s/%s' % (uc.MODULE_DIR, constants.MODULE_CONFIG):
|
|
return True
|
|
if value.endswith('.cc'):
|
|
return True
|
|
if value.endswith('.cpp'):
|
|
return True
|
|
if value.endswith('.java'):
|
|
return True
|
|
if value.endswith('.kt'):
|
|
return True
|
|
if value.endswith(uc.INT_NAME + '.xml'):
|
|
return True
|
|
if value.endswith(uc.GTF_INT_NAME + '.xml'):
|
|
return True
|
|
if value.endswith(
|
|
'/%s/%s' % (uc.ANDTEST_CONFIG_PATH, constants.MODULE_CONFIG)):
|
|
return True
|
|
if value.endswith(
|
|
'/%s/%s' % (uc.SINGLE_CONFIG_PATH, uc.SINGLE_CONFIG_NAME)):
|
|
return True
|
|
if value.endswith(
|
|
'/%s/%s' % (uc.MULTIPLE_CONFIG_PATH, uc.MAIN_CONFIG_NAME)):
|
|
return True
|
|
if value.endswith(
|
|
'/%s/%s' % (uc.MULTIPLE_CONFIG_PATH, uc.SUB_CONFIG_NAME_2)):
|
|
return True
|
|
return False
|
|
|
|
|
|
def realpath_side_effect(path):
|
|
"""Mock return values for os.path.realpath."""
|
|
return os.path.join(uc.ROOT, path)
|