From ca8630eaa1bedb6981eec61c5e2079d3bcc31574 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 16/38] Unit test fixes for 2015.8.7

* Fixing skipped boto tests to prevent errors if boto3 does not exists.
* Skip utils_test if timelib is not installed (#32699)
  date_cast() throws a RuntimeError, not an ImportError
* 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.
* Fix missing first data in stream when subscribing stream using a function 'read_async'.
* Make sure spm tests are picked up by runtests.
  Lists in py2 don't have the clear method
* 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.
* Fixed LoadAuthTestCase
  Fixed use of assert_has_calls in tests.
  The method logic was changed in mock-1.1.0.
  This mades the use of the method compatible with both <1.1.0 and >=1.1.0
* Fixed tests
  Fixed more lint
* 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.
* Remove test for file dir behavior
  Refs #34809
* modules.darwin_sysctl: __virtual__ return err msg.
  Updated message in darwin_sysctl module when return False if OS is not OSX.
* rename darwin_sysctl.py to mac_sysctl.py
* Fixed _interfaces_ifconfig output for SunOS test
* Prevent tests failure if /etc/fstab does not exists
* Prevent tests failures if boto does not exists
* SPM: packaging doesn't work in Python 2.6. Fixed.
---
 salt/modules/boto_elb.py                           |   2 +-
 salt/modules/{darwin_sysctl.py => mac_sysctl.py}   |   5 +-
 tests/unit/auth_test.py                            |   4 +-
 tests/unit/modules/boto_secgroup_test.py           |   1 +
 tests/unit/modules/boto_vpc_test.py                |  14 +-
 tests/unit/modules/cron_test.py                    |   2 +-
 tests/unit/modules/linux_sysctl_test.py            |  19 +-
 .../{darwin_sysctl_test.py => mac_sysctl_test.py}  |  32 ++--
 tests/unit/modules/mount_test.py                   |  21 +--
 tests/unit/modules/mysql_test.py                   |   6 +-
 tests/unit/modules/puppet_test.py                  |  15 +-
 tests/unit/netapi/rest_tornado/test_utils.py       |  27 ++-
 tests/unit/{spm.py => spm_test.py}                 |   6 +-
 .../unit/states/{dockerio.py => dockerio_test.py}  |   1 +
 tests/unit/states/file_test.py                     |  22 +--
 tests/unit/utils/network.py                        | 196 +++++++++++++++++++++
 tests/unit/utils/utils_test.py                     |  11 +-
 17 files changed, 294 insertions(+), 90 deletions(-)
 rename salt/modules/{darwin_sysctl.py => mac_sysctl.py} (96%)
 rename tests/unit/modules/{darwin_sysctl_test.py => mac_sysctl_test.py} (74%)
 rename tests/unit/{spm.py => spm_test.py} (98%)
 rename tests/unit/states/{dockerio.py => dockerio_test.py} (98%)
 create mode 100644 tests/unit/utils/network.py

diff --git a/salt/modules/boto_elb.py b/salt/modules/boto_elb.py
index 33e7396..d300f23 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/darwin_sysctl.py b/salt/modules/mac_sysctl.py
similarity index 96%
rename from salt/modules/darwin_sysctl.py
rename to salt/modules/mac_sysctl.py
index dce868a..fe91666 100644
--- a/salt/modules/darwin_sysctl.py
+++ b/salt/modules/mac_sysctl.py
@@ -19,7 +19,10 @@ def __virtual__():
     '''
     Only run on Darwin (OS X) systems
     '''
-    return __virtualname__ if __grains__['os'] == 'MacOS' else False
+    if __grains__['os'] == 'MacOS':
+        return __virtualname__
+    return (False, 'The darwin_sysctl execution module cannot be loaded: '
+            'only available on MacOS systems.')
 
 
 def show(config_file=False):
diff --git a/tests/unit/auth_test.py b/tests/unit/auth_test.py
index b6bddb2..d68cb25 100644
--- a/tests/unit/auth_test.py
+++ b/tests/unit/auth_test.py
@@ -48,7 +48,7 @@ class LoadAuthTestCase(TestCase):
                 'eauth': 'pam'
             }, expected_extra_kws=auth.AUTH_INTERNAL_KEYWORDS)
             ret = self.lauth.load_name(valid_eauth_load)
