2 # Copyright 2008 Google Inc. All Rights Reserved.
6 import unittest
, os
, sys
, StringIO
9 from autotest_lib
.cli
import atest
, topic_common
, rpc
10 from autotest_lib
.frontend
.afe
import rpc_client_lib
11 from autotest_lib
.frontend
.afe
.json_rpc
import proxy
12 from autotest_lib
.client
.common_lib
.test_utils
import mock
13 from autotest_lib
.client
.common_lib
import autotemp
18 def create_file(content
):
19 file_temp
= autotemp
.tempfile(unique_id
='cli_mock', text
=True)
20 os
.write(file_temp
.fd
, content
)
24 class ExitException(Exception):
28 class cli_unittest(unittest
.TestCase
):
30 super(cli_unittest
, self
).setUp()
31 self
.god
= mock
.mock_god(debug
=CLI_UT_DEBUG
, ut
=self
)
32 self
.god
.stub_class_method(rpc
.afe_comm
, 'run')
33 self
.god
.stub_function(sys
, 'exit')
35 def stub_authorization_headers(*args
, **kwargs
):
37 self
.god
.stub_with(rpc_client_lib
, 'authorization_headers',
38 stub_authorization_headers
)
42 super(cli_unittest
, self
).tearDown()
46 def assertEqualNoOrder(self
, x
, y
, message
=None):
47 self
.assertEqual(set(x
), set(y
), message
)
50 def assertWords(self
, string
, to_find
=[], not_in
=[]):
52 self
.assert_(string
.find(word
) >= 0,
53 "Could not find '%s' in: %s" % (word
, string
))
55 self
.assert_(string
.find(word
) < 0,
56 "Found (and shouldn't have) '%s' in: %s" % (word
,
60 def _check_output(self
, out
='', out_words_ok
=[], out_words_no
=[],
61 err
='', err_words_ok
=[], err_words_no
=[]):
62 if out_words_ok
or out_words_no
:
63 self
.assertWords(out
, out_words_ok
, out_words_no
)
65 self
.assertEqual('', out
)
67 if err_words_ok
or err_words_no
:
68 self
.assertWords(err
, err_words_ok
, err_words_no
)
70 self
.assertEqual('', err
)
73 def assertOutput(self
, obj
, results
,
74 out_words_ok
=[], out_words_no
=[],
75 err_words_ok
=[], err_words_no
=[]):
78 obj
.show_all_failures()
79 (out
, err
) = self
.god
.unmock_io()
80 self
._check
_output
(out
, out_words_ok
, out_words_no
,
81 err
, err_words_ok
, err_words_no
)
84 def mock_rpcs(self
, rpcs
):
85 """rpcs is a list of tuples, each representing one RPC:
86 (op, **dargs, success, expected)"""
87 for (op
, dargs
, success
, expected
) in rpcs
:
88 comm
= rpc
.afe_comm
.run
90 comm
.expect_call(op
, **dargs
).and_return(expected
)
92 comm
.expect_call(op
, **dargs
).and_raises(proxy
.JSONRPCException(expected
))
96 def run_cmd(self
, argv
, rpcs
=[], exit_code
=None,
97 out_words_ok
=[], out_words_no
=[],
98 err_words_ok
=[], err_words_no
=[]):
99 """Runs the command in argv.
100 rpcs is a list of tuples, each representing one RPC:
101 (op, **dargs, success, expected)
102 exit_code should be set if you expect the command
104 The words are lists of words that are expected"""
109 if not (CLI_USING_PDB
and CLI_UT_DEBUG
):
111 if exit_code
is not None:
112 sys
.exit
.expect_call(exit_code
).and_raises(ExitException
)
113 self
.assertRaises(ExitException
, atest
.main
)
116 (out
, err
) = self
.god
.unmock_io()
117 self
.god
.check_playback()
118 self
._check
_output
(out
, out_words_ok
, out_words_no
,
119 err
, err_words_ok
, err_words_no
)