# 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.