-            format_call_mock.assert_has_calls(expected_ret)
+            format_call_mock.assert_has_calls((expected_ret,), any_order=True)
 
     def test_get_groups(self):
         valid_eauth_load = {'username': 'test_user',
@@ -63,7 +63,7 @@ class LoadAuthTestCase(TestCase):
                 'eauth': 'pam'
                 }, expected_extra_kws=auth.AUTH_INTERNAL_KEYWORDS)
             self.lauth.get_groups(valid_eauth_load)
-            format_call_mock.assert_has_calls(expected_ret)
+            format_call_mock.assert_has_calls((expected_ret,), any_order=True)
 
 
 @patch('zmq.Context', MagicMock())
diff --git a/tests/unit/modules/boto_secgroup_test.py b/tests/unit/modules/boto_secgroup_test.py
index f1c6bb1..5099935 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 e7e09fa..cbf36a8 100644
--- a/tests/unit/modules/boto_vpc_test.py
+++ b/tests/unit/modules/boto_vpc_test.py
@@ -118,6 +118,13 @@ def _has_required_moto():
         return True
 
 
+@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__ = {}
@@ -230,13 +237,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/cron_test.py b/tests/unit/modules/cron_test.py
index 1231487..89c3e82 100644
--- a/tests/unit/modules/cron_test.py
+++ b/tests/unit/modules/cron_test.py
@@ -577,7 +577,7 @@ class PsTestCase(TestCase):
                                     '# Lines below here are managed by Salt, do not edit\n',
                                     '@hourly echo Hi!\n'])
         ret = cron.set_special('DUMMY_USER', '@hourly', 'echo Hi!')
-        write_cron_lines_mock.assert_has_calls(expected_write_call)
+        write_cron_lines_mock.assert_has_calls((expected_write_call,), any_order=True)
 
     def test__get_cron_date_time(self):
         ret = cron._get_cron_date_time(minute=STUB_CRON_TIMESTAMP['minute'],
diff --git a/tests/unit/modules/linux_sysctl_test.py b/tests/unit/modules/linux_sysctl_test.py
index aeef75b..eb8b7e2 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))
     def test_persist_no_conf_success(self):
diff --git a/tests/unit/modules/darwin_sysctl_test.py b/tests/unit/modules/mac_sysctl_test.py
similarity index 74%
rename from tests/unit/modules/darwin_sysctl_test.py
rename to tests/unit/modules/mac_sysctl_test.py
index 9b8e9ff..533397b 100644
--- a/tests/unit/modules/darwin_sysctl_test.py
+++ b/tests/unit/modules/mac_sysctl_test.py
@@ -7,7 +7,7 @@
 from __future__ import absolute_import
 
 # Import Salt Libs
-from salt.modules import darwin_sysctl
+from salt.modules import mac_sysctl
 from salt.exceptions import CommandExecutionError
 
 # Import Salt Testing Libs
