Index: mojo/devtools/common/devtoolslib/shell_unittest.py |
diff --git a/mojo/devtools/common/devtoolslib/shell_unittest.py b/mojo/devtools/common/devtoolslib/shell_unittest.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d472d8eb2f538a40cbc38017c8c414526d8e92d2 |
--- /dev/null |
+++ b/mojo/devtools/common/devtoolslib/shell_unittest.py |
@@ -0,0 +1,94 @@ |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Tests for the shell abstraction.""" |
etiennej
2015/08/18 09:58:43
This is actually about LinuxShell. Maybe rename th
ppi
2015/08/18 10:11:05
Done.
|
+ |
+import imp |
+import os.path |
+import sys |
+import unittest |
+import tempfile |
+import shutil |
+import threading |
+ |
+try: |
+ imp.find_module("devtoolslib") |
+except ImportError: |
+ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
+ |
+from devtoolslib.linux_shell import LinuxShell |
+ |
+ |
+class ShellTest(unittest.TestCase): |
+ """Tests the shell abstraction. |
+ |
+ These do not actually run the shell binary, it is substituted for shell utils |
+ like sleep or cat. Currently these only run against the Linux shell |
+ abstraction. |
+ """ |
+ |
+ def test_run_and_get_output(self): |
+ """Verifies that run_and_get_output() correctly builds and passes the |
+ argument list to the binary. |
+ """ |
+ shell = LinuxShell('echo') |
+ shell_args = ['--some-argument 42', 'unicornA', 'unicornB'] |
+ return_code, output, did_time_out = shell.run_and_get_output(shell_args) |
+ |
+ self.assertEquals(0, return_code) |
+ self.assertEquals(' '.join(shell_args), output.strip()) |
+ self.assertEquals(False, did_time_out) |
+ |
+ def test_run_and_get_output_timeout_met(self): |
+ """Verifies the returned values of run_and_get_output() when timeout is set |
+ but the binary exits before it is hit. |
+ """ |
+ shell = LinuxShell('echo') |
+ shell_args = ['--some-argument 42', 'unicornA', 'unicornB'] |
+ return_code, output, did_time_out = shell.run_and_get_output(shell_args, |
+ timeout=1) |
+ |
+ self.assertEquals(0, return_code) |
+ self.assertEquals(' '.join(shell_args), output.strip()) |
+ self.assertEquals(False, did_time_out) |
+ |
+ def test_run_and_get_output_timeout_exceeded(self): |
+ """Verifies the returned values of run_and_get_output() when timeout is set |
+ and the binary does not exit before it is hit. |
+ """ |
+ temp_dir = tempfile.mkdtemp() |
+ fifo_path = os.path.join(temp_dir, 'fifo') |
+ os.mkfifo(fifo_path) |
+ |
+ class Data: |
+ fifo = None |
+ |
+ # Any write to the fifo will block until it is open for reading by cat, |
+ # hence write on a background thread. |
+ def _write_to_fifo(): |
+ Data.fifo = open(fifo_path, 'w') |
+ print >> Data.fifo, 'abc' |
+ Data.fifo.flush() |
+ write_thread = threading.Thread(target=_write_to_fifo) |
+ write_thread.start() |
+ |
+ # The call to cat should read what is written to the fifo ('abc') and then |
+ # stall forever, as we don't close the fifo after writing. |
+ shell = LinuxShell('cat') |
+ args = [fifo_path] |
+ _, output, did_time_out = shell.run_and_get_output(args, timeout=1) |
+ |
+ write_thread.join() |
+ if Data.fifo: |
+ Data.fifo.close() |
+ |
+ # Verify that the process did time out and that the output was correctly |
+ # produced before that. |
+ self.assertEquals(True, did_time_out) |
+ self.assertEquals('abc', output.strip()) |
+ shutil.rmtree(temp_dir) |
+ |
+ |
+if __name__ == "__main__": |
+ unittest.main() |