3 # Copyright 2012 Intel Corporation
5 # Permission is hereby granted, free of charge, to any person
6 # obtaining a copy of this software and associated documentation files
7 # (the "Software"), to deal in the Software without restriction,
8 # including without limitation the rights to use, copy, modify, merge,
9 # publish, distribute, sublicense, and/or sell copies of the Software,
10 # and to permit persons to whom the Software is furnished to do so,
11 # subject to the following conditions:
13 # The above copyright notice and this permission notice shall be
14 # included in all copies or substantial portions of the Software.
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 '''Test driver for scripts in the cli directory.'''
33 from base_driver import *
35 class CliDriver(Driver):
37 def do_apitrace(self, args):
38 cmd = [self.options.apitrace] + args.split()
41 proc = subprocess.Popen(cmd, stdout = subprocess.PIPE)
42 self.output = proc.communicate()[0]
46 if (self.expect_failure):
47 if (proc.returncode == 0):
48 fail("Command unexpectedly passed when expecting failure:\n " + " ".join(cmd))
50 if (proc.returncode != 0):
51 fail("Command failed (returned non-zero):\n " + " ".join(cmd))
53 def do_expect(self, args):
54 expected = json.loads(args)
55 if (self.output != expected):
56 differ = difflib.Differ()
57 diff = differ.compare(expected.splitlines(1), self.output.splitlines(1))
59 fail("Unexpected output:\n%s\n" % diff)
61 def do_rm_and_mkdir(self, args):
65 # Operate only on local directories
68 # Failing to delete a directory that doesn't exist is no failure
69 def rmtree_onerror(function, path, excinfo):
70 if excinfo[0] == OSError and excinfo[1].errno != errno.ENOENT:
73 shutil.rmtree(dir, onerror = rmtree_onerror)
76 def unknown_command(self, args):
77 fail('Broken test script: Unknown command: %s' % (args))
79 def run_script(self, cli_script):
80 "Execute the commands in the given cli script."
83 'apitrace': self.do_apitrace,
84 'expect': self.do_expect,
85 'rm_and_mkdir': self.do_rm_and_mkdir
88 script = open(cli_script, 'rt')
92 self.expect_failure = False
94 line = script.readline()
103 (cmd, args) = line.split(None,1)
108 # Ignore blank lines and comments
109 if (len(cmd) == 0 or cmd == '\n' or cmd[0] == '#'):
112 if (cmd == 'EXPECT_FAILURE:'):
113 self.expect_failure = True
115 (cmd, args) = args.split(None, 1)
120 commands.get(cmd, self.unknown_command)(args)
125 self.run_script(self.args[0])
129 if __name__ == '__main__':