120 lines
2.8 KiB
Python
120 lines
2.8 KiB
Python
import os
|
|
import platform
|
|
import shutil
|
|
|
|
import subprocess
|
|
import threading
|
|
|
|
|
|
class Command(object):
|
|
"""Run system commands with timeout
|
|
|
|
From http://www.bo-yang.net/2016/12/01/python-run-command-with-timeout
|
|
Python3 might have a builtin way to do that.
|
|
"""
|
|
def __init__(self, cmd):
|
|
self.cmd = cmd
|
|
self.process = None
|
|
|
|
def run_command(self, capture = False):
|
|
self.process = subprocess.Popen(self.cmd, shell=True)
|
|
self.process.communicate()
|
|
|
|
def run(self, timeout = 5 * 60):
|
|
'''5 minutes default timeout'''
|
|
thread = threading.Thread(target=self.run_command, args=())
|
|
thread.start()
|
|
thread.join(timeout)
|
|
|
|
if thread.is_alive():
|
|
print 'Command timeout, kill it: ' + self.cmd
|
|
self.process.terminate()
|
|
thread.join()
|
|
return False, 255
|
|
else:
|
|
return True, self.process.returncode
|
|
|
|
|
|
osName = platform.system()
|
|
print('os name = {}'.format(osName))
|
|
|
|
root = os.path.dirname(os.path.realpath(__file__))
|
|
buildDir = os.path.join(root, 'build', osName)
|
|
|
|
if not os.path.exists(buildDir):
|
|
os.makedirs(buildDir)
|
|
|
|
os.chdir(buildDir)
|
|
|
|
if osName == 'Windows':
|
|
generator = '-G"NMake Makefiles"'
|
|
make = 'nmake'
|
|
testBinary ='ixwebsocket_unittest.exe'
|
|
else:
|
|
generator = ''
|
|
make = 'make -j6'
|
|
testBinary ='./ixwebsocket_unittest'
|
|
|
|
sanitizersFlags = {
|
|
'asan': '-DSANITIZE_ADDRESS=On',
|
|
'ubsan': '-DSANITIZE_UNDEFINED=On',
|
|
'tsan': '-DSANITIZE_THREAD=On',
|
|
'none': ''
|
|
}
|
|
sanitizer = 'tsan'
|
|
if osName == 'Linux':
|
|
sanitizer = 'none'
|
|
|
|
sanitizerFlags = sanitizersFlags[sanitizer]
|
|
|
|
# if osName == 'Windows':
|
|
# os.environ['CC'] = 'clang-cl'
|
|
# os.environ['CXX'] = 'clang-cl'
|
|
|
|
cmakeCmd = 'cmake -DCMAKE_BUILD_TYPE=Debug {} {} ../..'.format(generator, sanitizerFlags)
|
|
print(cmakeCmd)
|
|
ret = os.system(cmakeCmd)
|
|
assert ret == 0, 'CMake failed, exiting'
|
|
|
|
ret = os.system(make)
|
|
assert ret == 0, 'Make failed, exiting'
|
|
|
|
def findFiles(prefix):
|
|
'''Find all files under a given directory'''
|
|
|
|
paths = []
|
|
|
|
for root, _, files in os.walk(prefix):
|
|
for path in files:
|
|
fullPath = os.path.join(root, path)
|
|
|
|
if os.path.islink(fullPath):
|
|
continue
|
|
|
|
paths.append(fullPath)
|
|
|
|
return paths
|
|
|
|
#for path in findFiles('.'):
|
|
# print(path)
|
|
|
|
# We need to copy the zlib DLL in the current work directory
|
|
shutil.copy(os.path.join(
|
|
'..',
|
|
'..',
|
|
'..',
|
|
'third_party',
|
|
'ZLIB-Windows',
|
|
'zlib-1.2.11_deploy_v140',
|
|
'release_dynamic',
|
|
'x64',
|
|
'bin',
|
|
'zlib.dll'), '.')
|
|
|
|
# lldb = "lldb --batch -o 'run' -k 'thread backtrace all' -k 'quit 1'"
|
|
lldb = "" # Disabled for now
|
|
testCommand = '{} {} {}'.format(lldb, testBinary, os.getenv('TEST', ''))
|
|
command = Command(testCommand)
|
|
timedout, ret = command.run()
|
|
assert ret == 0, 'Test command failed'
|