blob: bb60cb88c18807ef8525dcbe4bb642eede56061f [file] [log] [blame]
Kuang-che Wu6e4beca2018-06-27 17:45:02 +08001# -*- coding: utf-8 -*-
Kuang-che Wu2ea804f2017-11-28 17:11:41 +08002# Copyright 2017 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5"""Common functions for testing"""
6
7from __future__ import print_function
8import os
Kuang-che Wue2563ea2018-01-05 20:30:28 +08009import contextlib
Kuang-che Wu23192ad2020-03-11 18:12:46 +080010from unittest import mock
Kuang-che Wue2563ea2018-01-05 20:30:28 +080011
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080012
13def get_testdata_path(filename=None):
Kuang-che Wue2563ea2018-01-05 20:30:28 +080014 """Gets path to test data
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080015
16 Args:
17 filename: path relative to the test data folder.
18
19 Returns:
20 path to the file inside test data folder. If filename is None, the path of
21 test data folder is returned.
22 """
23 path = os.path.join(os.path.dirname(__file__), '..', 'testdata')
Kuang-che Wue2563ea2018-01-05 20:30:28 +080024 assert os.path.exists(path)
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080025 if filename:
26 path = os.path.join(path, filename)
27 return path
Kuang-che Wue2563ea2018-01-05 20:30:28 +080028
29
30@contextlib.contextmanager
31def mock_function_by_file(module, name, filename):
32 """Context manager to mock function by test data
33
34 Args:
35 module: module of function to mock
36 name: function name to mock
37 filename: path relative to the test data folder
38
39 Returns:
40 context manager, which mocks the said function within its scope.
41 """
Kuang-che Wua5723492019-11-25 20:59:34 +080042 with open(get_testdata_path(filename)) as f:
43 data = f.read()
Kuang-che Wue2563ea2018-01-05 20:30:28 +080044 with mock.patch.object(module, name, return_value=data):
45 yield