@@ -25,13 +25,13 @@ from salttesting.mock import (
 ensure_in_syspath('../../')
 
 # Globals
-darwin_sysctl.__salt__ = {}
+mac_sysctl.__salt__ = {}
 
 
 @skipIf(NO_MOCK, NO_MOCK_REASON)
 class DarwinSysctlTestCase(TestCase):
     '''
-    TestCase for salt.modules.darwin_sysctl module
+    TestCase for salt.modules.mac_sysctl module
     '''
 
     def test_get(self):
@@ -39,8 +39,8 @@ class DarwinSysctlTestCase(TestCase):
         Tests the return of get function
         '''
         mock_cmd = MagicMock(return_value='foo')
-        with patch.dict(darwin_sysctl.__salt__, {'cmd.run': mock_cmd}):
-            self.assertEqual(darwin_sysctl.get('kern.ostype'), 'foo')
+        with patch.dict(mac_sysctl.__salt__, {'cmd.run': mock_cmd}):
+            self.assertEqual(mac_sysctl.get('kern.ostype'), 'foo')
 
     def test_assign_cmd_failed(self):
         '''
@@ -49,9 +49,9 @@ class DarwinSysctlTestCase(TestCase):
         cmd = {'pid': 3548, 'retcode': 1, 'stderr': '',
                'stdout': 'net.inet.icmp.icmplim: 250 -> 50'}
         mock_cmd = MagicMock(return_value=cmd)
-        with patch.dict(darwin_sysctl.__salt__, {'cmd.run_all': mock_cmd}):
+        with patch.dict(mac_sysctl.__salt__, {'cmd.run_all': mock_cmd}):
             self.assertRaises(CommandExecutionError,
-                              darwin_sysctl.assign,
+                              mac_sysctl.assign,
                               'net.inet.icmp.icmplim', 50)
 
     def test_assign(self):
@@ -62,8 +62,8 @@ class DarwinSysctlTestCase(TestCase):
                'stdout': 'net.inet.icmp.icmplim: 250 -> 50'}
         ret = {'net.inet.icmp.icmplim': '50'}
         mock_cmd = MagicMock(return_value=cmd)
-        with patch.dict(darwin_sysctl.__salt__, {'cmd.run_all': mock_cmd}):
-            self.assertEqual(darwin_sysctl.assign(
+        with patch.dict(mac_sysctl.__salt__, {'cmd.run_all': mock_cmd}):
+            self.assertEqual(mac_sysctl.assign(
                 'net.inet.icmp.icmplim', 50), ret)
 
     @patch('os.path.isfile', MagicMock(return_value=False))
@@ -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,
-                                           darwin_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):
@@ -84,7 +84,7 @@ class DarwinSysctlTestCase(TestCase):
         Tests successful add of config file when previously not one
         '''
         with patch('salt.utils.fopen', mock_open()) as m_open:
-            darwin_sysctl.persist('net.inet.icmp.icmplim', 50)
+            mac_sysctl.persist('net.inet.icmp.icmplim', 50)
             helper_open = m_open()
             helper_open.write.assert_called_once_with(
                 '#\n# Kernel sysctl configuration\n#\n')
@@ -97,7 +97,7 @@ class DarwinSysctlTestCase(TestCase):
         to_write = '#\n# Kernel sysctl configuration\n#\n'
         m_calls_list = [call.writelines(['net.inet.icmp.icmplim=50', '\n'])]
         with patch('salt.utils.fopen', mock_open(read_data=to_write)) as m_open:
-            darwin_sysctl.persist('net.inet.icmp.icmplim', 50, config=to_write)
+            mac_sysctl.persist('net.inet.icmp.icmplim', 50, config=to_write)
             helper_open = m_open()
             calls_list = helper_open.method_calls
             self.assertEqual(calls_list, m_calls_list)
diff --git a/tests/unit/modules/mount_test.py b/tests/unit/modules/mount_test.py
index 282539d..b2b23bf 100644
--- a/tests/unit/modules/mount_test.py
+++ b/tests/unit/modules/mount_test.py
@@ -100,15 +100,16 @@ class MountTestCase(TestCase):
         '''
         mock = MagicMock(return_value={})
         with patch.object(mount, 'fstab', mock):
-            self.assertTrue(mount.rm_fstab('name', 'device'))
+            with patch('salt.utils.fopen', mock_open()) as m_open:
+                self.assertTrue(mount.rm_fstab('name', 'device'))
 
-        mock = MagicMock(return_value={'name': 'name'})
-        with patch.object(mount, 'fstab', mock):
+        mock_fstab = MagicMock(return_value={'name': 'name'})
+        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):
         '''
@@ -144,11 +145,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/mysql_test.py b/tests/unit/modules/mysql_test.py
index 8cd3eca..85b71ba 100644
--- a/tests/unit/modules/mysql_test.py
+++ b/tests/unit/modules/mysql_test.py
@@ -293,10 +293,10 @@ class MySQLTestCase(TestCase):
         with patch.dict(mysql.__salt__, {'config.option': MagicMock()}):
             function(*args, **kwargs)
             if isinstance(expected_sql, dict):
-                calls = (call().cursor().execute('{0}'.format(expected_sql['sql']), expected_sql['sql_args']))
+                calls = call().cursor().execute('{0}'.format(expected_sql['sql']), expected_sql['sql_args'])
             else:
-                calls = (call().cursor().execute('{0}'.format(expected_sql)))
-            connect_mock.assert_has_calls(calls)
+                calls = call().cursor().execute('{0}'.format(expected_sql))
+            connect_mock.assert_has_calls((calls,), True)
 
 
 if __name__ == '__main__':
diff --git a/tests/unit/modules/puppet_test.py b/tests/unit/modules/puppet_test.py
index 6a43fd4..dcc488a 100644
--- a/tests/unit/modules/puppet_test.py
+++ b/tests/unit/modules/puppet_test.py
@@ -91,10 +91,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):
         '''
