mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
urlfetcher: Add http and ftp unit test mocking
This commit is contained in:
parent
9fc20d4a97
commit
37adfb0150
87
tests/cli-test-xml/compare/virt-install-fake-ftp.xml
Normal file
87
tests/cli-test-xml/compare/virt-install-fake-ftp.xml
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<domain type="test">
|
||||||
|
<name>foobar</name>
|
||||||
|
<uuid>00000000-1111-2222-3333-444444444444</uuid>
|
||||||
|
<metadata>
|
||||||
|
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
|
||||||
|
<libosinfo:os id="http://redhat.com/rhel/6.0"/>
|
||||||
|
</libosinfo:libosinfo>
|
||||||
|
</metadata>
|
||||||
|
<memory>65536</memory>
|
||||||
|
<currentMemory>65536</currentMemory>
|
||||||
|
<vcpu>2</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch="i686">hvm</type>
|
||||||
|
<kernel>/tmp/virtinst-vmlinuz.</kernel>
|
||||||
|
<initrd>/tmp/virtinst-initrd.img.</initrd>
|
||||||
|
<cmdline>method=ftp://example.com</cmdline>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<pae/>
|
||||||
|
</features>
|
||||||
|
<clock offset="utc"/>
|
||||||
|
<on_reboot>destroy</on_reboot>
|
||||||
|
<pm>
|
||||||
|
<suspend-to-mem enabled="no"/>
|
||||||
|
<suspend-to-disk enabled="no"/>
|
||||||
|
</pm>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/test-hv</emulator>
|
||||||
|
<controller type="usb" index="0" model="ich9-ehci1"/>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci1">
|
||||||
|
<master startport="0"/>
|
||||||
|
</controller>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci2">
|
||||||
|
<master startport="2"/>
|
||||||
|
</controller>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci3">
|
||||||
|
<master startport="4"/>
|
||||||
|
</controller>
|
||||||
|
<interface type="user">
|
||||||
|
<mac address="00:11:22:33:44:55"/>
|
||||||
|
<model type="e1000"/>
|
||||||
|
</interface>
|
||||||
|
<console type="pty"/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
||||||
|
<domain type="test">
|
||||||
|
<name>foobar</name>
|
||||||
|
<uuid>00000000-1111-2222-3333-444444444444</uuid>
|
||||||
|
<metadata>
|
||||||
|
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
|
||||||
|
<libosinfo:os id="http://redhat.com/rhel/6.0"/>
|
||||||
|
</libosinfo:libosinfo>
|
||||||
|
</metadata>
|
||||||
|
<memory>65536</memory>
|
||||||
|
<currentMemory>65536</currentMemory>
|
||||||
|
<vcpu>2</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch="i686">hvm</type>
|
||||||
|
<boot dev="hd"/>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<pae/>
|
||||||
|
</features>
|
||||||
|
<clock offset="utc"/>
|
||||||
|
<pm>
|
||||||
|
<suspend-to-mem enabled="no"/>
|
||||||
|
<suspend-to-disk enabled="no"/>
|
||||||
|
</pm>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/test-hv</emulator>
|
||||||
|
<controller type="usb" index="0" model="ich9-ehci1"/>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci1">
|
||||||
|
<master startport="0"/>
|
||||||
|
</controller>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci2">
|
||||||
|
<master startport="2"/>
|
||||||
|
</controller>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci3">
|
||||||
|
<master startport="4"/>
|
||||||
|
</controller>
|
||||||
|
<interface type="user">
|
||||||
|
<mac address="00:11:22:33:44:55"/>
|
||||||
|
<model type="e1000"/>
|
||||||
|
</interface>
|
||||||
|
<console type="pty"/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
87
tests/cli-test-xml/compare/virt-install-fake-http.xml
Normal file
87
tests/cli-test-xml/compare/virt-install-fake-http.xml
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<domain type="test">
|
||||||
|
<name>foobar</name>
|
||||||
|
<uuid>00000000-1111-2222-3333-444444444444</uuid>
|
||||||
|
<metadata>
|
||||||
|
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
|
||||||
|
<libosinfo:os id="http://redhat.com/rhel/6.0"/>
|
||||||
|
</libosinfo:libosinfo>
|
||||||
|
</metadata>
|
||||||
|
<memory>65536</memory>
|
||||||
|
<currentMemory>65536</currentMemory>
|
||||||
|
<vcpu>2</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch="i686">hvm</type>
|
||||||
|
<kernel>/tmp/virtinst-vmlinuz.</kernel>
|
||||||
|
<initrd>/tmp/virtinst-initrd.img.</initrd>
|
||||||
|
<cmdline>method=https://foobar.com</cmdline>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<pae/>
|
||||||
|
</features>
|
||||||
|
<clock offset="utc"/>
|
||||||
|
<on_reboot>destroy</on_reboot>
|
||||||
|
<pm>
|
||||||
|
<suspend-to-mem enabled="no"/>
|
||||||
|
<suspend-to-disk enabled="no"/>
|
||||||
|
</pm>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/test-hv</emulator>
|
||||||
|
<controller type="usb" index="0" model="ich9-ehci1"/>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci1">
|
||||||
|
<master startport="0"/>
|
||||||
|
</controller>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci2">
|
||||||
|
<master startport="2"/>
|
||||||
|
</controller>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci3">
|
||||||
|
<master startport="4"/>
|
||||||
|
</controller>
|
||||||
|
<interface type="user">
|
||||||
|
<mac address="00:11:22:33:44:55"/>
|
||||||
|
<model type="e1000"/>
|
||||||
|
</interface>
|
||||||
|
<console type="pty"/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
||||||
|
<domain type="test">
|
||||||
|
<name>foobar</name>
|
||||||
|
<uuid>00000000-1111-2222-3333-444444444444</uuid>
|
||||||
|
<metadata>
|
||||||
|
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
|
||||||
|
<libosinfo:os id="http://redhat.com/rhel/6.0"/>
|
||||||
|
</libosinfo:libosinfo>
|
||||||
|
</metadata>
|
||||||
|
<memory>65536</memory>
|
||||||
|
<currentMemory>65536</currentMemory>
|
||||||
|
<vcpu>2</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch="i686">hvm</type>
|
||||||
|
<boot dev="hd"/>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<pae/>
|
||||||
|
</features>
|
||||||
|
<clock offset="utc"/>
|
||||||
|
<pm>
|
||||||
|
<suspend-to-mem enabled="no"/>
|
||||||
|
<suspend-to-disk enabled="no"/>
|
||||||
|
</pm>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/test-hv</emulator>
|
||||||
|
<controller type="usb" index="0" model="ich9-ehci1"/>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci1">
|
||||||
|
<master startport="0"/>
|
||||||
|
</controller>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci2">
|
||||||
|
<master startport="2"/>
|
||||||
|
</controller>
|
||||||
|
<controller type="usb" index="0" model="ich9-uhci3">
|
||||||
|
<master startport="4"/>
|
||||||
|
</controller>
|
||||||
|
<interface type="user">
|
||||||
|
<mac address="00:11:22:33:44:55"/>
|
||||||
|
<model type="e1000"/>
|
||||||
|
</interface>
|
||||||
|
<console type="pty"/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -782,6 +782,8 @@ c.add_valid("--cdrom %(EXISTIMG2)s --os-variant win2k3 --wait 0 --print-step 2")
|
|||||||
c.add_valid("--pxe --autostart") # --autostart flag
|
c.add_valid("--pxe --autostart") # --autostart flag
|
||||||
c.add_compare("--cdrom http://example.com/path/to/some.iso", "cdrom-url")
|
c.add_compare("--cdrom http://example.com/path/to/some.iso", "cdrom-url")
|
||||||
c.add_compare("--pxe --print-step all", "simple-pxe") # Diskless PXE install
|
c.add_compare("--pxe --print-step all", "simple-pxe") # Diskless PXE install
|
||||||
|
c.add_compare("--location ftp://example.com", "fake-ftp") # fake ftp:// install using urlfetcher.py mocking
|
||||||
|
c.add_compare("--location https://foobar.com", "fake-http") # fake https:// install using urlfetcher.py mocking
|
||||||
c.add_invalid("--pxe --virt-type bogus") # Bogus virt-type
|
c.add_invalid("--pxe --virt-type bogus") # Bogus virt-type
|
||||||
c.add_invalid("--pxe --arch bogus") # Bogus arch
|
c.add_invalid("--pxe --arch bogus") # Bogus arch
|
||||||
c.add_invalid("--livecd") # LiveCD with no media
|
c.add_invalid("--livecd") # LiveCD with no media
|
||||||
|
@ -16,6 +16,9 @@ import virtinst.progress
|
|||||||
from virtinst import Installer
|
from virtinst import Installer
|
||||||
from virtinst import Guest
|
from virtinst import Guest
|
||||||
|
|
||||||
|
# These are all functional tests
|
||||||
|
os.environ.pop("VIRTINST_TEST_SUITE", None)
|
||||||
|
|
||||||
|
|
||||||
class _URLTestData(object):
|
class _URLTestData(object):
|
||||||
"""
|
"""
|
||||||
@ -182,8 +185,6 @@ def _testURL(testdata):
|
|||||||
|
|
||||||
|
|
||||||
def _testURLWrapper(testdata):
|
def _testURLWrapper(testdata):
|
||||||
os.environ.pop("VIRTINST_TEST_SUITE", None)
|
|
||||||
|
|
||||||
sys.stdout.write("\nTesting %-25s " % testdata.name)
|
sys.stdout.write("\nTesting %-25s " % testdata.name)
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
@ -8,11 +8,16 @@
|
|||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from gi.repository import Libosinfo
|
from gi.repository import Libosinfo
|
||||||
|
|
||||||
|
|
||||||
|
def _in_testsuite():
|
||||||
|
return "VIRTINST_TEST_SUITE" in os.environ
|
||||||
|
|
||||||
|
|
||||||
###################
|
###################
|
||||||
# Sorting helpers #
|
# Sorting helpers #
|
||||||
###################
|
###################
|
||||||
@ -234,6 +239,12 @@ class _OSDB(object):
|
|||||||
def guess_os_by_tree(self, location):
|
def guess_os_by_tree(self, location):
|
||||||
if location.startswith("/"):
|
if location.startswith("/"):
|
||||||
location = "file://" + location
|
location = "file://" + location
|
||||||
|
|
||||||
|
if _in_testsuite() and not location.startswith("file:"):
|
||||||
|
# We have mock network tests, but we don't want to pass the
|
||||||
|
# fake URL to libosinfo because it slows down the testcase
|
||||||
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tree = Libosinfo.Tree.create_from_location(location, None)
|
tree = Libosinfo.Tree.create_from_location(location, None)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
#
|
#
|
||||||
# This work is licensed under the GNU GPLv2 or later.
|
# This work is licensed under the GNU GPLv2 or later.
|
||||||
# See the COPYING file in the top-level directory.
|
# See the COPYING file in the top-level directory.
|
||||||
|
#
|
||||||
|
# Backends for the various URL types we support (http, https, ftp, local)
|
||||||
|
|
||||||
import ftplib
|
import ftplib
|
||||||
import io
|
import io
|
||||||
@ -15,9 +17,74 @@ import urllib
|
|||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
|
||||||
###########################################################################
|
##############################
|
||||||
# Backends for the various URL types we support (http, https, ftp, local) #
|
# Mocking for the test suite #
|
||||||
###########################################################################
|
##############################
|
||||||
|
|
||||||
|
def _in_testsuite():
|
||||||
|
return "VIRTINST_TEST_SUITE" in os.environ
|
||||||
|
|
||||||
|
|
||||||
|
def _make_mock_url(url, filesyntax):
|
||||||
|
if url.endswith("treeinfo"):
|
||||||
|
# If the url is requesting treeinfo, give a fake treeinfo from
|
||||||
|
# our testsuite data
|
||||||
|
fn = ("%s/../tests/cli-test-xml/fakerhel6tree/.treeinfo" %
|
||||||
|
os.path.abspath(os.path.dirname(__file__)))
|
||||||
|
abspath = os.path.abspath(fn)
|
||||||
|
else:
|
||||||
|
# Otherwise just copy this file
|
||||||
|
abspath = os.path.abspath(__file__)
|
||||||
|
|
||||||
|
if filesyntax:
|
||||||
|
return "file://" + abspath
|
||||||
|
return abspath
|
||||||
|
|
||||||
|
|
||||||
|
class _MockRequestsResponse:
|
||||||
|
def __init__(self, url):
|
||||||
|
fn = _make_mock_url(url, filesyntax=False)
|
||||||
|
self._content = open(fn).read()
|
||||||
|
self.headers = {'content-length': len(self._content)}
|
||||||
|
|
||||||
|
def raise_for_status(self):
|
||||||
|
pass
|
||||||
|
def iter_content(self, *args, **kwargs):
|
||||||
|
dummy = args
|
||||||
|
dummy = kwargs
|
||||||
|
return [self._content.encode("utf-8")]
|
||||||
|
|
||||||
|
|
||||||
|
class _MockRequestsSession:
|
||||||
|
def close(self):
|
||||||
|
pass
|
||||||
|
def head(self, url, *args, **kwargs):
|
||||||
|
dummy = args
|
||||||
|
dummy = kwargs
|
||||||
|
return _MockRequestsResponse(url)
|
||||||
|
def get(self, url, *args, **kwargs):
|
||||||
|
dummy = args
|
||||||
|
dummy = kwargs
|
||||||
|
return _MockRequestsResponse(url)
|
||||||
|
|
||||||
|
|
||||||
|
class _MockFTPSession:
|
||||||
|
def connect(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
def login(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
def voidcmd(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
def quit(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
def size(self, url):
|
||||||
|
path = _make_mock_url(url, filesyntax=False)
|
||||||
|
return os.path.getsize(path)
|
||||||
|
|
||||||
|
|
||||||
|
###########################
|
||||||
|
# Fetcher implementations #
|
||||||
|
###########################
|
||||||
|
|
||||||
class _URLFetcher(object):
|
class _URLFetcher(object):
|
||||||
"""
|
"""
|
||||||
@ -168,7 +235,10 @@ class _HTTPURLFetcher(_URLFetcher):
|
|||||||
_session = None
|
_session = None
|
||||||
|
|
||||||
def _prepare(self):
|
def _prepare(self):
|
||||||
self._session = requests.Session()
|
if _in_testsuite():
|
||||||
|
self._session = _MockRequestsSession()
|
||||||
|
else:
|
||||||
|
self._session = requests.Session()
|
||||||
|
|
||||||
def _cleanup(self):
|
def _cleanup(self):
|
||||||
if self._session:
|
if self._session:
|
||||||
@ -227,7 +297,10 @@ class _FTPURLFetcher(_URLFetcher):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
parsed = urllib.parse.urlparse(self.location)
|
parsed = urllib.parse.urlparse(self.location)
|
||||||
self._ftp = ftplib.FTP()
|
if _in_testsuite():
|
||||||
|
self._ftp = _MockFTPSession()
|
||||||
|
else:
|
||||||
|
self._ftp = ftplib.FTP()
|
||||||
username = urllib.parse.unquote(parsed.username or '')
|
username = urllib.parse.unquote(parsed.username or '')
|
||||||
password = urllib.parse.unquote(parsed.password or '')
|
password = urllib.parse.unquote(parsed.password or '')
|
||||||
self._ftp.connect(parsed.hostname, parsed.port or 0)
|
self._ftp.connect(parsed.hostname, parsed.port or 0)
|
||||||
@ -242,6 +315,8 @@ class _FTPURLFetcher(_URLFetcher):
|
|||||||
"""
|
"""
|
||||||
Use urllib and ftplib to grab the file
|
Use urllib and ftplib to grab the file
|
||||||
"""
|
"""
|
||||||
|
if _in_testsuite():
|
||||||
|
url = _make_mock_url(url, filesyntax=True)
|
||||||
request = urllib.request.Request(url)
|
request = urllib.request.Request(url)
|
||||||
urlobj = urllib.request.urlopen(request)
|
urlobj = urllib.request.urlopen(request)
|
||||||
size = self._ftp.size(urllib.parse.urlparse(url)[2])
|
size = self._ftp.size(urllib.parse.urlparse(url)[2])
|
||||||
|
Loading…
Reference in New Issue
Block a user