blob: e6499e9778e9195d3f7e2286149c19540feff2f6 [file] [log] [blame]
mblighbe630eb2008-08-01 16:41:48 +00001#
2# Copyright 2008 Google Inc. All Rights Reserved.
3
4"""Test for cli."""
5
mbligh41515392009-07-11 00:13:11 +00006import unittest, os, sys, StringIO
mblighbe630eb2008-08-01 16:41:48 +00007
8import common
9from autotest_lib.cli import atest, topic_common, rpc
10from autotest_lib.frontend.afe.json_rpc import proxy
11from autotest_lib.client.common_lib.test_utils import mock
mbligh41515392009-07-11 00:13:11 +000012from autotest_lib.client.common_lib import autotemp
mblighbe630eb2008-08-01 16:41:48 +000013
mblighb9a8b162008-10-29 16:47:29 +000014CLI_USING_PDB = False
mblighbe630eb2008-08-01 16:41:48 +000015CLI_UT_DEBUG = False
16
17def create_file(content):
mbligh41515392009-07-11 00:13:11 +000018 file_temp = autotemp.tempfile(unique_id='cli_mock', text=True)
19 os.write(file_temp.fd, content)
20 os.close(file_temp.fd)
21 return file_temp
mblighbe630eb2008-08-01 16:41:48 +000022
23
24class ExitException(Exception):
25 pass
26
27
28class cli_unittest(unittest.TestCase):
29 def setUp(self):
mbligh9deeefa2009-05-01 23:11:08 +000030 super(cli_unittest, self).setUp()
mblighbe630eb2008-08-01 16:41:48 +000031 self.god = mock.mock_god(debug=CLI_UT_DEBUG)
32 self.god.stub_class_method(rpc.afe_comm, 'run')
33 self.god.stub_function(sys, 'exit')
34
35
36 def tearDown(self):
mbligh9deeefa2009-05-01 23:11:08 +000037 super(cli_unittest, self).tearDown()
mblighbe630eb2008-08-01 16:41:48 +000038 self.god.unstub_all()
39
40
41 def assertEqualNoOrder(self, x, y, message=None):
42 self.assertEqual(set(x), set(y), message)
43
44
45 def assertWords(self, string, to_find=[], not_in=[]):
46 for word in to_find:
47 self.assert_(string.find(word) >= 0,
48 "Could not find '%s' in: %s" % (word, string))
49 for word in not_in:
50 self.assert_(string.find(word) < 0,
51 "Found (and shouldn't have) '%s' in: %s" % (word,
52 string))
53
54
55 def _check_output(self, out='', out_words_ok=[], out_words_no=[],
56 err='', err_words_ok=[], err_words_no=[]):
57 if out_words_ok or out_words_no:
58 self.assertWords(out, out_words_ok, out_words_no)
59 else:
60 self.assertEqual('', out)
61
62 if err_words_ok or err_words_no:
63 self.assertWords(err, err_words_ok, err_words_no)
64 else:
65 self.assertEqual('', err)
66
67
mbligh7a3ebe32008-12-01 17:10:33 +000068 def assertOutput(self, obj, results,
mblighbe630eb2008-08-01 16:41:48 +000069 out_words_ok=[], out_words_no=[],
70 err_words_ok=[], err_words_no=[]):
71 self.god.mock_io()
mbligh7a3ebe32008-12-01 17:10:33 +000072 obj.output(results)
mblighbe630eb2008-08-01 16:41:48 +000073 obj.show_all_failures()
74 (out, err) = self.god.unmock_io()
75 self._check_output(out, out_words_ok, out_words_no,
76 err, err_words_ok, err_words_no)
77
78
79 def mock_rpcs(self, rpcs):
80 """rpcs is a list of tuples, each representing one RPC:
81 (op, **dargs, success, expected)"""
82 for (op, dargs, success, expected) in rpcs:
83 comm = rpc.afe_comm.run
84 if success:
85 comm.expect_call(op, **dargs).and_return(expected)
86 else:
87 comm.expect_call(op, **dargs).and_raises(proxy.JSONRPCException(expected))
88
89
90
91 def run_cmd(self, argv, rpcs=[], exit_code=None,
92 out_words_ok=[], out_words_no=[],
93 err_words_ok=[], err_words_no=[]):
94 """Runs the command in argv.
95 rpcs is a list of tuples, each representing one RPC:
96 (op, **dargs, success, expected)
97 exit_code should be set if you expect the command
98 to fail
99 The words are lists of words that are expected"""
100 sys.argv = argv
101
102 self.mock_rpcs(rpcs)
103
mblighb9a8b162008-10-29 16:47:29 +0000104 if not (CLI_USING_PDB and CLI_UT_DEBUG):
mblighbe630eb2008-08-01 16:41:48 +0000105 self.god.mock_io()
mblighd876f452008-12-03 15:09:17 +0000106 if exit_code is not None:
mblighbe630eb2008-08-01 16:41:48 +0000107 sys.exit.expect_call(exit_code).and_raises(ExitException)
108 self.assertRaises(ExitException, atest.main)
109 else:
110 atest.main()
111 (out, err) = self.god.unmock_io()
112 self.god.check_playback()
113 self._check_output(out, out_words_ok, out_words_no,
114 err, err_words_ok, err_words_no)
115 return (out, err)