salt/tests/unit/transport/mixins.py
Erik Johnson 3184168365 Use explicit unicode strings + break up salt.utils
This PR is part of what will be an ongoing effort to use explicit
unicode strings in Salt. Because Python 3 does not suport Python 2's raw
unicode string syntax (i.e. `ur'\d+'`), we must use
`salt.utils.locales.sdecode()` to ensure that the raw string is unicode.
However, because of how `salt/utils/__init__.py` has evolved into the
hulking monstrosity it is today, this means importing a large module in
places where it is not needed, which could negatively impact
performance. For this reason, this PR also breaks out some of the
functions from `salt/utils/__init__.py` into new/existing modules under
`salt/utils/`. The long term goal will be that the modules within this
directory do not depend on importing `salt.utils`.

A summary of the changes in this PR is as follows:

* Moves the following functions from `salt.utils` to new locations
  (including a deprecation warning if invoked from `salt.utils`):
  `to_bytes`, `to_str`, `to_unicode`, `str_to_num`, `is_quoted`,
  `dequote`, `is_hex`, `is_bin_str`, `rand_string`,
  `contains_whitespace`, `clean_kwargs`, `invalid_kwargs`, `which`,
  `which_bin`, `path_join`, `shlex_split`, `rand_str`, `is_windows`,
  `is_proxy`, `is_linux`, `is_darwin`, `is_sunos`, `is_smartos`,
  `is_smartos_globalzone`, `is_smartos_zone`, `is_freebsd`, `is_netbsd`,
  `is_openbsd`, `is_aix`
* Moves the functions already deprecated by @rallytime to the bottom of
  `salt/utils/__init__.py` for better organization, so we can keep the
  deprecated ones separate from the ones yet to be deprecated as we
  continue to break up `salt.utils`
* Updates `salt/*.py` and all files under `salt/client/` to use explicit
  unicode string literals.
* Gets rid of implicit imports of `salt.utils` (e.g. `from salt.utils
  import foo` becomes `import salt.utils.foo as foo`).
* Renames the `test.rand_str` function to `test.random_hash` to more
  accurately reflect what it does
* Modifies `salt.utils.stringutils.random()` (née `salt.utils.rand_string()`)
  such that it returns a string matching the passed size. Previously
  this function would get `size` bytes from `os.urandom()`,
  base64-encode it, and return the result, which would in most cases not
  be equal to the passed size.
2017-08-08 13:33:43 -05:00

83 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
# Import Python libs
from __future__ import absolute_import
# Import Salt Libs
import salt.transport.client
# Import 3rd-party libs
from salt.ext import six
class ReqChannelMixin(object):
def test_basic(self):
'''
Test a variety of messages, make sure we get the expected responses
'''
msgs = [
{'foo': 'bar'},
{'bar': 'baz'},
{'baz': 'qux', 'list': [1, 2, 3]},
]
for msg in msgs:
ret = self.channel.send(msg, timeout=2, tries=1)
self.assertEqual(ret['load'], msg)
def test_normalization(self):
'''
Since we use msgpack, we need to test that list types are converted to lists
'''
types = {
'list': list,
}
msgs = [
{'list': tuple([1, 2, 3])},
]
for msg in msgs:
ret = self.channel.send(msg, timeout=2, tries=1)
for k, v in six.iteritems(ret['load']):
self.assertEqual(types[k], type(v))
def test_badload(self):
'''
Test a variety of bad requests, make sure that we get some sort of error
'''
msgs = ['', [], tuple()]
for msg in msgs:
ret = self.channel.send(msg, timeout=2, tries=1)
self.assertEqual(ret, 'payload and load must be a dict')
class PubChannelMixin(object):
def test_basic(self):
self.pub = None
def handle_pub(ret):
self.pub = ret
self.stop()
self.pub_channel = salt.transport.client.AsyncPubChannel.factory(self.minion_opts, io_loop=self.io_loop)
connect_future = self.pub_channel.connect()
connect_future.add_done_callback(lambda f: self.stop())
self.wait()
connect_future.result()
self.pub_channel.on_recv(handle_pub)
load = {
'fun': 'f',
'arg': 'a',
'tgt': 't',
'jid': 'j',
'ret': 'r',
'tgt_type': 'glob',
}
self.server_channel.publish(load)
self.wait()
self.assertEqual(self.pub['load'], load)
self.pub_channel.on_recv(None)
self.server_channel.publish(load)
with self.assertRaises(self.failureException):
self.wait(timeout=0.5)
# close our pub_channel, to pass our FD checks
del self.pub_channel