summaryrefslogtreecommitdiff
path: root/tests/test_misc.py
diff options
context:
space:
mode:
authorNoah Spurrier <noah@squaretrade.com>2012-10-26 11:19:10 -0700
committerNoah Spurrier <noah@squaretrade.com>2012-10-26 11:19:10 -0700
commit7999ca657997e78febfb3fb89cfcc066d50bf788 (patch)
tree7ff33465bb4f8f79b92add505d11d4b731dfe6a7 /tests/test_misc.py
parent6b65a76c26d72caf0a5b11725750861bf89f2b75 (diff)
downloadpexpect-7999ca657997e78febfb3fb89cfcc066d50bf788.tar.gz
Moved everything up one directory level.
Diffstat (limited to 'tests/test_misc.py')
-rwxr-xr-xtests/test_misc.py217
1 files changed, 217 insertions, 0 deletions
diff --git a/tests/test_misc.py b/tests/test_misc.py
new file mode 100755
index 0000000..61abfde
--- /dev/null
+++ b/tests/test_misc.py
@@ -0,0 +1,217 @@
+#!/usr/bin/env python
+'''
+PEXPECT LICENSE
+
+ This license is approved by the OSI and FSF as GPL-compatible.
+ http://opensource.org/licenses/isc-license.txt
+
+ Copyright (c) 2012, Noah Spurrier <noah@noah.org>
+ PERMISSION TO USE, COPY, MODIFY, AND/OR DISTRIBUTE THIS SOFTWARE FOR ANY
+ PURPOSE WITH OR WITHOUT FEE IS HEREBY GRANTED, PROVIDED THAT THE ABOVE
+ COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL COPIES.
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+'''
+import pexpect
+import unittest
+import PexpectTestCase
+import time
+import os
+import re
+
+class TestCaseMisc(PexpectTestCase.PexpectTestCase):
+
+ def test_isatty (self):
+ child = pexpect.spawn('cat')
+ assert child.isatty(), "Not returning True. Should always be True."
+ def test_read (self):
+ child = pexpect.spawn('cat')
+ child.sendline ("abc")
+ child.sendeof()
+ assert child.read(0) == '', "read(0) did not return ''"
+ assert child.read(1) == 'a', "read(1) did not return 'a'"
+ assert child.read(1) == 'b', "read(1) did not return 'b'"
+ assert child.read(1) == 'c', "read(1) did not return 'c'"
+ assert child.read(2) == '\r\n', "read(2) did not return '\\r\\n'"
+ assert child.read() == 'abc\r\n', "read() did not return 'abc\\r\\n'"
+ def test_readline (self):
+ '''See the note in test_readlines() for an explaination as to why
+ I allow line3 and line4 to return multiple patterns.
+ Basically, this is done to handle a valid condition on slow systems.
+ '''
+ child = pexpect.spawn('cat')
+ child.sendline ("abc")
+ child.sendline ("123")
+ child.sendeof()
+ line1 = child.readline(0)
+ line2 = child.readline()
+ line3 = child.readline(2)
+ line4 = child.readline(1)
+ line5 = child.readline()
+ assert line1 == '', "readline(0) did not return ''. Returned: " + repr(line1)
+ assert line2 == 'abc\r\n', "readline() did not return 'abc\\r\\n'. Returned: " + repr(line2)
+ assert ( (line3 == 'abc\r\n' or line3 == '123\r\n'),
+ "readline(2) did not return 'abc\\r\\n'. Returned: "
+ + repr(line3) )
+ assert ( (line4 == '123\r\n' or line4 == 'abc\r\n'),
+ "readline(1) did not return '123\\r\\n'. Returned: "
+ + repr(line4) )
+ assert line5 == '123\r\n', "readline() did not return '123\\r\\n'. Returned: " + repr(line5)
+ def test_iter (self):
+ '''See the note in test_readlines() for an explaination as to why
+ I allow line3 and line4 to return multiple patterns.
+ Basically, this is done to handle a valid condition on slow systems.
+ '''
+ child = pexpect.spawn('cat')
+ child.sendline ("abc")
+ child.sendline ("123")
+ child.sendeof()
+ # Don't use ''.join() because we want to test the ITERATOR.
+ page = ""
+ for line in child:
+ page = page + line
+ assert ( (page == 'abc\r\nabc\r\n123\r\n123\r\n' or
+ page == 'abc\r\n123\r\nabc\r\n123\r\n') ,
+ "iterator did not work. page=%s"%repr(page) )
+ def test_readlines(self):
+ '''Note that on some slow or heavily loaded systems that the lines
+ coming back from 'cat' may come even after the EOF.
+ We except to see two copies of the lines we send 'cat'.
+ The first line is the TTY echo, the second line is from 'cat'.
+ Usually 'cat' will respond with 'abc' before we have a chance to
+ send the second line, '123'. If this does not happen then the
+ lines may appear out of order. This is technically not an error.
+ That's just the nature of asynchronous communication.
+ This is why the assert will allow either of the two possible
+ patterns to be returned by lineslined(). The (lame) alternative is
+ to put a long sleep between the two sendline() calls, but then
+ I have to make assumptions about how fast 'cat' can reply.
+ '''
+ child = pexpect.spawn('cat')
+ child.sendline ("abc")
+ child.sendline ("123")
+ child.sendeof()
+ page = child.readlines()
+ page = ''.join(page)
+ assert ( (page == 'abc\r\nabc\r\n123\r\n123\r\n' or
+ page == 'abc\r\n123\r\nabc\r\n123\r\n'),
+ "readlines() did not work. page=%s"%repr(page) )
+ def test_write (self):
+ child = pexpect.spawn('cat')
+ child.write('a')
+ child.write('\r')
+ assert child.readline() == 'a\r\n', "write() did not work"
+ def test_writelines (self):
+ child = pexpect.spawn('cat')
+ child.writelines(['abc','123','xyz','\r'])
+ child.sendeof()
+ line = child.readline()
+ assert line == 'abc123xyz\r\n', "writelines() did not work. line=%s"%repr(line)
+ def test_eof(self):
+ child = pexpect.spawn('cat')
+ child.sendeof()
+ try:
+ child.expect ('the unexpected')
+ except:
+ pass
+ assert child.eof(), "child.eof() did not return True"
+ def test_terminate(self):
+ child = pexpect.spawn('cat')
+ child.terminate(force=1)
+ assert child.terminated, "child.terminated is not True"
+ def test_bad_child_pid(self):
+ child = pexpect.spawn('cat')
+ child.terminate(force=1)
+ child.terminated = 0 # Force invalid state to test code
+ try:
+ child.isalive()
+ except pexpect.ExceptionPexpect, e:
+ pass
+ else:
+ self.fail ("child.isalive() should have raised a pexpect.ExceptionPexpect")
+ child.terminated = 1 # Force back to valid state so __del__ won't complain
+ def test_bad_arguments (self):
+ '''This tests that we get a graceful error when passing bad arguments.'''
+ try:
+ p = pexpect.spawn(1)
+ except pexpect.ExceptionPexpect, e:
+ pass
+ else:
+ self.fail ("pexpect.spawn(1) should have raised a pexpect.ExceptionPexpect.")
+ try:
+ p = pexpect.spawn('ls', '-la') # should really use pexpect.spawn('ls', ['-ls'])
+ except TypeError, e:
+ pass
+ else:
+ self.fail ("pexpect.spawn('ls', '-la') should have raised a TypeError.")
+ try:
+ p = pexpect.spawn('cat')
+ p.close()
+ p.read_nonblocking(size=1, timeout=3)
+ except ValueError, e:
+ pass
+ else:
+ self.fail ("read_nonblocking on closed spawn object should have raised a ValueError.")
+ def test_isalive(self):
+ child = pexpect.spawn('cat')
+ assert child.isalive(), "child.isalive() did not return True"
+ child.sendeof()
+ child.expect(pexpect.EOF)
+ assert not child.isalive(), "child.isalive() did not return False"
+ def test_bad_type_in_expect(self):
+ child = pexpect.spawn('cat')
+ try:
+ child.expect({}) # We don't support dicts yet. Should give TypeError
+ except TypeError, e:
+ pass
+ else:
+ self.fail ("child.expect({}) should have raised a TypeError")
+ def test_winsize(self):
+ child = pexpect.spawn('cat')
+ child.setwinsize(10,13)
+ assert child.getwinsize()==(10,13), "getwinsize() did not return (10,13)"
+ def test_env(self):
+ default = pexpect.run('env')
+ userenv = pexpect.run('env', env={'foo':'pexpect'})
+ assert default!=userenv, "'default' and 'userenv' should be different"
+ assert 'foo' in userenv and 'pexpect' in userenv, "'foo' and 'pexpect' should be in 'userenv'"
+ def test_cwd (self): # This assumes 'pwd' and '/tmp' exist on this platform.
+ default = pexpect.run('pwd')
+ tmpdir = pexpect.run('pwd', cwd='/tmp')
+ assert default!=tmpdir, "'default' and 'tmpdir' should be different"
+ assert ('tmp' in tmpdir), "'tmp' should be returned by 'pwd' command"
+ def test_which (self):
+ p = os.defpath
+ ep = os.environ['PATH']
+ os.defpath = ":/tmp"
+ os.environ['PATH'] = ":/tmp"
+ wp = pexpect.which ("ticker.py")
+ assert wp == 'ticker.py', "Should return a string. Returned %s" % wp
+ os.defpath = "/tmp"
+ os.environ['PATH'] = "/tmp"
+ wp = pexpect.which ("ticker.py")
+ assert wp == None, "Executable should not be found. Returned %s" % wp
+ os.defpath = p
+ os.environ['PATH'] = ep
+ def test_searcher_re (self):
+ ss = pexpect.searcher_re ([re.compile('this'),re.compile('that'),re.compile('and'),re.compile('the'),re.compile('other')])
+ assert ss.__str__() == 'searcher_re:\n 0: re.compile("this")\n 1: re.compile("that")\n 2: re.compile("and")\n 3: re.compile("the")\n 4: re.compile("other")'
+ ss = pexpect.searcher_re ([pexpect.TIMEOUT,re.compile('this'),re.compile('that'),re.compile('and'),pexpect.EOF,re.compile('other')])
+ assert ss.__str__() == 'searcher_re:\n 0: TIMEOUT\n 1: re.compile("this")\n 2: re.compile("that")\n 3: re.compile("and")\n 4: EOF\n 5: re.compile("other")'
+ def test_searcher_string (self):
+ ss = pexpect.searcher_string (['this','that','and','the','other'])
+ assert ss.__str__() == 'searcher_string:\n 0: "this"\n 1: "that"\n 2: "and"\n 3: "the"\n 4: "other"', repr(ss.__str__())
+ ss = pexpect.searcher_string (['this',pexpect.EOF,'that','and','the','other',pexpect.TIMEOUT])
+ assert ss.__str__() == 'searcher_string:\n 0: "this"\n 1: EOF\n 2: "that"\n 3: "and"\n 4: "the"\n 5: "other"\n 6: TIMEOUT'
+
+if __name__ == '__main__':
+ unittest.main()
+
+suite = unittest.makeSuite(TestCaseMisc,'test')
+