def testNumberedRedirect(self): run( 'python -c "import sys;' 'print >> sys.stderr, \'error\';print \'out\'"' '> stdout.txt 2> stderr.txt', globals(), locals()) self.assertEquals('error\n', file('stderr.txt').read()) self.assertEquals('out\n', file('stdout.txt').read())
def testErrorInBackQuoteNoDeadLock(self): error = False try: run('echo `echo $invalid`', globals(), locals()) except: error = True self.assertTrue(error)
def testPipeWithErrorInLeftDoesNotCauseDeadLock(self): error = False try: run('/bin/ls $invalid | /bin/cat', globals(), locals()) except Exception, e: self.assertTrue('invalid' in e.message) error = True
def testPyCmdAndNativeBackquote(self): def tmp(args, input, options): return args tmp = PyCmd(tmp, '', inType=IOType.No) run('$tmp `echo foo bar` > out.txt', globals(), locals()) self.assertTrue(file('out.txt').read().endswith('\nfoo\nbar\n'))
def testPyCmdNoInput_inputNone(self): def tmp(args, input, options): return [str(input)] tmp = PyCmd(tmp, '', inType=IOType.No) run('$tmp > out.txt', globals(), locals()) self.assertEquals('None\n', file('out.txt').read())
def testPyCmdNoInputWithNative(self): def tmp(args, input, options): return ['bar'] tmp = PyCmd(tmp, '', inType=IOType.No) run('(echo foo && $tmp) | cat > out.txt', globals(), locals()) self.assertEquals('foo\nbar\n', file('out.txt').read())
def testOrNotPyCmd(self): def tmp(args, input, options): yield 'a' raise Exception('Error!') run('$tmp > out.txt || $tmp >> out.txt', globals(), locals()) self.assertEquals('a\na\n', file('out.txt').read())
def testListComprehension(self): def tmp(args, input, options): return [x * x for x in xrange(3)] run('$tmp ${[x * x for x in xrange(3)]} > out.txt', globals(), locals()) self.assertEquals('0\n1\n4\n', file('out.txt').read())
def testPyCmdFileInput(self): def tmp(args, input, options): return [1, 2, 3] def represent(args, input, options): return (repr(e.rstrip('\r\n')) for e in input) represent = PyCmd(represent, '', inType=IOType.File) run('$tmp | $represent > out.txt', globals(), locals()) self.assertEquals('\'1\'\n\'2\'\n\'3\'\n', file('out.txt').read())
def testPyCmdWithErrorDoesNotCauseDeadLock(self): def tmp(args, input, options): return ['tmp', 19] error = False try: run('$tmp $invalid', globals(), locals()) except: error = True self.assertTrue(error)
def testPyCmdFileOutput(self): def tmp(args, input, options): return [1, 2, 3] def represent(args, input, options): return (repr(e.rstrip('\r\n')) for e in input) tmp = PyCmd(tmp, '', outType=IOType.File) run('$tmp | $represent > out.txt', globals(), locals()) # Outputs of pycmd with IOType.File is converted to file stream. self.assertEquals('\'1\'\n\'2\'\n\'3\'\n', file('out.txt').read())
def testNoDeadLock_pipeAndBackquote(self): def tmp(args, input, options): return [] tmp = PyCmd(tmp, '', inType=IOType.No) error = False try: run( '$tmp `echo foo` > /invalid/path/1831 | ' '$tmp `echo piyo` > /invalid/path/1928', globals(), locals()) except IOError: error = True self.assertTrue(error)
def testPyCmdPipeBothOutput(self): def tmp0(args, input, options): return [1, 2, 3] def tmp1(args, input, options): return [4, 5, 6] def represent(args, input, options): return (repr(e.rstrip('\r\n')) for e in input) tmp0 = PyCmd(tmp0, '', outType=IOType.File) run('($tmp0 && $tmp1) | cat > out.txt', globals(), locals()) self.assertEquals('1\n2\n3\n4\n5\n6\n', file('out.txt').read())
def testPyCmdWithErrorInPipeDoesNotCauseDeadLock(self): def tmp(args, input, options): return ['tmp', 19] def reader(args, input, options): list(input) return [] error = False try: run('$tmp $invalid | $reader', globals(), locals()) except: error = True self.assertTrue(error)
def testReturnCodeMulti(self): rc = run( '(echo foo >> /dev/null -> rc0) && ' '(echo bar >> /dev/null -> rc1)', globals(), locals()) self.assertEquals(2, len(rc)) self.assertEquals(0, rc['rc0']) self.assertEquals(0, rc['rc1'])
def testPyCmdNoInput_outputIgnored(self): def tmp(args, input, options): return ['foo'] tmp = PyCmd(tmp, '', inType=IOType.No, outType=IOType.No) response = run('$tmp > out.txt -> rc', globals(), locals()) self.assertEquals('', file('out.txt').read()) self.assertTrue(response['rc'] != 0)
def testBackQuoteWIthGlob(self): run('echo foo > foo.txt', globals(), locals()) run('echo bar > bar.txt', globals(), locals()) run( 'python -c "import sys;print \':\'.join(sys.argv)" ' '*`echo .txt` > out.txt', globals(), locals()) self.assertEquals('-c:bar.txt:foo.txt\n', file('out.txt').read())
def testStoreOutput(self): file('tmp.txt', 'w').write('hello\nworld\n\npiyo') rc = run('cat tmp.txt => out', globals(), locals()) self.assertEquals(['hello', 'world', '', 'piyo'], rc['out'])
def testStoreOutputWithPyCmd(self): rc = run('echo foo | pycmd a b => out', globals(), locals()) self.assertEquals(['pycmd', 'a', 'b', 'foo'], rc['out'])
def testSemiColon(self): rc = run('echo foo >> out.txt; echo bar >> out.txt', globals(), locals()) self.assertEquals('foo\nbar\n', file('out.txt').read())
def testBackQuoteEmptyOutput(self): run('echo `echo`', globals(), locals())
def testEchoMix(self): data = ['foo', 'bar'] run('echo a $data b > out.txt', globals(), locals()) self.assertEquals('a\nfoo\nbar\nb\n', file('out.txt').read())
def testEchoTuple(self): data = ('foo', 'bar', 'baz') run('echo $data > out.txt', globals(), locals()) self.assertEquals('foo\nbar\nbaz\n', file('out.txt').read())
def testNoDeadLock_pipeRightCommandEarlyReturn(self): # Usually, echo bar exits earlier than echo `echo foo` run('echo `echo foo` | echo bar > /dev/null', globals(), locals())
def testBackQuoteWIthPrefixSuffix(self): run( 'python -c "import sys;print \':\'.join(sys.argv)" ' 'hoge`echo foo bar`piyo > out.txt', globals(), locals()) self.assertEquals('-c:hogefoo:barpiyo\n', file('out.txt').read())
def testReturnCode(self): rc = run('python -c "import sys;sys.exit(7)" -> rc', globals(), locals()) self.assertEquals(1, len(rc)) self.assertEquals(True, os.WIFEXITED(rc['rc'])) self.assertEquals(7, os.WEXITSTATUS(rc['rc']))
def testExpandUser(self): rc = run('echo ~/test.txt > out.txt', globals(), locals()) path = os.path.expanduser('~/test.txt') self.assertEquals(path + '\n', file('out.txt').read())
def testBackQuoteInRedirect(self): run('echo foo > `echo out.txt`', globals(), locals()) self.assertEquals('foo\n', file('out.txt').read())
def testGlob(self): run('echo foo > foo.txt', globals(), locals()) run('echo bar > bar.txt', globals(), locals()) run('echo baz > baz.doc', globals(), locals()) run('echo test > "a*b.doc"', globals(), locals()) run('echo *.txt > out1.txt', globals(), locals()) run('echo "*.txt" > out2.txt', globals(), locals()) run('echo *\'*\'*.doc > out3.txt', globals(), locals()) self.assertEquals('bar.txt foo.txt\n', file('out1.txt').read()) self.assertEquals('*.txt\n', file('out2.txt').read()) self.assertEquals('a*b.doc\n', file('out3.txt').read())
def testEchoString(self): run('echo foo bar "piyo" | sort > out.txt', globals(), locals()) self.assertEquals('foo bar piyo\n', file('out.txt').read())
def testFilterCmd(self): run('/bin/echo "cupcake\\ndonut\\nfroyo\\nginger" |' 'filter ${lambda l: "e" in l} > out.txt', globals(), locals()) self.assertEquals('cupcake\nginger\n', file('out.txt').read())
def testEchoXrange(self): data = xrange(3) run('echo $data > out.txt', globals(), locals()) self.assertEquals('0\n1\n2\n', file('out.txt').read())
def testChangeDir(self): rc = run('cd /dev', globals(), locals()) self.assertEquals('/dev', os.getcwd())
def testMapCmd(self): run('/bin/echo "1\\n2\\n3\\n4\\n5" | map ${lambda l: int(l)} |' 'map ${lambda x: x * x} > out.txt', globals(), locals()) self.assertEquals('1\n4\n9\n16\n25\n', file('out.txt').read())
def testWhere(self): table = PyshTable(('a', 'b'), ((i, i * i % 10) for i in xrange(10))) rc = run('echo $table | where "a == 3" => out', globals(), locals()) self.assertEquals(1, len(rc['out'])) self.assertEquals((3, 9), (rc['out'][0].a, rc['out'][0].b))
def testReduceCmd(self): run('/bin/echo "foo\\nbar" | reduce ${lambda x, y: x + y} |' 'cat > out.txt', globals(), locals()) self.assertEquals('foobar\n', file('out.txt').read())
def testPipeInBackQuote(self): run( 'python -c "import sys;print \':\'.join(sys.argv)" ' '`echo foo bar | cat` > out.txt', globals(), locals()) self.assertEquals('-c:foo:bar\n', file('out.txt').read())
def testChangeDirHome(self): rc = run('cd', globals(), locals()) self.assertEquals(os.environ['HOME'], os.getcwd())
def testPyCmdInBackQuote(self): run( 'python -c "import sys;print \':\'.join(sys.argv)" ' '`echo a | pycmd b c` > out.txt', globals(), locals()) self.assertEquals('-c:pycmd:b:c:a\n', file('out.txt').read())
def testOrderby(self): table = PyshTable(('a', 'b'), ((i, i * i % 10) for i in xrange(10))) rc = run('echo $table | orderby b desc => out', globals(), locals()) self.assertEquals(10, len(rc['out'])) self.assertEquals(9, rc['out'][0].b)
def testPyCmdReadInBackQuote(self): run('echo foo bar | pycmd a `pycmd 1 2` b | cat > out.txt', globals(), locals()) self.assertEquals('pycmd\na\npycmd\n1\n2\nfoo\nbar\nb\n', file('out.txt').read())