blob: 795a9a80028586b54dc20a1fd6f1aad541b56950 [file] [log] [blame]
# Copyright 2014 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.
import logging
import os
import sys
import unittest
# Directory client/tests/
TESTS_DIR = os.path.dirname(os.path.abspath(
__file__.decode(sys.getfilesystemencoding())))
# Directory client/
CLIENT_DIR = os.path.dirname(TESTS_DIR)
sys.path.insert(0, CLIENT_DIR)
# Fix import path.
sys.path.insert(0, os.path.join(CLIENT_DIR, 'third_party', 'pyasn1'))
sys.path.insert(0, os.path.join(CLIENT_DIR, 'third_party', 'rsa'))
sys.path.insert(0, os.path.join(CLIENT_DIR, 'third_party'))
# third_party/
from depot_tools import fix_encoding
from utils import fs
_UMASK = None
class EnvVars(object):
"""Context manager for environment variables.
Passed a dict to the constructor it sets variables named with the key to the
value. Exiting the context causes all the variables named with the key to be
restored to their value before entering the context.
"""
def __init__(self, var_map):
self.var_map = var_map
self._backup = None
def __enter__(self):
self._backup = os.environ
os.environ = os.environ.copy()
os.environ.update(self.var_map)
def __exit__(self, exc_type, exc_value, traceback):
os.environ = self._backup
class SymLink(str):
"""Used as a marker to create a symlink instead of a file."""
def umask():
"""Returns current process umask without modifying it."""
global _UMASK
if _UMASK is None:
_UMASK = os.umask(0777)
os.umask(_UMASK)
return _UMASK
def make_tree(out, contents):
for relpath, content in sorted(contents.iteritems()):
filepath = os.path.join(out, relpath.replace('/', os.path.sep))
dirpath = os.path.dirname(filepath)
if not fs.isdir(dirpath):
fs.makedirs(dirpath, 0700)
if isinstance(content, SymLink):
fs.symlink(content, filepath)
else:
mode = 0700 if relpath.endswith('.py') else 0600
flags = os.O_WRONLY | os.O_CREAT
if sys.platform == 'win32':
# pylint: disable=no-member
flags |= os.O_BINARY
with os.fdopen(os.open(filepath, flags, mode), 'wb') as f:
f.write(content)
def main():
"""Improvement over unittest.main()."""
fix_encoding.fix_encoding()
logging.basicConfig(
level=logging.DEBUG if '-v' in sys.argv else logging.ERROR,
format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s')
if '-v' in sys.argv:
unittest.TestCase.maxDiff = None
# Use an unusual umask.
os.umask(0070)
fs.chdir(TESTS_DIR)
unittest.main()