summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Illfelder <illfelder@users.noreply.github.com>2016-05-17 09:45:56 -0700
committerMax Illfelder <illfelder@users.noreply.github.com>2016-05-17 09:45:56 -0700
commit729a0cfc4a3bbe6757a9a61b0002bc572edaf023 (patch)
tree468262d71af0995ceca554a631529386f33ca285
parent7087603a860f422590b72a5404d7977fa2c84ab6 (diff)
parentf713a378a0d496509b8f2eb5fcae7fede920cb44 (diff)
downloadgoogle-compute-image-packages-729a0cfc4a3bbe6757a9a61b0002bc572edaf023.tar.gz
Merge pull request #237 from illfelder/development
100% unit test coverage on Linux guest code.
-rw-r--r--google_compute_engine/accounts/tests/accounts_daemon_test.py3
-rw-r--r--google_compute_engine/accounts/tests/accounts_utils_test.py43
-rw-r--r--google_compute_engine/ip_forwarding/ip_forwarding_utils.py2
-rw-r--r--google_compute_engine/tests/config_manager_test.py9
-rw-r--r--google_compute_engine/tests/metadata_watcher_test.py13
5 files changed, 67 insertions, 3 deletions
diff --git a/google_compute_engine/accounts/tests/accounts_daemon_test.py b/google_compute_engine/accounts/tests/accounts_daemon_test.py
index 1027f4b..50c3c68 100644
--- a/google_compute_engine/accounts/tests/accounts_daemon_test.py
+++ b/google_compute_engine/accounts/tests/accounts_daemon_test.py
@@ -113,6 +113,7 @@ class AccountsDaemonTest(unittest.TestCase):
'user:ssh-rsa key user@domain.com': False,
'user:ssh-rsa key google {"expireOn":"%s"}' % _GetTimestamp(-1): False,
'user:ssh-rsa key google-ssh': False,
+ 'user:ssh-rsa key google-ssh {invalid:json}': False,
'user:ssh-rsa key google-ssh {"userName":"user"}': False,
'user:ssh-rsa key google-ssh {"expireOn":"invalid"}': False,
'user:xyz key google-ssh {"expireOn":"%s"}' % _GetTimestamp(1): False,
@@ -129,7 +130,7 @@ class AccountsDaemonTest(unittest.TestCase):
'a': ['1', '2'],
'b': ['3', '4', '5'],
}
- accounts_data = ''
+ accounts_data = 'skip\n'
for user, keys in user_map.items():
for key in keys:
accounts_data += '%s:%s\n' % (user, key)
diff --git a/google_compute_engine/accounts/tests/accounts_utils_test.py b/google_compute_engine/accounts/tests/accounts_utils_test.py
index f1308f2..b51ef96 100644
--- a/google_compute_engine/accounts/tests/accounts_utils_test.py
+++ b/google_compute_engine/accounts/tests/accounts_utils_test.py
@@ -282,11 +282,54 @@ class AccountsUtilsTest(unittest.TestCase):
self.assertEqual(mock_permissions.mock_calls, expected_calls)
@mock.patch('google_compute_engine.accounts.accounts_utils.file_utils.SetPermissions')
+ @mock.patch('google_compute_engine.accounts.accounts_utils.shutil.copy')
+ @mock.patch('google_compute_engine.accounts.accounts_utils.tempfile.NamedTemporaryFile')
+ @mock.patch('google_compute_engine.accounts.accounts_utils.os.path.exists')
+ def testUpdateAuthorizedKeysNoKeys(self, mock_exists, mock_tempfile,
+ mock_copy, mock_permissions):
+ user = 'user'
+ ssh_keys = ['Google key 1']
+ temp_dest = '/tmp/dest'
+ pw_uid = 1
+ pw_gid = 2
+ pw_dir = '/home'
+ ssh_dir = '/home/.ssh'
+ authorized_keys_file = '/home/.ssh/authorized_keys'
+ pw_entry = accounts_utils.pwd.struct_passwd(
+ ('', '', pw_uid, pw_gid, '', pw_dir, ''))
+ self.mock_utils._GetUser.return_value = pw_entry
+ mock_exists.return_value = False
+ mock_tempfile.return_value = mock_tempfile
+ mock_tempfile.__enter__.return_value.name = temp_dest
+ self.mock_logger.name = 'test'
+
+ # The authorized keys file does not exist so write a new one.
+ accounts_utils.AccountsUtils._UpdateAuthorizedKeys(
+ self.mock_utils, user, ssh_keys)
+ expected_calls = [
+ mock.call(mode='w', prefix='test-', delete=True),
+ mock.call.__enter__(),
+ mock.call.__enter__().write(self.mock_utils.google_comment + '\n'),
+ mock.call.__enter__().write('Google key 1\n'),
+ mock.call.__enter__().flush(),
+ mock.call.__exit__(None, None, None),
+ ]
+ self.assertEqual(mock_tempfile.mock_calls, expected_calls)
+ mock_copy.assert_called_once_with(temp_dest, authorized_keys_file)
+ expected_calls = [
+ mock.call(pw_dir, mode=0o755, uid=pw_uid, gid=pw_gid, mkdir=True),
+ mock.call(ssh_dir, mode=0o700, uid=pw_uid, gid=pw_gid, mkdir=True),
+ mock.call(authorized_keys_file, mode=0o600, uid=pw_uid, gid=pw_gid),
+ ]
+ self.assertEqual(mock_permissions.mock_calls, expected_calls)
+
+ @mock.patch('google_compute_engine.accounts.accounts_utils.file_utils.SetPermissions')
def testUpdateAuthorizedKeysNoUser(self, mock_permissions):
user = 'user'
ssh_keys = ['key']
self.mock_utils._GetUser.return_value = None
+ # The user does not exist, so do not write authorized keys.
accounts_utils.AccountsUtils._UpdateAuthorizedKeys(
self.mock_utils, user, ssh_keys)
self.mock_utils._GetUser.assert_called_once_with(user)
diff --git a/google_compute_engine/ip_forwarding/ip_forwarding_utils.py b/google_compute_engine/ip_forwarding/ip_forwarding_utils.py
index ad9258e..6e206b5 100644
--- a/google_compute_engine/ip_forwarding/ip_forwarding_utils.py
+++ b/google_compute_engine/ip_forwarding/ip_forwarding_utils.py
@@ -81,8 +81,6 @@ class IpForwardingUtils(object):
if fields and fields[0] == 'default' and 'dev' in fields:
index = fields.index('dev') + 1
return fields[index] if index < len(fields) else 'eth0'
- else:
- continue
return 'eth0'
def ParseForwardedIps(self, forwarded_ips):
diff --git a/google_compute_engine/tests/config_manager_test.py b/google_compute_engine/tests/config_manager_test.py
index 7862b9e..1fccbf9 100644
--- a/google_compute_engine/tests/config_manager_test.py
+++ b/google_compute_engine/tests/config_manager_test.py
@@ -118,6 +118,15 @@ class ConfigManagerTest(unittest.TestCase):
]
self.assertEqual(self.mock_config.mock_calls, expected_calls)
+ def testSetOptionNoOverwrite(self):
+ self.mock_config_manager.SetOption(
+ self.section, self.option, self.value, overwrite=False)
+ expected_calls = [
+ mock.call.read(self.config_file),
+ mock.call.has_option(self.section, self.option),
+ ]
+ self.assertEqual(self.mock_config.mock_calls, expected_calls)
+
def testSetOptionNewSection(self):
section = 'test-section'
self.mock_config_manager.SetOption(section, self.option, self.value)
diff --git a/google_compute_engine/tests/metadata_watcher_test.py b/google_compute_engine/tests/metadata_watcher_test.py
index 40e162c..4a7de5a 100644
--- a/google_compute_engine/tests/metadata_watcher_test.py
+++ b/google_compute_engine/tests/metadata_watcher_test.py
@@ -105,6 +105,19 @@ class MetadataWatcherTest(unittest.TestCase):
@mock.patch('google_compute_engine.metadata_watcher.urlrequest.urlopen')
@mock.patch('google_compute_engine.metadata_watcher.urlrequest.Request')
+ def testGetMetadataRequestHttpException(self, mock_request, mock_urlopen):
+ mock_request.return_value = mock_request
+ mock_response = mock.Mock()
+ mock_response.getcode.return_value = metadata_watcher.httpclient.NOT_FOUND
+ mock_urlopen.side_effect = metadata_watcher.StatusException(mock_response),
+
+ with self.assertRaises(metadata_watcher.StatusException):
+ self.mock_watcher._GetMetadataRequest(self.url)
+ self.assertEqual(mock_request.call_count, 1)
+ self.assertEqual(mock_urlopen.call_count, 1)
+
+ @mock.patch('google_compute_engine.metadata_watcher.urlrequest.urlopen')
+ @mock.patch('google_compute_engine.metadata_watcher.urlrequest.Request')
def testGetMetadataRequestException(self, mock_request, mock_urlopen):
mock_request.return_value = mock_request
mock_response = mock.Mock()