• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2017, The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""Utility functions for unit tests."""
16
17# pylint: disable=line-too-long
18
19import os
20
21from atest import constants
22from atest import unittest_constants as uc
23
24def assert_strict_equal(test_class, first, second):
25    """Check for strict equality and strict equality of nametuple elements.
26
27    assertEqual considers types equal to their subtypes, but we want to
28    not consider set() and frozenset() equal for testing.
29    """
30    # Allow 2 lists with different order but the same content equal.
31    if isinstance(first, list) and isinstance(second, list):
32        first.sort()
33        second.sort()
34    test_class.assertEqual(first, second)
35    # allow byte and unicode string equality.
36    if not (isinstance(first, str) and
37            isinstance(second, str)):
38        test_class.assertIsInstance(first, type(second))
39        test_class.assertIsInstance(second, type(first))
40    # Recursively check elements of namedtuples for strict equals.
41    if isinstance(first, tuple) and hasattr(first, '_fields'):
42        # pylint: disable=invalid-name
43        for f in first._fields:
44            assert_strict_equal(test_class, getattr(first, f),
45                                getattr(second, f))
46
47def assert_equal_testinfos(test_class, test_info_a, test_info_b):
48    """Check that the passed in TestInfos are equal."""
49    # Use unittest.assertEqual to do checks when None is involved.
50    if test_info_a is None or test_info_b is None:
51        test_class.assertEqual(test_info_a, test_info_b)
52        return
53
54    for attr in test_info_a.__dict__:
55        test_info_a_attr = getattr(test_info_a, attr)
56        test_info_b_attr = getattr(test_info_b, attr)
57        test_class.assertEqual(test_info_a_attr, test_info_b_attr,
58                               msg=('TestInfo.%s mismatch: %s != %s' %
59                                    (attr, test_info_a_attr, test_info_b_attr)))
60
61def assert_equal_testinfo_sets(test_class, test_info_set_a, test_info_set_b):
62    """Check that the sets of TestInfos are equal."""
63    test_class.assertEqual(len(test_info_set_a), len(test_info_set_b),
64                           msg=('mismatch # of TestInfos: %d != %d' %
65                                (len(test_info_set_a), len(test_info_set_b))))
66    # Iterate over a set and pop them out as you compare them.
67    while test_info_set_a:
68        test_info_a = test_info_set_a.pop()
69        test_info_b_to_remove = None
70        for test_info_b in test_info_set_b:
71            try:
72                assert_equal_testinfos(test_class, test_info_a, test_info_b)
73                test_info_b_to_remove = test_info_b
74                break
75            except AssertionError:
76                pass
77        if test_info_b_to_remove:
78            test_info_set_b.remove(test_info_b_to_remove)
79        else:
80            # We haven't found a match, raise an assertion error.
81            raise AssertionError('No matching TestInfo (%s) in [%s]' %
82                                 (test_info_a, ';'.join([str(t) for t in test_info_set_b])))
83
84# pylint: disable=too-many-return-statements
85def isfile_side_effect(value):
86    """Mock return values for os.path.isfile."""
87    value = str(value)
88    if value == '/%s/%s' % (uc.CC_MODULE_DIR, constants.MODULE_CONFIG):
89        return True
90    if value == '/%s/%s' % (uc.MODULE_DIR, constants.MODULE_CONFIG):
91        return True
92    if value.endswith('.cc'):
93        return True
94    if value.endswith('.cpp'):
95        return True
96    if value.endswith('.java'):
97        return True
98    if value.endswith('.kt'):
99        return True
100    if value.endswith(uc.INT_NAME + '.xml'):
101        return True
102    if value.endswith(uc.GTF_INT_NAME + '.xml'):
103        return True
104    if value.endswith(
105        '/%s/%s' % (uc.ANDTEST_CONFIG_PATH, constants.MODULE_CONFIG)):
106        return True
107    if value.endswith(
108        '/%s/%s' % (uc.SINGLE_CONFIG_PATH, uc.SINGLE_CONFIG_NAME)):
109        return True
110    if value.endswith(
111        '/%s/%s' % (uc.MULTIPLE_CONFIG_PATH, uc.MAIN_CONFIG_NAME)):
112        return True
113    if value.endswith(
114        '/%s/%s' % (uc.MULTIPLE_CONFIG_PATH, uc.SUB_CONFIG_NAME_2)):
115        return True
116    return False
117
118
119def realpath_side_effect(path):
120    """Mock return values for os.path.realpath."""
121    return os.path.join(uc.ROOT, path)
122