@@ -155,9 +157,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/netapi/rest_tornado/test_utils.py b/tests/unit/netapi/rest_tornado/test_utils.py
index 1dd18d5..c22c288 100644
--- a/tests/unit/netapi/rest_tornado/test_utils.py
+++ b/tests/unit/netapi/rest_tornado/test_utils.py
@@ -103,7 +103,8 @@ class TestEventListener(AsyncTestCase):
             event_listener = saltnado.EventListener({},  # we don't use mod_opts, don't save?
                                                     {'sock_dir': SOCK_DIR,
                                                      'transport': 'zeromq'})
-            event_future = event_listener.get_event(1, 'evt1', self.stop)  # get an event future
+            self._finished = False  # fit to event_listener's behavior
+            event_future = event_listener.get_event(self, 'evt1', self.stop)  # get an event future
             me.fire_event({'data': 'foo2'}, 'evt2')  # fire an event we don't want
             me.fire_event({'data': 'foo1'}, 'evt1')  # fire an event we do want
             self.wait()  # wait for the future
@@ -113,6 +114,27 @@ class TestEventListener(AsyncTestCase):
             self.assertEqual(event_future.result()['tag'], 'evt1')
             self.assertEqual(event_future.result()['data']['data'], 'foo1')
 
+    def test_set_event_handler(self):
+        '''
+        Test subscribing events using set_event_handler
+        '''
+        with eventpublisher_process():
+            me = event.MasterEvent(SOCK_DIR)
+            event_listener = saltnado.EventListener({},  # we don't use mod_opts, don't save?
+                                                    {'sock_dir': SOCK_DIR,
+                                                     'transport': 'zeromq'})
+            self._finished = False  # fit to event_listener's behavior
+            event_future = event_listener.get_event(self,
+                                                    tag='evt',
+                                                    callback=self.stop,
+                                                    timeout=1,
+                                                    )  # get an event future
+            me.fire_event({'data': 'foo'}, 'evt')  # fire an event we do want
+            self.wait()
+
+            # check that we subscribed the event we wanted
+            self.assertEqual(len(event_listener.timeout_map), 0)
+
     def test_timeout(self):
         '''
         Make sure timeouts work correctly
@@ -121,7 +143,8 @@ class TestEventListener(AsyncTestCase):
             event_listener = saltnado.EventListener({},  # we don't use mod_opts, don't save?
                                                     {'sock_dir': SOCK_DIR,
                                                      'transport': 'zeromq'})
-            event_future = event_listener.get_event(1,
+            self._finished = False  # fit to event_listener's behavior
+            event_future = event_listener.get_event(self,
                                                     tag='evt1',
                                                     callback=self.stop,
                                                     timeout=1,
diff --git a/tests/unit/spm.py b/tests/unit/spm_test.py
similarity index 98%
rename from tests/unit/spm.py
rename to tests/unit/spm_test.py
index d2c0bf7..1adc377 100644
--- a/tests/unit/spm.py
+++ b/tests/unit/spm_test.py
@@ -129,12 +129,12 @@ class SPMTest(TestCase):
                 ('summary', 'Summary: {0}')):
             assert line.format(_F1['definition'][key]) in lines
         # Reinstall with force=False, should fail
-        self.ui._error.clear()
+        self.ui._error = []
         self.client.run(['local', 'install', pkgpath])
         assert len(self.ui._error) > 0
         # Reinstall with force=True, should succeed
         __opts__['force'] = True
-        self.ui._error.clear()
+        self.ui._error = []
         self.client.run(['local', 'install', pkgpath])
         assert len(self.ui._error) == 0
         __opts__['force'] = False
@@ -167,7 +167,7 @@ class SPMTest(TestCase):
         )
 
         for args in fail_args:
-            self.ui._error.clear()
+            self.ui._error = []
             self.client.run(args)
             assert len(self.ui._error) > 0
 
diff --git a/tests/unit/states/dockerio.py b/tests/unit/states/dockerio_test.py
similarity index 98%
rename from tests/unit/states/dockerio.py
rename to tests/unit/states/dockerio_test.py
index c73b633..54f51be 100644
--- a/tests/unit/states/dockerio.py
+++ b/tests/unit/states/dockerio_test.py
@@ -20,6 +20,7 @@ def provision_state(module, fixture):
 
 
 @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
diff --git a/tests/unit/states/file_test.py b/tests/unit/states/file_test.py
index 2168a6b..605d1e0 100644
--- a/tests/unit/states/file_test.py
+++ b/tests/unit/states/file_test.py
@@ -925,6 +925,7 @@ class FileTestCase(TestCase):
 
     # 'comment' function tests: 1
 
+    @patch.object(os.path, 'exists', MagicMock(return_value=True))
     def test_comment(self):
         '''
         Test to comment out specified lines in a file.
