SHA256
1
0
forked from pool/salt
salt/0018-Unit-tests-fixes-for-2016.3.2.patch
Klaus Kämpf 14ef6d2b51 Accepting request 430691 from systemsmanagement:saltstack:testing
- splitting out the susemanager integration plugins into their own
  subpackages. ATM this only contains the zypp plugin to tell
  susemanager about manually installed packages.

- Unit and integration tests fixes for 2016.3.2
  Add:
  * 0018-Unit-tests-fixes-for-2016.3.2.patch
  * 0019-Fix-snapper_test-for-python26.patch
  * 0020-Integration-tests-fixes-for-2016.3.2.patch

- Prevent pkg.install failure for expired keys (bsc#996455)
  Add:
  * 0017-Check-for-single-quote-before-splitting-on-single-qu.patch

- Required D-Bus and generating machine ID where it is missing

- Fix sphinx crashes when documentation is being generated
  Add script for documentation update.
  Add:
  * 0016-Improve-Mock-to-be-flexible-and-able-to-mock-methods.patch
  * update-documentation.sh

- Fix pkg.installed refresh repo failure (bsc#993549)
  Fix salt.states.pkgrepo.management no change failure (bsc#990440)
  Add:
  * 0014-Add-ignore_repo_failure-option-to-suppress-zypper-s-.patch
  * 0015-Remove-zypper-s-raise-exception-if-mod_repo-has-no-a.patch

- Deprecate status.uptime one version later
  Add:

OBS-URL: https://build.opensuse.org/request/show/430691
OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=77
2016-09-28 07:49:13 +00:00

928 lines
40 KiB
Diff

From e5fc36b5fad0683f57022bf2f3c63f453cda5e8d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
<psuarezhernandez@suse.com>
Date: Tue, 6 Sep 2016 11:21:05 +0100
Subject: [PATCH 18/19] Unit tests fixes for 2016.3.2
* Fixing skipped boto tests to prevent errors if boto3 does not exists.
* Fix tests that assert CommandExecutionError (#32485)
Trying to assert that an exception was raised using
helper_open.write.assertRaises() is bogus--there is no such method. Use
standard unittest.assertRaises() instead.
* Skip utils_test if timelib is not installed (#32699)
date_cast() throws a RuntimeError, not an ImportError
* Fix tests (#35693)
Fix tests/unit/modules/useradd_test.py::UserAddTestCase::test_info
Fix unit/pyobjects_test.py::MapTests::test_map
Fix tests/unit/pyobjects_test.py::RendererTests::test_extend
Fix tests/unit/pyobjects_test.py::RendererTests::test_requisite_implicit_list
* Fix tests to prevent errors when libcloud is not present
* Fixed _interfaces_ifconfig output for SunOS test
* Fix PortageConfigTestCase in case of portage is not present
* Rename dockerio.py unit tests to dockerio_test.py
These tests have never run automatically because of an incorrect file name.
Added a skipIf on these tests as they are currently non-functioning and the
module they're testing has been deprecated.
* Prevent tests failures if boto does not exists
---
salt/modules/boto_elb.py | 2 +-
salt/modules/linux_sysctl.py | 6 +-
tests/unit/cloud/clouds/dimensiondata_test.py | 10 ++-
tests/unit/cloud/clouds/gce_test.py | 10 ++-
tests/unit/modules/boto_cloudtrail_test.py | 10 +--
tests/unit/modules/boto_iot_test.py | 10 +--
tests/unit/modules/boto_lambda_test.py | 10 +--
tests/unit/modules/boto_s3_bucket_test.py | 10 +--
tests/unit/modules/boto_secgroup_test.py | 1 +
tests/unit/modules/boto_vpc_test.py | 14 ++--
tests/unit/modules/linux_sysctl_test.py | 19 +++--
tests/unit/modules/mac_sysctl_test.py | 10 +--
tests/unit/modules/mount_test.py | 14 ++--
tests/unit/modules/portage_config.py | 10 ++-
tests/unit/modules/puppet_test.py | 15 ++--
tests/unit/modules/useradd_test.py | 6 +-
tests/unit/pyobjects_test.py | 11 +++
tests/unit/states/boto_cloudtrail_test.py | 10 +--
tests/unit/states/boto_iot_test.py | 10 +--
tests/unit/states/boto_lambda_test.py | 10 +--
tests/unit/states/boto_s3_bucket_test.py | 10 +--
tests/unit/states/dockerio.py | 112 -------------------------
tests/unit/states/dockerio_test.py | 113 ++++++++++++++++++++++++++
tests/unit/utils/network.py | 12 +--
tests/unit/utils/utils_test.py | 11 +--
25 files changed, 244 insertions(+), 212 deletions(-)
delete mode 100644 tests/unit/states/dockerio.py
create mode 100644 tests/unit/states/dockerio_test.py
diff --git a/salt/modules/boto_elb.py b/salt/modules/boto_elb.py
index 31df1fc..162abcd 100644
--- a/salt/modules/boto_elb.py
+++ b/salt/modules/boto_elb.py
@@ -57,6 +57,7 @@ log = logging.getLogger(__name__)
# Import third party libs
try:
import boto
+ import boto.ec2 # pylint: enable=unused-import
# connection settings were added in 2.33.0
required_boto_version = '2.33.0'
if (_LooseVersion(boto.__version__) <
@@ -64,7 +65,6 @@ try:
msg = 'boto_elb requires boto {0}.'.format(required_boto_version)
logging.debug(msg)
raise ImportError()
- import boto.ec2
from boto.ec2.elb import HealthCheck
from boto.ec2.elb.attributes import AccessLogAttribute
from boto.ec2.elb.attributes import ConnectionDrainingAttribute
diff --git a/salt/modules/linux_sysctl.py b/salt/modules/linux_sysctl.py
index b016ca6..7702d52 100644
--- a/salt/modules/linux_sysctl.py
+++ b/salt/modules/linux_sysctl.py
@@ -41,7 +41,11 @@ def _check_systemd_salt_config():
sysctl_dir = os.path.split(conf)[0]
if not os.path.exists(sysctl_dir):
os.makedirs(sysctl_dir)
- salt.utils.fopen(conf, 'w').close()
+ try:
+ salt.utils.fopen(conf, 'w').close()
+ except (IOError, OSError):
+ msg = 'Could not create file: {0}'
+ raise CommandExecutionError(msg.format(conf))
return conf
diff --git a/tests/unit/cloud/clouds/dimensiondata_test.py b/tests/unit/cloud/clouds/dimensiondata_test.py
index aa7f2c0..ee01d65 100644
--- a/tests/unit/cloud/clouds/dimensiondata_test.py
+++ b/tests/unit/cloud/clouds/dimensiondata_test.py
@@ -8,7 +8,13 @@
# Import Python libs
from __future__ import absolute_import
-import libcloud.security
+
+try:
+ import libcloud.security
+ HAS_LIBCLOUD = True
+except ImportError:
+ HAS_LIBCLOUD = False
+
import platform
import os
@@ -44,7 +50,7 @@ ON_SUSE = True if 'SuSE' in platform.dist() else False
ON_MAC = True if 'Darwin' in platform.system() else False
if not os.path.exists('/etc/ssl/certs/YaST-CA.pem') and ON_SUSE:
- if os.path.isfile('/etc/ssl/ca-bundle.pem'):
+ if os.path.isfile('/etc/ssl/ca-bundle.pem') and HAS_LIBCLOUD:
libcloud.security.CA_CERTS_PATH.append('/etc/ssl/ca-bundle.pem')
else:
HAS_CERTS = False
diff --git a/tests/unit/cloud/clouds/gce_test.py b/tests/unit/cloud/clouds/gce_test.py
index 87824eb..c90f8ab 100644
--- a/tests/unit/cloud/clouds/gce_test.py
+++ b/tests/unit/cloud/clouds/gce_test.py
@@ -8,7 +8,13 @@
# Import Python libs
from __future__ import absolute_import
-import libcloud.security
+
+try:
+ import libcloud.security
+ HAS_LIBCLOUD = True
+except ImportError:
+ HAS_LIBCLOUD = False
+
import platform
import os
@@ -51,7 +57,7 @@ ON_SUSE = True if 'SuSE' in platform.dist() else False
ON_MAC = True if 'Darwin' in platform.system() else False
if not os.path.exists('/etc/ssl/certs/YaST-CA.pem') and ON_SUSE:
- if os.path.isfile('/etc/ssl/ca-bundle.pem'):
+ if os.path.isfile('/etc/ssl/ca-bundle.pem') and HAS_LIBCLOUD:
libcloud.security.CA_CERTS_PATH.append('/etc/ssl/ca-bundle.pem')
else:
HAS_CERTS = False
diff --git a/tests/unit/modules/boto_cloudtrail_test.py b/tests/unit/modules/boto_cloudtrail_test.py
index 2f86101..264a795 100644
--- a/tests/unit/modules/boto_cloudtrail_test.py
+++ b/tests/unit/modules/boto_cloudtrail_test.py
@@ -103,6 +103,11 @@ if _has_required_boto():
StopLoggingTime=None)
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto3_version))
+@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoCloudTrailTestCaseBase(TestCase):
conn = None
@@ -128,11 +133,6 @@ class BotoCloudTrailTestCaseMixin(object):
pass
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
- ' or equal to version {0}'
- .format(required_boto3_version))
-@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoCloudTrailTestCase(BotoCloudTrailTestCaseBase, BotoCloudTrailTestCaseMixin):
'''
TestCase for salt.modules.boto_cloudtrail module
diff --git a/tests/unit/modules/boto_iot_test.py b/tests/unit/modules/boto_iot_test.py
index 73c362f..520bfe9 100644
--- a/tests/unit/modules/boto_iot_test.py
+++ b/tests/unit/modules/boto_iot_test.py
@@ -103,6 +103,11 @@ if _has_required_boto():
ruleDisabled=True)
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto3_version))
+@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoIoTTestCaseBase(TestCase):
conn = None
@@ -128,11 +133,6 @@ class BotoIoTTestCaseMixin(object):
pass
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
- ' or equal to version {0}'
- .format(required_boto3_version))
-@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoIoTPolicyTestCase(BotoIoTTestCaseBase, BotoIoTTestCaseMixin):
'''
TestCase for salt.modules.boto_iot module
diff --git a/tests/unit/modules/boto_lambda_test.py b/tests/unit/modules/boto_lambda_test.py
index 01ca245..ad7fb33 100644
--- a/tests/unit/modules/boto_lambda_test.py
+++ b/tests/unit/modules/boto_lambda_test.py
@@ -109,6 +109,11 @@ def _has_required_boto():
return True
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto3_version))
+@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoLambdaTestCaseBase(TestCase):
conn = None
@@ -145,11 +150,6 @@ class BotoLambdaTestCaseMixin(object):
pass
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
- ' or equal to version {0}'
- .format(required_boto3_version))
-@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoLambdaFunctionTestCase(BotoLambdaTestCaseBase, BotoLambdaTestCaseMixin):
'''
TestCase for salt.modules.boto_lambda module
diff --git a/tests/unit/modules/boto_s3_bucket_test.py b/tests/unit/modules/boto_s3_bucket_test.py
index f4b1992..5e7d6be 100644
--- a/tests/unit/modules/boto_s3_bucket_test.py
+++ b/tests/unit/modules/boto_s3_bucket_test.py
@@ -205,6 +205,11 @@ if _has_required_boto():
}
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto3_version))
+@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoS3BucketTestCaseBase(TestCase):
conn = None
@@ -230,11 +235,6 @@ class BotoS3BucketTestCaseMixin(object):
pass
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
- ' or equal to version {0}'
- .format(required_boto3_version))
-@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoS3BucketTestCase(BotoS3BucketTestCaseBase, BotoS3BucketTestCaseMixin):
'''
TestCase for salt.modules.boto_s3_bucket module
diff --git a/tests/unit/modules/boto_secgroup_test.py b/tests/unit/modules/boto_secgroup_test.py
index cc88568..7fd51ad 100644
--- a/tests/unit/modules/boto_secgroup_test.py
+++ b/tests/unit/modules/boto_secgroup_test.py
@@ -23,6 +23,7 @@ import salt.loader
from salt.ext.six.moves import range # pylint: disable=redefined-builtin
try:
import boto
+ import boto.ec2 # pylint: enable=unused-import
HAS_BOTO = True
except ImportError:
HAS_BOTO = False
diff --git a/tests/unit/modules/boto_vpc_test.py b/tests/unit/modules/boto_vpc_test.py
index 64c7976..162bcae 100644
--- a/tests/unit/modules/boto_vpc_test.py
+++ b/tests/unit/modules/boto_vpc_test.py
@@ -124,6 +124,13 @@ def _has_required_moto():
context = {}
+@skipIf(NO_MOCK, NO_MOCK_REASON)
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(HAS_MOTO is False, 'The moto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto_version))
+@skipIf(_has_required_moto() is False, 'The moto version must be >= to version {0}'.format(required_moto_version))
class BotoVpcTestCaseBase(TestCase):
def setUp(self):
boto_vpc.__context__ = {}
@@ -249,13 +256,6 @@ class BotoVpcTestCaseMixin(object):
return rtbl
-@skipIf(NO_MOCK, NO_MOCK_REASON)
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(HAS_MOTO is False, 'The moto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto module must be greater than'
- ' or equal to version {0}'
- .format(required_boto_version))
-@skipIf(_has_required_moto() is False, 'The moto version must be >= to version {0}'.format(required_moto_version))
class BotoVpcTestCase(BotoVpcTestCaseBase, BotoVpcTestCaseMixin):
'''
TestCase for salt.modules.boto_vpc module
diff --git a/tests/unit/modules/linux_sysctl_test.py b/tests/unit/modules/linux_sysctl_test.py
index 89bea83..1eca7d5 100644
--- a/tests/unit/modules/linux_sysctl_test.py
+++ b/tests/unit/modules/linux_sysctl_test.py
@@ -84,17 +84,22 @@ class LinuxSysctlTestCase(TestCase):
self.assertEqual(linux_sysctl.assign(
'net.ipv4.ip_forward', 1), ret)
- @patch('os.path.isfile', MagicMock(return_value=False))
def test_persist_no_conf_failure(self):
'''
Tests adding of config file failure
'''
- with patch('salt.utils.fopen', mock_open()) as m_open:
- helper_open = m_open()
- helper_open.write.assertRaises(CommandExecutionError,
- linux_sysctl.persist,
- 'net.ipv4.ip_forward',
- 1, config=None)
+ asn_cmd = {'pid': 1337, 'retcode': 0,
+ 'stderr': "sysctl: permission denied", 'stdout': ''}
+ mock_asn_cmd = MagicMock(return_value=asn_cmd)
+ cmd = "sysctl -w net.ipv4.ip_forward=1"
+ mock_cmd = MagicMock(return_value=cmd)
+ with patch.dict(linux_sysctl.__salt__, {'cmd.run_stdout': mock_cmd,
+ 'cmd.run_all': mock_asn_cmd}):
+ with patch('salt.utils.fopen', mock_open()) as m_open:
+ self.assertRaises(CommandExecutionError,
+ linux_sysctl.persist,
+ 'net.ipv4.ip_forward',
+ 1, config=None)
@patch('os.path.isfile', MagicMock(return_value=False))
@patch('os.path.exists', MagicMock(return_value=True))
diff --git a/tests/unit/modules/mac_sysctl_test.py b/tests/unit/modules/mac_sysctl_test.py
index e90ec64..533397b 100644
--- a/tests/unit/modules/mac_sysctl_test.py
+++ b/tests/unit/modules/mac_sysctl_test.py
@@ -72,11 +72,11 @@ class DarwinSysctlTestCase(TestCase):
Tests adding of config file failure
'''
with patch('salt.utils.fopen', mock_open()) as m_open:
- helper_open = m_open()
- helper_open.write.assertRaises(CommandExecutionError,
- mac_sysctl.persist,
- 'net.inet.icmp.icmplim',
- 50, config=None)
+ m_open.side_effect = IOError(13, 'Permission denied', '/file')
+ self.assertRaises(CommandExecutionError,
+ mac_sysctl.persist,
+ 'net.inet.icmp.icmplim',
+ 50, config=None)
@patch('os.path.isfile', MagicMock(return_value=False))
def test_persist_no_conf_success(self):
diff --git a/tests/unit/modules/mount_test.py b/tests/unit/modules/mount_test.py
index 290c368..b2cf904 100644
--- a/tests/unit/modules/mount_test.py
+++ b/tests/unit/modules/mount_test.py
@@ -141,10 +141,10 @@ class MountTestCase(TestCase):
with patch.dict(mount.__grains__, {'kernel': ''}):
with patch.object(mount, 'fstab', mock_fstab):
with patch('salt.utils.fopen', mock_open()) as m_open:
- helper_open = m_open()
- helper_open.write.assertRaises(CommandExecutionError,
- mount.rm_fstab,
- config=None)
+ m_open.side_effect = IOError(13, 'Permission denied:', '/file')
+ self.assertRaises(CommandExecutionError,
+ mount.rm_fstab,
+ 'name', 'device')
def test_set_fstab(self):
'''
@@ -180,11 +180,7 @@ class MountTestCase(TestCase):
mock = MagicMock(return_value={'name': 'name'})
with patch.object(mount, 'fstab', mock):
- with patch('salt.utils.fopen', mock_open()) as m_open:
- helper_open = m_open()
- helper_open.write.assertRaises(CommandExecutionError,
- mount.rm_automaster,
- 'name', 'device')
+ self.assertTrue(mount.rm_automaster('name', 'device'))
def test_set_automaster(self):
'''
diff --git a/tests/unit/modules/portage_config.py b/tests/unit/modules/portage_config.py
index 8da1ebe..6275442 100644
--- a/tests/unit/modules/portage_config.py
+++ b/tests/unit/modules/portage_config.py
@@ -11,7 +11,7 @@ from __future__ import absolute_import
# Import Salt Testing libs
from salttesting import skipIf, TestCase
from salttesting.helpers import ensure_in_syspath
-from salttesting.mock import NO_MOCK, NO_MOCK_REASON
+from salttesting.mock import NO_MOCK, NO_MOCK_REASON, MagicMock
ensure_in_syspath('../../')
# Import salt libs
@@ -20,6 +20,10 @@ from salt.modules import portage_config
@skipIf(NO_MOCK, NO_MOCK_REASON)
class PortageConfigTestCase(TestCase):
+ class DummyAtom(object):
+ def __init__(self, atom):
+ self.cp, self.repo = atom.split("::") if "::" in atom else (atom, None)
+
def test_get_config_file_wildcards(self):
pairs = [
('*/*::repo', '/etc/portage/package.mask/repo'),
@@ -29,7 +33,11 @@ class PortageConfigTestCase(TestCase):
('cat/pkg::repo', '/etc/portage/package.mask/cat/pkg'),
]
+ portage_config.portage = MagicMock()
for (atom, expected) in pairs:
+ dummy_atom = self.DummyAtom(atom)
+ portage_config.portage.dep.Atom = MagicMock(return_value=dummy_atom)
+ portage_config._p_to_cp = MagicMock(return_value=dummy_atom.cp)
self.assertEqual(portage_config._get_config_file('mask', atom), expected)
if __name__ == '__main__':
diff --git a/tests/unit/modules/puppet_test.py b/tests/unit/modules/puppet_test.py
index 02bc2e1..2cdd696 100644
--- a/tests/unit/modules/puppet_test.py
+++ b/tests/unit/modules/puppet_test.py
@@ -85,10 +85,12 @@ class PuppetTestCase(TestCase):
with patch('salt.utils.fopen', mock_open()):
self.assertTrue(puppet.disable())
- with patch('salt.utils.fopen', mock_open()) as m_open:
- helper_open = m_open()
- helper_open.write.assertRaises(CommandExecutionError,
- puppet.disable)
+ try:
+ with patch('salt.utils.fopen', mock_open()) as m_open:
+ m_open.side_effect = IOError(13, 'Permission denied:', '/file')
+ self.assertRaises(CommandExecutionError, puppet.disable)
+ except StopIteration:
+ pass
def test_status(self):
'''
@@ -145,9 +147,8 @@ class PuppetTestCase(TestCase):
self.assertDictEqual(puppet.summary(), {'resources': 1})
with patch('salt.utils.fopen', mock_open()) as m_open:
- helper_open = m_open()
- helper_open.write.assertRaises(CommandExecutionError,
- puppet.summary)
+ m_open.side_effect = IOError(13, 'Permission denied:', '/file')
+ self.assertRaises(CommandExecutionError, puppet.summary)
def test_plugin_sync(self):
'''
diff --git a/tests/unit/modules/useradd_test.py b/tests/unit/modules/useradd_test.py
index 7e646b6..cc9e610 100644
--- a/tests/unit/modules/useradd_test.py
+++ b/tests/unit/modules/useradd_test.py
@@ -326,7 +326,7 @@ class UserAddTestCase(TestCase):
'''
Test the user information
'''
- self.assertEqual(useradd.info('salt'), {})
+ self.assertEqual(useradd.info('username-that-doesnt-exist'), {})
mock = MagicMock(return_value=pwd.struct_passwd(('_TEST_GROUP',
'*',
@@ -336,9 +336,7 @@ class UserAddTestCase(TestCase):
'/var/virusmails',
'/usr/bin/false')))
with patch.object(pwd, 'getpwnam', mock):
- mock = MagicMock(return_value='Group Name')
- with patch.object(useradd, 'list_groups', mock):
- self.assertEqual(useradd.info('salt')['name'], '_TEST_GROUP')
+ self.assertEqual(useradd.info('username-that-doesnt-exist')['name'], '_TEST_GROUP')
# 'list_groups' function tests: 1
diff --git a/tests/unit/pyobjects_test.py b/tests/unit/pyobjects_test.py
index f1c3e29..3eb4bd5 100644
--- a/tests/unit/pyobjects_test.py
+++ b/tests/unit/pyobjects_test.py
@@ -54,10 +54,18 @@ include('http')
extend_template = '''#!pyobjects
include('http')
+
+from salt.utils.pyobjects import StateFactory
+Service = StateFactory('service')
+
Service.running(extend('apache'), watch=[{'file': '/etc/file'}])
'''
map_template = '''#!pyobjects
+from salt.utils.pyobjects import StateFactory
+Service = StateFactory('service')
+
+
class Samba(Map):
__merge__ = 'samba:lookup'
@@ -127,6 +135,9 @@ from salt://password.sls import password
'''
requisite_implicit_list_template = '''#!pyobjects
+from salt.utils.pyobjects import StateFactory
+Service = StateFactory('service')
+
with Pkg.installed("pkg"):
Service.running("service", watch=File("file"), require=Cmd("cmd"))
'''
diff --git a/tests/unit/states/boto_cloudtrail_test.py b/tests/unit/states/boto_cloudtrail_test.py
index 48fbd32..9e6dd95 100644
--- a/tests/unit/states/boto_cloudtrail_test.py
+++ b/tests/unit/states/boto_cloudtrail_test.py
@@ -104,6 +104,11 @@ if _has_required_boto():
StopLoggingTime=None)
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto3_version))
+@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoCloudTrailStateTestCaseBase(TestCase):
conn = None
@@ -124,11 +129,6 @@ class BotoCloudTrailStateTestCaseBase(TestCase):
session_instance.client.return_value = self.conn
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
- ' or equal to version {0}'
- .format(required_boto3_version))
-@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoCloudTrailTestCase(BotoCloudTrailStateTestCaseBase, BotoCloudTrailTestCaseMixin):
'''
TestCase for salt.modules.boto_cloudtrail state.module
diff --git a/tests/unit/states/boto_iot_test.py b/tests/unit/states/boto_iot_test.py
index 8c2549d..81d68c8 100644
--- a/tests/unit/states/boto_iot_test.py
+++ b/tests/unit/states/boto_iot_test.py
@@ -103,6 +103,11 @@ if _has_required_boto():
principal = 'arn:aws:iot:us-east-1:1234:cert/21fc104aaaf6043f5756c1b57bda84ea8395904c43f28517799b19e4c42514'
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto3_version))
+@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoIoTStateTestCaseBase(TestCase):
conn = None
@@ -123,11 +128,6 @@ class BotoIoTStateTestCaseBase(TestCase):
session_instance.client.return_value = self.conn
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
- ' or equal to version {0}'
- .format(required_boto3_version))
-@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoIoTPolicyTestCase(BotoIoTStateTestCaseBase, BotoIoTTestCaseMixin):
'''
TestCase for salt.modules.boto_iot state.module
diff --git a/tests/unit/states/boto_lambda_test.py b/tests/unit/states/boto_lambda_test.py
index 4557aed..7b02391 100644
--- a/tests/unit/states/boto_lambda_test.py
+++ b/tests/unit/states/boto_lambda_test.py
@@ -101,6 +101,11 @@ def _has_required_boto():
return True
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto3_version))
+@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoLambdaStateTestCaseBase(TestCase):
conn = None
@@ -121,11 +126,6 @@ class BotoLambdaStateTestCaseBase(TestCase):
session_instance.client.return_value = self.conn
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
- ' or equal to version {0}'
- .format(required_boto3_version))
-@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoLambdaFunctionTestCase(BotoLambdaStateTestCaseBase, BotoLambdaTestCaseMixin):
'''
TestCase for salt.modules.boto_lambda state.module
diff --git a/tests/unit/states/boto_s3_bucket_test.py b/tests/unit/states/boto_s3_bucket_test.py
index 4049e9a..03c406f 100644
--- a/tests/unit/states/boto_s3_bucket_test.py
+++ b/tests/unit/states/boto_s3_bucket_test.py
@@ -277,6 +277,11 @@ if _has_required_boto():
}
+@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
+@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
+ ' or equal to version {0}'
+ .format(required_boto3_version))
+@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoS3BucketStateTestCaseBase(TestCase):
conn = None
@@ -297,11 +302,6 @@ class BotoS3BucketStateTestCaseBase(TestCase):
session_instance.client.return_value = self.conn
-@skipIf(HAS_BOTO is False, 'The boto module must be installed.')
-@skipIf(_has_required_boto() is False, 'The boto3 module must be greater than'
- ' or equal to version {0}'
- .format(required_boto3_version))
-@skipIf(NO_MOCK, NO_MOCK_REASON)
class BotoS3BucketTestCase(BotoS3BucketStateTestCaseBase, BotoS3BucketTestCaseMixin):
'''
TestCase for salt.modules.boto_s3_bucket state.module
diff --git a/tests/unit/states/dockerio.py b/tests/unit/states/dockerio.py
deleted file mode 100644
index c73b633..0000000
--- a/tests/unit/states/dockerio.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Import Python libs
-from __future__ import absolute_import
-from contextlib import contextmanager
-
-# Import Salt Testing libs
-from salttesting import skipIf, TestCase
-from salttesting.mock import NO_MOCK, NO_MOCK_REASON, MagicMock
-
-
-@contextmanager
-def provision_state(module, fixture):
- previous_dict = getattr(module, '__salt__', {}).copy()
- try:
- module.__dict__.setdefault('__salt__', {}).update(fixture)
- yield
- finally:
- setattr(module, '__salt__', previous_dict)
-
-
-@skipIf(NO_MOCK, NO_MOCK_REASON)
-class DockerStateTestCase(TestCase):
- def test_docker_run_success(self):
- from salt.states import dockerio
- salt_fixture = {'docker.retcode': MagicMock(return_value=0),
- 'docker.run_all': MagicMock(
- return_value={'stdout': '.\n..\n',
- 'stderr': '',
- 'status': True,
- 'comment': 'Success',
- 'retcode': 0})}
-
- with provision_state(dockerio, salt_fixture):
- result = dockerio.run('ls /', 'ubuntu')
-
- self.assertEqual(result, {'name': 'ls /',
- 'result': True,
- 'comment': 'Success',
- 'changes': {}})
-
- def test_docker_run_failure(self):
- from salt.states import dockerio
- salt_fixture = {'docker.retcode': MagicMock(return_value=0),
- 'docker.run_all': MagicMock(
- return_value={'stdout': '',
- 'stderr': 'Error',
- 'status': False,
- 'comment': 'Failure',
- 'retcode': 1})}
-
- with provision_state(dockerio, salt_fixture):
- result = dockerio.run('ls /', 'ubuntu')
-
- self.assertEqual(result, {'name': 'ls /',
- 'result': False,
- 'comment': 'Failure',
- 'changes': {}})
-
- def test_docker_run_onlyif(self):
- from salt.states import dockerio
- salt_fixture = {'docker.retcode': MagicMock(return_value=1),
- 'docker.run_all': None}
- with provision_state(dockerio, salt_fixture):
- result = dockerio.run('ls /', 'ubuntu',
- onlyif='ls -l')
- self.assertEqual(result, {'name': 'ls /',
- 'result': True,
- 'comment': 'onlyif execution failed',
- 'changes': {}})
-
- def test_docker_run_unless(self):
- from salt.states import dockerio
- salt_fixture = {'docker.retcode': MagicMock(return_value=0),
- 'docker.run_all': None}
- with provision_state(dockerio, salt_fixture):
- result = dockerio.run('ls /', 'ubuntu',
- unless='ls -l')
- self.assertEqual(result, {'name': 'ls /',
- 'result': True,
- 'comment': 'unless execution succeeded',
- 'changes': {}})
-
- def test_docker_run_docked_onlyif(self):
- from salt.states import dockerio
- salt_fixture = {'docker.retcode': MagicMock(return_value=1),
- 'docker.run_all': None}
- with provision_state(dockerio, salt_fixture):
- result = dockerio.run('ls /', 'ubuntu',
- docked_onlyif='ls -l')
- self.assertEqual(result, {'name': 'ls /',
- 'result': True,
- 'comment': 'docked_onlyif execution failed',
- 'changes': {}})
-
- def test_docker_run_docked_unless(self):
- from salt.states import dockerio
- salt_fixture = {'docker.retcode': MagicMock(return_value=0),
- 'docker.run_all': None}
- with provision_state(dockerio, salt_fixture):
- result = dockerio.run('ls /', 'ubuntu',
- docked_unless='ls -l')
- self.assertEqual(result, {'name': 'ls /',
- 'result': True,
- 'comment': ('docked_unless execution'
- ' succeeded'),
- 'changes': {}})
-
-
-if __name__ == '__main__':
- from integration import run_tests
- run_tests(DockerStateTestCase, needs_daemon=False)
diff --git a/tests/unit/states/dockerio_test.py b/tests/unit/states/dockerio_test.py
new file mode 100644
index 0000000..54f51be
--- /dev/null
+++ b/tests/unit/states/dockerio_test.py
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+
+# Import Python libs
+from __future__ import absolute_import
+from contextlib import contextmanager
+
+# Import Salt Testing libs
+from salttesting import skipIf, TestCase
+from salttesting.mock import NO_MOCK, NO_MOCK_REASON, MagicMock
+
+
+@contextmanager
+def provision_state(module, fixture):
+ previous_dict = getattr(module, '__salt__', {}).copy()
+ try:
+ module.__dict__.setdefault('__salt__', {}).update(fixture)
+ yield
+ finally:
+ setattr(module, '__salt__', previous_dict)
+
+
+@skipIf(NO_MOCK, NO_MOCK_REASON)
+@skipIf(True, 'Skipped: This module has been deprecated.')
+class DockerStateTestCase(TestCase):
+ def test_docker_run_success(self):
+ from salt.states import dockerio
+ salt_fixture = {'docker.retcode': MagicMock(return_value=0),
+ 'docker.run_all': MagicMock(
+ return_value={'stdout': '.\n..\n',
+ 'stderr': '',
+ 'status': True,
+ 'comment': 'Success',
+ 'retcode': 0})}
+
+ with provision_state(dockerio, salt_fixture):
+ result = dockerio.run('ls /', 'ubuntu')
+
+ self.assertEqual(result, {'name': 'ls /',
+ 'result': True,
+ 'comment': 'Success',
+ 'changes': {}})
+
+ def test_docker_run_failure(self):
+ from salt.states import dockerio
+ salt_fixture = {'docker.retcode': MagicMock(return_value=0),
+ 'docker.run_all': MagicMock(
+ return_value={'stdout': '',
+ 'stderr': 'Error',
+ 'status': False,
+ 'comment': 'Failure',
+ 'retcode': 1})}
+
+ with provision_state(dockerio, salt_fixture):
+ result = dockerio.run('ls /', 'ubuntu')
+
+ self.assertEqual(result, {'name': 'ls /',
+ 'result': False,
+ 'comment': 'Failure',
+ 'changes': {}})
+
+ def test_docker_run_onlyif(self):
+ from salt.states import dockerio
+ salt_fixture = {'docker.retcode': MagicMock(return_value=1),
+ 'docker.run_all': None}
+ with provision_state(dockerio, salt_fixture):
+ result = dockerio.run('ls /', 'ubuntu',
+ onlyif='ls -l')
+ self.assertEqual(result, {'name': 'ls /',
+ 'result': True,
+ 'comment': 'onlyif execution failed',
+ 'changes': {}})
+
+ def test_docker_run_unless(self):
+ from salt.states import dockerio
+ salt_fixture = {'docker.retcode': MagicMock(return_value=0),
+ 'docker.run_all': None}
+ with provision_state(dockerio, salt_fixture):
+ result = dockerio.run('ls /', 'ubuntu',
+ unless='ls -l')
+ self.assertEqual(result, {'name': 'ls /',
+ 'result': True,
+ 'comment': 'unless execution succeeded',
+ 'changes': {}})
+
+ def test_docker_run_docked_onlyif(self):
+ from salt.states import dockerio
+ salt_fixture = {'docker.retcode': MagicMock(return_value=1),
+ 'docker.run_all': None}
+ with provision_state(dockerio, salt_fixture):
+ result = dockerio.run('ls /', 'ubuntu',
+ docked_onlyif='ls -l')
+ self.assertEqual(result, {'name': 'ls /',
+ 'result': True,
+ 'comment': 'docked_onlyif execution failed',
+ 'changes': {}})
+
+ def test_docker_run_docked_unless(self):
+ from salt.states import dockerio
+ salt_fixture = {'docker.retcode': MagicMock(return_value=0),
+ 'docker.run_all': None}
+ with provision_state(dockerio, salt_fixture):
+ result = dockerio.run('ls /', 'ubuntu',
+ docked_unless='ls -l')
+ self.assertEqual(result, {'name': 'ls /',
+ 'result': True,
+ 'comment': ('docked_unless execution'
+ ' succeeded'),
+ 'changes': {}})
+
+
+if __name__ == '__main__':
+ from integration import run_tests
+ run_tests(DockerStateTestCase, needs_daemon=False)
diff --git a/tests/unit/utils/network.py b/tests/unit/utils/network.py
index 89db848..72ca857 100644
--- a/tests/unit/utils/network.py
+++ b/tests/unit/utils/network.py
@@ -151,15 +151,16 @@ class NetworkTestCase(TestCase):
self.assertEqual(interfaces,
{'ilbext0': {'inet': [{'address': '10.10.11.11',
'broadcast': '10.10.11.31',
+ 'netmask': '255.255.255.224'},
+ {'address': '10.10.11.12',
+ 'broadcast': '10.10.11.31',
'netmask': '255.255.255.224'}],
- 'inet6': [{'address': '::',
- 'prefixlen': '0'}],
+ 'inet6': [],
'up': True},
'ilbint0': {'inet': [{'address': '10.6.0.11',
'broadcast': '10.6.0.255',
'netmask': '255.255.255.0'}],
- 'inet6': [{'address': '::',
- 'prefixlen': '0'}],
+ 'inet6': [],
'up': True},
'lo0': {'inet': [{'address': '127.0.0.1',
'netmask': '255.0.0.0'}],
@@ -174,8 +175,7 @@ class NetworkTestCase(TestCase):
'up': True},
'vpn0': {'inet': [{'address': '10.6.0.14',
'netmask': '255.0.0.0'}],
- 'inet6': [{'address': '::',
- 'prefixlen': '0'}],
+ 'inet6': [],
'up': True}}
)
diff --git a/tests/unit/utils/utils_test.py b/tests/unit/utils/utils_test.py
index 261af69..11f0baf 100644
--- a/tests/unit/utils/utils_test.py
+++ b/tests/unit/utils/utils_test.py
@@ -527,14 +527,9 @@ class UtilsTestCase(TestCase):
ret = utils.date_cast('Mon Dec 23 10:19:15 MST 2013')
expected_ret = datetime.datetime(2013, 12, 23, 10, 19, 15)
self.assertEqual(ret, expected_ret)
- except ImportError:
- try:
- ret = utils.date_cast('Mon Dec 23 10:19:15 MST 2013')
- expected_ret = datetime.datetime(2013, 12, 23, 10, 19, 15)
- self.assertEqual(ret, expected_ret)
- except RuntimeError:
- # Unparseable without timelib installed
- self.skipTest('\'timelib\' is not installed')
+ except RuntimeError:
+ # Unparseable without timelib installed
+ self.skipTest('\'timelib\' is not installed')
@skipIf(not HAS_TIMELIB, '\'timelib\' is not installed')
def test_date_format(self):
--
2.8.2