| Index: mojo/devtools/common/devtoolslib/linux_shell_unittest.py
|
| diff --git a/mojo/devtools/common/devtoolslib/linux_shell_unittest.py b/mojo/devtools/common/devtoolslib/linux_shell_unittest.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6a70848205ae62e35d63a469b2da5d2a028ae6b7
|
| --- /dev/null
|
| +++ b/mojo/devtools/common/devtoolslib/linux_shell_unittest.py
|
| @@ -0,0 +1,93 @@
|
| +# 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 linux shell abstraction."""
|
| +
|
| +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 LinuxShellTest(unittest.TestCase):
|
| + """Tests the Linux shell abstraction.
|
| +
|
| + These do not actually run the shell binary, it is substituted for shell utils
|
| + like sleep or cat.
|
| + """
|
| +
|
| + 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()
|
|
|