# -*- 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)