2016-02-23 16:35:48 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
|
|
|
:codeauthor: :email:`Bo Maryniuk <bo@suse.de>`
|
|
|
|
'''
|
|
|
|
|
|
|
|
# Import Python Libs
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
|
|
|
# Import Salt Testing Libs
|
|
|
|
from salttesting import TestCase, skipIf
|
|
|
|
from salttesting.mock import (
|
|
|
|
MagicMock,
|
|
|
|
patch,
|
|
|
|
NO_MOCK,
|
|
|
|
NO_MOCK_REASON
|
|
|
|
)
|
2016-02-24 10:55:34 +00:00
|
|
|
from salt.exceptions import CommandExecutionError
|
|
|
|
|
2016-02-23 16:35:48 +00:00
|
|
|
import os
|
|
|
|
|
|
|
|
from salttesting.helpers import ensure_in_syspath
|
|
|
|
|
|
|
|
ensure_in_syspath('../../')
|
|
|
|
|
|
|
|
|
|
|
|
def get_test_data(filename):
|
|
|
|
'''
|
|
|
|
Return static test data
|
|
|
|
'''
|
|
|
|
return open(os.path.join(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'zypp'), filename)).read()
|
|
|
|
|
|
|
|
|
|
|
|
# Import Salt Libs
|
|
|
|
from salt.modules import zypper
|
|
|
|
|
|
|
|
# Globals
|
|
|
|
zypper.__salt__ = {}
|
2016-02-24 16:24:05 +00:00
|
|
|
zypper.rpm = None
|
2016-02-23 16:35:48 +00:00
|
|
|
|
|
|
|
@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
|
|
class ZypperTestCase(TestCase):
|
|
|
|
'''
|
|
|
|
Test cases for salt.modules.zypper
|
|
|
|
'''
|
|
|
|
|
2016-02-24 10:56:18 +00:00
|
|
|
def test_list_upgrades(self):
|
|
|
|
'''
|
|
|
|
List package upgrades
|
|
|
|
:return:
|
|
|
|
'''
|
|
|
|
ref_out = {
|
|
|
|
'stdout': get_test_data('zypper-updates.xml'),
|
|
|
|
'stderr': None,
|
|
|
|
'retcode': 0
|
|
|
|
}
|
|
|
|
with patch.dict(zypper.__salt__, {'cmd.run_all': MagicMock(return_value=ref_out)}):
|
|
|
|
upgrades = zypper.list_upgrades(refresh=False)
|
|
|
|
assert(len(upgrades) == 3)
|
|
|
|
for pkg, version in {'SUSEConnect': '0.2.33-7.1',
|
|
|
|
'bind-utils': '9.9.6P1-35.1',
|
|
|
|
'bind-libs': '9.9.6P1-35.1'}.items():
|
|
|
|
assert(pkg in upgrades)
|
|
|
|
assert(upgrades[pkg] == version)
|
|
|
|
|
|
|
|
|
2016-02-24 10:55:34 +00:00
|
|
|
def test_list_upgrades_error_handling(self):
|
|
|
|
'''
|
|
|
|
Test error handling in the list package upgrades.
|
|
|
|
:return:
|
|
|
|
'''
|
|
|
|
# Test handled errors
|
|
|
|
ref_out = {
|
|
|
|
'stderr': 'Some handled zypper internal error',
|
|
|
|
'retcode': 1
|
|
|
|
}
|
|
|
|
with patch.dict(zypper.__salt__, {'cmd.run_all': MagicMock(return_value=ref_out)}):
|
|
|
|
try:
|
|
|
|
zypper.list_upgrades(refresh=False)
|
|
|
|
except CommandExecutionError as error:
|
|
|
|
assert (error.message == ref_out['stderr'])
|
|
|
|
|
|
|
|
# Test unhandled error
|
|
|
|
ref_out = {
|
|
|
|
'retcode': 1
|
|
|
|
}
|
|
|
|
with patch.dict(zypper.__salt__, {'cmd.run_all': MagicMock(return_value=ref_out)}):
|
|
|
|
try:
|
|
|
|
zypper.list_upgrades(refresh=False)
|
|
|
|
except CommandExecutionError as error:
|
|
|
|
assert (error.message == 'Zypper returned non-zero system exit. See Zypper logs for more details.')
|
|
|
|
|
|
|
|
|
2016-02-23 16:35:48 +00:00
|
|
|
def test_list_products(self):
|
|
|
|
'''
|
|
|
|
List products test.
|
|
|
|
'''
|
2016-02-24 10:21:11 +00:00
|
|
|
ref_out = get_test_data('zypper-products.xml')
|
2016-02-23 16:35:48 +00:00
|
|
|
with patch.dict(zypper.__salt__, {'cmd.run': MagicMock(return_value=ref_out)}):
|
|
|
|
products = zypper.list_products()
|
|
|
|
assert(len(products) == 5)
|
2016-02-24 10:56:30 +00:00
|
|
|
assert(['SLES', 'SLES', 'SUSE-Manager-Proxy', 'SUSE-Manager-Server', 'sle-manager-tools-beta'] ==
|
|
|
|
sorted([prod['name'] for prod in products]))
|
2016-02-23 16:35:48 +00:00
|
|
|
assert('SUSE LLC <https://www.suse.com/>' in [product['vendor'] for product in products])
|
|
|
|
assert([False, False, False, False, True] ==
|
|
|
|
sorted([product['isbase'] for product in products]))
|
|
|
|
assert([False, False, False, False, True] ==
|
|
|
|
sorted([product['installed'] for product in products]))
|
2016-02-24 10:56:30 +00:00
|
|
|
assert(['0', '0', '0', '0', '0'] ==
|
2016-02-23 16:35:48 +00:00
|
|
|
sorted([product['release'] for product in products]))
|
|
|
|
assert([False, False, False, False, u'sles'] ==
|
|
|
|
sorted([product['productline'] for product in products]))
|
|
|
|
assert([1509408000, 1522454400, 1522454400, 1730332800, 1730332800] ==
|
|
|
|
sorted([product['eol_t'] for product in products]))
|
|
|
|
|
|
|
|
|
|
|
|
def test_refresh_db(self):
|
|
|
|
'''
|
|
|
|
Test if refresh DB handled correctly
|
|
|
|
'''
|
|
|
|
ref_out = [
|
|
|
|
"Repository 'openSUSE-Leap-42.1-LATEST' is up to date.",
|
|
|
|
"Repository 'openSUSE-Leap-42.1-Update' is up to date.",
|
|
|
|
"Retrieving repository 'openSUSE-Leap-42.1-Update-Non-Oss' metadata",
|
|
|
|
"Forcing building of repository cache",
|
|
|
|
"Building repository 'openSUSE-Leap-42.1-Update-Non-Oss' cache ..........[done]",
|
|
|
|
"Building repository 'salt-dev' cache",
|
|
|
|
"All repositories have been refreshed."
|
|
|
|
]
|
|
|
|
|
|
|
|
run_out = {
|
|
|
|
'stderr': '', 'stdout': '\n'.join(ref_out), 'retcode': 0
|
|
|
|
}
|
|
|
|
|
|
|
|
with patch.dict(zypper.__salt__, {'cmd.run_all': MagicMock(return_value=run_out)}):
|
|
|
|
result = zypper.refresh_db()
|
|
|
|
self.assertEqual(result.get("openSUSE-Leap-42.1-LATEST"), False)
|
|
|
|
self.assertEqual(result.get("openSUSE-Leap-42.1-Update"), False)
|
|
|
|
self.assertEqual(result.get("openSUSE-Leap-42.1-Update-Non-Oss"), True)
|
|
|
|
|
|
|
|
|
2016-02-24 11:31:17 +00:00
|
|
|
def test_info_installed(self):
|
|
|
|
'''
|
|
|
|
Test the return information of the named package(s), installed on the system.
|
|
|
|
|
|
|
|
:return:
|
|
|
|
'''
|
|
|
|
run_out = {
|
|
|
|
'virgo-dummy':
|
|
|
|
{'build_date': '2015-07-09T10:55:19Z',
|
|
|
|
'vendor': 'openSUSE Build Service',
|
|
|
|
'description': 'This is the Virgo dummy package used for testing SUSE Manager',
|
|
|
|
'license': 'GPL-2.0', 'build_host': 'sheep05', 'url': 'http://www.suse.com',
|
|
|
|
'build_date_time_t': 1436432119, 'relocations': '(not relocatable)',
|
|
|
|
'source_rpm': 'virgo-dummy-1.0-1.1.src.rpm', 'install_date': '2016-02-23T16:31:57Z',
|
|
|
|
'install_date_time_t': 1456241517, 'summary': 'Virgo dummy package', 'version': '1.0',
|
|
|
|
'signature': 'DSA/SHA1, Thu Jul 9 08:55:33 2015, Key ID 27fa41bd8a7c64f9',
|
|
|
|
'release': '1.1', 'group': 'Applications/System', 'arch': 'noarch', 'size': '17992'},
|
|
|
|
|
|
|
|
'libopenssl1_0_0':
|
|
|
|
{'build_date': '2015-11-04T23:20:34Z', 'vendor': 'SUSE LLC <https://www.suse.com/>',
|
|
|
|
'description': 'The OpenSSL Project is a collaborative effort.',
|
|
|
|
'license': 'OpenSSL', 'build_host': 'sheep11', 'url': 'https://www.openssl.org/',
|
|
|
|
'build_date_time_t': 1446675634, 'relocations': '(not relocatable)',
|
|
|
|
'source_rpm': 'openssl-1.0.1i-34.1.src.rpm', 'install_date': '2016-02-23T16:31:35Z',
|
|
|
|
'install_date_time_t': 1456241495, 'summary': 'Secure Sockets and Transport Layer Security',
|
|
|
|
'version': '1.0.1i', 'signature': 'RSA/SHA256, Wed Nov 4 22:21:34 2015, Key ID 70af9e8139db7c82',
|
|
|
|
'release': '34.1', 'group': 'Productivity/Networking/Security', 'packager': 'https://www.suse.com/',
|
|
|
|
'arch': 'x86_64', 'size': '2576912'},
|
|
|
|
}
|
|
|
|
with patch.dict(zypper.__salt__, {'lowpkg.info': MagicMock(return_value=run_out)}):
|
|
|
|
installed = zypper.info_installed()
|
|
|
|
# Test overall products length
|
|
|
|
assert(len(installed) == 2)
|
|
|
|
|
|
|
|
# Test translated fields
|
|
|
|
for pkg_name, pkg_info in installed.items():
|
|
|
|
assert(installed[pkg_name].get('source') == run_out[pkg_name]['source_rpm'])
|
|
|
|
|
|
|
|
# Test keys transition from the lowpkg.info
|
|
|
|
for pn_key, pn_val in run_out['virgo-dummy'].items():
|
|
|
|
if pn_key == 'source_rpm':
|
|
|
|
continue
|
|
|
|
assert(installed['virgo-dummy'][pn_key] == pn_val)
|
|
|
|
|
2016-02-24 12:59:05 +00:00
|
|
|
def test_info_available(self):
|
|
|
|
'''
|
|
|
|
Test return the information of the named package available for the system.
|
|
|
|
|
|
|
|
:return:
|
|
|
|
'''
|
2016-02-24 15:06:53 +00:00
|
|
|
test_pkgs = ['vim', 'emacs', 'python']
|
2016-02-24 12:59:05 +00:00
|
|
|
ref_out = get_test_data('zypper-available.txt')
|
|
|
|
with patch.dict(zypper.__salt__, {'cmd.run_stdout': MagicMock(return_value=ref_out)}):
|
|
|
|
available = zypper.info_available(*test_pkgs, refresh=False)
|
2016-02-24 15:06:53 +00:00
|
|
|
assert (len(available) == 3)
|
2016-02-24 12:59:05 +00:00
|
|
|
for pkg_name, pkg_info in available.items():
|
|
|
|
assert(pkg_name in test_pkgs)
|
|
|
|
|
|
|
|
assert(available['emacs']['status'] == 'up-to-date')
|
|
|
|
assert(available['emacs']['installed'] == True)
|
|
|
|
assert(available['emacs']['support level'] == 'Level 3')
|
|
|
|
assert(available['emacs']['vendor'] == 'SUSE LLC <https://www.suse.com/>')
|
|
|
|
assert(available['emacs']['summary'] == 'GNU Emacs Base Package')
|
|
|
|
|
|
|
|
assert(available['vim']['status'] == 'not installed')
|
|
|
|
assert(available['vim']['installed'] == False)
|
|
|
|
assert(available['vim']['support level'] == 'Level 3')
|
|
|
|
assert(available['vim']['vendor'] == 'SUSE LLC <https://www.suse.com/>')
|
|
|
|
assert(available['vim']['summary'] == 'Vi IMproved')
|
|
|
|
|
2016-02-24 13:10:07 +00:00
|
|
|
@patch('salt.modules.zypper.refresh_db', MagicMock(return_value=True))
|
|
|
|
def test_latest_version(self):
|
|
|
|
'''
|
|
|
|
Test the latest version of the named package available for upgrade or installation.
|
|
|
|
|
|
|
|
:return:
|
|
|
|
'''
|
|
|
|
ref_out = get_test_data('zypper-available.txt')
|
|
|
|
with patch.dict(zypper.__salt__, {'cmd.run_stdout': MagicMock(return_value=ref_out)}):
|
|
|
|
assert(zypper.latest_version('vim') == '7.4.326-2.62')
|
|
|
|
|
2016-02-24 14:52:18 +00:00
|
|
|
@patch('salt.modules.zypper.refresh_db', MagicMock(return_value=True))
|
|
|
|
def test_upgrade_available(self):
|
|
|
|
'''
|
|
|
|
Test whether or not an upgrade is available for a given package.
|
|
|
|
|
|
|
|
:return:
|
|
|
|
'''
|
|
|
|
ref_out = get_test_data('zypper-available.txt')
|
|
|
|
with patch.dict(zypper.__salt__, {'cmd.run_stdout': MagicMock(return_value=ref_out)}):
|
2016-02-24 15:06:53 +00:00
|
|
|
for pkg_name in ['emacs', 'python']:
|
|
|
|
assert(not zypper.upgrade_available(pkg_name))
|
2016-02-24 14:52:18 +00:00
|
|
|
assert(zypper.upgrade_available('vim'))
|
|
|
|
|
2016-02-24 16:24:05 +00:00
|
|
|
@patch('salt.modules.zypper.HAS_RPM', True)
|
|
|
|
def test_version_cmp_rpm(self):
|
|
|
|
'''
|
|
|
|
Test package version is called RPM version if RPM-Python is installed
|
|
|
|
|
|
|
|
:return:
|
|
|
|
'''
|
|
|
|
with patch('salt.modules.zypper.rpm', MagicMock(return_value=MagicMock)):
|
|
|
|
with patch('salt.modules.zypper.rpm.labelCompare', MagicMock(return_value=0)):
|
|
|
|
assert(0 == zypper.version_cmp('1', '2')) # mock returns 0, which means RPM was called
|
|
|
|
|
|
|
|
@patch('salt.modules.zypper.HAS_RPM', False)
|
2016-02-24 16:24:23 +00:00
|
|
|
def test_version_cmp_fallback(self):
|
|
|
|
'''
|
|
|
|
Test package version is called RPM version if RPM-Python is installed
|
|
|
|
|
|
|
|
:return:
|
|
|
|
'''
|
|
|
|
with patch('salt.modules.zypper.rpm', MagicMock(return_value=MagicMock)):
|
|
|
|
with patch('salt.modules.zypper.rpm.labelCompare', MagicMock(return_value=0)):
|
|
|
|
assert(-1 == zypper.version_cmp('1', '2')) # mock returns -1, a python implementation was called
|
|
|
|
|
2016-02-24 11:31:17 +00:00
|
|
|
|
2016-02-23 16:35:48 +00:00
|
|
|
if __name__ == '__main__':
|
|
|
|
from integration import run_tests
|
|
|
|
run_tests(ZypperTestCase, needs_daemon=False)
|