uitests: console/keyring/viewer coverage work

Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2020-08-28 11:55:36 -04:00
parent 2c86eefa5b
commit 64e3ff1d08
6 changed files with 114 additions and 38 deletions

View File

@ -10,7 +10,7 @@ from virtinst import log
from tests.uitests import utils as uiutils
def _vm_wrapper(vmname, uri="qemu:///system"):
def _vm_wrapper(vmname, uri="qemu:///system", opts=None):
"""
Decorator to define+start a VM and clean it up on exit
"""
@ -25,7 +25,9 @@ def _vm_wrapper(vmname, uri="qemu:///system"):
dom.create()
self.app.uri = uri
self.conn = conn
self.app.open(extra_opts=["--show-domain-console", vmname])
extra_opts = (opts or [])
extra_opts += ["--show-domain-console", vmname]
self.app.open(extra_opts=extra_opts)
fn(self, *args, **kwargs)
finally:
try:
@ -47,6 +49,7 @@ class Console(uiutils.UITestCase):
"""
conn = None
extraopts = None
##############
# Test cases #
@ -101,6 +104,19 @@ class Console(uiutils.UITestCase):
win.find("Fullscreen Exit").click()
uiutils.check(lambda: win.size == newsize)
# Tweak scaling
win.click_title()
win.click_title()
win.find("^View$", "menu").click()
scalemenu = win.find("Scale Display", "menu")
scalemenu.point()
scalemenu.find("Always", "radio menu item").click()
win.find("^View$", "menu").click()
scalemenu = win.find("Scale Display", "menu")
scalemenu.point()
scalemenu.find("Never", "radio menu item").click()
self.sleep(.5)
@_vm_wrapper("uitests-vnc-standard")
def testConsoleVNCStandard(self):
return self._checkConsoleStandard()
@ -123,12 +139,43 @@ class Console(uiutils.UITestCase):
passwd.typeText("xx")
win.find("Login", "push button").click()
self._click_alert_button("Viewer authentication error", "OK")
savecheck = win.find("Save this password", "check box")
if not savecheck.checked:
savecheck.click()
passwd.typeText("yy")
self.pressKey("Enter")
self._click_alert_button("Viewer authentication error", "OK")
# Check proper password
passwd.text = ""
passwd.typeText("goodp")
win.find("Login", "push button").click()
uiutils.check(lambda: con.showing)
# Restart VM to retrigger console connect
smenu = win.find("Menu", "toggle button")
smenu.click()
smenu.find("Force Off", "menu item").click()
self._click_alert_button("you sure", "Yes")
win.find("Run", "push button").click()
uiutils.check(lambda: passwd.showing)
# Password should be filled in
uiutils.check(lambda: bool(passwd.text))
# Uncheck 'Save password' and login, which will delete it from keyring
savecheck.click()
win.find("Login", "push button").click()
uiutils.check(lambda: con.showing)
# Restart VM to retrigger console connect
smenu = win.find("Menu", "toggle button")
smenu.click()
smenu.find("Force Off", "menu item").click()
self._click_alert_button("you sure", "Yes")
win.find("Run", "push button").click()
uiutils.check(lambda: passwd.showing)
# Password should be empty now
uiutils.check(lambda: not bool(passwd.text))
@_vm_wrapper("uitests-vnc-password")
def testConsoleVNCPassword(self):
return self._checkPassword()
@ -179,7 +226,7 @@ class Console(uiutils.UITestCase):
term = win.find("Serial Terminal")
uiutils.check(lambda: term.showing)
@_vm_wrapper("uitests-spice-specific")
@_vm_wrapper("uitests-spice-specific", opts=["--test-options=spice-agent"])
def testConsoleSpiceSpecific(self):
"""
Spice specific behavior. Has lots of devices that will open
@ -193,8 +240,32 @@ class Console(uiutils.UITestCase):
# than that
win.find("Virtual Machine", "menu").click()
win.find("Redirect USB", "menu item").click()
self.app.root.find("Select USB devices for redirection", "label")
usbwin = self.app.root.find("vmm dialog", "alert")
usbwin.find("Select USB devices for redirection", "label")
usbwin.find("SPICE CD", "check box").click()
chooser = self.app.root.find(None, "file chooser")
# Find the cwd bookmark on the left
chooser.find("virt-manager", "label").click()
chooser.find("virt-manager", "label").click()
chooser.find("COPYING").click()
self.pressKey("Enter")
uiutils.check(lambda: not chooser.showing)
usbwin.find("Close", "push button").click()
# Test fake guest resize behavior
def _click_auto():
vmenu = win.find("^View$", "menu")
vmenu.click()
smenu = vmenu.find("Scale Display", "menu")
smenu.point()
smenu.find("Auto resize VM", "check menu item").click()
_click_auto()
win.click_title()
win.click_title()
_click_auto()
win.click_title()
win.click_title()
def _testLiveHotplug(self, fname):
win = self.app.topwin

