radiasoft / sirepo

Sirepo is a framework for scientific cloud computing. Try it out!
https://sirepo.com
Apache License 2.0
64 stars 31 forks source link

problems running tests on master #1528

Closed njsmith closed 5 years ago

njsmith commented 5 years ago

Using the vagrant image, running python setup.py tests in the sirepo source dir, on latest master (3d1d4623), I get:

[py2;@v sirepo]$ python setup.py test
running test
running egg_info
writing requirements to sirepo.egg-info/requires.txt
writing sirepo.egg-info/PKG-INFO
writing top-level names to sirepo.egg-info/top_level.txt
writing dependency_links to sirepo.egg-info/dependency_links.txt
writing entry points to sirepo.egg-info/entry_points.txt
reading manifest file 'sirepo.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'sirepo.egg-info/SOURCES.txt'
running build_ext
============================= test session starts ==============================
platform linux2 -- Python 2.7.14, pytest-3.2.3, py-1.7.0, pluggy-0.4.0
rootdir: /home/vagrant/src/radiasoft/sirepo, inifile:
plugins: forked-0.2
collected 36 items                                                              

tests/application_data_test.py .

And then it seems to hang forever.

If I do pytest tests -v -s --fulltrace, and hit control-C after it's stuck, I get a ton of output, that suggests it's stuck in waitpid?

``` ============================= test session starts ============================== platform linux2 -- Python 2.7.14, pytest-3.2.3, py-1.7.0, pluggy-0.4.0 -- /home/vagrant/.pyenv/versions/2.7.14/envs/py2/bin/python2.7 cachedir: .cache rootdir: /home/vagrant/src/radiasoft/sirepo, inifile: plugins: forked-0.2 collected 36 items tests/application_data_test.py::test_processed_image PASSEDsirepo/oauth.py:216:_init_tables creating user oauth database ^C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! KeyboardInterrupt !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! config = <_pytest.config.Config object at 0x7f918f319150> doit = def wrap_session(config, doit): """Skeleton command line program""" session = Session(config) session.exitstatus = EXIT_OK initstate = 0 try: try: config._do_configure() initstate = 1 config.hook.pytest_sessionstart(session=session) initstate = 2 > session.exitstatus = doit(config, session) or 0 ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py:110: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <_pytest.config.Config object at 0x7f918f319150> session = def _main(config, session): """ default command line protocol for initialization, session, running tests and reporting. """ config.hook.pytest_collection(session=session) > config.hook.pytest_runtestloop(session=session) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py:146: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtestloop'> kwargs = {'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>, 'session': }>, 'session': } def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f918f2faa10> hook = <_HookCaller 'pytest_runtestloop'>, methods = [] kwargs = {'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>, 'session': }>, 'session': } def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtestloop'>, methods = [] kwargs = {'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>, 'session': }>, 'session': } self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:334: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 0 meths, kwargs={'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>, 'session': }> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() try: args = [all_kwargs[argname] for argname in hook_impl.argnames] except KeyError: for argname in hook_impl.argnames: if argname not in all_kwargs: raise HookCallError( "hook call must provide argument %r" % (argname,)) if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:614: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ session = def pytest_runtestloop(session): if (session.testsfailed and not session.config.option.continue_on_collection_errors): raise session.Interrupted( "%d errors during collection" % session.testsfailed) if session.config.option.collectonly: return True for i, item in enumerate(session.items): nextitem = session.items[i + 1] if i + 1 < len(session.items) else None > item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py:169: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_protocol'> kwargs = {'__multicall__': <_MultiCall 0 results, 1 meths, kwargs={'item': , '__multicall__': <...extitem': }>, 'item': , 'nextitem': } def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f918f2faa10> hook = <_HookCaller 'pytest_runtest_protocol'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0x7f918f2ca098>] kwargs = {'__multicall__': <_MultiCall 0 results, 1 meths, kwargs={'item': , '__multicall__': <...extitem': }>, 'item': , 'nextitem': } def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_protocol'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0x7f918f2ca098>] kwargs = {'__multicall__': <_MultiCall 0 results, 1 meths, kwargs={'item': , '__multicall__': <...extitem': }>, 'item': , 'nextitem': } self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:334: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 1 meths, kwargs={'item': , '__multicall__': <_MultiCall 0 results, 1 meths, kwargs={...}>, 'nextitem': }> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() try: args = [all_kwargs[argname] for argname in hook_impl.argnames] except KeyError: for argname in hook_impl.argnames: if argname not in all_kwargs: raise HookCallError( "hook call must provide argument %r" % (argname,)) if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:613: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = func = , 'nextitem': }>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0x7f9189a34368> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0x7f9189a34368> func = , 'nextitem': }>> def __init__(self, func): try: > self.result = func() ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:265: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 1 meths, kwargs={'item': , '__multicall__': <_MultiCall 0 results, 1 meths, kwargs={...}>, 'nextitem': }> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() try: args = [all_kwargs[argname] for argname in hook_impl.argnames] except KeyError: for argname in hook_impl.argnames: if argname not in all_kwargs: raise HookCallError( "hook call must provide argument %r" % (argname,)) if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:613: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = func = , 'nextitem': }>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0x7f9189a343f8> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0x7f9189a343f8> func = , 'nextitem': }>> def __init__(self, func): try: > self.result = func() ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:265: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 1 meths, kwargs={'item': , '__multicall__': <_MultiCall 0 results, 1 meths, kwargs={...}>, 'nextitem': }> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() try: args = [all_kwargs[argname] for argname in hook_impl.argnames] except KeyError: for argname in hook_impl.argnames: if argname not in all_kwargs: raise HookCallError( "hook call must provide argument %r" % (argname,)) if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py:614: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @pytest.mark.tryfirst def pytest_runtest_protocol(item): if item.config.getvalue("forked"): > reports = forked_run_report(item) ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/pytest_forked/__init__.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def forked_run_report(item): # for now, we run setup/teardown in the subprocess # XXX optionally allow sharing of setup/teardown from _pytest.runner import runtestprotocol EXITSTATUS_TESTEXIT = 4 import marshal def runforked(): try: reports = runtestprotocol(item, log=False) except KeyboardInterrupt: py.std.os._exit(EXITSTATUS_TESTEXIT) return marshal.dumps([serialize_report(x) for x in reports]) ff = py.process.ForkedFunc(runforked) > result = ff.waitfinish() ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/pytest_forked/__init__.py:56: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = waiter = def waitfinish(self, waiter=os.waitpid): > pid, systemstatus = waiter(self.pid, 0) E KeyboardInterrupt ../../../.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/py/_process/forkedfunc.py:82: KeyboardInterrupt ========================== 1 passed in 32.96 seconds =========================== ```

