Beispiel #1
0
def test_batched_command():
    bc = BatchedCommand(cmd=[sys.executable, "-i", "-u", "-q", "-"])
    response = bc("print('a')")
    assert_equal(response, "a")
    response = bc("print(2 + 1)")
    assert_equal(response, "3")
    stderr = bc.close(return_stderr=True)
    assert_is_not_none(stderr)
Beispiel #2
0
def test_batched_close_ok():
    # Expect a long wait and no timeout if the process runs longer than timeout
    # seconds and the config for "datalad.runtime.stalled-external" has its
    # default value.
    bc = BatchedCommand(cmd=[sys.executable, "-i", "-u", "-q", "-"], timeout=2)
    # Send at least one instruction to start the subprocess
    response = bc("import time; print('a')")
    assert_equal(response, "a")
    bc.stdin_queue.put("time.sleep(.5); exit(3)\n".encode())
    bc.close(return_stderr=False)
    assert_true(bc.wait_timed_out is False)
    assert_equal(bc.return_code, 3)
Beispiel #3
0
def test_tuple_requests():
    bc = BatchedCommand(cmd=py2cmd("""
import time
import sys
print(f"{time.time()}:{sys.stdin.readline().strip()}")
            """))

    start_time_1, line = bc(("one", "line")).split(":")
    assert_equal(line, "one line")
    start_time_2, line = bc(("end", "now")).split(":")
    assert_not_equal(start_time_1, start_time_2)
    assert_equal(line, "end now")
    bc.close(return_stderr=False)
Beispiel #4
0
def test_batched_close_abandon():
    # Expect a timeout if the process runs longer than timeout and the config
    # for "datalad.runtime.stalled-external" is "abandon".
    bc = BatchedCommand(cmd=[sys.executable, "-i", "-u", "-q", "-"],
                        timeout=.1)
    # Send at least one instruction to start the subprocess
    response = bc("import time; print('a')")
    assert_equal(response, "a")
    bc.stdin_queue.put("time.sleep(2); exit(1)\n".encode())
    with unittest.mock.patch("datalad.cfg") as cfg_mock:
        cfg_mock.configure_mock(**{"obtain.return_value": "abandon"})
        bc.close(return_stderr=False)
        assert_true(bc.wait_timed_out is True)
        assert_is_none(bc.return_code)
Beispiel #5
0
def test_batched_restart():
    # Expect that the process is restarted after exit.
    bc = BatchedCommand(
        cmd=py2cmd("import os\n"
                   "import sys\n"
                   "print(os.getpid(), sys.stdin.readline().strip())\n"))

    # Send four lines
    lines = [f"line-{i}" for i in range(4)]
    responses = [bc(lines[i]).split() for i in range(4)]
    pid_set = set([int(r[0]) for r in responses])
    assert_equal(len(pid_set), 4)
    response_lines = [r[1] for r in responses]
    assert_equal(lines, response_lines)
    bc.close(return_stderr=False)
Beispiel #6
0
def test_command_fail_2():
    # Expect that the return code of a failing command is caught,
    # that None is returned as result and that the process is restarted,
    # if the batched command is called again.
    bc = BatchedCommand(cmd=py2cmd("""
print(a*b)
            """))

    # Send something to start the process
    result = bc("line one")
    assert_not_equal(bc.return_code, 0)
    assert_is_none(result)
    result = bc("line two")
    assert_not_equal(bc.return_code, 0)
    assert_is_none(result)
    bc.close(return_stderr=False)
Beispiel #7
0
def test_command_fail_1():
    # Expect that the return code of a failing command is caught,
    # that None is returned as result.
    bc = BatchedCommand(cmd=py2cmd("""
print("something")
exit(3)
            """))

    # Send something to start the process
    result = bc("line one")
    assert_equal(bc.return_code, None)
    assert_equal(result, "something")
    result = bc("line two")
    assert_equal(bc.return_code, 3)
    assert_equal(result, None)
    bc.close(return_stderr=False)