1import os 2import signal 3import socket 4import sys 5 6import py 7import pytest 8 9import tox 10from tox.logs import ResultLog 11 12 13@pytest.fixture(name="pkg") 14def create_fake_pkg(tmpdir): 15 pkg = tmpdir.join("hello-1.0.tar.gz") 16 pkg.write("whatever") 17 return pkg 18 19 20def test_pre_set_header(): 21 replog = ResultLog() 22 d = replog.dict 23 assert replog.dict == d 24 assert replog.dict["reportversion"] == "1" 25 assert replog.dict["toxversion"] == tox.__version__ 26 assert replog.dict["platform"] == sys.platform 27 assert replog.dict["host"] == socket.getfqdn() 28 data = replog.dumps_json() 29 replog2 = ResultLog.from_json(data) 30 assert replog2.dict == replog.dict 31 32 33def test_set_header(pkg): 34 replog = ResultLog() 35 d = replog.dict 36 assert replog.dict == d 37 assert replog.dict["reportversion"] == "1" 38 assert replog.dict["toxversion"] == tox.__version__ 39 assert replog.dict["platform"] == sys.platform 40 assert replog.dict["host"] == socket.getfqdn() 41 expected = { 42 "basename": "hello-1.0.tar.gz", 43 "md5": pkg.computehash("md5"), 44 "sha256": pkg.computehash("sha256"), 45 } 46 env_log = replog.get_envlog("a") 47 env_log.set_header(installpkg=pkg) 48 assert env_log.dict["installpkg"] == expected 49 50 data = replog.dumps_json() 51 replog2 = ResultLog.from_json(data) 52 assert replog2.dict == replog.dict 53 54 55def test_addenv_setpython(pkg): 56 replog = ResultLog() 57 envlog = replog.get_envlog("py36") 58 envlog.set_python_info(py.path.local(sys.executable)) 59 envlog.set_header(installpkg=pkg) 60 assert envlog.dict["python"]["version_info"] == list(sys.version_info) 61 assert envlog.dict["python"]["version"] == sys.version 62 assert envlog.dict["python"]["executable"] == sys.executable 63 64 65def test_get_commandlog(pkg): 66 replog = ResultLog() 67 envlog = replog.get_envlog("py36") 68 assert "setup" not in envlog.dict 69 setuplog = envlog.get_commandlog("setup") 70 envlog.set_header(installpkg=pkg) 71 setuplog.add_command(["virtualenv", "..."], "venv created", 0) 72 expected = [{"command": ["virtualenv", "..."], "output": "venv created", "retcode": 0}] 73 assert setuplog.list == expected 74 assert envlog.dict["setup"] 75 setuplog2 = replog.get_envlog("py36").get_commandlog("setup") 76 assert setuplog2.list == setuplog.list 77 78 79@pytest.mark.parametrize("exit_code", [None, 0, 5, 128 + signal.SIGTERM, 1234]) 80@pytest.mark.parametrize("os_name", ["posix", "nt"]) 81def test_invocation_error(exit_code, os_name, mocker, monkeypatch): 82 monkeypatch.setattr(os, "name", value=os_name) 83 mocker.spy(tox.exception, "exit_code_str") 84 result = str(tox.exception.InvocationError("<command>", exit_code=exit_code)) 85 # check that mocker works, because it will be our only test in 86 # test_z_cmdline.py::test_exit_code needs the mocker.spy above 87 assert tox.exception.exit_code_str.call_count == 1 88 call_args = tox.exception.exit_code_str.call_args 89 assert call_args == mocker.call("InvocationError", "<command>", exit_code) 90 if exit_code is None: 91 assert "(exited with code" not in result 92 else: 93 assert "(exited with code %d)" % exit_code in result 94 note = "Note: this might indicate a fatal error signal" 95 if (os_name == "posix") and (exit_code == 128 + signal.SIGTERM): 96 assert note in result 97 assert "({} - 128 = {}: SIGTERM)".format(exit_code, signal.SIGTERM) in result 98 else: 99 assert note not in result 100