| # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from autotest_lib.client.cros import constants |
| from autotest_lib.server import autotest |
| |
| |
| class InteractiveClient(object): |
| """InteractiveClient represents a remote host for interactive tests. |
| |
| An XML-RPC server is deployed to the remote host and a set of methods |
| exposed that allow you to open a browser window on that device, write |
| output and receive button clicks in order to develop interactive tests. |
| """ |
| |
| XMLRPC_BRINGUP_TIMEOUT_SECONDS = 60 |
| |
| def __init__(self, client_host): |
| """Construct a InteractiveClient. |
| |
| @param client_host: host object representing a remote host. |
| |
| """ |
| self._host = client_host |
| # Make sure the client library is on the device so that the proxy code |
| # is there when we try to call it. |
| client_at = autotest.Autotest(self._host) |
| client_at.install() |
| # Start up the XML-RPC proxy on the client. |
| self._proxy = self._host.rpc_server_tracker.xmlrpc_connect( |
| constants.INTERACTIVE_XMLRPC_SERVER_COMMAND, |
| constants.INTERACTIVE_XMLRPC_SERVER_PORT, |
| command_name= |
| constants.INTERACTIVE_XMLRPC_SERVER_CLEANUP_PATTERN, |
| ready_test_name= |
| constants.INTERACTIVE_XMLRPC_SERVER_READY_METHOD, |
| timeout_seconds=self.XMLRPC_BRINGUP_TIMEOUT_SECONDS) |
| |
| |
| def login(self): |
| """Login to the system and open a tab. |
| |
| The tab opened is used by other methods on this server to interact |
| with the user. |
| |
| @return True on success, False otherwise. |
| |
| """ |
| return self._proxy.login() |
| |
| |
| def set_output(self, html): |
| """Replace the contents of the tab. |
| |
| @param html: HTML document to replace tab contents with. |
| |
| @return True on success, False otherwise. |
| |
| """ |
| return self._proxy.set_output(html) |
| |
| |
| def append_output(self, html): |
| """Append HTML to the contents of the tab. |
| |
| @param html: HTML to append to the existing tab contents. |
| |
| @return True on success, False otherwise. |
| |
| """ |
| return self._proxy.append_output(html) |
| |
| |
| def append_buttons(self, *args): |
| """Append confirmation buttons to the tab. |
| |
| Each button is given an index, 0 for the first button, 1 for the second, |
| and so on. |
| |
| @param title...: Title of button to append. |
| |
| @return True on success, False otherwise. |
| |
| """ |
| return self._proxy.append_buttons(*args) |
| |
| |
| def wait_for_button(self, timeout): |
| """Wait for a button to be clicked. |
| |
| Call append_buttons() before this to add buttons to the document. |
| |
| @param timeout: Maximum time, in seconds, to wait for a click. |
| |
| @return index of button that was clicked, or -1 on timeout. |
| |
| """ |
| return self._proxy.wait_for_button(timeout) |
| |
| |
| def check_for_button(self): |
| """Check whether a button has been clicked. |
| |
| Call append_buttons() before this to add buttons to the document. |
| |
| @return index of button that was clicked or -1 if no button |
| has been clicked. |
| |
| """ |
| return self._proxy.check_for_button() |
| |
| |
| def append_list(self, name): |
| """Append a results list to the contents of the tab. |
| |
| @param name: Name to use for making modifications to the list. |
| |
| @return True. |
| |
| """ |
| return self._proxy.append_list(name) |
| |
| |
| def append_list_item(self, list_name, item_name, html): |
| """Append an item to a results list. |
| |
| @param list_name: Name of list provided to append_list(). |
| @param item_name: Name to use for making modifications to the item. |
| @param html: HTML to place in the list item. |
| |
| @return True. |
| |
| """ |
| return self._proxy.append_list_item(list_name, item_name, html) |
| |
| |
| def replace_list_item(self, item_name, html): |
| """Replace an item in a results list. |
| |
| @param item_name: Name of item provided to append_list_item(). |
| @param html: HTML to place in the list item. |
| |
| @return True. |
| |
| """ |
| return self._proxy.replace_list_item(item_name, html) |
| |
| |
| def close(self): |
| """Tear down state associated with the client.""" |
| # Log out the browser. |
| self._proxy.close() |
| # This does not close the host because it's shared with the client. |