@@ -981,6 +982,7 @@ class FileTestCase(TestCase):
 
     # 'uncomment' function tests: 1
 
+    @patch.object(os.path, 'exists', MagicMock(return_value=True))
     def test_uncomment(self):
         '''
         Test to uncomment specified commented lines in a file
@@ -1318,26 +1320,6 @@ class FileTestCase(TestCase):
                                                      (name, source,
                                                       preserve=True), ret)
 
-                    with patch.object(os.path, 'isdir', mock_t):
-                        with patch.dict(filestate.__opts__, {'test': False}):
-                            with patch.object(shutil, 'copy',
-                                              MagicMock(side_effect=[IOError,
-                                                                     True])):
-                                comt = ('Failed to copy "{0}" to "{1}"'
-                                        .format(source, name))
-                                ret.update({'comment': comt, 'result': False})
-                                self.assertDictEqual(filestate.copy
-                                                     (name, source,
-                                                      preserve=True), ret)
-
-                                comt = ('Copied "{0}" to "{1}"'.format(source,
-                                                                       name))
-                                ret.update({'comment': comt, 'result': True,
-                                            'changes': {name: source}})
-                                self.assertDictEqual(filestate.copy
-                                                     (name, source,
-                                                      preserve=True), ret)
-
     # 'rename' function tests: 1
 
     def test_rename(self):
diff --git a/tests/unit/utils/network.py b/tests/unit/utils/network.py
new file mode 100644
index 0000000..63ec554
--- /dev/null
+++ b/tests/unit/utils/network.py
@@ -0,0 +1,196 @@
+# -*- coding: utf-8 -*-
+# Import Python libs
+from __future__ import absolute_import
+
+# Import Salt Testing libs
+from salttesting import skipIf
+from salttesting import TestCase
+from salttesting.helpers import ensure_in_syspath
+from salttesting.mock import NO_MOCK, NO_MOCK_REASON, patch
+ensure_in_syspath('../../')
+
+# Import salt libs
+from salt.utils import network
+
+LINUX = '''\
+eth0      Link encap:Ethernet  HWaddr e0:3f:49:85:6a:af
+          inet addr:10.10.10.56  Bcast:10.10.10.255  Mask:255.255.252.0
+          inet6 addr: fe80::e23f:49ff:fe85:6aaf/64 Scope:Link
+          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
+          RX packets:643363 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:196539 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:1000
+          RX bytes:386388355 (368.4 MiB)  TX bytes:25600939 (24.4 MiB)
+
+lo        Link encap:Local Loopback
+          inet addr:127.0.0.1  Mask:255.0.0.0
+          inet6 addr: ::1/128 Scope:Host
+          UP LOOPBACK RUNNING  MTU:65536  Metric:1
+          RX packets:548901 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:548901 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:0
+          RX bytes:613479895 (585.0 MiB)  TX bytes:613479895 (585.0 MiB)
+'''
+
+FREEBSD = '''
+em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+        options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
+        ether 00:30:48:ff:ff:ff
+        inet 10.10.10.250 netmask 0xffffffe0 broadcast 10.10.10.255
+        inet 10.10.10.56 netmask 0xffffffc0 broadcast 10.10.10.63
+        media: Ethernet autoselect (1000baseT <full-duplex>)
+        status: active
+em1: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
+        options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
+        ether 00:30:48:aa:aa:aa
+        media: Ethernet autoselect
+        status: no carrier
+plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
+lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
+        options=3<RXCSUM,TXCSUM>
+        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8
+        inet6 ::1 prefixlen 128
+        inet 127.0.0.1 netmask 0xff000000
+        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
+tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
+        options=80000<LINKSTATE>
+        inet 10.12.0.1 --> 10.12.0.2 netmask 0xffffffff
+        Opened by PID 1964
+'''
+
+SOLARIS = '''\
+lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
+        inet 127.0.0.1 netmask ff000000
+net0: flags=100001100943<UP,BROADCAST,RUNNING,PROMISC,MULTICAST,ROUTER,IPv4,PHYSRUNNING> mtu 1500 index 2
+        inet 10.10.10.38 netmask ffffffe0 broadcast 10.10.10.63
+ilbint0: flags=110001100843<UP,BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4,VRRP,PHYSRUNNING> mtu 1500 index 3
+        inet 10.6.0.11 netmask ffffff00 broadcast 10.6.0.255
+ilbext0: flags=110001100843<UP,BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4,VRRP,PHYSRUNNING> mtu 1500 index 4
+        inet 10.10.11.11 netmask ffffffe0 broadcast 10.10.11.31
+ilbext0:1: flags=110001100843<UP,BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4,VRRP,PHYSRUNNING> mtu 1500 index 4
+        inet 10.10.11.12 netmask ffffffe0 broadcast 10.10.11.31
+vpn0: flags=1000011008d1<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST,ROUTER,IPv4,PHYSRUNNING> mtu 1480 index 5
+        inet tunnel src 10.10.11.12 tunnel dst 10.10.5.5
+        tunnel hop limit 64
+        inet 10.6.0.14 --> 10.6.0.15 netmask ff000000
+lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
+        inet6 ::1/128
+net0: flags=120002004941<UP,RUNNING,PROMISC,MULTICAST,DHCP,IPv6,PHYSRUNNING> mtu 1500 index 2
+        inet6 fe80::221:9bff:fefd:2a22/10
+ilbint0: flags=120002000840<RUNNING,MULTICAST,IPv6,PHYSRUNNING> mtu 1500 index 3
+        inet6 ::/0
+ilbext0: flags=120002000840<RUNNING,MULTICAST,IPv6,PHYSRUNNING> mtu 1500 index 4
+        inet6 ::/0
+vpn0: flags=120002200850<POINTOPOINT,RUNNING,MULTICAST,NONUD,IPv6,PHYSRUNNING> mtu 1480 index 5
+        inet tunnel src 10.10.11.12 tunnel dst 10.10.5.5
+        tunnel hop limit 64
+        inet6 ::/0 --> fe80::b2d6:7c10
+'''
+
+FREEBSD_SOCKSTAT = '''\
+USER    COMMAND     PID     FD  PROTO  LOCAL ADDRESS    FOREIGN ADDRESS
+root    python2.7   1294    41  tcp4   127.0.0.1:61115  127.0.0.1:4506
+'''
+
+
+@skipIf(NO_MOCK, NO_MOCK_REASON)
+class NetworkTestCase(TestCase):
+
+    def test_interfaces_ifconfig_linux(self):
+        interfaces = network._interfaces_ifconfig(LINUX)
+        self.assertEqual(interfaces,
+                         {'eth0': {'hwaddr': 'e0:3f:49:85:6a:af',
+                                   'inet': [{'address': '10.10.10.56',
+                                             'broadcast': '10.10.10.255',
+                                             'netmask': '255.255.252.0'}],
+                                   'inet6': [{'address': 'fe80::e23f:49ff:fe85:6aaf',
+                                              'prefixlen': '64',
+                                              'scope': 'link'}],
+                                   'up': True},
+                          'lo': {'inet': [{'address': '127.0.0.1',
+                                           'netmask': '255.0.0.0'}],
+                                 'inet6': [{'address': '::1',
+                                            'prefixlen': '128',
+                                            'scope': 'host'}],
+                                 'up': True}}
+        )
+
+    def test_interfaces_ifconfig_freebsd(self):
+        interfaces = network._interfaces_ifconfig(FREEBSD)
+        self.assertEqual(interfaces,
+                         {'': {'up': False},
+                          'em0': {'hwaddr': '00:30:48:ff:ff:ff',
+                                  'inet': [{'address': '10.10.10.250',
+                                            'broadcast': '10.10.10.255',
+                                            'netmask': '255.255.255.224'},
+                                           {'address': '10.10.10.56',
+                                            'broadcast': '10.10.10.63',
+                                            'netmask': '255.255.255.192'}],
+                                  'up': True},
+                          'em1': {'hwaddr': '00:30:48:aa:aa:aa',
+                                  'up': False},
+                          'lo0': {'inet': [{'address': '127.0.0.1',
+                                            'netmask': '255.0.0.0'}],
+                                  'inet6': [{'address': 'fe80::1',
+                                             'prefixlen': '64',
+                                             'scope': '0x8'},
+                                            {'address': '::1',
+                                             'prefixlen': '128',
+                                             'scope': None}],
+                                  'up': True},
+                          'plip0': {'up': False},
+                          'tun0': {'inet': [{'address': '10.12.0.1',
+                                             'netmask': '255.255.255.255'}],
+                                   'up': True}}
+
+        )
+
+    def test_interfaces_ifconfig_solaris(self):
+        with patch('salt.utils.is_sunos', lambda: True):
+            interfaces = network._interfaces_ifconfig(SOLARIS)
+            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'}],
+                                          'up': True},
+                              'ilbint0': {'inet': [{'address': '10.6.0.11',
+                                                    'broadcast': '10.6.0.255',
+                                                    'netmask': '255.255.255.0'}],
+                                          'inet6': [{'address': '::',
+                                                     'prefixlen': '0'}],
+                                          'up': True},
+                              'lo0': {'inet': [{'address': '127.0.0.1',
+                                                'netmask': '255.0.0.0'}],
+                                      'inet6': [{'address': '::1',
+                                                 'prefixlen': '128'}],
+                                      'up': True},
+                              'net0': {'inet': [{'address': '10.10.10.38',
+                                                 'broadcast': '10.10.10.63',
+                                                 'netmask': '255.255.255.224'}],
+                                       'inet6': [{'address': 'fe80::221:9bff:fefd:2a22',
+                                                  'prefixlen': '10'}],
+                                       'up': True},
+                              'vpn0': {'inet': [{'address': '10.6.0.14',
+                                                 'netmask': '255.0.0.0'}],
+                                       'inet6': [{'address': '::',
+                                                  'prefixlen': '0'}],
+                                       'up': True}}
+            )
+
+    def test_freebsd_remotes_on(self):
+        with patch('salt.utils.is_sunos', lambda: False):
+            with patch('salt.utils.is_freebsd', lambda: True):
+                with patch('subprocess.check_output',
+                           return_value=FREEBSD_SOCKSTAT):
+                    remotes = network._freebsd_remotes_on('4506', 'remote')
+                    self.assertEqual(remotes, set(['127.0.0.1']))
+
+
+if __name__ == '__main__':
+    from integration import run_tests
+    run_tests(NetworkTestCase, needs_daemon=False)
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.10.2

