Browse Source

Commander - a wrapper around ProcessLibrary and SSHLibrary

Daniel Sheffield 1 year ago
commit
2aea2291cf
3 changed files with 85 additions and 0 deletions
  1. 48 0
      Commander.py
  2. 1 0
      requirements.txt
  3. 36 0
      test.robot

+ 48 - 0
Commander.py

@@ -0,0 +1,48 @@
+from robot.api.deco import library, keyword
+from robot.libraries.BuiltIn import BuiltIn
+
+@library
+class Commander:
+
+    @property
+    def OperatingSystem(self):
+        self._operatingsystem = self._operatingsystem or self.BuiltIn.get_library_instance('OperatingSystem')
+        return self._operatingsystem
+
+    @property
+    def Process(self):
+        self._process = self._process or self.BuiltIn.get_library_instance('Process')
+        return self._process
+
+    @property
+    def BuiltIn(self):
+        self._builtin = self._builtin or BuiltIn()
+        return self._builtin
+
+    def __init__(self):
+        self._process = None
+        self._builtin = None
+        self._operatingsystem = None
+
+    @keyword
+    def execute_pipeline(self, *commands, stdout=None, append=False):
+        procs = []
+        append = (stdout and append) or False
+        if append:
+            self.OperatingSystem.append_to_file(stdout, '')
+            self.OperatingSystem.move_file(stdout, f'{stdout}.old')
+
+        procs.append(self.Process.start_process(*commands[0]))
+        prev = procs[-1]
+        for command in commands[1:-1]:
+            procs.append(self.Process.start_process(*command, stdin=prev.stdout))
+            prev = procs[-1]
+        procs.append(self.Process.start_process(
+            *commands[-1], stdin=prev.stdout, stdout=f'{stdout}.new' if append else stdout))
+        ret = self.Process.wait_for_process(procs[-1])
+        if append:
+            ret = self.Process.run_process('cat', f'{stdout}.old', f'{stdout}.new', stdout=stdout)
+            self.OperatingSystem.remove_file(f'{stdout}.new')
+            self.OperatingSystem.remove_file(f'{stdout}.old')
+        return ret
+

+ 1 - 0
requirements.txt

@@ -0,0 +1 @@
+robotframework

+ 36 - 0
test.robot

@@ -0,0 +1,36 @@
+*** Settings ***
+Library    Process
+Library    Commander
+Library    OperatingSystem
+Library    String
+Library    Collections
+
+*** Variables ***
+@{COMMAND1}    echo    a b c
+@{COMMAND2}    cut     -f2
+@{COMMAND3}    wc
+
+*** Test Cases ***
+Test Execute Pipeline
+    ${proc}    Execute Pipeline    ${COMMAND1}    ${COMMAND2}    ${COMMAND3}
+    ${expected}    Catenate    SEPARATOR=${SPACE*7}    ${EMPTY}    1    3    6
+    Should Be Equal As Strings    ${SPACE}${proc.stdout}    ${expected}
+
+Test Execute Pipeline stdout
+    ${proc}    Execute Pipeline    ${COMMAND1}    ${COMMAND2}    ${COMMAND3}
+    ...    stdout=out
+    ${expected}    Catenate    SEPARATOR=${SPACE*7}    ${EMPTY}    1    3    6
+    ${expected}    Get Substring    ${expected}    1
+    ${output}    Get File    out
+    ${output}    Split To Lines    ${output}
+    Should Be Equal As Strings    ${output}[0]    ${expected}
+
+Test Execute Pipeline stdout append
+    ${existing}    Get File    exist
+    ${proc}    Execute Pipeline    ${COMMAND1}    ${COMMAND2}    ${COMMAND3}
+    ...    stdout=exist    append=True
+    ${expected}    Catenate    SEPARATOR=${SPACE*7}    ${EMPTY}    1    3    6
+    ${expected}    Get Substring    ${expected}    1
+    ${output}    Get File    exist
+    ${output}    Split To Lines    ${output}
+    Should Be Equal As Strings    ${output}[0]    ${existing}${expected}