コード例 #1
0
async def test_task_before_after_callbacks(output: CapLines):
    conf = PyProjectConfig.parse_toml(f"""
    [tool.foremon]
    scripts = ["true"]
    """).tool.foremon

    async def async_before(task, trigger):
        print("BEFORE ASYNC")

    def before(task, trigger):
        print("BEFORE NORMAL")

    async def async_after(task, trigger):
        print("AFTER ASYNC")

    def after(task, trigger):
        print("AFTER NORMAL")

    await (ScriptTask(conf).add_before_callback(
        async_before).add_before_callback(before).add_after_callback(
            async_after).add_after_callback(after).run())

    assert output.stdout_expect('BEFORE ASYNC')
    assert output.stdout_expect('BEFORE NORMAL')
    assert output.stdout_expect('AFTER ASYNC')
    assert output.stdout_expect('AFTER NORMAL')
コード例 #2
0
async def test_task_unexpected_returncode(output: CapLines):
    conf = PyProjectConfig.parse_toml(f"""
    [tool.foremon]
    patterns = ["*"]
    returncode = 1
    scripts = ["true"]
    """).tool.foremon

    task = ScriptTask(conf)
    await task.run()
    assert output.stderr_expect('starting.*')
    assert output.stderr_expect('app crashed.*')
コード例 #3
0
async def test_task_run_one_script(output: CapLines):
    conf = PyProjectConfig.parse_toml(f"""
    [tool.foremon]
    patterns = ["*"]
    scripts = ["echo Hello World!"]
    """).tool.foremon

    task = ScriptTask(conf)
    await task.run()
    assert output.stderr_expect('starting.*')
    assert output.stdout_expect('Hello World!')
    assert output.stderr_expect('clean exit.*')
コード例 #4
0
async def test_task_run_from_queueiter(output: CapLines):
    conf = PyProjectConfig.parse_toml(f"""
    [tool.foremon]
    scripts = ["echo START 1", "sleep 0.2", "echo END 1"]

        [tool.foremon.test]
        scripts = ["echo START 2", "sleep 0.2", "echo END 2"]
    """).tool.foremon

    queue = asyncio.Queue()

    queue.put_nowait(ScriptTask(conf).run())
    queue.put_nowait(ScriptTask(conf.configs[0]).run())
    queue.put_nowait(None)

    async for coro in queueiter(queue):
        await coro

    assert output.stdout_expect('START 1')
    assert output.stdout_expect('END 1')
    assert output.stdout_expect('START 2')
    assert output.stdout_expect('END 2')
コード例 #5
0
async def test_task_run_from_queue(output: CapLines):
    conf = PyProjectConfig.parse_toml(f"""
    [tool.foremon]
    scripts = ["echo ok"]
    """).tool.foremon

    task = ScriptTask(conf)
    queue = asyncio.Queue()

    queue.put_nowait(task.run())
    queue.put_nowait(task.run())
    queue.put_nowait(None)

    # Serial exec
    while True:
        task = await queue.get()
        if task == None: break
        await task

    assert output.stderr_expect('starting.*')
    assert output.stdout_expect('ok')
    assert output.stderr_expect('starting.*')
    assert output.stdout_expect('ok')
コード例 #6
0
def test_task_add_monitor_duplicate():

    conf = PyProjectConfig.parse_toml(f"""
    [tool.foremon]
    scripts = ["echo START 1", "sleep 0.2", "echo END 1"]

        [tool.foremon.test]
        scripts = ["echo START 2", "sleep 0.2", "echo END 2"]
    """).tool.foremon

    from foremon.monitor import Monitor

    task = ScriptTask(conf)
    mon = Monitor()

    mon.add_task(task)

    with pytest.raises(ForemonError):
        mon.add_task(task)
コード例 #7
0
async def test_task_terminate(output: CapLines):
    conf = PyProjectConfig.parse_toml(f"""
    [tool.foremon]
    patterns = ["*"]
    returncode = 0
    term_signal = "SIGTERM"
    scripts = ["sleep 10"]
    """).tool.foremon

    task = ScriptTask(conf)

    def do_later():
        if task.running:
            task.terminate()
        else:
            task.loop.call_later(0.1, do_later)

    do_later()
    await task.run()
    assert output.stderr_expect('terminated.*')
コード例 #8
0
async def test_task_is_killed(output: CapLines):
    conf = PyProjectConfig.parse_toml(f"""
    [tool.foremon]
    patterns = ["*"]
    returncode = 0
    scripts = ["sleep 10"]
    """).tool.foremon

    task = ScriptTask(conf)

    def do_later():
        if task.running:
            display_info("about to send kill")
            os.kill(task.process.pid, signal.SIGKILL)
        else:
            task.loop.call_later(0.1, do_later)

    do_later()
    await task.run()
    display_info("about to send kill")
    assert output.stderr_expect('app crashed -9.*')
コード例 #9
0
def monitor_from_toml(toml: str) -> Monitor:
    conf = PyProjectConfig.parse_toml(toml).tool.foremon
    task = ScriptTask(conf)
    monitor = Monitor(pipe=None)
    monitor.add_task(task)
    return monitor