|
@@ -26,6 +26,7 @@ import http.client
|
|
|
import pwd
|
|
|
import getpass
|
|
|
import re
|
|
|
+import json
|
|
|
from optparse import OptionParser
|
|
|
from isc.config.config_data import ConfigData, MultiConfigData
|
|
|
from isc.config.module_spec import ModuleSpec
|
|
@@ -457,6 +458,137 @@ class TestConfigCommands(unittest.TestCase):
|
|
|
finally:
|
|
|
self.tool.send_POST = orig_send_POST
|
|
|
|
|
|
+ def test_have_users(self):
|
|
|
+ # Make sure __have_users raises the correct exception
|
|
|
+ # upon failure of either send_POST or the read() on the
|
|
|
+ # response
|
|
|
+
|
|
|
+ orig_send_POST = self.tool.send_POST
|
|
|
+ expected_printed_messages = []
|
|
|
+ try:
|
|
|
+ # Check what happens when cmdctl returns a HTTP server failure
|
|
|
+ def send_POST_HTTPFailure(self, params=None):
|
|
|
+ '''Replacement send_POST() method that returns a
|
|
|
+ HTTP failure code.'''
|
|
|
+ class MyResponse:
|
|
|
+ def __init__(self):
|
|
|
+ self.status = http.client.SERVICE_UNAVAILABLE
|
|
|
+ def read(self):
|
|
|
+ return ''
|
|
|
+ return MyResponse()
|
|
|
+
|
|
|
+ self.tool.send_POST = send_POST_HTTPFailure
|
|
|
+ self.assertRaises(FailToLogin, self.tool._have_users)
|
|
|
+ expected_printed_messages.append(
|
|
|
+ 'Failure in cmdctl when checking if users already exist')
|
|
|
+ self.__check_printed_messages(expected_printed_messages)
|
|
|
+
|
|
|
+ # Check what happens when cmdctl returns a result successfully
|
|
|
+ def create_send_POST_success(status):
|
|
|
+ '''Create a replacement send_POST() method that
|
|
|
+ successfully returns status.'''
|
|
|
+ def send_POST_success(self, params=None):
|
|
|
+ class MyResponse:
|
|
|
+ def __init__(self):
|
|
|
+ self.status = http.client.OK
|
|
|
+ def read(self):
|
|
|
+ class MyData:
|
|
|
+ def decode(self):
|
|
|
+ return json.dumps(status)
|
|
|
+ return MyData()
|
|
|
+ return MyResponse()
|
|
|
+ return send_POST_success
|
|
|
+
|
|
|
+ # Users exist
|
|
|
+ self.tool.send_POST = create_send_POST_success(True)
|
|
|
+ self.assertTrue(self.tool._have_users())
|
|
|
+
|
|
|
+ # Users don't exist
|
|
|
+ self.tool.send_POST = create_send_POST_success(False)
|
|
|
+ self.assertFalse(self.tool._have_users())
|
|
|
+
|
|
|
+ # Check what happens when send_POST() raises an exception
|
|
|
+ def send_POST_raiseImmediately(self, params=None):
|
|
|
+ raise socket.error("test error")
|
|
|
+
|
|
|
+ self.tool.send_POST = send_POST_raiseImmediately
|
|
|
+ self.assertRaises(FailToLogin, self.tool._have_users)
|
|
|
+ expected_printed_messages.append(
|
|
|
+ 'Socket error checking if users exist: test error')
|
|
|
+ self.__check_printed_messages(expected_printed_messages)
|
|
|
+
|
|
|
+ # Check what happens when reading a HTTP response raises an
|
|
|
+ # exception
|
|
|
+ def create_send_POST_raiseOnRead(exception):
|
|
|
+ '''Create a replacement send_POST() method that raises
|
|
|
+ the given exception when read() is called on the value
|
|
|
+ returned from send_POST()'''
|
|
|
+ def send_POST_raiseOnRead(self, params=None):
|
|
|
+ class MyResponse:
|
|
|
+ def __init__(self):
|
|
|
+ self.status = http.client.OK
|
|
|
+ def read(self):
|
|
|
+ raise exception
|
|
|
+ return MyResponse()
|
|
|
+ return send_POST_raiseOnRead
|
|
|
+
|
|
|
+ # basic socket error
|
|
|
+ self.tool.send_POST =\
|
|
|
+ create_send_POST_raiseOnRead(socket.error("read error"))
|
|
|
+ self.assertRaises(FailToLogin, self.tool._have_users)
|
|
|
+ expected_printed_messages.append(
|
|
|
+ 'Socket error checking if users exist: read error')
|
|
|
+ self.__check_printed_messages(expected_printed_messages)
|
|
|
+
|
|
|
+ # connection reset
|
|
|
+ exc = socket.error("connection reset")
|
|
|
+ exc.errno = errno.ECONNRESET
|
|
|
+ self.tool.send_POST =\
|
|
|
+ create_send_POST_raiseOnRead(exc)
|
|
|
+ self.assertRaises(FailToLogin, self.tool._have_users)
|
|
|
+ expected_printed_messages.append(
|
|
|
+ 'Socket error checking if users exist: '
|
|
|
+ 'connection reset')
|
|
|
+ expected_printed_messages.append(
|
|
|
+ 'Please check the logs of b10-cmdctl, there may be a '
|
|
|
+ 'problem accepting SSL connections, such as a permission '
|
|
|
+ 'problem on the server certificate file.'
|
|
|
+ )
|
|
|
+ self.__check_printed_messages(expected_printed_messages)
|
|
|
+
|
|
|
+ # 'normal' SSL error
|
|
|
+ exc = ssl.SSLError()
|
|
|
+ self.tool.send_POST =\
|
|
|
+ create_send_POST_raiseOnRead(exc)
|
|
|
+ self.assertRaises(FailToLogin, self.tool._have_users)
|
|
|
+ expected_printed_messages.append(
|
|
|
+ 'SSL error checking if users exist: .*')
|
|
|
+ self.__check_printed_messages(expected_printed_messages)
|
|
|
+
|
|
|
+ # 'EOF' SSL error
|
|
|
+ exc = ssl.SSLError()
|
|
|
+ exc.errno = ssl.SSL_ERROR_EOF
|
|
|
+ self.tool.send_POST =\
|
|
|
+ create_send_POST_raiseOnRead(exc)
|
|
|
+ self.assertRaises(FailToLogin, self.tool._have_users)
|
|
|
+ expected_printed_messages.append(
|
|
|
+ 'SSL error checking if users exist: .*')
|
|
|
+ expected_printed_messages.append(
|
|
|
+ 'Please check the logs of b10-cmdctl, there may be a '
|
|
|
+ 'problem accepting SSL connections, such as a permission '
|
|
|
+ 'problem on the server certificate file.'
|
|
|
+ )
|
|
|
+ self.__check_printed_messages(expected_printed_messages)
|
|
|
+
|
|
|
+ # any other exception should be passed through
|
|
|
+ self.tool.send_POST =\
|
|
|
+ create_send_POST_raiseOnRead(ImportError())
|
|
|
+ self.assertRaises(ImportError, self.tool._have_users)
|
|
|
+ self.__check_printed_messages(expected_printed_messages)
|
|
|
+
|
|
|
+ finally:
|
|
|
+ self.tool.send_POST = orig_send_POST
|
|
|
+
|
|
|
def test_run(self):
|
|
|
def login_to_cmdctl():
|
|
|
return True
|