def pytest_configure(config): option.config = config.option option.detailed = config.option.detailed option.fds_threshold = config.option.fds_threshold option.print_log = config.option.print_log option.save_log = config.option.save_log option.unsafe = config.option.unsafe option.user = config.option.user option.restart = config.option.restart option.generated_tests = {} option.current_dir = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir)) option.test_dir = option.current_dir + '/test' option.architecture = platform.architecture()[0] option.system = platform.system() option.cache_dir = tempfile.mkdtemp(prefix='unit-test-cache-') public_dir(option.cache_dir) # set stdout to non-blocking if option.detailed or option.print_log: fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, 0)
def prepare_env(self, script): shutil.copytree( option.test_dir + '/ruby/' + script, option.temp_dir + '/ruby/' + script, ) public_dir(option.temp_dir + '/ruby/' + script)
def unit_run(): global unit_instance if not option.restart and 'unitd' in unit_instance: return unit_instance build_dir = option.current_dir + '/build' unitd = build_dir + '/unitd' if not os.path.isfile(unitd): exit('Could not find unit') temp_dir = tempfile.mkdtemp(prefix='unit-test-') public_dir(temp_dir) if oct(stat.S_IMODE(os.stat(build_dir).st_mode)) != '0o777': public_dir(build_dir) os.mkdir(temp_dir + '/state') unitd_args = [ unitd, '--no-daemon', '--modules', build_dir, '--state', temp_dir + '/state', '--pid', temp_dir + '/unit.pid', '--log', temp_dir + '/unit.log', '--control', 'unix:' + temp_dir + '/control.unit.sock', '--tmp', temp_dir, ] if option.user: unitd_args.extend(['--user', option.user]) with open(temp_dir + '/unit.log', 'w') as log: unit_instance['process'] = subprocess.Popen(unitd_args, stderr=log) if not waitforfiles(temp_dir + '/control.unit.sock'): _print_log() exit('Could not start unit') unit_instance['temp_dir'] = temp_dir unit_instance['log'] = temp_dir + '/unit.log' unit_instance['control_sock'] = temp_dir + '/control.unit.sock' unit_instance['unitd'] = unitd return unit_instance
def prepare_env(self, script): # copy application shutil.copytree(option.test_dir + '/node/' + script, option.temp_dir + '/node') # copy modules shutil.copytree( option.current_dir + '/node/node_modules', option.temp_dir + '/node/node_modules', ) public_dir(option.temp_dir + '/node')
def pytest_sessionfinish(session): if not option.restart and option.save_log: print('Path to unit.log:\n' + Log.get_path() + '\n') option.restart = True unit_stop() public_dir(option.cache_dir) shutil.rmtree(option.cache_dir) if not option.save_log and os.path.isdir(option.temp_dir): public_dir(option.temp_dir) shutil.rmtree(option.temp_dir)
def test_java_application_multipart(self, temp_dir): self.load('multipart') reldst = '/uploads' fulldst = temp_dir + reldst os.mkdir(fulldst) public_dir(fulldst) fields = { 'file': { 'filename': 'sample.txt', 'type': 'text/plain', 'data': io.StringIO('Data from sample file'), }, 'destination': fulldst, 'upload': 'Upload', } encoded, content_type = self.multipart_encode(fields) preamble = 'Preamble. Should be ignored.' epilogue = 'Epilogue. Should be ignored.' body = "%s\r\n%s\r\n%s" % (preamble, encoded.decode(), epilogue) resp = self.post( headers={ 'Content-Type': content_type, 'Host': 'localhost', 'Connection': 'close', }, body=body, ) assert resp['status'] == 200, 'multipart status' assert re.search(r'sample\.txt created', resp['body']), 'multipart body' assert (self.search_in_log(r'^Data from sample file$', name=reldst + '/sample.txt') is not None), 'file created'
def unit_run(): global unit_instance if not option.restart and 'unitd' in unit_instance: return unit_instance build_dir = option.current_dir + '/build' unitd = build_dir + '/unitd' if not os.path.isfile(unitd): exit('Could not find unit') temp_dir = tempfile.mkdtemp(prefix='unit-test-') public_dir(temp_dir) if oct(stat.S_IMODE(os.stat(build_dir).st_mode)) != '0o777': public_dir(build_dir) os.mkdir(temp_dir + '/state') unitd_args = [ unitd, '--no-daemon', '--modules', build_dir, '--state', temp_dir + '/state', '--pid', temp_dir + '/unit.pid', '--log', temp_dir + '/unit.log', '--control', 'unix:' + temp_dir + '/control.unit.sock', '--tmp', temp_dir, ] if option.user: unitd_args.extend(['--user', option.user]) with open(temp_dir + '/unit.log', 'w') as log: unit_instance['process'] = subprocess.Popen(unitd_args, stderr=log) Log.temp_dir = temp_dir if not waitforfiles(temp_dir + '/control.unit.sock'): _print_log() exit('Could not start unit') unit_instance['temp_dir'] = temp_dir unit_instance['control_sock'] = temp_dir + '/control.unit.sock' unit_instance['unitd'] = unitd option.temp_dir = temp_dir with open(temp_dir + '/unit.pid', 'r') as f: unit_instance['pid'] = f.read().rstrip() _clear_conf(unit_instance['temp_dir'] + '/control.unit.sock') _fds_info['main']['fds'] = _count_fds(unit_instance['pid']) router = _fds_info['router'] router['pid'] = pid_by_name(router['name']) router['fds'] = _count_fds(router['pid']) controller = _fds_info['controller'] controller['pid'] = pid_by_name(controller['name']) controller['fds'] = _count_fds(controller['pid']) return unit_instance
def run(request): unit = unit_run() option.skip_alerts = [ r'read signalfd\(4\) failed', r'sendmsg.+failed', r'recvmsg.+failed', ] option.skip_sanitizer = False _fds_info['main']['skip'] = False _fds_info['router']['skip'] = False _fds_info['controller']['skip'] = False yield # stop unit error_stop_unit = unit_stop() error_stop_processes = stop_processes() # prepare log with Log.open(encoding='utf-8') as f: log = f.read() Log.set_pos(f.tell()) if not option.save_log and option.restart: shutil.rmtree(unit['temp_dir']) Log.set_pos(0) # clean temp_dir before the next test if not option.restart: _clear_conf(unit['temp_dir'] + '/control.unit.sock', log=log) for item in os.listdir(unit['temp_dir']): if item not in [ 'control.unit.sock', 'state', 'unit.pid', 'unit.log', ]: path = os.path.join(unit['temp_dir'], item) public_dir(path) if os.path.isfile(path) or stat.S_ISSOCK( os.stat(path).st_mode): os.remove(path) else: for attempt in range(10): try: shutil.rmtree(path) break except OSError as err: if err.errno != 16: raise time.sleep(1) # check descriptors _check_fds(log=log) # print unit.log in case of error if hasattr(request.node, 'rep_call') and request.node.rep_call.failed: _print_log(log) if error_stop_unit or error_stop_processes: _print_log(log) # check unit.log for errors assert error_stop_unit is None, 'stop unit' assert error_stop_processes is None, 'stop processes' _check_alerts(log=log)
def run(request): unit = unit_run() option.skip_alerts = [ r'read signalfd\(4\) failed', r'sendmsg.+failed', r'recvmsg.+failed', ] option.skip_sanitizer = False _fds_check['main']['skip'] = False _fds_check['router']['skip'] = False _fds_check['controller']['skip'] = False yield # stop unit error_stop_unit = unit_stop() error_stop_processes = stop_processes() # prepare log with Log.open(encoding='utf-8') as f: log = f.read() Log.set_pos(f.tell()) if not option.save_log and option.restart: shutil.rmtree(unit['temp_dir']) Log.set_pos(0) # clean temp_dir before the next test if not option.restart: _clear_conf(unit['temp_dir'] + '/control.unit.sock', log) for item in os.listdir(unit['temp_dir']): if item not in [ 'control.unit.sock', 'state', 'unit.pid', 'unit.log', ]: path = os.path.join(unit['temp_dir'], item) public_dir(path) if os.path.isfile(path) or stat.S_ISSOCK( os.stat(path).st_mode): os.remove(path) else: shutil.rmtree(path) # check descriptors (wait for some time before check) def waitforfds(diff): for i in range(600): fds_diff = diff() if fds_diff <= option.fds_threshold: break time.sleep(0.1) return fds_diff ps = _fds_check['main'] if not ps['skip']: fds_diff = waitforfds( lambda: _count_fds(unit_instance['pid']) - ps['fds']) ps['fds'] += fds_diff assert (fds_diff <= option.fds_threshold), 'descriptors leak main process' else: ps['fds'] = _count_fds(unit_instance['pid']) for name in ['controller', 'router']: ps = _fds_check[name] ps_pid = ps['pid'] ps['pid'] = pid_by_name(ps['name']) if not ps['skip']: fds_diff = waitforfds(lambda: _count_fds(ps['pid']) - ps['fds']) ps['fds'] += fds_diff assert ps['pid'] == ps_pid, 'same pid %s' % name assert fds_diff <= option.fds_threshold, ('descriptors leak %s' % name) else: ps['fds'] = _count_fds(ps['pid']) # print unit.log in case of error if hasattr(request.node, 'rep_call') and request.node.rep_call.failed: _print_log(log) if error_stop_unit or error_stop_processes: _print_log(log) # check unit.log for errors assert error_stop_unit is None, 'stop unit' assert error_stop_processes is None, 'stop processes' _check_alerts(log=log)
def run(request): unit = unit_run() option.temp_dir = unit['temp_dir'] option.skip_alerts = [ r'read signalfd\(4\) failed', r'sendmsg.+failed', r'recvmsg.+failed', ] option.skip_sanitizer = False yield # stop unit error_stop_unit = unit_stop() error_stop_processes = stop_processes() # prepare log with open(unit_instance['log'], 'r', encoding='utf-8', errors='ignore') as f: log = f.read() if not option.restart and option.save_log: with open(unit_instance['temp_dir'] + '/' + unit_log_copy, 'a') as f: f.write(log) # remove unit.log if not option.save_log and option.restart: shutil.rmtree(unit['temp_dir']) # clean temp_dir before the next test if not option.restart: conf_resp = _clear_conf(unit['temp_dir'] + '/control.unit.sock') if 'success' not in conf_resp: _print_log(log) assert 'success' in conf_resp open(unit['log'], 'w').close() for item in os.listdir(unit['temp_dir']): if item not in [ 'control.unit.sock', 'state', 'unit.pid', 'unit.log', unit_log_copy, ]: path = os.path.join(unit['temp_dir'], item) public_dir(path) if os.path.isfile(path) or stat.S_ISSOCK( os.stat(path).st_mode): os.remove(path) else: shutil.rmtree(path) # print unit.log in case of error if hasattr(request.node, 'rep_call') and request.node.rep_call.failed: _print_log(log) if error_stop_unit or error_stop_processes: _print_log(log) # check unit.log for errors assert error_stop_unit is None, 'stop unit' assert error_stop_processes is None, 'stop processes' _check_alerts(log=log)