View File

@ -81,7 +81,7 @@ class _TimedRevealer(vmmGObject):
def _schedule_unreveal_timeout(self, timeout):
if self._timeout_id:
return
return # pragma: no cover
def cb():
self._revealer.set_reveal_child(False)
@ -437,7 +437,7 @@ class vmmConsolePages(vmmGObjectUI):
def _resizeguest_ui_changed_cb(self, src):
if not src.get_sensitive():
return
return # pragma: no cover
val = int(self.widget("details-menu-view-resizeguest").get_active())
self.vm.set_console_resizeguest(val)
@ -446,9 +446,9 @@ class vmmConsolePages(vmmGObjectUI):
def _do_size_to_vm(self, src_ignore):
# Resize the console to best fit the VM resolution
if not self._viewer:
return
return # pragma: no cover
if not self._viewer.console_get_desktop_resolution():
return
return # pragma: no cover
top_w, top_h = self.topwin.get_size()
viewer_alloc = self.widget("console-gfx-scroll").get_allocation()
@ -654,7 +654,7 @@ class vmmConsolePages(vmmGObjectUI):
if not self.vm:
# This is triggered via cleanup + idle_add, so vm might
# disappear and spam the logs
return
return # pragma: no cover
pagenum = self.widget("console-pages").get_current_page()
paused = self.vm.is_paused()
@ -690,7 +690,7 @@ class vmmConsolePages(vmmGObjectUI):
gdev = gdevs and gdevs[0] or None
if gdev:
ginfo = ConnectionInfo(self.vm.conn, gdev)
except Exception as e:
except Exception as e: # pragma: no cover
# We can fail here if VM is destroyed: xen is a bit racy
# and can't handle domain lookups that soon after
log.exception("Getting graphics console failed: %s", str(e))
@ -720,12 +720,10 @@ class vmmConsolePages(vmmGObjectUI):
if ginfo.gtype == "vnc":
viewer_class = VNCViewer
elif ginfo.gtype == "spice":
if have_spice_gtk:
viewer_class = SpiceViewer
else:
if not have_spice_gtk: # pragma: no cover
raise RuntimeError("Error opening Spice console, "
"SpiceClientGtk missing")
viewer_class = SpiceViewer
self._viewer = viewer_class(self.vm, ginfo)
self._connect_viewer_signals()
@ -880,7 +878,7 @@ class vmmConsolePages(vmmGObjectUI):
menu = self.widget("details-menu-view-serial-list").get_submenu()
for child in menu.get_children():
if isinstance(child, Gtk.SeparatorMenuItem):
break
break # pragma: no cover
if child.get_sensitive():
child.toggled()
break

View File

@ -380,9 +380,11 @@ class VNCViewer(Viewer):
return self._display.is_open()
def _get_scaling(self):
return self._display.get_scaling()
if self._display:
return self._display.get_scaling()
def _set_scaling(self, scaling):
return self._display.set_scaling(scaling)
if self._display:
return self._display.set_scaling(scaling)
def _get_grab_keys(self):
return self._display.get_grab_keys().as_string()
@ -431,11 +433,11 @@ class VNCViewer(Viewer):
return False
def _get_usb_widget(self):
return None
return None # pragma: no cover
def _has_usb_redirection(self):
return False
def _has_agent(self):
return False
return False # pragma: no cover
#######################
@ -696,7 +698,8 @@ class SpiceViewer(Viewer):
def _has_agent(self):
if not self._main_channel:
return False
return self._main_channel.get_property("agent-connected")
return (self._main_channel.get_property("agent-connected") or
self.config.CLITestOptions.spice_agent)
def _open_host(self):
host, port, tlsport = self._ginfo.get_conn_host()
@ -727,9 +730,11 @@ class SpiceViewer(Viewer):
self._spice_session.connect()
def _get_scaling(self):
return self._display.get_property("scaling")
if self._display:
return self._display.get_property("scaling")
def _set_scaling(self, scaling):
self._display.set_property("scaling", scaling)
if self._display:
self._display.set_property("scaling", scaling)
def _set_resizeguest(self, val):
if self._display:

View File

