예제 #1
0
파일: test_command.py 프로젝트: sdss/clu
async def test_time_limit(event_loop):

    command = Command(command_string="new-command", time_limit=0.5)
    await asyncio.sleep(0.6)

    assert command.status == CommandStatus.TIMEDOUT
    assert command.done()
예제 #2
0
파일: conftest.py 프로젝트: sdss/HAL
def mock_send_command(mocker):

    command = Command()
    command.set_status("done")

    HALHelper._send_command = mocker.AsyncMock(return_value=command)
    Macro.send_command = mocker.AsyncMock(return_value=command)
예제 #3
0
파일: __init__.py 프로젝트: sdss/HAL
    async def _send_command(
        self,
        command: HALCommandType,
        target: str,
        cmd_str: str,
        raise_on_fail: bool = True,
        **kwargs,
    ):
        """Sends a command to a target."""

        bypasses = self.actor.helpers.bypasses

        # If the helper is bypassed, just returns a fake done command.
        if (self.name and self.name in bypasses) or ("all" in bypasses):
            command.warning(f"Bypassing command '{target} {cmd_str}'")
            cmd = Command()
            cmd.set_status(CommandStatus.DONE)
            return cmd

        if self.actor.tron is None or self.actor.tron.connected() is False:
            raise HALError("Not connected to Tron. Cannot send commands.")

        cmd = await command.send_command(target, cmd_str, **kwargs)
        if raise_on_fail and cmd.status.did_fail:
            if cmd.status == CommandStatus.TIMEDOUT:
                raise HALError(f"Command '{target} {cmd_str}' timed out.")
            else:
                raise HALError(f"Command '{target} {cmd_str}' failed.")

        return cast(Command, cmd)
예제 #4
0
파일: test_command.py 프로젝트: sdss/clu
def test_child_command_write(command):

    command.command_id = 666
    child = Command(command_string="new-command", parent=command)

    child.write("i", "hello")
    command.actor.write.assert_called_with(
        "i",
        message={"text": "hello"},
        command=command,
        broadcast=False,
        silent=False,
        **{},
    )
예제 #5
0
async def test_unique(json_actor, click_parser):

    cmd = Command("unique-command", actor=json_actor)
    click_parser.parse_command(cmd)
    await asyncio.sleep(0.01)

    cmd2 = Command("unique-command", actor=json_actor)
    click_parser.parse_command(cmd2)
    await cmd2

    assert cmd2.status.did_fail
    assert (
        "Another command with name my-parser-command-parser_unique-command"
        in cmd2.replies[-1].message["error"]
    )
예제 #6
0
async def test_cancellable(json_actor, click_parser):

    cmd = Command("cancellable-command", actor=json_actor)
    click_parser.parse_command(cmd)
    await asyncio.sleep(0.01)

    cmd2 = Command("cancellable-command --stop", actor=json_actor)
    click_parser.parse_command(cmd2)
    await cmd2
    await cmd

    assert cmd.status.did_fail
    assert cmd2.status.did_succeed
    assert "has been cancelled." in cmd.replies[-1].message["error"]
    assert "has been scheduled for cancellation" in cmd2.replies[-1].message["text"]
예제 #7
0
async def test_cancellable_duplicate(json_actor, click_parser):

    cmd = Command("cancellable-command", actor=json_actor)
    click_parser.parse_command(cmd)
    await asyncio.sleep(0.01)

    cmd2 = Command("cancellable-command", actor=json_actor)
    click_parser.parse_command(cmd2)
    await cmd2

    assert cmd2.status.did_fail
    assert (
        "Another command my-parser-command-parser_cancellable-command"
        in cmd2.replies[-1].message["error"]
    )
예제 #8
0
파일: test_command.py 프로젝트: sdss/clu
def test_child_command_finished(command):

    child = Command(command_string="new-command", parent=command)

    child.finish(text="Finished")
    command.actor.write.assert_called_with(
        "i",
        message={},
        text="Finished",
        command=command,
        broadcast=False,
        silent=False,
        **{},
    )

    assert child.status.did_succeed
예제 #9
0
파일: test_command.py 프로젝트: sdss/clu
def test_child_command_failed(command):

    child = Command(command_string="new-command", parent=command)

    child.fail(error="Failed")
    command.actor.write.assert_called_with(
        "e",
        message={},
        error="Failed",
        command=command,
        broadcast=False,
        silent=False,
        **{},
    )

    assert child.status.did_fail
