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