From bd462bc68506d7da4d7e04b05e947e0cf3f8e19d Mon Sep 17 00:00:00 2001 From: Daniel Watkins Date: Wed, 12 Nov 2014 13:52:28 +0000 Subject: Add tests for current parse_ssh_config behaviour. This also adds mock as a test dependency, as we are looking to migrate away from mocker. --- test-requirements.txt | 1 + tests/unittests/test_sshutil.py | 58 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/test-requirements.txt b/test-requirements.txt index 2edb8066..230f0404 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,4 +1,5 @@ httpretty>=0.7.1 +mock mocker nose pep8==1.5.7 diff --git a/tests/unittests/test_sshutil.py b/tests/unittests/test_sshutil.py index d8662cac..2a496418 100644 --- a/tests/unittests/test_sshutil.py +++ b/tests/unittests/test_sshutil.py @@ -1,6 +1,9 @@ -from cloudinit import ssh_util from unittest import TestCase +from mock import patch + +from cloudinit import ssh_util + VALID_CONTENT = { 'dsa': ( @@ -98,4 +101,57 @@ class TestAuthKeyLineParser(TestCase): self.assertFalse(key.valid()) +class TestParseSSHConfig(TestCase): + + def setUp(self): + self.load_file_patch = patch('cloudinit.ssh_util.util.load_file') + self.load_file = self.load_file_patch.start() + self.isfile_patch = patch('cloudinit.ssh_util.os.path.isfile') + self.isfile = self.isfile_patch.start() + self.isfile.return_value = True + + def tearDown(self): + self.load_file_patch.stop() + self.isfile_patch.stop() + + def test_not_a_file(self): + self.isfile.return_value = False + self.load_file.side_effect = IOError + ret = ssh_util.parse_ssh_config('not a real file') + self.assertEqual([], ret) + + def test_empty_file(self): + self.load_file.return_value = '' + ret = ssh_util.parse_ssh_config('some real file') + self.assertEqual([], ret) + + def test_comment_line(self): + comment_line = '# This is a comment' + self.load_file.return_value = comment_line + ret = ssh_util.parse_ssh_config('some real file') + self.assertEqual(1, len(ret)) + self.assertEqual(comment_line, ret[0].line) + + def test_blank_lines(self): + lines = ['', '\t', ' '] + self.load_file.return_value = '\n'.join(lines) + ret = ssh_util.parse_ssh_config('some real file') + self.assertEqual(len(lines), len(ret)) + for line in ret: + self.assertEqual('', line.line) + + def test_lower_case_config(self): + self.load_file.return_value = 'foo bar' + ret = ssh_util.parse_ssh_config('some real file') + self.assertEqual(1, len(ret)) + self.assertEqual('foo', ret[0].key) + self.assertEqual('bar', ret[0].value) + + def test_upper_case_config(self): + self.load_file.return_value = 'Foo Bar' + ret = ssh_util.parse_ssh_config('some real file') + self.assertEqual(1, len(ret)) + self.assertEqual('foo', ret[0].key) + self.assertEqual('Bar', ret[0].value) + # vi: ts=4 expandtab -- cgit v1.2.3 From 4ecca95e5973707f08fefc43448fec9e0f984966 Mon Sep 17 00:00:00 2001 From: Daniel Watkins Date: Wed, 12 Nov 2014 13:52:28 +0000 Subject: Handle = used as config delimiter in SSH config. --- cloudinit/ssh_util.py | 5 ++++- tests/unittests/test_sshutil.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/cloudinit/ssh_util.py b/cloudinit/ssh_util.py index 70a577bc..14d0cb0f 100644 --- a/cloudinit/ssh_util.py +++ b/cloudinit/ssh_util.py @@ -293,7 +293,10 @@ def parse_ssh_config(fname): if not line or line.startswith("#"): lines.append(SshdConfigLine(line)) continue - (key, val) = line.split(None, 1) + try: + key, val = line.split(None, 1) + except ValueError: + key, val = line.split('=', 1) lines.append(SshdConfigLine(line, key, val)) return lines diff --git a/tests/unittests/test_sshutil.py b/tests/unittests/test_sshutil.py index 2a496418..cd576e8f 100644 --- a/tests/unittests/test_sshutil.py +++ b/tests/unittests/test_sshutil.py @@ -154,4 +154,18 @@ class TestParseSSHConfig(TestCase): self.assertEqual('foo', ret[0].key) self.assertEqual('Bar', ret[0].value) + def test_lower_case_with_equals(self): + self.load_file.return_value = 'foo=bar' + ret = ssh_util.parse_ssh_config('some real file') + self.assertEqual(1, len(ret)) + self.assertEqual('foo', ret[0].key) + self.assertEqual('bar', ret[0].value) + + def test_upper_case_with_equals(self): + self.load_file.return_value = 'Foo=bar' + ret = ssh_util.parse_ssh_config('some real file') + self.assertEqual(1, len(ret)) + self.assertEqual('foo', ret[0].key) + self.assertEqual('bar', ret[0].value) + # vi: ts=4 expandtab -- cgit v1.2.3 From 5d168a9d11e905dd19e24d0596b7d1145e6b8aa1 Mon Sep 17 00:00:00 2001 From: Daniel Watkins Date: Thu, 13 Nov 2014 10:35:46 +0000 Subject: Use test_helpers.TestCase for test_sshutil tests. As requested by harlowja. --- tests/unittests/test_sshutil.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/unittests/test_sshutil.py b/tests/unittests/test_sshutil.py index cd576e8f..3b317121 100644 --- a/tests/unittests/test_sshutil.py +++ b/tests/unittests/test_sshutil.py @@ -1,7 +1,6 @@ -from unittest import TestCase - from mock import patch +from . import helpers as test_helpers from cloudinit import ssh_util @@ -38,7 +37,7 @@ TEST_OPTIONS = ("no-port-forwarding,no-agent-forwarding,no-X11-forwarding," 'user \"root\".\';echo;sleep 10"') -class TestAuthKeyLineParser(TestCase): +class TestAuthKeyLineParser(test_helpers.TestCase): def test_simple_parse(self): # test key line with common 3 fields (keytype, base64, comment) parser = ssh_util.AuthKeyLineParser() @@ -101,7 +100,7 @@ class TestAuthKeyLineParser(TestCase): self.assertFalse(key.valid()) -class TestParseSSHConfig(TestCase): +class TestParseSSHConfig(test_helpers.TestCase): def setUp(self): self.load_file_patch = patch('cloudinit.ssh_util.util.load_file') -- cgit v1.2.3