I also tried running just the server_tests.py file, and it didn't freeze, but test_get_data_file failed. I guess this may be a second, unrelated issue:

``` [py2;@v sirepo]$ pytest tests/server_test.py -v ============================= test session starts ============================== platform linux2 -- Python 2.7.14, pytest-3.2.3, py-1.7.0, pluggy-0.4.0 -- /home/vagrant/.pyenv/versions/2.7.14/envs/py2/bin/python2.7 cachedir: .cache rootdir: /home/vagrant/src/radiasoft/sirepo, inifile: plugins: forked-0.2 collected 3 items tests/server_test.py::test_basic PASSEDsirepo/runner/background.py:122:_start KSUlLQLW-0tOOOj5P-bunchReport1: started: pid=7766 cmd=['sirepo', 'elegant', 'run', '/home/vagrant/src/radiasoft/sirepo/tests/server_work/db/user/KSUlLQLW/elegant/0tOOOj5P/bunchReport'] sirepo/runner/background.py:50:_kill KSUlLQLW-0tOOOj5P-bunchReport1: kill 15 pid=7766 sirepo/runner/background.py:95:_sigchld_handler KSUlLQLW-0tOOOj5P-bunchReport1: waitpid pid=7766 status=15 sirepo/server.py:776:_simulation_error error in read_result: /home/vagrant/src/radiasoft/sirepo/tests/server_work/db/user/KSUlLQLW/elegant/0tOOOj5P/bunchReport: error: ERROR: Terminated unexpectedly tests/server_test.py::test_get_data_file FAILEDsirepo/util.py:45:_raise srw: simulation not found by name: UndulatorRadiation sirepo/uri_router.py:176:_dispatch find-by-name/srw/default/UndulatorRadiation: error: NotFound: 404 Not Found: The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again. File "/home/vagrant/.pyenv/versions/py2/bin/pytest", line 11, in sys.exit(main()) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/config.py", line 58, in main return config.hook.pytest_cmdline_main(config=config) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py", line 139, in pytest_cmdline_main return wrap_session(config, _main) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py", line 110, in wrap_session session.exitstatus = doit(config, session) or 0 File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py", line 146, in _main config.hook.pytest_runtestloop(session=session) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py", line 169, in pytest_runtestloop item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 613, in execute return _wrapped_call(hook_impl.function(*args), self.execute) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 248, in _wrapped_call call_outcome = _CallOutcome(func) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 265, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 613, in execute return _wrapped_call(hook_impl.function(*args), self.execute) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 248, in _wrapped_call call_outcome = _CallOutcome(func) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 265, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/pytest_forked/__init__.py", line 35, in pytest_runtest_protocol reports = forked_run_report(item) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/pytest_forked/__init__.py", line 55, in forked_run_report ff = py.process.ForkedFunc(runforked) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/py/_process/forkedfunc.py", line 50, in __init__ self._child(nice_level, child_on_start, child_on_exit) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/py/_process/forkedfunc.py", line 65, in _child retval = self.fun(*self.args, **self.kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/pytest_forked/__init__.py", line 50, in runforked reports = runtestprotocol(item, log=False) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 82, in runtestprotocol reports.append(call_and_report(item, "call", log)) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 162, in call_and_report call = call_runtest_hook(item, when, **kwds) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 182, in call_runtest_hook return CallInfo(lambda: ihook(item=item, **kwds), when=when) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 196, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 182, in return CallInfo(lambda: ihook(item=item, **kwds), when=when) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 613, in execute return _wrapped_call(hook_impl.function(*args), self.execute) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 248, in _wrapped_call call_outcome = _CallOutcome(func) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 265, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 112, in pytest_runtest_call item.runtest() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/python.py", line 1169, in runtest self.ihook.pytest_pyfunc_call(pyfuncitem=self) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 613, in execute return _wrapped_call(hook_impl.function(*args), self.execute) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 248, in _wrapped_call call_outcome = _CallOutcome(func) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 265, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/python.py", line 143, in pytest_pyfunc_call testfunction(**testargs) File "/home/vagrant/src/radiasoft/sirepo/tests/server_test.py", line 119, in test_srw pkeq(fc.get('/find-by-name/srw/default/UndulatorRadiation').status_code, 404) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 830, in get return self.open(*args, **kw) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/testing.py", line 200, in open follow_redirects=follow_redirects File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 803, in open response = self.run_wsgi_app(environ, buffered=buffered) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 716, in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 923, in run_wsgi_app app_rv = app(environ, start_response) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 2309, in __call__ return self.wsgi_app(environ, start_response) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app response = self.full_dispatch_request() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request rv = self.dispatch_request() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/home/vagrant/src/radiasoft/sirepo/sirepo/uri_router.py", line 172, in _dispatch return _dispatch_call(route.func, kwargs) File "/home/vagrant/src/radiasoft/sirepo/sirepo/uri_router.py", line 182, in _dispatch_call resp = flask.make_response(func(**kwargs)) File "/home/vagrant/src/radiasoft/sirepo/sirepo/server.py", line 258, in api_findByName util.raise_not_found('{}: simulation not found by name: {}', simulation_type, simulation_name) File "/home/vagrant/src/radiasoft/sirepo/sirepo/util.py", line 25, in raise_not_found _raise('NotFound', *args, **kwargs) File "/home/vagrant/src/radiasoft/sirepo/sirepo/util.py", line 46, in _raise raise getattr(werkzeug.exceptions, exc)() tests/server_test.py::test_srw PASSED =================================== FAILURES =================================== ______________________________ test_get_data_file ______________________________ Traceback (most recent call last): File "/home/vagrant/src/radiasoft/sirepo/tests/server_test.py", line 62, in test_get_data_file run.nextRequest File "/home/vagrant/src/radiasoft/pykern/pykern/pkcollections.py", line 56, in __getattr__ return self.__getattribute__(name) AttributeError: 'Dict' object has no attribute 'nextRequest' ===================== 1 failed, 2 passed in 13.36 seconds ====================== ```

