mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
uitests: console/keyring/viewer coverage work
Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
parent
2c86eefa5b
commit
64e3ff1d08
@ -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
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user