aboutsummaryrefslogtreecommitdiff
path: root/llvm_tools/test_helpers.py
blob: 67d88d9f9cb51ccf7cd748d916413a3f23144daa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Helper functions for unit testing."""


from contextlib import contextmanager
import json
import os
from tempfile import mkstemp


class ArgsOutputTest(object):
    """Testing class to simulate a argument parser object."""

    def __init__(self, svn_option="google3"):
        self.chroot_path = "/abs/path/to/chroot"
        self.last_tested = "/abs/path/to/last_tested_file.json"
        self.llvm_version = svn_option
        self.verbose = False
        self.extra_change_lists = None
        self.options = ["latest-toolchain"]
        self.builders = ["some-builder"]


# FIXME: Migrate modules with similar helper to use this module.
def CallCountsToMockFunctions(mock_function):
    """A decorator that passes a call count to the function it decorates.

    Examples:
      @CallCountsToMockFunctions
      def foo(call_count):
        return call_count
      ...
      ...
      [foo(), foo(), foo()]
      [0, 1, 2]
    """

    counter = [0]

    def Result(*args, **kwargs):
        # For some values of `counter`, the mock function would simulate raising
        # an exception, so let the test case catch the exception via
        # `unittest.TestCase.assertRaises()` and to also handle recursive functions.
        prev_counter = counter[0]
        counter[0] += 1

        ret_value = mock_function(prev_counter, *args, **kwargs)

        return ret_value

    return Result


def WritePrettyJsonFile(file_name, json_object):
    """Writes the contents of the file to the json object.

    Args:
      file_name: The file that has contents to be used for the json object.
      json_object: The json object to write to.
    """

    json.dump(file_name, json_object, indent=4, separators=(",", ": "))


def CreateTemporaryJsonFile():
    """Makes a temporary .json file."""

    return CreateTemporaryFile(suffix=".json")


@contextmanager
def CreateTemporaryFile(suffix=""):
    """Makes a temporary file."""

    fd, temp_file_path = mkstemp(suffix=suffix)

    os.close(fd)

    try:
        yield temp_file_path

    finally:
        if os.path.isfile(temp_file_path):
            os.remove(temp_file_path)