CC @robnagler

robnagler commented 5 years ago

I can't reproduce in master or njs-sow-2. All tests run except runner_test.py (see comment).

Perhaps we can debug together. My schedule is open.

njsmith commented 5 years ago

Unfortunately I was AFK during the day – going to take a look now, but I guess you're probably AFK now :-). If I don't get it tonight then maybe we can compare notes tomorrow...

robnagler commented 5 years ago

Just leaving the kbd behind. I have a couple of meetings tomorrow, but ping me and we'll see. I didn't review the code, just tested, and tried to reproduce the issue.

njsmith commented 5 years ago

OK, I built a new totally-vanilla vagrant image from scratch (just ran vagrant up, then installed redhat-dev and sirepo-dev, then ran pytest tests). And then I forgot about it for a while, which I guess was crucial :-). I get 3 failures:

``` [py2;@v2 sirepo]$ pytest tests ============================= test session starts ============================== platform linux2 -- Python 2.7.14, pytest-3.2.3, py-1.7.0, pluggy-0.4.0 rootdir: /home/vagrant/src/radiasoft/sirepo, inifile: plugins: forked-1.0.1 collected 36 items tests/application_data_test.py . tests/beaker_compat_test.py F.. tests/blank_test.py . tests/bluesky_test.py ... tests/cookie_test.py . tests/crystal_test.py ... tests/exporter_test.py . tests/importer_test.py .. tests/oauth_test.py F tests/server1_test.py .. tests/server_test.py .F. tests/srw_test.py .. tests/template_common_test.py . tests/uri_router_test.py .. tests/pkcli/admin_test.py . tests/template/elegant_import_test.py . tests/template/elegant_rpn_test.py . tests/template/elegant_test.py . tests/template/shadow_generate_test.py . tests/template/srw_generate_test.py .. tests/template/srw_import_test.py . tests/template/srw_magmeaszip_test.py .. =================================== FAILURES =================================== _____________________________ test_anonymous_user ______________________________ Traceback (most recent call last): File "/home/vagrant/src/radiasoft/sirepo/tests/beaker_compat_test.py", line 54, in test_anonymous_user ('a', 'sros'), File "/home/vagrant/src/radiasoft/sirepo/tests/beaker_compat_test.py", line 44, in _test_cookie want_cookie=False, File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 81, in test_in_request fc = flask_client(cfg) File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 52, in flask_client server.init() File "/home/vagrant/src/radiasoft/sirepo/sirepo/server.py", line 657, in init uri_router.init(app, uwsgi) File "/home/vagrant/src/radiasoft/sirepo/sirepo/uri_router.py", line 76, in init importlib.import_module('sirepo.' + m).init_apis(app) File "/home/vagrant/src/radiasoft/sirepo/sirepo/oauth.py", line 138, in init_apis _init_tables(app) File "/home/vagrant/src/radiasoft/sirepo/sirepo/oauth.py", line 217, in _init_tables _db.create_all() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 963, in create_all self._execute_for_all_tables(app, bind, 'create_all') File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 955, in _execute_for_all_tables op(bind=self.get_engine(app, bind), **extra) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", line 4200, in create_all ddl.SchemaGenerator, self, checkfirst=checkfirst, tables=tables File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2011, in _run_visitor conn._run_visitor(visitorcallable, element, **kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1599, in _run_visitor visitorcallable(self.dialect, self, **kwargs).traverse_single(element) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 130, in traverse_single return meth(obj, **kw) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 752, in visit_metadata [t for t in tables if self._can_create_table(t)] File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 729, in _can_create_table self.connection, table.name, schema=effective_schema File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 1357, in has_table connection, "table_info", table_name, schema=schema File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 1799, in _get_table_pragma cursor = connection.execute(statement) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 974, in execute return self._execute_text(object_, multiparams, params) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1147, in _execute_text parameters, File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1240, in _execute_context e, statement, parameters, cursor, context File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1458, in _handle_dbapi_exception util.raise_from_cause(sqlalchemy_exception, exc_info) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 296, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1236, in _execute_context cursor, statement, parameters, context File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 536, in do_execute cursor.execute(statement, parameters) OperationalError: (sqlite3.OperationalError) database is locked [SQL: u'PRAGMA table_info("user_t")'] (Background on this error at: http://sqlalche.me/e/e3q8) ______________________________ test_login_logout _______________________________ Traceback (most recent call last): File "/home/vagrant/src/radiasoft/sirepo/tests/oauth_test.py", line 22, in test_login_logout 'SIREPO_OAUTH_GITHUB_CALLBACK_URI': 'n/a', File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 52, in flask_client server.init() File "/home/vagrant/src/radiasoft/sirepo/sirepo/server.py", line 657, in init uri_router.init(app, uwsgi) File "/home/vagrant/src/radiasoft/sirepo/sirepo/uri_router.py", line 76, in init importlib.import_module('sirepo.' + m).init_apis(app) File "/home/vagrant/src/radiasoft/sirepo/sirepo/oauth.py", line 138, in init_apis _init_tables(app) File "/home/vagrant/src/radiasoft/sirepo/sirepo/oauth.py", line 217, in _init_tables _db.create_all() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 963, in create_all self._execute_for_all_tables(app, bind, 'create_all') File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 955, in _execute_for_all_tables op(bind=self.get_engine(app, bind), **extra) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", line 4200, in create_all ddl.SchemaGenerator, self, checkfirst=checkfirst, tables=tables File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2011, in _run_visitor conn._run_visitor(visitorcallable, element, **kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1599, in _run_visitor visitorcallable(self.dialect, self, **kwargs).traverse_single(element) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 130, in traverse_single return meth(obj, **kw) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 752, in visit_metadata [t for t in tables if self._can_create_table(t)] File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 729, in _can_create_table self.connection, table.name, schema=effective_schema File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 1357, in has_table connection, "table_info", table_name, schema=schema File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 1799, in _get_table_pragma cursor = connection.execute(statement) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 974, in execute return self._execute_text(object_, multiparams, params) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1147, in _execute_text parameters, File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1240, in _execute_context e, statement, parameters, cursor, context File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1458, in _handle_dbapi_exception util.raise_from_cause(sqlalchemy_exception, exc_info) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 296, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1236, in _execute_context cursor, statement, parameters, context File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 536, in do_execute cursor.execute(statement, parameters) OperationalError: (sqlite3.OperationalError) database is locked [SQL: u'PRAGMA table_info("user_t")'] (Background on this error at: http://sqlalche.me/e/e3q8) ______________________________ test_get_data_file ______________________________ Traceback (most recent call last): File "/home/vagrant/src/radiasoft/sirepo/tests/server_test.py", line 78, in test_get_data_file raw_response=True, File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 142, in sr_get return _req(route_name, params, self.get, raw_response=raw_response) File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 187, in _req resp = op(uri) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 830, in get return self.open(*args, **kw) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/testing.py", line 200, in open follow_redirects=follow_redirects File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 803, in open response = self.run_wsgi_app(environ, buffered=buffered) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 716, in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 923, in run_wsgi_app app_rv = app(environ, start_response) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 2309, in __call__ return self.wsgi_app(environ, start_response) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 2295, in wsgi_app response = self.handle_exception(e) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1741, in handle_exception reraise(exc_type, exc_value, tb) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app response = self.full_dispatch_request() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request rv = self.handle_user_exception(e) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception reraise(exc_type, exc_value, tb) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request rv = self.dispatch_request() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/home/vagrant/src/radiasoft/sirepo/sirepo/uri_router.py", line 172, in _dispatch return _dispatch_call(route.func, kwargs) File "/home/vagrant/src/radiasoft/sirepo/sirepo/uri_router.py", line 182, in _dispatch_call resp = flask.make_response(func(**kwargs)) File "/home/vagrant/src/radiasoft/sirepo/sirepo/server.py", line 152, in api_downloadDataFile filename, content, content_type = template.get_data_file(run_dir, model, frame, options=options) File "/home/vagrant/src/radiasoft/sirepo/sirepo/template/elegant.py", line 368, in get_data_file return _sdds(_report_output_filename('bunchReport')) File "/home/vagrant/src/radiasoft/sirepo/sirepo/template/elegant.py", line 346, in _sdds '{}: invalid or empty output from sddsprintout'.format(path) AssertionError: /home/vagrant/src/radiasoft/sirepo/tests/server_work/db/user/WuZ7gm5M/elegant/VEcL0HN7/bunchReport/elegant.bun: invalid or empty output from sddsprintout ----------------------------- Captured stderr call ----------------------------- sirepo/runner/background.py:122:_start WuZ7gm5M-VEcL0HN7-bunchReport1: started: pid=26097 cmd=['sirepo', 'elegant', 'run', '/home/vagrant/src/radiasoft/sirepo/tests/server_work/db/user/WuZ7gm5M/elegant/VEcL0HN7/bunchReport'] sirepo/runner/background.py:95:_sigchld_handler WuZ7gm5M-VEcL0HN7-bunchReport1: waitpid pid=26097 status=0 sirepo/template/elegant_common.py:61:subprocess_output ['sddsprintout', '-columns', '-spreadsheet=csv', '/home/vagrant/src/radiasoft/sirepo/tests/server_work/db/user/WuZ7gm5M/elegant/VEcL0HN7/bunchReport/elegant.bun']: exit=1 err=Error for sddsprintout: Unable to read layout--no header lines found (SDDS_ReadLayout) sirepo/uri_router.py:176:_dispatch download-data-file/elegant/VEcL0HN7/bunchReport1/-1/csv: error: AssertionError: /home/vagrant/src/radiasoft/sirepo/tests/server_work/db/user/WuZ7gm5M/elegant/VEcL0HN7/bunchReport/elegant.bun: invalid or empty output from sddsprintout File "/home/vagrant/.pyenv/versions/py2/bin/pytest", line 10, in sys.exit(main()) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/config.py", line 58, in main return config.hook.pytest_cmdline_main(config=config) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py", line 139, in pytest_cmdline_main return wrap_session(config, _main) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py", line 110, in wrap_session session.exitstatus = doit(config, session) or 0 File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py", line 146, in _main config.hook.pytest_runtestloop(session=session) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/main.py", line 169, in pytest_runtestloop item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 613, in execute return _wrapped_call(hook_impl.function(*args), self.execute) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 248, in _wrapped_call call_outcome = _CallOutcome(func) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 265, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 613, in execute return _wrapped_call(hook_impl.function(*args), self.execute) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 248, in _wrapped_call call_outcome = _CallOutcome(func) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 265, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/pytest_forked/__init__.py", line 35, in pytest_runtest_protocol reports = forked_run_report(item) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/pytest_forked/__init__.py", line 55, in forked_run_report ff = py.process.ForkedFunc(runforked) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/py/_process/forkedfunc.py", line 50, in __init__ self._child(nice_level, child_on_start, child_on_exit) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/py/_process/forkedfunc.py", line 65, in _child retval = self.fun(*self.args, **self.kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/pytest_forked/__init__.py", line 50, in runforked reports = runtestprotocol(item, log=False) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 82, in runtestprotocol reports.append(call_and_report(item, "call", log)) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 162, in call_and_report call = call_runtest_hook(item, when, **kwds) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 182, in call_runtest_hook return CallInfo(lambda: ihook(item=item, **kwds), when=when) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 196, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 182, in return CallInfo(lambda: ihook(item=item, **kwds), when=when) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 613, in execute return _wrapped_call(hook_impl.function(*args), self.execute) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 248, in _wrapped_call call_outcome = _CallOutcome(func) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 265, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/runner.py", line 112, in pytest_runtest_call item.runtest() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/python.py", line 1169, in runtest self.ihook.pytest_pyfunc_call(pyfuncitem=self) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__ return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec return self._inner_hookexec(hook, methods, kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in _MultiCall(methods, kwargs, hook.spec_opts).execute() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 613, in execute return _wrapped_call(hook_impl.function(*args), self.execute) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 248, in _wrapped_call call_outcome = _CallOutcome(func) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 265, in __init__ self.result = func() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute res = hook_impl.function(*args) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/_pytest/python.py", line 143, in pytest_pyfunc_call testfunction(**testargs) File "/home/vagrant/src/radiasoft/sirepo/tests/server_test.py", line 78, in test_get_data_file raw_response=True, File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 142, in sr_get return _req(route_name, params, self.get, raw_response=raw_response) File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 187, in _req resp = op(uri) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 830, in get return self.open(*args, **kw) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/testing.py", line 200, in open follow_redirects=follow_redirects File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 803, in open response = self.run_wsgi_app(environ, buffered=buffered) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 716, in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/werkzeug/test.py", line 923, in run_wsgi_app app_rv = app(environ, start_response) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 2309, in __call__ return self.wsgi_app(environ, start_response) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app response = self.full_dispatch_request() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request rv = self.dispatch_request() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request re ==================== 3 failed, 33 passed in 948.61 seconds ===================== ```

