mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-01-11 05:17:59 +03:00
uitests: Finish console.py and viewers.py coverage
Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
parent
e414fc3bdc
commit
c36f232370
@ -717,3 +717,156 @@ class Details(uiutils.UITestCase):
|
|||||||
|
|
||||||
# Do standard xmleditor tests
|
# Do standard xmleditor tests
|
||||||
self._test_xmleditor_interactions(win, finish)
|
self._test_xmleditor_interactions(win, finish)
|
||||||
|
|
||||||
|
def testDetailsConsoleChecksSSH(self):
|
||||||
|
"""
|
||||||
|
Trigger a bunch of console connection failures to hit
|
||||||
|
various details/* code paths
|
||||||
|
"""
|
||||||
|
fakeuri = "qemu+ssh://foouser@256.256.256.256:1234/system"
|
||||||
|
uri = tests.utils.URIs.test_full + ",fakeuri=%s" % fakeuri
|
||||||
|
self.app.uri = uri
|
||||||
|
self.app.open(xmleditor_enabled=True)
|
||||||
|
|
||||||
|
self.app.topwin.find("test\n", "table cell").doubleClick()
|
||||||
|
win = self.app.root.find("test on", "frame")
|
||||||
|
conpages = win.find("console-pages")
|
||||||
|
run = win.find("Run", "push button")
|
||||||
|
shutdown = win.find("Shut Down", "push button")
|
||||||
|
conbtn = win.find("Console", "radio button")
|
||||||
|
detailsbtn = win.find("Details", "radio button")
|
||||||
|
|
||||||
|
def _run():
|
||||||
|
win.click_title()
|
||||||
|
run.click()
|
||||||
|
uiutils.check(lambda: not run.sensitive)
|
||||||
|
def _stop():
|
||||||
|
shutdown.click()
|
||||||
|
uiutils.check(lambda: not shutdown.sensitive)
|
||||||
|
def _checkcon(msg):
|
||||||
|
conbtn.click()
|
||||||
|
uiutils.check(lambda: conpages.showing)
|
||||||
|
conpages.find(msg)
|
||||||
|
def _check_textconsole_menu(msg):
|
||||||
|
vmenu = win.find("^View$", "menu")
|
||||||
|
vmenu.click()
|
||||||
|
tmenu = win.find("Text Consoles", "menu")
|
||||||
|
tmenu.point()
|
||||||
|
tmenu.find(msg, "menu item")
|
||||||
|
vmenu.click()
|
||||||
|
|
||||||
|
# Check initial state
|
||||||
|
_checkcon("Graphical console not configured")
|
||||||
|
_stop()
|
||||||
|
_check_textconsole_menu("No graphical console available")
|
||||||
|
|
||||||
|
# Add a SDL graphics device which can't be displayed
|
||||||
|
detailsbtn.click()
|
||||||
|
win.find("add-hardware", "push button").click()
|
||||||
|
addhw = self.app.root.find("Add New Virtual Hardware", "frame")
|
||||||
|
addhw.find("Graphics", "table cell").click()
|
||||||
|
addhw.find("XML", "page tab").click()
|
||||||
|
dev = '<graphics type="sdl" display=":3.4" xauth="/tmp/.Xauthority"/>'
|
||||||
|
addhw.find("XML editor").text = dev
|
||||||
|
addhw.find("Finish", "push button").click()
|
||||||
|
uiutils.check(lambda: not addhw.active)
|
||||||
|
uiutils.check(lambda: win.active)
|
||||||
|
_run()
|
||||||
|
_checkcon("Cannot display graphical console type")
|
||||||
|
|
||||||
|
def _change_gfx_xml(_xml):
|
||||||
|
detailsbtn.click()
|
||||||
|
win.find("Display ", "table cell").click()
|
||||||
|
win.find("XML", "page tab").click()
|
||||||
|
win.find("XML editor").set_text(_xml)
|
||||||
|
win.find("config-apply").click()
|
||||||
|
|
||||||
|
# Listening from some other address
|
||||||
|
_stop()
|
||||||
|
xml = '<graphics type="spice" listen="0.0.0.0" port="6000" tlsPort="6001"/>'
|
||||||
|
_change_gfx_xml(xml)
|
||||||
|
_run()
|
||||||
|
_checkcon(".*resolving.*256.256.256.256.*")
|
||||||
|
|
||||||
|
# Listening from some other address
|
||||||
|
_stop()
|
||||||
|
xml = '<graphics type="spice" listen="257.0.0.1" port="6000"/>'
|
||||||
|
_change_gfx_xml(xml)
|
||||||
|
_run()
|
||||||
|
_checkcon(".*resolving.*257.0.0.1.*")
|
||||||
|
|
||||||
|
# Hit a specific error about tls only and ssh
|
||||||
|
_stop()
|
||||||
|
xml = '<graphics type="spice" tlsPort="60001" autoport="no"/>'
|
||||||
|
_change_gfx_xml(xml)
|
||||||
|
_run()
|
||||||
|
_checkcon(".*configured for TLS only.*")
|
||||||
|
|
||||||
|
# Fake a socket connection
|
||||||
|
_stop()
|
||||||
|
xml = '<graphics type="vnc" socket="/tmp/foobar.sock"/>'
|
||||||
|
_change_gfx_xml(xml)
|
||||||
|
_run()
|
||||||
|
_checkcon(".*SSH tunnel error output.*")
|
||||||
|
|
||||||
|
# Add a listen type='none' check
|
||||||
|
_stop()
|
||||||
|
xml = '<graphics type="spice"><listen type="none"/></graphics>'
|
||||||
|
_change_gfx_xml(xml)
|
||||||
|
_run()
|
||||||
|
_checkcon(".*local file descriptor.*")
|
||||||
|
|
||||||
|
# Add a local list + port check
|
||||||
|
_stop()
|
||||||
|
xml = '<graphics type="spice" listen="127.0.0.1" port="6000" tlsPort="60001"/>'
|
||||||
|
_change_gfx_xml(xml)
|
||||||
|
_run()
|
||||||
|
_checkcon(".*SSH tunnel error output.*")
|
||||||
|
|
||||||
|
def testDetailsConsoleChecksTCP(self):
|
||||||
|
"""
|
||||||
|
Hit a specific warning when the connection has
|
||||||
|
non-SSH transport but the guest config is only listening locally
|
||||||
|
"""
|
||||||
|
fakeuri = "qemu+tcp://foouser@256.256.256.256:1234/system"
|
||||||
|
uri = tests.utils.URIs.test_full + ",fakeuri=%s" % fakeuri
|
||||||
|
self.app.uri = uri
|
||||||
|
self.app.open(xmleditor_enabled=True)
|
||||||
|
|
||||||
|
self.app.topwin.find("test\n", "table cell").doubleClick()
|
||||||
|
win = self.app.root.find("test on", "frame")
|
||||||
|
conpages = win.find("console-pages")
|
||||||
|
run = win.find("Run", "push button")
|
||||||
|
shutdown = win.find("Shut Down", "push button")
|
||||||
|
conbtn = win.find("Console", "radio button")
|
||||||
|
detailsbtn = win.find("Details", "radio button")
|
||||||
|
|
||||||
|
def _run():
|
||||||
|
win.click_title()
|
||||||
|
run.click()
|
||||||
|
uiutils.check(lambda: not run.sensitive)
|
||||||
|
def _stop():
|
||||||
|
shutdown.click()
|
||||||
|
uiutils.check(lambda: not shutdown.sensitive)
|
||||||
|
def _checkcon(msg):
|
||||||
|
conbtn.click()
|
||||||
|
uiutils.check(lambda: conpages.showing)
|
||||||
|
conpages.find(msg)
|
||||||
|
|
||||||
|
# Check initial state
|
||||||
|
_checkcon("Graphical console not configured")
|
||||||
|
_stop()
|
||||||
|
|
||||||
|
# Add a SDL graphics device which can't be displayed
|
||||||
|
detailsbtn.click()
|
||||||
|
win.find("add-hardware", "push button").click()
|
||||||
|
addhw = self.app.root.find("Add New Virtual Hardware", "frame")
|
||||||
|
addhw.find("Graphics", "table cell").click()
|
||||||
|
addhw.find("XML", "page tab").click()
|
||||||
|
dev = '<graphics type="vnc" port="6000" address="127.0.0.1"/>'
|
||||||
|
addhw.find("XML editor").text = dev
|
||||||
|
addhw.find("Finish", "push button").click()
|
||||||
|
uiutils.check(lambda: not addhw.active)
|
||||||
|
uiutils.check(lambda: win.active)
|
||||||
|
_run()
|
||||||
|
_checkcon(".*configured to listen locally.*")
|
||||||
|
@ -28,7 +28,7 @@ def _vm_wrapper(vmname, uri="qemu:///system", opts=None):
|
|||||||
extra_opts = (opts or [])
|
extra_opts = (opts or [])
|
||||||
extra_opts += ["--show-domain-console", vmname]
|
extra_opts += ["--show-domain-console", vmname]
|
||||||
self.app.open(extra_opts=extra_opts)
|
self.app.open(extra_opts=extra_opts)
|
||||||
fn(self, *args, **kwargs)
|
fn(self, dom, *args, **kwargs)
|
||||||
finally:
|
finally:
|
||||||
try:
|
try:
|
||||||
self.app.stop()
|
self.app.stop()
|
||||||
@ -55,7 +55,7 @@ class Console(uiutils.UITestCase):
|
|||||||
# Test cases #
|
# Test cases #
|
||||||
##############
|
##############
|
||||||
|
|
||||||
def _checkConsoleStandard(self):
|
def _checkConsoleStandard(self, dom):
|
||||||
"""
|
"""
|
||||||
Shared logic for general console handling
|
Shared logic for general console handling
|
||||||
"""
|
"""
|
||||||
@ -97,6 +97,11 @@ class Console(uiutils.UITestCase):
|
|||||||
uiutils.check(lambda: not fstb.showing, timeout=5)
|
uiutils.check(lambda: not fstb.showing, timeout=5)
|
||||||
self.point(win.position[0] + win.size[0] / 2, 0)
|
self.point(win.position[0] + win.size[0] / 2, 0)
|
||||||
uiutils.check(lambda: fstb.showing)
|
uiutils.check(lambda: fstb.showing)
|
||||||
|
# Move it off and have it hide again
|
||||||
|
win.point()
|
||||||
|
uiutils.check(lambda: not fstb.showing, timeout=5)
|
||||||
|
self.point(win.position[0] + win.size[0] / 2, 0)
|
||||||
|
uiutils.check(lambda: fstb.showing)
|
||||||
|
|
||||||
# Click stuff and exit fullscreen
|
# Click stuff and exit fullscreen
|
||||||
win.find("Fullscreen Send Key").click()
|
win.find("Fullscreen Send Key").click()
|
||||||
@ -104,6 +109,13 @@ class Console(uiutils.UITestCase):
|
|||||||
win.find("Fullscreen Exit").click()
|
win.find("Fullscreen Exit").click()
|
||||||
uiutils.check(lambda: win.size == newsize)
|
uiutils.check(lambda: win.size == newsize)
|
||||||
|
|
||||||
|
# Trigger pointer grab, verify title was updated
|
||||||
|
win.click()
|
||||||
|
uiutils.check(lambda: "Control_L" in win.name)
|
||||||
|
# Ungrab
|
||||||
|
win.keyCombo("<ctrl><alt>")
|
||||||
|
uiutils.check(lambda: "Control_L" not in win.name)
|
||||||
|
|
||||||
# Tweak scaling
|
# Tweak scaling
|
||||||
win.click_title()
|
win.click_title()
|
||||||
win.click_title()
|
win.click_title()
|
||||||
@ -115,15 +127,20 @@ class Console(uiutils.UITestCase):
|
|||||||
scalemenu = win.find("Scale Display", "menu")
|
scalemenu = win.find("Scale Display", "menu")
|
||||||
scalemenu.point()
|
scalemenu.point()
|
||||||
scalemenu.find("Never", "radio menu item").click()
|
scalemenu.find("Never", "radio menu item").click()
|
||||||
self.sleep(.5)
|
win.find("^View$", "menu").click()
|
||||||
|
scalemenu = win.find("Scale Display", "menu")
|
||||||
|
scalemenu.point()
|
||||||
|
scalemenu.find("Only", "radio menu item").click()
|
||||||
|
|
||||||
|
dom.destroy()
|
||||||
|
win.find("Guest is not running.")
|
||||||
|
|
||||||
@_vm_wrapper("uitests-vnc-standard")
|
@_vm_wrapper("uitests-vnc-standard")
|
||||||
def testConsoleVNCStandard(self):
|
def testConsoleVNCStandard(self, dom):
|
||||||
return self._checkConsoleStandard()
|
return self._checkConsoleStandard(dom)
|
||||||
@_vm_wrapper("uitests-spice-standard")
|
@_vm_wrapper("uitests-spice-standard")
|
||||||
def testConsoleSpiceStandard(self):
|
def testConsoleSpiceStandard(self, dom):
|
||||||
return self._checkConsoleStandard()
|
return self._checkConsoleStandard(dom)
|
||||||
|
|
||||||
|
|
||||||
def _checkPassword(self):
|
def _checkPassword(self):
|
||||||
"""
|
"""
|
||||||
@ -177,12 +194,32 @@ class Console(uiutils.UITestCase):
|
|||||||
uiutils.check(lambda: not bool(passwd.text))
|
uiutils.check(lambda: not bool(passwd.text))
|
||||||
|
|
||||||
@_vm_wrapper("uitests-vnc-password")
|
@_vm_wrapper("uitests-vnc-password")
|
||||||
def testConsoleVNCPassword(self):
|
def testConsoleVNCPassword(self, dom):
|
||||||
|
ignore = dom
|
||||||
return self._checkPassword()
|
return self._checkPassword()
|
||||||
@_vm_wrapper("uitests-spice-password")
|
@_vm_wrapper("uitests-spice-password")
|
||||||
def testConsoleSpicePassword(self):
|
def testConsoleSpicePassword(self, dom):
|
||||||
|
ignore = dom
|
||||||
return self._checkPassword()
|
return self._checkPassword()
|
||||||
|
|
||||||
|
@_vm_wrapper("uitests-vnc-password",
|
||||||
|
opts=["--test-options=fake-vnc-username"])
|
||||||
|
def testConsoleVNCPasswordUsername(self, dom):
|
||||||
|
ignore = dom
|
||||||
|
win = self.app.topwin
|
||||||
|
con = win.find("console-gfx-viewport")
|
||||||
|
uiutils.check(lambda: not con.showing)
|
||||||
|
passwd = win.find("Password:", "password text")
|
||||||
|
uiutils.check(lambda: passwd.showing)
|
||||||
|
username = win.find("Username:", "text")
|
||||||
|
uiutils.check(lambda: username.showing)
|
||||||
|
|
||||||
|
# Since we are mocking the username, sending the credentials
|
||||||
|
# is ignored, so with the correct password this succeeds
|
||||||
|
username.text = "fakeuser"
|
||||||
|
passwd.typeText("goodp")
|
||||||
|
win.find("Login", "push button").click()
|
||||||
|
uiutils.check(lambda: con.showing)
|
||||||
|
|
||||||
@_vm_wrapper("uitests-vnc-socket")
|
@_vm_wrapper("uitests-vnc-socket")
|
||||||
def testConsoleVNCSocket(self, dom):
|
def testConsoleVNCSocket(self, dom):
|
||||||
@ -205,10 +242,11 @@ class Console(uiutils.UITestCase):
|
|||||||
uiutils.check(lambda: con.showing)
|
uiutils.check(lambda: con.showing)
|
||||||
|
|
||||||
@_vm_wrapper("uitests-lxc-serial", uri="lxc:///")
|
@_vm_wrapper("uitests-lxc-serial", uri="lxc:///")
|
||||||
def testConsoleLXCSerial(self):
|
def testConsoleLXCSerial(self, dom):
|
||||||
"""
|
"""
|
||||||
Ensure LXC has serial open, and we can send some data
|
Ensure LXC has serial open, and we can send some data
|
||||||
"""
|
"""
|
||||||
|
ignore = dom
|
||||||
win = self.app.topwin
|
win = self.app.topwin
|
||||||
term = win.find("Serial Terminal")
|
term = win.find("Serial Terminal")
|
||||||
uiutils.check(lambda: term.showing)
|
uiutils.check(lambda: term.showing)
|
||||||
@ -246,12 +284,15 @@ class Console(uiutils.UITestCase):
|
|||||||
term = win.find("Serial Terminal")
|
term = win.find("Serial Terminal")
|
||||||
uiutils.check(lambda: term.showing)
|
uiutils.check(lambda: term.showing)
|
||||||
|
|
||||||
@_vm_wrapper("uitests-spice-specific", opts=["--test-options=spice-agent"])
|
@_vm_wrapper("uitests-spice-specific",
|
||||||
def testConsoleSpiceSpecific(self):
|
opts=["--test-options=spice-agent",
|
||||||
|
"--test-options=fake-console-resolution"])
|
||||||
|
def testConsoleSpiceSpecific(self, dom):
|
||||||
"""
|
"""
|
||||||
Spice specific behavior. Has lots of devices that will open
|
Spice specific behavior. Has lots of devices that will open
|
||||||
channels, spice GL + local config, and usbredir
|
channels, spice GL + local config, and usbredir
|
||||||
"""
|
"""
|
||||||
|
ignore = dom
|
||||||
win = self.app.topwin
|
win = self.app.topwin
|
||||||
con = win.find("console-gfx-viewport")
|
con = win.find("console-gfx-viewport")
|
||||||
uiutils.check(lambda: con.showing)
|
uiutils.check(lambda: con.showing)
|
||||||
@ -337,11 +378,12 @@ class Console(uiutils.UITestCase):
|
|||||||
|
|
||||||
|
|
||||||
@_vm_wrapper("uitests-hotplug")
|
@_vm_wrapper("uitests-hotplug")
|
||||||
def testLiveHotplug(self):
|
def testLiveHotplug(self, dom):
|
||||||
"""
|
"""
|
||||||
Live test for basic hotplugging and media change, as well as
|
Live test for basic hotplugging and media change, as well as
|
||||||
testing our auto-poolify magic
|
testing our auto-poolify magic
|
||||||
"""
|
"""
|
||||||
|
ignore = dom
|
||||||
import tempfile
|
import tempfile
|
||||||
tmpdir = tempfile.TemporaryDirectory(prefix="uitests-tmp")
|
tmpdir = tempfile.TemporaryDirectory(prefix="uitests-tmp")
|
||||||
dname = tmpdir.name
|
dname = tmpdir.name
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.22.1 -->
|
<!-- Generated with glade 3.36.0 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.22"/>
|
<requires lib="gtk+" version="3.22"/>
|
||||||
<object class="GtkAccelGroup" id="accelgroup1"/>
|
<object class="GtkAccelGroup" id="accelgroup1"/>
|
||||||
@ -18,9 +18,6 @@
|
|||||||
</accel-groups>
|
</accel-groups>
|
||||||
<signal name="configure-event" handler="on_vmm_details_configure_event" swapped="no"/>
|
<signal name="configure-event" handler="on_vmm_details_configure_event" swapped="no"/>
|
||||||
<signal name="delete-event" handler="on_vmm_details_delete_event" swapped="no"/>
|
<signal name="delete-event" handler="on_vmm_details_delete_event" swapped="no"/>
|
||||||
<child type="titlebar">
|
|
||||||
<placeholder/>
|
|
||||||
</child>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="vbox2">
|
<object class="GtkBox" id="vbox2">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -772,6 +769,11 @@
|
|||||||
<property name="tab_fill">False</property>
|
<property name="tab_fill">False</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child internal-child="accessible">
|
||||||
|
<object class="AtkObject" id="console-pages-atkobject">
|
||||||
|
<property name="AtkObject::accessible-name">console-pages</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
@ -821,5 +823,8 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child type="titlebar">
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
@ -350,8 +350,12 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
def _scroll_size_allocate(self, src_ignore, req):
|
def _scroll_size_allocate(self, src_ignore, req):
|
||||||
if not self._viewer:
|
if not self._viewer:
|
||||||
return
|
return
|
||||||
if not self._viewer.console_get_desktop_resolution():
|
|
||||||
|
res = self._viewer.console_get_desktop_resolution()
|
||||||
|
if res is None:
|
||||||
|
if not self.config.CLITestOptions.fake_console_resolution:
|
||||||
return
|
return
|
||||||
|
res = (800, 600)
|
||||||
|
|
||||||
scroll = self.widget("console-gfx-scroll")
|
scroll = self.widget("console-gfx-scroll")
|
||||||
is_scale = self._viewer.console_get_scaling()
|
is_scale = self._viewer.console_get_scaling()
|
||||||
@ -362,7 +366,7 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
align_ratio = float(req.width) / float(req.height)
|
align_ratio = float(req.width) / float(req.height)
|
||||||
|
|
||||||
# pylint: disable=unpacking-non-sequence
|
# pylint: disable=unpacking-non-sequence
|
||||||
desktop_w, desktop_h = self._viewer.console_get_desktop_resolution()
|
desktop_w, desktop_h = res
|
||||||
desktop_ratio = float(desktop_w) / float(desktop_h)
|
desktop_ratio = float(desktop_w) / float(desktop_h)
|
||||||
|
|
||||||
if is_scale:
|
if is_scale:
|
||||||
@ -556,7 +560,7 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
##########################
|
##########################
|
||||||
|
|
||||||
def _show_vm_status_unavailable(self):
|
def _show_vm_status_unavailable(self):
|
||||||
if self.vm.is_crashed():
|
if self.vm.is_crashed(): # pragma: no cover
|
||||||
self._activate_unavailable_page(_("Guest has crashed."))
|
self._activate_unavailable_page(_("Guest has crashed."))
|
||||||
else:
|
else:
|
||||||
self._activate_unavailable_page(_("Guest is not running."))
|
self._activate_unavailable_page(_("Guest is not running."))
|
||||||
@ -778,7 +782,7 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
force_accel = self.config.get_console_accels()
|
force_accel = self.config.get_console_accels()
|
||||||
|
|
||||||
if force_accel:
|
if force_accel:
|
||||||
self._enable_modifiers()
|
self._enable_modifiers() # pragma: no cover
|
||||||
elif self._someone_has_focus():
|
elif self._someone_has_focus():
|
||||||
self._disable_modifiers()
|
self._disable_modifiers()
|
||||||
else:
|
else:
|
||||||
@ -800,14 +804,15 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
self._activate_auth_page(withPassword, withUsername)
|
self._activate_auth_page(withPassword, withUsername)
|
||||||
|
|
||||||
def _viewer_agent_connected(self, ignore):
|
def _viewer_agent_connected(self, ignore):
|
||||||
self._refresh_resizeguest_from_settings()
|
self._refresh_resizeguest_from_settings() # pragma: no cover
|
||||||
|
|
||||||
def _viewer_usb_redirect_error(self, ignore, errstr):
|
def _viewer_usb_redirect_error(self, ignore, errstr):
|
||||||
self.err.show_err(_("USB redirection error"),
|
self.err.show_err(
|
||||||
text2=str(errstr), modal=True)
|
_("USB redirection error"),
|
||||||
|
text2=str(errstr), modal=True) # pragma: no cover
|
||||||
|
|
||||||
def _viewer_disconnected_set_page(self, errdetails, ssherr):
|
def _viewer_disconnected_set_page(self, errdetails, ssherr):
|
||||||
if self.vm.is_runable():
|
if self.vm.is_runable(): # pragma: no cover
|
||||||
# Exit was probably for legitimate reasons
|
# Exit was probably for legitimate reasons
|
||||||
self._show_vm_status_unavailable()
|
self._show_vm_status_unavailable()
|
||||||
return
|
return
|
||||||
|
@ -148,7 +148,7 @@ class _Tunnel(object):
|
|||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self._closed:
|
if self._closed:
|
||||||
return
|
return # pragma: no cover
|
||||||
self._closed = True
|
self._closed = True
|
||||||
|
|
||||||
log.debug("Close tunnel PID=%s ERRFD=%s",
|
log.debug("Close tunnel PID=%s ERRFD=%s",
|
||||||
@ -168,7 +168,7 @@ class _Tunnel(object):
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
new = self._errfd.recv(1024)
|
new = self._errfd.recv(1024)
|
||||||
except Exception:
|
except Exception: # pragma: no cover
|
||||||
break
|
break
|
||||||
|
|
||||||
if not new:
|
if not new:
|
||||||
@ -180,11 +180,11 @@ class _Tunnel(object):
|
|||||||
|
|
||||||
def open(self, argv, sshfd):
|
def open(self, argv, sshfd):
|
||||||
if self._closed:
|
if self._closed:
|
||||||
return
|
return # pragma: no cover
|
||||||
|
|
||||||
errfds = socket.socketpair()
|
errfds = socket.socketpair()
|
||||||
pid = os.fork()
|
pid = os.fork()
|
||||||
if pid == 0:
|
if pid == 0: # pragma: no cover
|
||||||
errfds[0].close()
|
errfds[0].close()
|
||||||
|
|
||||||
os.dup2(sshfd.fileno(), 0)
|
os.dup2(sshfd.fileno(), 0)
|
||||||
|
@ -16,7 +16,7 @@ try:
|
|||||||
from gi.repository import SpiceClientGtk
|
from gi.repository import SpiceClientGtk
|
||||||
from gi.repository import SpiceClientGLib
|
from gi.repository import SpiceClientGLib
|
||||||
have_spice_gtk = True
|
have_spice_gtk = True
|
||||||
except (ValueError, ImportError):
|
except (ValueError, ImportError): # pragma: no cover
|
||||||
have_spice_gtk = False
|
have_spice_gtk = False
|
||||||
|
|
||||||
from virtinst import log
|
from virtinst import log
|
||||||
@ -131,7 +131,7 @@ class Viewer(vmmGObject):
|
|||||||
if self._ginfo.gtlsport and not self._ginfo.gport:
|
if self._ginfo.gtlsport and not self._ginfo.gport:
|
||||||
# This makes spice loop requesting an fd. Disable until spice is
|
# This makes spice loop requesting an fd. Disable until spice is
|
||||||
# fixed: https://bugzilla.redhat.com/show_bug.cgi?id=1334071
|
# fixed: https://bugzilla.redhat.com/show_bug.cgi?id=1334071
|
||||||
return None
|
return None # pragma: no cover
|
||||||
|
|
||||||
if not self._vm.conn.support.domain_open_graphics():
|
if not self._vm.conn.support.domain_open_graphics():
|
||||||
return None
|
return None
|
||||||
@ -334,6 +334,9 @@ class VNCViewer(Viewer):
|
|||||||
for idx in range(int(credList.n_values)):
|
for idx in range(int(credList.n_values)):
|
||||||
values.append(credList.get_nth(idx))
|
values.append(credList.get_nth(idx))
|
||||||
|
|
||||||
|
if self.config.CLITestOptions.fake_vnc_username:
|
||||||
|
values.append(GtkVnc.DisplayCredential.USERNAME)
|
||||||
|
|
||||||
withUsername = False
|
withUsername = False
|
||||||
withPassword = False
|
withPassword = False
|
||||||
for cred in values:
|
for cred in values:
|
||||||
@ -378,23 +381,23 @@ class VNCViewer(Viewer):
|
|||||||
|
|
||||||
def _refresh_grab_keys(self):
|
def _refresh_grab_keys(self):
|
||||||
if not self._display:
|
if not self._display:
|
||||||
return
|
return # pragma: no cover
|
||||||
|
|
||||||
try:
|
try:
|
||||||
keys = self.config.get_keys_combination()
|
keys = self.config.get_keys_combination()
|
||||||
if not keys:
|
if not keys:
|
||||||
return
|
return # pragma: no cover
|
||||||
|
|
||||||
try:
|
try:
|
||||||
keys = [int(k) for k in keys.split(',')]
|
keys = [int(k) for k in keys.split(',')]
|
||||||
except Exception:
|
except Exception: # pragma: no cover
|
||||||
log.debug("Error in grab_keys configuration in Gsettings",
|
log.debug("Error in grab_keys configuration in Gsettings",
|
||||||
exc_info=True)
|
exc_info=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
seq = GtkVnc.GrabSequence.new(keys)
|
seq = GtkVnc.GrabSequence.new(keys)
|
||||||
self._display.set_grab_keys(seq)
|
self._display.set_grab_keys(seq)
|
||||||
except Exception as e:
|
except Exception as e: # pragma: no cover
|
||||||
log.debug("Error when getting the grab keys combination: %s",
|
log.debug("Error when getting the grab keys combination: %s",
|
||||||
str(e))
|
str(e))
|
||||||
|
|
||||||
@ -403,7 +406,7 @@ class VNCViewer(Viewer):
|
|||||||
|
|
||||||
def _refresh_keyboard_grab_default(self):
|
def _refresh_keyboard_grab_default(self):
|
||||||
if not self._display:
|
if not self._display:
|
||||||
return
|
return # pragma: no cover
|
||||||
self._display.set_keyboard_grab(self.config.get_keyboard_grab_default())
|
self._display.set_keyboard_grab(self.config.get_keyboard_grab_default())
|
||||||
|
|
||||||
def _get_desktop_resolution(self):
|
def _get_desktop_resolution(self):
|
||||||
@ -508,7 +511,7 @@ class SpiceViewer(Viewer):
|
|||||||
autoredir = self.config.get_auto_usbredir()
|
autoredir = self.config.get_auto_usbredir()
|
||||||
if autoredir:
|
if autoredir:
|
||||||
gtk_session.set_property("auto-usbredir", True)
|
gtk_session.set_property("auto-usbredir", True)
|
||||||
except Exception:
|
except Exception: # pragma: no cover
|
||||||
self._usbdev_manager = None
|
self._usbdev_manager = None
|
||||||
log.debug("Error initializing spice usb device manager",
|
log.debug("Error initializing spice usb device manager",
|
||||||
exc_info=True)
|
exc_info=True)
|
||||||
@ -559,7 +562,7 @@ class SpiceViewer(Viewer):
|
|||||||
# Can happen if we close the details window and clear self._tunnels
|
# Can happen if we close the details window and clear self._tunnels
|
||||||
# while initially connecting to spice and channel FD requests
|
# while initially connecting to spice and channel FD requests
|
||||||
# are still rolling in
|
# are still rolling in
|
||||||
return
|
return # pragma: no cover
|
||||||
|
|
||||||
log.debug("Requesting fd for channel: %s", channel)
|
log.debug("Requesting fd for channel: %s", channel)
|
||||||
channel.connect_after("channel-event", self._fd_channel_event_cb)
|
channel.connect_after("channel-event", self._fd_channel_event_cb)
|
||||||
@ -585,7 +588,7 @@ class SpiceViewer(Viewer):
|
|||||||
not self._display):
|
not self._display):
|
||||||
channel_id = channel.get_property("channel-id")
|
channel_id = channel.get_property("channel-id")
|
||||||
|
|
||||||
if channel_id != 0:
|
if channel_id != 0: # pragma: no cover
|
||||||
log.debug("Spice multi-head unsupported")
|
log.debug("Spice multi-head unsupported")
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -601,7 +604,7 @@ class SpiceViewer(Viewer):
|
|||||||
self._audio = SpiceClientGLib.Audio.get(self._spice_session, None)
|
self._audio = SpiceClientGLib.Audio.get(self._spice_session, None)
|
||||||
|
|
||||||
def _agent_connected_cb(self, src, val):
|
def _agent_connected_cb(self, src, val):
|
||||||
self.emit("agent-connected")
|
self.emit("agent-connected") # pragma: no cover
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
@ -626,23 +629,23 @@ class SpiceViewer(Viewer):
|
|||||||
|
|
||||||
def _refresh_grab_keys(self):
|
def _refresh_grab_keys(self):
|
||||||
if not self._display:
|
if not self._display:
|
||||||
return
|
return # pragma: no cover
|
||||||
|
|
||||||
try:
|
try:
|
||||||
keys = self.config.get_keys_combination()
|
keys = self.config.get_keys_combination()
|
||||||
if not keys:
|
if not keys:
|
||||||
return
|
return # pragma: no cover
|
||||||
|
|
||||||
try:
|
try:
|
||||||
keys = [int(k) for k in keys.split(',')]
|
keys = [int(k) for k in keys.split(',')]
|
||||||
except Exception:
|
except Exception: # pragma: no cover
|
||||||
log.debug("Error in grab_keys configuration in Gsettings",
|
log.debug("Error in grab_keys configuration in Gsettings",
|
||||||
exc_info=True)
|
exc_info=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
seq = SpiceClientGtk.GrabSequence.new(keys)
|
seq = SpiceClientGtk.GrabSequence.new(keys)
|
||||||
self._display.set_grab_keys(seq)
|
self._display.set_grab_keys(seq)
|
||||||
except Exception as e:
|
except Exception as e: # pragma: no cover
|
||||||
log.debug("Error when getting the grab keys combination: %s",
|
log.debug("Error when getting the grab keys combination: %s",
|
||||||
str(e))
|
str(e))
|
||||||
|
|
||||||
@ -652,7 +655,7 @@ class SpiceViewer(Viewer):
|
|||||||
|
|
||||||
def _refresh_keyboard_grab_default(self):
|
def _refresh_keyboard_grab_default(self):
|
||||||
if not self._display:
|
if not self._display:
|
||||||
return
|
return # pragma: no cover
|
||||||
self._display.set_property("grab-keyboard",
|
self._display.set_property("grab-keyboard",
|
||||||
self.config.get_keyboard_grab_default())
|
self.config.get_keyboard_grab_default())
|
||||||
|
|
||||||
@ -663,7 +666,7 @@ class SpiceViewer(Viewer):
|
|||||||
|
|
||||||
def _has_agent(self):
|
def _has_agent(self):
|
||||||
if not self._main_channel:
|
if not self._main_channel:
|
||||||
return False
|
return False # pragma: no cover
|
||||||
return (self._main_channel.get_property("agent-connected") or
|
return (self._main_channel.get_property("agent-connected") or
|
||||||
self.config.CLITestOptions.spice_agent)
|
self.config.CLITestOptions.spice_agent)
|
||||||
|
|
||||||
@ -686,14 +689,14 @@ class SpiceViewer(Viewer):
|
|||||||
self._spice_session.open_fd(fd)
|
self._spice_session.open_fd(fd)
|
||||||
|
|
||||||
def _set_username(self, cred):
|
def _set_username(self, cred):
|
||||||
ignore = cred
|
ignore = cred # pragma: no cover
|
||||||
def _set_password(self, cred):
|
def _set_password(self, cred):
|
||||||
self._spice_session.set_property("password", cred)
|
self._spice_session.set_property("password", cred)
|
||||||
fd = self._get_fd_for_open()
|
fd = self._get_fd_for_open()
|
||||||
if fd is not None:
|
if fd is not None:
|
||||||
self._spice_session.open_fd(fd)
|
self._spice_session.open_fd(fd)
|
||||||
else:
|
else:
|
||||||
self._spice_session.connect()
|
self._spice_session.connect() # pragma: no cover
|
||||||
|
|
||||||
def _get_scaling(self):
|
def _get_scaling(self):
|
||||||
if self._display:
|
if self._display:
|
||||||
@ -709,17 +712,17 @@ class SpiceViewer(Viewer):
|
|||||||
def _get_resizeguest(self):
|
def _get_resizeguest(self):
|
||||||
if self._display:
|
if self._display:
|
||||||
return self._display.get_property("resize-guest")
|
return self._display.get_property("resize-guest")
|
||||||
return False
|
return False # pragma: no cover
|
||||||
|
|
||||||
def _usbdev_redirect_error(self, spice_usbdev_widget, spice_usb_device,
|
def _usbdev_redirect_error(self, spice_usbdev_widget, spice_usb_device,
|
||||||
errstr):
|
errstr): # pragma: no cover
|
||||||
ignore = spice_usbdev_widget
|
ignore = spice_usbdev_widget
|
||||||
ignore = spice_usb_device
|
ignore = spice_usb_device
|
||||||
self.emit("usb-redirect-error", errstr)
|
self.emit("usb-redirect-error", errstr)
|
||||||
|
|
||||||
def _get_usb_widget(self):
|
def _get_usb_widget(self):
|
||||||
if not self._spice_session:
|
if not self._spice_session:
|
||||||
return
|
return # pragma: no cover
|
||||||
|
|
||||||
usbwidget = SpiceClientGtk.UsbDeviceWidget.new(self._spice_session,
|
usbwidget = SpiceClientGtk.UsbDeviceWidget.new(self._spice_session,
|
||||||
None)
|
None)
|
||||||
@ -728,7 +731,7 @@ class SpiceViewer(Viewer):
|
|||||||
|
|
||||||
def _has_usb_redirection(self):
|
def _has_usb_redirection(self):
|
||||||
if not self._spice_session or not self._usbdev_manager:
|
if not self._spice_session or not self._usbdev_manager:
|
||||||
return False
|
return False # pragma: no cover
|
||||||
|
|
||||||
for c in self._spice_session.get_channels():
|
for c in self._spice_session.get_channels():
|
||||||
if c.__class__ is SpiceClientGLib.UsbredirChannel:
|
if c.__class__ is SpiceClientGLib.UsbredirChannel:
|
||||||
|
@ -108,6 +108,10 @@ class CLITestOptionsClass:
|
|||||||
if we are doing firstrun testing
|
if we are doing firstrun testing
|
||||||
* fake-systemd-success: If doing firstrun testing, fake that
|
* fake-systemd-success: If doing firstrun testing, fake that
|
||||||
systemd checks for libvirtd succeeded
|
systemd checks for libvirtd succeeded
|
||||||
|
* fake-vnc-username: Fake VNC username auth request
|
||||||
|
* fake-console-resolution: Fake viewer console resolution response.
|
||||||
|
Spice doesn't return values here when we are just testing
|
||||||
|
against seabios in uitests, this fakes it to hit more code paths
|
||||||
"""
|
"""
|
||||||
def __init__(self, test_options_str):
|
def __init__(self, test_options_str):
|
||||||
optset = set()
|
optset = set()
|
||||||
@ -143,6 +147,8 @@ class CLITestOptionsClass:
|
|||||||
self.spice_agent = _get("spice-agent")
|
self.spice_agent = _get("spice-agent")
|
||||||
self.firstrun_uri = _get_value("firstrun-uri")
|
self.firstrun_uri = _get_value("firstrun-uri")
|
||||||
self.fake_systemd_success = _get("fake-systemd-success")
|
self.fake_systemd_success = _get("fake-systemd-success")
|
||||||
|
self.fake_vnc_username = _get("fake-vnc-username")
|
||||||
|
self.fake_console_resolution = _get("fake-console-resolution")
|
||||||
|
|
||||||
if optset: # pragma: no cover
|
if optset: # pragma: no cover
|
||||||
raise RuntimeError("Unknown --test-options keys: %s" % optset)
|
raise RuntimeError("Unknown --test-options keys: %s" % optset)
|
||||||
|
Loading…
Reference in New Issue
Block a user