@ -234,7 +234,7 @@ class vmmEngine(vmmGObject):
We serialize conn autostart, so polkit/ssh-askpass doesn't spam
"""
if self._exiting:
return
return # pragma: no cover
connections_queue = queue.Queue()
auto_conns = [conn.get_uri() for conn in self._connobjs.values() if
@ -366,7 +366,7 @@ class vmmEngine(vmmGObject):
ignore1, ignore2, conn, kwargs = self._tick_queue.get()
try:
conn.tick_from_engine(**kwargs)
except Exception:
except Exception: # pragma: no cover
# Don't attempt to show any UI error here, since it
# can cause dialogs to appear from nowhere if say
# libvirtd is shut down
@ -376,7 +376,6 @@ class vmmEngine(vmmGObject):
# Need to clear reference to make leak check happy
conn = None
self._tick_queue.task_done()
return 1
#####################################
@ -423,7 +422,7 @@ class vmmEngine(vmmGObject):
Public call, manager/details/... use this to force exit the app
"""
if self._exiting:
return
return # pragma: no cover
self._exiting = True
@ -438,7 +437,7 @@ class vmmEngine(vmmGObject):
# Engine will always appear to leak
objs.remove(self.object_key)
for name in objs:
for name in objs: # pragma: no cover
log.debug("LEAK: %s", name)
log.debug("Exiting app normally.")
@ -516,7 +515,7 @@ class vmmEngine(vmmGObject):
self.CLI_SHOW_DOMAIN_CONSOLE,
self.CLI_SHOW_DOMAIN_DELETE]):
self._cli_show_vm_helper(uri, clistr, show_window)
else:
else: # pragma: no cover
raise RuntimeError("Unknown cli window command '%s'" %
show_window)

View File

@ -55,11 +55,11 @@ class vmmKeyring(vmmGObject):
"org.freedesktop.Secret.Collection", None)
log.debug("Using keyring session %s", self._session)
except Exception:
except Exception: # pragma: no cover
log.exception("Error determining keyring")
def _cleanup(self):
pass
pass # pragma: no cover
def _add_secret(self, secret):
ret = None
@ -76,7 +76,7 @@ class vmmKeyring(vmmGObject):
_id = self._collection.CreateItem("(a{sv}(oayays)b)",
props, params, replace)[0]
ret = int(_id.rsplit("/")[-1])
except Exception:
except Exception: # pragma: no cover
log.exception("Failed to add keyring secret")
return ret
@ -112,7 +112,7 @@ class vmmKeyring(vmmGObject):
attrs["%s" % key] = "%s" % val
ret = _vmmSecret(label, secret, attrs)
except Exception:
except Exception: # pragma: no cover
log.exception("Failed to get keyring secret id=%s", _id)
return ret
@ -130,7 +130,7 @@ class vmmKeyring(vmmGObject):
def get_console_password(self, vm):
if not self.is_available():
return ("", "")
return ("", "") # pragma: no cover
username, keyid = vm.get_console_password()
@ -139,30 +139,30 @@ class vmmKeyring(vmmGObject):
secret = self._get_secret(keyid)
if secret is None or secret.get_name() != self._get_secret_name(vm):
return ("", "")
return ("", "") # pragma: no cover
if (secret.attributes.get("hvuri", None) != vm.conn.get_uri() or
secret.attributes.get("uuid", None) != vm.get_uuid()):
return ("", "")
return ("", "") # pragma: no cover
return (secret.get_secret(), username or "")
def set_console_password(self, vm, password, username=""):
if not self.is_available():
return
return # pragma: no cover
secret = _vmmSecret(self._get_secret_name(vm), password,
{"uuid": vm.get_uuid(),
"hvuri": vm.conn.get_uri()})
keyid = self._add_secret(secret)
if keyid is None:
return
return # pragma: no cover
vm.set_console_password(username, keyid)
def del_console_password(self, vm):
if not self.is_available():
return
return # pragma: no cover
ignore, keyid = vm.get_console_password()
if keyid == -1:

View File

@ -95,6 +95,8 @@ class CLITestOptionsClass:
managed save issues
* test-vm-run-fail: Make VM run fail, so we can test the error path
* spice-agent: Make spice-agent detection return true in viewer.py
"""
def __init__(self, test_options_str, test_first_run):
optset = set()
@ -128,6 +130,7 @@ class CLITestOptionsClass:
self.config_libguestfs = _get("config-libguestfs")
self.test_managed_save = _get("test-managed-save")
self.test_vm_run_fail = _get("test-vm-run-fail")
self.spice_agent = _get("spice-agent")
if optset: # pragma: no cover
raise RuntimeError("Unknown --test-options keys: %s" % optset)