Those two sqlite failures seem to have like a 5+ minute timeouts on them before they fail, which I guess is why I thought it had frozen before!

Possibly the two sqlite locking-related errors are a side-effect of having my src/ dir on NFS? No idea about test_get_data_file though.

njsmith commented 5 years ago

And for reference, here's the results on my original VM with the njs-sow-2 branch:

``` [py2;@v sirepo]$ pytest tests -v ============================= test session starts ============================== platform linux2 -- Python 2.7.14, pytest-3.2.3, py-1.7.0, pluggy-0.4.0 -- /home/vagrant/.pyenv/versions/2.7.14/envs/py2/bin/python2.7 cachedir: .cache rootdir: /home/vagrant/src/radiasoft/sirepo, inifile: plugins: forked-0.2 collected 37 items tests/application_data_test.py::test_processed_image PASSED tests/beaker_compat_test.py::test_anonymous_user FAILED tests/beaker_compat_test.py::test_no_user PASSED tests/beaker_compat_test.py::test_oauth_user PASSED tests/blank_test.py::test_nothing PASSED tests/bluesky_test.py::test_auth_hash PASSED tests/bluesky_test.py::test_auth_hash_copy PASSED tests/bluesky_test.py::test_auth_login PASSED tests/cookie_test.py::test_1 PASSED tests/crystal_test.py::test_calc_bragg_angle PASSED tests/crystal_test.py::test_get_crystal_parameters PASSED tests/crystal_test.py::test_get_crystal_parameters_str PASSED tests/exporter_test.py::test_create_zip PASSED tests/importer_test.py::test_import_json PASSED tests/importer_test.py::test_import_zip PASSED tests/oauth_test.py::test_login_logout FAILED tests/runner_test.py::test_runner_myapp PASSED tests/server1_test.py::test_1_serial_stomp PASSED tests/server1_test.py::test_missing_cookies PASSED tests/server_test.py::test_basic PASSED tests/server_test.py::test_get_data_file FAILED tests/server_test.py::test_srw PASSED tests/srw_test.py::test_model_defaults PASSED tests/srw_test.py::test_prepare_aux_files PASSED tests/template_common_test.py::test_validate_safe_zip PASSED tests/uri_router_test.py::test_not_found PASSED tests/uri_router_test.py::test_uri_for_api PASSED tests/pkcli/admin_test.py::test_purge_users PASSED tests/template/elegant_import_test.py::test_importer PASSED tests/template/elegant_rpn_test.py::test_rpn PASSED tests/template/elegant_test.py::test_get_application_data PASSED tests/template/shadow_generate_test.py::test_generate_python PASSED tests/template/srw_generate_test.py::test_generate_all_optics PASSED tests/template/srw_generate_test.py::test_generate_python PASSED tests/template/srw_import_test.py::test_importer PASSED tests/template/srw_magmeaszip_test.py::test_magnetic_measurements_zip_file PASSED tests/template/srw_magmeaszip_test.py::test_validate_safe_zip PASSED =================================== FAILURES =================================== _____________________________ test_anonymous_user ______________________________ Traceback (most recent call last): File "/home/vagrant/src/radiasoft/sirepo/tests/beaker_compat_test.py", line 54, in test_anonymous_user ('a', 'sros'), File "/home/vagrant/src/radiasoft/sirepo/tests/beaker_compat_test.py", line 44, in _test_cookie want_cookie=False, File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 81, in test_in_request fc = flask_client(cfg) File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 52, in flask_client server.init() File "/home/vagrant/src/radiasoft/sirepo/sirepo/server.py", line 703, in init uri_router.init(app, uwsgi) File "/home/vagrant/src/radiasoft/sirepo/sirepo/uri_router.py", line 76, in init importlib.import_module('sirepo.' + m).init_apis(app) File "/home/vagrant/src/radiasoft/sirepo/sirepo/oauth.py", line 138, in init_apis _init_tables(app) File "/home/vagrant/src/radiasoft/sirepo/sirepo/oauth.py", line 217, in _init_tables _db.create_all() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 963, in create_all self._execute_for_all_tables(app, bind, 'create_all') File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 955, in _execute_for_all_tables op(bind=self.get_engine(app, bind), **extra) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", line 4005, in create_all tables=tables) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1940, in _run_visitor conn._run_visitor(visitorcallable, element, **kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1549, in _run_visitor **kwargs).traverse_single(element) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 121, in traverse_single return meth(obj, **kw) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 736, in visit_metadata [t for t in tables if self._can_create_table(t)]) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 711, in _can_create_table table.name, schema=effective_schema) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 1181, in has_table connection, "table_info", table_name, schema=schema) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 1577, in _get_table_pragma cursor = connection.execute(statement) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 942, in execute return self._execute_text(object, multiparams, params) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1104, in _execute_text statement, parameters File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context context) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception exc_info File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context context) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute cursor.execute(statement, parameters) OperationalError: (sqlite3.OperationalError) database is locked [SQL: u'PRAGMA table_info("user_t")'] (Background on this error at: http://sqlalche.me/e/e3q8) ______________________________ test_login_logout _______________________________ Traceback (most recent call last): File "/home/vagrant/src/radiasoft/sirepo/tests/oauth_test.py", line 22, in test_login_logout 'SIREPO_OAUTH_GITHUB_CALLBACK_URI': 'n/a', File "/home/vagrant/src/radiasoft/sirepo/sirepo/srunit.py", line 52, in flask_client server.init() File "/home/vagrant/src/radiasoft/sirepo/sirepo/server.py", line 703, in init uri_router.init(app, uwsgi) File "/home/vagrant/src/radiasoft/sirepo/sirepo/uri_router.py", line 76, in init importlib.import_module('sirepo.' + m).init_apis(app) File "/home/vagrant/src/radiasoft/sirepo/sirepo/oauth.py", line 138, in init_apis _init_tables(app) File "/home/vagrant/src/radiasoft/sirepo/sirepo/oauth.py", line 217, in _init_tables _db.create_all() File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 963, in create_all self._execute_for_all_tables(app, bind, 'create_all') File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 955, in _execute_for_all_tables op(bind=self.get_engine(app, bind), **extra) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", line 4005, in create_all tables=tables) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1940, in _run_visitor conn._run_visitor(visitorcallable, element, **kwargs) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1549, in _run_visitor **kwargs).traverse_single(element) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 121, in traverse_single return meth(obj, **kw) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 736, in visit_metadata [t for t in tables if self._can_create_table(t)]) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 711, in _can_create_table table.name, schema=effective_schema) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 1181, in has_table connection, "table_info", table_name, schema=schema) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 1577, in _get_table_pragma cursor = connection.execute(statement) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 942, in execute return self._execute_text(object, multiparams, params) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1104, in _execute_text statement, parameters File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context context) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception exc_info File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context context) File "/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute cursor.execute(statement, parameters) OperationalError: (sqlite3.OperationalError) database is locked [SQL: u'PRAGMA table_info("user_t")'] (Background on this error at: http://sqlalche.me/e/e3q8) ______________________________ test_get_data_file ______________________________ Traceback (most recent call last): File "/home/vagrant/src/radiasoft/sirepo/tests/server_test.py", line 62, in test_get_data_file run.nextRequest File "/home/vagrant/src/radiasoft/pykern/pykern/pkcollections.py", line 56, in __getattr__ return self.__getattribute__(name) AttributeError: 'Dict' object has no attribute 'nextRequest' ==================== 3 failed, 34 passed in 932.69 seconds ===================== ```

