tests: uitests: More createvm testing

Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2020-02-05 14:58:51 -05:00
parent 01eb65bd61
commit eb605cccd8
4 changed files with 154 additions and 53 deletions

View File

@ -29,6 +29,13 @@ class NewVM(uiutils.UITestCase):
if check:
uiutils.check_in_loop(lambda: pagenumlabel.text != oldtext)
def back(self, newvm, check=True):
pagenumlabel = newvm.find("pagenum-label")
oldtext = pagenumlabel.text
newvm.find_fuzzy("Back", "button").click()
if check:
uiutils.check_in_loop(lambda: pagenumlabel.text != oldtext)
##############
# Test cases #
@ -62,8 +69,8 @@ class NewVM(uiutils.UITestCase):
entry.click()
# Back up, select test:///default, verify media-combo is now empty
self.back(newvm)
back = newvm.find_fuzzy("Back", "button")
back.click()
uiutils.check_in_loop(lambda: not back.sensitive)
combo.click()
combo.find_fuzzy("test default").click()
@ -99,7 +106,7 @@ class NewVM(uiutils.UITestCase):
# Verify back+forward still keeps Generic selected
self.sleep(.5)
newvm.find_fuzzy("Back", "button").click()
self.back(newvm)
self.sleep(.5)
self.forward(newvm)
self.sleep(.5)
@ -236,19 +243,21 @@ class NewVM(uiutils.UITestCase):
url = "https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/10/Fedora/x86_64/os/"
oslabel = "Fedora 10"
newvm.find("install-url-entry").text = url
newvm.find("install-urlopts-expander").click_expander()
newvm.find("install-urlopts-entry").text = "foo=bar"
uiutils.check_in_loop(lambda: osentry.text == oslabel, timeout=10)
# Move forward, then back, ensure OS stays selected
self.forward(newvm)
newvm.find_fuzzy("Back", "button").click()
self.back(newvm)
uiutils.check_in_loop(lambda: osentry.text == oslabel)
# Disable autodetect, make sure OS still selected
newvm.find_fuzzy("Automatically detect", "check").click()
uiutils.check_in_loop(lambda: osentry.text == oslabel)
self.forward(newvm)
newvm.find_fuzzy("Back", "button").click()
self.back(newvm)
# Ensure the EOL field was selected
osentry.click()
@ -296,19 +305,36 @@ class NewVM(uiutils.UITestCase):
newvm.find("oslist-entry").text = "generic"
newvm.find("oslist-popover").find_fuzzy("generic").click()
self.forward(newvm, check=False)
# Path permission check
alert = self.app.root.find("vmm dialog", "alert")
alert.find_fuzzy("No", "push button").click()
self.forward(newvm)
newvm.find_fuzzy("Finish", "button").click()
self.app.root.find_fuzzy("vm-ppc64 on", "frame")
self.assertFalse(newvm.showing)
def testNewVMAArch64UEFI(self):
"""
Test aarch64 UEFI usage
"""
self.app.uri = tests.utils.URIs.kvm_aarch64
newvm = self._open_create_wizard()
def testNewArmKernel(self):
newvm.find_fuzzy("Local install media", "radio").click()
self.forward(newvm)
newvm.find_fuzzy("Automatically detect", "check").click()
newvm.find("oslist-entry").text = "generic"
newvm.find("oslist-popover").find_fuzzy("generic").click()
newvm.find("media-entry").text = "/dev/default-pool/testvol1.img"
self.forward(newvm)
self.forward(newvm)
newvm.find_fuzzy("Enable storage", "check box").click()
self.forward(newvm)
newvm.find_fuzzy("Finish", "button").click()
self.app.root.find_fuzzy("vm1 on", "frame")
self.assertFalse(newvm.showing)
def testNewVMArmKernel(self):
"""
New arm VM that requires kernel/initrd/dtb
"""
@ -323,11 +349,15 @@ class NewVM(uiutils.UITestCase):
self.assertTrue(TCG.showing)
# Validate some initial defaults
newvm.find_fuzzy("Virt Type", "combo").click()
newvm.find_fuzzy("Import", "radio").click()
newvm.find_fuzzy("Import", "radio").click()
self.assertFalse(newvm.find_fuzzy("Local", "radio").sensitive)
newvm.find_fuzzy("vexpress-a15", "menu item")
newvm.find("virt", "menu item")
newvm.find_fuzzy("Machine Type", "combo").click()
self.sleep(.2)
newvm.find_fuzzy("canon", "menu item").click()
newvm.find_fuzzy("Machine Type", "combo").click()
self.sleep(.2)
newvm.find("virt", "menu item").click()
self.forward(newvm)
# Set the import media details
@ -343,10 +373,6 @@ class NewVM(uiutils.UITestCase):
alert = self.app.root.find("vmm dialog", "alert")
alert.find_fuzzy("Yes", "push button").click()
# Path permission check
alert = self.app.root.find("vmm dialog", "alert")
alert.find_fuzzy("No", "push button").click()
self.forward(newvm)
newvm.find_fuzzy("Finish", "button").click()
@ -370,6 +396,11 @@ class NewVM(uiutils.UITestCase):
"text", "application path").text = "/sbin/init"
self.forward(newvm)
self.forward(newvm)
# Trigger back, to ensure disk page skipping works
self.back(newvm)
self.back(newvm)
self.forward(newvm)
self.forward(newvm)
newvm.find_fuzzy("Finish", "button").click()
time.sleep(1)
@ -420,6 +451,38 @@ class NewVM(uiutils.UITestCase):
self.assertFalse(newvm.showing)
def testNewVMContainerBootstrap(self):
self.app.uri = tests.utils.URIs.lxc
try:
import virtBootstrap # pylint: disable=unused-import
except ImportError:
self.skipTest("virtBootstrap not installed")
newvm = self._open_create_wizard()
newvm.find_fuzzy("Operating system", "radio").click()
self.forward(newvm)
# Set directory path
import tempfile
tmpdir = tempfile.TemporaryDirectory()
newvm.find_fuzzy("Create OS directory", "check box").click()
self.sleep(.5)
rootdir = newvm.find_fuzzy(None, "text", "root directory")
self.assertTrue(".local/share/libvirt" in rootdir.text)
rootdir.text = tmpdir.name
newvm.find("install-oscontainer-source-uri").text = "docker://alpine"
newvm.find("install-oscontainer-root-passwd").text = "foobar"
self.forward(newvm)
self.forward(newvm)
newvm.find_fuzzy("Finish", "button").click()
prog = self.app.root.find("Creating Virtual Machine", "frame")
uiutils.check_in_loop(lambda: not prog.showing, timeout=30)
time.sleep(1)
self.app.root.find_fuzzy("container1 on", "frame")
self.assertFalse(newvm.showing)
def testNewVMXenPV(self):
"""
Test the create wizard with a fake xen PV install
@ -441,26 +504,49 @@ class NewVM(uiutils.UITestCase):
self.forward(newvm)
newvm.find_fuzzy("Finish", "button").click()
self.app.root.find_fuzzy("vm1 on", "frame")
self.assertFalse(newvm.showing)
def testNewVMInstallFail(self):
newvm = self._open_create_wizard()
newvm.find_fuzzy("Manual", "radio").click()
self.forward(newvm)
newvm.find("oslist-entry").text = "generic"
newvm.find("oslist-popover").find_fuzzy("generic").click()
self.forward(newvm)
self.forward(newvm)
self.forward(newvm)
def dofail():
_newvm = self._open_create_wizard()
_newvm.find_fuzzy("Manual", "radio").click()
self.forward(_newvm)
_newvm.find("oslist-entry").text = "generic"
_newvm.find("oslist-popover").find_fuzzy("generic").click()
self.forward(_newvm)
self.forward(_newvm)
self.forward(_newvm)
# '/' in name will trigger libvirt error
newvm.find_fuzzy("Name", "text").text = "test/bad"
newvm.find_fuzzy("Finish", "button").click()
alert = self.app.root.find("vmm dialog", "alert")
alert.find_fuzzy("Unable to complete install")
alert.find_fuzzy("Close", "button").click()
# '/' in name will trigger libvirt error
_newvm.find_fuzzy("Name", "text").text = "test/bad"
_newvm.find_fuzzy("Finish", "button").click()
alert = self.app.root.find("vmm dialog", "alert")
alert.find_fuzzy("Unable to complete install")
alert.find_fuzzy("Close", "button").click()
return _newvm
newvm = dofail()
# Closing dialog should trigger storage cleanup path
newvm.find_fuzzy("Cancel", "button").click()
uiutils.check_in_loop(lambda: not newvm.visible)
# Run again
newvm = dofail()
self.back(newvm)
newvm.find_fuzzy("Select or create", "radio").click()
newvm.find("storage-entry").text = "/dev/default-pool/somenewvol1"
self.forward(newvm)
newvm.find_fuzzy("Name", "text").text = "test-foo"
newvm.find_fuzzy("Finish", "button").click()
alert = self.app.root.find("vmm dialog")
alert.find_fuzzy("Unable to complete install")
# self.app.root.find_fuzzy("test-foo on", "frame")
# self.assertFalse(newvm.showing)
def testNewVMCustomizeXMLEdit(self):

View File

@ -469,8 +469,7 @@ class VMMDogtailApp(object):
cmd = [sys.executable]
if tests.utils.clistate.use_coverage:
cmd += ["-m", "coverage", "run", "--append",
"--omit", "/usr/*",
"--omit", "*/virtinst/*"]
"--source", os.path.join(os.getcwd(), "virtManager")]
cmd += [os.path.join(os.getcwd(), "virt-manager"),
"--test-first-run",
"--no-fork"]

View File

@ -955,6 +955,11 @@ bar</property>
<property name="valign">center</property>
<property name="hexpand">True</property>
<property name="invisible_char">●</property>
<child internal-child="accessible">
<object class="AtkObject" id="install-urlopts-entry-atkobject">
<property name="AtkObject::accessible-name" translatable="yes">install-urlopts-entry</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">1</property>
@ -973,6 +978,11 @@ bar</property>
<property name="use_underline">True</property>
</object>
</child>
<child internal-child="accessible">
<object class="AtkObject" id="install-url-options-atkobject">
<property name="AtkObject::accessible-name" translatable="yes">install-urlopts-expander</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
@ -1451,6 +1461,11 @@ connections is not yet supported.&lt;/small&gt;</property>
* docker://registry:port/image:tag
* virt-builder://template
</property>
<child internal-child="accessible">
<object class="AtkObject" id="install-oscontainer-source-url-entry-atkobject">
<property name="AtkObject::accessible-name" translatable="yes">install-oscontainer-source-uri</property>
</object>
</child>
</object>
</child>
</object>
@ -1561,6 +1576,7 @@ connections is not yet supported.&lt;/small&gt;</property>
<child>
<object class="GtkBox" id="install-oscontainer-rootpw-box">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="spacing">3</property>
<child>
@ -1581,6 +1597,11 @@ connections is not yet supported.&lt;/small&gt;</property>
<property name="can_focus">True</property>
<property name="visibility">False</property>
<property name="invisible_char">●</property>
<child internal-child="accessible">
<object class="AtkObject" id="install-oscontainer-rootpw-atkobject">
<property name="AtkObject::accessible-name" translatable="yes">install-oscontainer-root-passwd</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>

View File

@ -109,7 +109,7 @@ class vmmCreateVM(vmmGObjectUI):
if not cls._instance:
cls._instance = vmmCreateVM()
cls._instance.show(parentobj and parentobj.topwin or None, uri=uri)
except Exception as e:
except Exception as e: # pragma: no cover
if not parentobj:
raise
parentobj.err.show_err(
@ -593,13 +593,10 @@ class vmmCreateVM(vmmGObjectUI):
# CPU
phys_cpus = int(self.conn.host_active_processor_count())
cmax = phys_cpus
if cmax <= 0:
cmax = 1
cpu_label = (_("Up to %(numcpus)d available") %
{'numcpus': int(phys_cpus)})
cpu_label = ("<span size='small'>%s</span>" % cpu_label)
self.widget("cpus").set_range(1, cmax)
self.widget("cpus").set_range(1, max(phys_cpus, 1))
self.widget("phys-cpu-label").set_markup(cpu_label)
# Storage
@ -638,7 +635,7 @@ class vmmCreateVM(vmmGObjectUI):
try:
self._populate_conn_state()
except Exception as e:
except Exception as e: # pragma: no cover
log.exception("Error setting create wizard conn state.")
return self._show_startup_error(str(e))
@ -689,7 +686,7 @@ class vmmCreateVM(vmmGObjectUI):
for guest in guests:
if not guest.domains:
continue
continue # pragma: no cover
gtype = guest.os_type
dom = guest.domains[0]
@ -736,12 +733,11 @@ class vmmCreateVM(vmmGObjectUI):
"s390x"]
if self.conn.caps.host.cpu.arch not in prios:
prios = []
else:
for p in prios[:]:
if p not in archs:
prios.remove(p)
else:
archs.remove(p)
for p in prios[:]:
if p not in archs:
prios.remove(p)
else:
archs.remove(p)
if prios:
if archs:
prios += [None]
@ -1059,7 +1055,7 @@ class vmmCreateVM(vmmGObjectUI):
self._failed_guest, meter)
def _cleanup_disks_finished(error, details):
if error:
if error: # pragma: no cover
log.debug("Error cleaning up disk images:"
"\nerror=%s\ndetails=%s", error, details)
self.idle_add(self._close)
@ -1194,7 +1190,7 @@ class vmmCreateVM(vmmGObjectUI):
try:
path, ignore = self._get_storage_path(newname, do_log=False)
self._populate_summary_storage(path=path)
except Exception:
except Exception: # pragma: no cover
log.debug("Error generating storage path on name change "
"for name=%s", newname, exc_info=True)
@ -1226,10 +1222,9 @@ class vmmCreateVM(vmmGObjectUI):
# Auto-generate a path if not specified
if enable_src and not self.widget("install-oscontainer-fs").get_text():
if os.geteuid() == 0:
fs_dir = ['/var/lib/libvirt/filesystems/']
else:
fs_dir = [os.environ['HOME'],
fs_dir = ['/var/lib/libvirt/filesystems/']
if os.geteuid() != 0:
fs_dir = [os.path.expanduser("~"),
'.local/share/libvirt/filesystems/']
default_name = virtinst.Guest.generate_name(self._guest)
@ -1366,7 +1361,7 @@ class vmmCreateVM(vmmGObjectUI):
if pagenum == PAGE_FINISH:
try:
self._populate_summary()
except Exception as e:
except Exception as e: # pragma: no cover
self.err.show_err(_("Error populating summary page: %s") %
str(e))
return