예제 #10
0
async def test_help(json_actor, click_parser):

    cmd = Command(command_string="ping --help", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.is_done
예제 #11
0
async def test_help_not_found(json_actor, click_parser):

    cmd = Command(command_string="png --help", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_fail
예제 #12
0
async def test_abort(json_actor, click_parser):

    cmd = Command(command_string="command-abort", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_fail
    assert "Command 'command-abort' was aborted" in json_actor.mock_replies[-1]["error"]
예제 #13
0
async def test_parser_full_help(json_actor, click_parser, cmd_str):

    cmd = Command(command_string=cmd_str, actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.is_done
    assert "Usage: json_actor" in cmd.replies[-1].message["help"][0]
예제 #14
0
async def test_string_with_spaces(json_actor, click_parser):

    cmd = Command(command_string='mygroup neg-number-command --text "A test" -1')
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_succeed
    assert cmd.replies[-1]["text"] == "A test"
예제 #15
0
async def test_keyword_bad_parameter(json_actor, click_parser):

    cmd = Command(command_string="keyword bad_param", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_fail
    assert len(json_actor.mock_replies) == 2
    assert "is not part of the data model" in json_actor.mock_replies[1]["error"]
예제 #16
0
async def test_keyword(json_actor, click_parser):

    cmd = Command(command_string="keyword version", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_succeed
    assert len(json_actor.mock_replies) == 5
    assert json_actor.mock_replies[1]["text"].strip() == "version = {"
예제 #17
0
async def test_cancellable_cannot_find(json_actor, click_parser, mocker):

    mocker.patch.object(clu.parsers.click, "get_running_tasks", return_value=None)

    cmd = Command("cancellable-command --stop", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_fail
    assert "Cannot find running command" in cmd.replies[-1].message["error"]
예제 #18
0
async def test_exit_finish(json_actor, click_parser):

    cmd = Command(command_string="command-exit --finish", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    # Wait a bit more to allow for extra messages to arrive.
    await asyncio.sleep(0.1)

    assert cmd.status.is_done
예제 #19
0
async def test_keyword_no_model(json_actor, click_parser):

    json_actor.model = None

    cmd = Command(command_string="keyword version", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_fail
    assert len(json_actor.mock_replies) == 2
    assert "Actor does not have a data model" in json_actor.mock_replies[1]["error"]
예제 #20
0
async def test_uncaught_exception(json_actor, click_parser, caplog):

    cmd = Command(command_string="bad-command", actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_fail
    assert "uncaught error" in json_actor.mock_replies[-1]["error"]

    last_log = caplog.record_tuples[-1]
    assert last_log[1] == logging.ERROR
    assert "Command 'bad-command' failed with error:" in last_log[2]

    # Confirm the traceback was logged.
    log_filename = click_parser.log.log_filename
    assert os.path.exists(log_filename)

    log_data = open(log_filename).read()
    assert "This is an exception in the command." in log_data
예제 #21
0
async def test_command_neg_number(json_actor, click_parser, command_string):

    cmd = Command(command_string="mygroup " + command_string, actor=json_actor)
    click_parser.parse_command(cmd)
    await cmd

    assert cmd.status.did_succeed
    # This is a different test. We are testing that mygroup got called
    # with the parser_obj "object" and its value was passed.
    assert cmd.replies[-3]["object"] == "my_object"

    if "-15" in command_string:
        assert cmd.replies[-2]["value"] == -15
    else:
        assert cmd.replies[-2]["value"] == 15

    if "-r" in command_string or "--recursive" in command_string:
        assert cmd.replies[-2]["recursive"] is True
    else:
        assert cmd.replies[-2]["recursive"] is False
예제 #22
0
    def send_message(
        self,
        parent_command: Command,
        message: str,
        command_id: Optional[int] = None,
    ) -> Command:
        """Sends a message to the device."""

        if not self.is_connected():
            raise OSError("Device is not connected")

        command_id = command_id or self.id_pool.get()

        dev_command = Command(message,
                              command_id=command_id,
                              parent=parent_command)
        self.running_commands[command_id] = dev_command

        self.write(f"{command_id} {message}")

        return dev_command
예제 #23
0
파일: test_command.py 프로젝트: sdss/clu
def test_child_command_running(command):

    child = Command(command_string="new-command", parent=command)

    child.set_status("RUNNING")
    command.actor.write.assert_not_called()
예제 #24
0
파일: test_command.py 프로젝트: sdss/clu
def command(mocker):

    yield Command(command_string="say-hello",
                  command_id=100,
                  actor=mocker.MagicMock())
예제 #25
0
파일: test_command.py 프로젝트: sdss/clu
def test_child_command(command):

    child = Command(command_string="new-command", parent=command)
    assert child.parent == command
예제 #26
0
파일: conftest.py 프로젝트: sdss/HAL
def command(actor):

    yield Command(actor=actor)