So, the same three errors, though test_get_data_file has switched back to AttributeError: 'Dict' object has no attribute 'nextRequest', instead of AssertionError: /home/vagrant/src/radiasoft/sirepo/tests/server_work/db/user/WuZ7gm5M/elegant/VEcL0HN7/bunchReport/elegant.bun: invalid or empty output from sddsprintout

I just re-ran test_get_data_file on the clean VM, to check whether there's some randomness, and indeed, this time it gave me AttributeError: 'Dict' object has no attribute 'nextRequest'.

Conclusion so far: none of the failures can be attributed to my branch or to my having somehow screwed up my main VM, using NFS for src/ may cause some problems, and there's still a mystery about test_get_data_file.

robnagler commented 5 years ago

NFS definitely causes problems. I debugged a speed problem this week on another developer's VM with NFS-mounted sources. lstat (git status) is an order of magnitude or two slower. It's good to know that this happens on Linux hosts, too, because I thought it was a Mac issue.

It's really odd that you got database is locked, because it is a fresh db unless you happen to be setting SIREPO_SRDB_ROOT or SIREPO_SERVER_DB_DIR. I don't think the tests clear those values, which is probably a bug. I wish people would print more context in error messages. This contains no information about what is locked:

OperationalError: (sqlite3.OperationalError) database is locked [SQL: u'PRAGMA table_info("user_t")'] (Background on this error at: http://sqlalche.me/e/e3q8)

For the sdds error, you can run this command manually to see what is output:

sirepo/template/elegant_common.py:61:subprocess_output ['sddsprintout', '-columns', '-spreadsheet=csv', '/home/vagrant/src/radiasoft/sirepo/tests/server_work/db/user/WuZ7gm5M/elegant/VEcL0HN7/bunchReport/elegant.bun']: exit=1 err=Error for sddsprintout:
njsmith commented 5 years ago

It's really odd that you got database is locked, because it is a fresh db unless you happen to be setting SIREPO_SRDB_ROOT or SIREPO_SERVER_DB_DIR. I don't think the tests clear those values, which is probably a bug.

I suspect it's something like: sqlite tries to lock the file. The lock command returns an error, meaning "this NFS mount doesn't have file-locking support". sqlite misinterprets the error as meaning "this file is already locked".

I just add nfs_version: 4 to my Vagrantfile. (Vagrant's default is to use NFS v3 for some reason. v4 has locking integrated into the protocol, rather than requiring some weird sideband protocol that always breaks.) Now those two tests pass, and the whole thing finishes in ~2 minutes instead of ~15:

``` [py2;@v sirepo]$ pytest tests ============================= test session starts ============================== platform linux2 -- Python 2.7.14, pytest-3.2.3, py-1.7.0, pluggy-0.4.0 rootdir: /home/vagrant/src/radiasoft/sirepo, inifile: plugins: forked-0.2 collected 37 items tests/application_data_test.py . tests/beaker_compat_test.py ... tests/blank_test.py . tests/bluesky_test.py ... tests/cookie_test.py . tests/crystal_test.py ... tests/exporter_test.py . tests/importer_test.py .. tests/oauth_test.py . tests/runner_test.py . tests/server1_test.py .. tests/server_test.py .F. tests/srw_test.py .. tests/template_common_test.py . tests/uri_router_test.py .. tests/pkcli/admin_test.py . tests/template/elegant_import_test.py . tests/template/elegant_rpn_test.py . tests/template/elegant_test.py . tests/template/shadow_generate_test.py . tests/template/srw_generate_test.py .. tests/template/srw_import_test.py . tests/template/srw_magmeaszip_test.py .. =================================== FAILURES =================================== ______________________________ test_get_data_file ______________________________ Traceback (most recent call last): File "/home/vagrant/src/radiasoft/sirepo/tests/server_test.py", line 62, in test_get_data_file run.nextRequest File "/home/vagrant/src/radiasoft/pykern/pykern/pkcollections.py", line 56, in __getattr__ return self.__getattribute__(name) AttributeError: 'Dict' object has no attribute 'nextRequest' ==================== 1 failed, 36 passed in 135.52 seconds ===================== ```
njsmith commented 5 years ago

OK, I tracked down this last failure in test_get_data_file.

Here's what's happening:

So it's a real bug, but given that (a) you're not hitting this in your production configuration, for whatever reason, and (b) this is exactly the code we're trying to get rid of (and this is why we're trying to get rid of it!), I don't think we should worry about this test failure.

robnagler commented 5 years ago

Excellent debugging, thanks!

Yes, let's ignore the test failure.

I added checking nfs v4 on macs. I don't think it works, but it's what we use Linux-Linux, and it works much better, of course.

I'm in a crunch this week so I don't have time to review the code. I'll try to get the review done by this weekend.

robnagler commented 5 years ago

There's an intermittent runner_test.py hang with a zombie sirepo process. The test process is in a loop with a rapid polling of runner.sock which no long exists:

select(0, NULL, NULL, NULL, {tv_sec=0, tv_usec=100000}) = 0 (Timeout)
stat("/home/vagrant/src/njsmith/sirepo/tests/runner_work/db/runner.sock", 0x7ffdb8c7df70) = -1 ENOENT (No such file or directory)
select(0, NULL, NULL, NULL, {tv_sec=0, tv_usec=100000}) = 0 (Timeout)
stat("/home/vagrant/src/njsmith/sirepo/tests/runner_work/db/runner.sock",

Here's the ps:

 5655 pts/2    S+     0:00 bash test.sh
 5661 pts/2    S+     0:01 python setup.py test
 5887 pts/2    Sl+    0:00 python setup.py test
 5979 ?        Ssl    0:00 orted --hnp --set-sid --report-uri 23 --singleton-died-pipe 24 -mca state_novm_select 1
 5986 pts/2    Z+     0:00 [sirepo] <defunct>

orted is running, which happens because mpi4py starts it, but it is detached from the group so hard to say if it is the cause of the zombie. Here's

 4501 pts/0    Ss     0:00 -bash USER=vagrant LOGNAME=vagrant HOME=/home/vagrant PATH=/usr/local/bin:/usr/bin MAIL=/var/mail/vagrant SHELL=/bin/bash SSH_
 4843 pts/0    S+     0:00  \_ screen -r
 1145 pts/1    Ss     0:00 /bin/bash
 1405 pts/1    S+     0:03  \_ emacs
 1407 pts/2    Ss     0:00      \_ /bin/bash
 5655 pts/2    S+     0:00      |   \_ bash test.sh
 5661 pts/2    S+     0:01      |       \_ python setup.py test
 5887 pts/2    Sl+    0:00      |           \_ python setup.py test
 5986 pts/2    Z+     0:00      |               \_ [sirepo] <defunct>

The test is failing when run directly:

Traceback (most recent call last):
  File "/home/vagrant/src/njsmith/sirepo/tests/runner_test.py", line 86, in test_runner_myapp
    run.nextRequest
  File "/home/vagrant/src/radiasoft/pykern/pykern/pkcollections.py", line 56, in __getattr__
    return self.__getattribute__(name)
AttributeError: 'Dict' object has no attribute 'nextRequest'
robnagler commented 5 years ago

The failure running individually was due to the 'complete' vs 'completed' that I had leftover. After I changed that, it worked, but the test still hangs from bash test.sh.

njsmith commented 5 years ago

There's an intermittent runner_test.py hang with a zombie sirepo process

So this apparently is a difference between pytest tests and setup.py test. These seem to be the same except that if you do setup.py test then it sets PYTHONPATH to:

'PYTHONPATH': '/home/vagrant/src/radiasoft/sirepo:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/src/radiasoft/pykern:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages:/home/vagrant/.pyenv/versions/2.7.14/envs/py2/lib/python2.7/site-packages',

This is then inherited by our py3 process, and somehow things don't work out right when we try to run py3 with 122 copies of the py2 environment's site-packages added to its sys.path. If I add a del os.environ['PYTHONPATH'] at the top of the test, then setup.py test starts working again.

Maybe this makes sense to PJ Eby, but it sure doesn't make sense to me.

What environment does test.sh run in? Is it run after everything is installed into the local python environment, to check that it works-as-deployed? Is the goal to test the installed sirepo, or the sirepo in the source tree?

I'm trying to figure out which of these options is best:

robnagler commented 5 years ago

I had to figure out why PYTHONPATH was being created so badly. I asked for these changes: https://github.com/pypa/setuptools/pull/1709 They won't put it in, because I didn't follow procedures. That won't fix things for us right now.

I think the fix is del runner_env['PYTHONPATH'], because the entire python environment should be setup completely by pyenv exec.

test.sh runs in docker build. It performs validation, runs the javascript test, and deploys to pypi if it has the credentials to do so. Since you are calling pyenv exec directly, I don't think it can run in tox or other environments that modify PYTHONPATH. py3 and py2 have to be in agreement, and that's the only environment it needs to run in. That being said, test.sh runs pksetup.PKDeploy which runs tox, which will be a problem unless we skip this test, which we should in that case.

One thing I did realize is that the SIREPO_SRDB_ROOT setting is probably not enough. We should cascade the entire config environment. pkconfig could do that, but that's for another time.

robnagler commented 5 years ago

This definitely fixes the python setup.py test hanging problem:

diff --git a/tests/runner_test.py b/tests/runner_test.py
index c2303bbf..ce950f6e 100644
--- a/tests/runner_test.py
+++ b/tests/runner_test.py
@@ -21,6 +21,7 @@ def test_runner_myapp():

     # Check if the py3 environment is set up
     py3_env = dict(os.environ)
+    del py3_env['PYTHONPATH']
     py3_env['PYENV_VERSION'] = 'py3'
     returncode = subprocess.call(
         ['pyenv', 'exec', 'sirepo', '--help'], env=py3_env
jaraco commented 5 years ago

I'm trying to figure out which of these options is best: modify test.sh, replacing setup.py test with pytest tests

That option seems best to me. We're looking to deprecate setup.py <anything>, including test.

If you're relying on the setup_requires support that setup.py test offers, that's also deprecated. Our best recommendation if you need to install packages to run tests is to use tox.

robnagler commented 5 years ago

Thanks for the notification @jaraco. I didn't know setup.py <anything> was deprecated.

I wonder if there's a plan for a command to create documentation, deployment, etc. per https://github.com/pypa/setuptools/issues/1684#issuecomment-471205138. Is the plan to rely on tox for everything?

jaraco commented 5 years ago

I wouldn’t say they’re deprecated yet, only discouraged. Tox may be suitable and it’s a model I’ve used for docs with success.

I guess it’s fair to say there isn’t a plan, just intentions and exploration and experimentation.