Commit e0118fd0 authored by Jérome Perrin's avatar Jérome Perrin

test

parent 1cafb98e
...@@ -30,8 +30,11 @@ import shutil ...@@ -30,8 +30,11 @@ import shutil
import urlparse import urlparse
import tempfile import tempfile
import StringIO import StringIO
import subprocess
import pysftp import pysftp
from paramiko.ssh_exception import SSHException
from paramiko.ssh_exception import AuthenticationException
import utils import utils
...@@ -67,7 +70,7 @@ class ProFTPdTestCase(utils.SlapOSInstanceTestCase): ...@@ -67,7 +70,7 @@ class ProFTPdTestCase(utils.SlapOSInstanceTestCase):
hostname or sftp_url.hostname, hostname or sftp_url.hostname,
port=sftp_url.port, port=sftp_url.port,
cnopts=cnopts, cnopts=cnopts,
username=username or parameter_dict['user'], # XXX username=username or parameter_dict['username'],
password=password or parameter_dict['password']) password=password or parameter_dict['password'])
...@@ -76,10 +79,8 @@ class TestSFTPListen(ProFTPdTestCase): ...@@ -76,10 +79,8 @@ class TestSFTPListen(ProFTPdTestCase):
self.assertTrue(self._getConnection(hostname=self.config['ipv4_address'])) self.assertTrue(self._getConnection(hostname=self.config['ipv4_address']))
def test_does_not_listen_on_all_ip(self): def test_does_not_listen_on_all_ip(self):
from paramiko.ssh_exception import SSHException
import pdb; pdb.set_trace()
with self.assertRaises(SSHException): with self.assertRaises(SSHException):
self._getConnection(hostname='127.0.0.1') self._getConnection(hostname='0.0.0.0')
class TestSFTPOperations(ProFTPdTestCase): class TestSFTPOperations(ProFTPdTestCase):
...@@ -108,7 +109,10 @@ class TestSFTPOperations(ProFTPdTestCase): ...@@ -108,7 +109,10 @@ class TestSFTPOperations(ProFTPdTestCase):
# it's visible in listdir() # it's visible in listdir()
self.assertEqual(['testfile'], sftp.listdir()) self.assertEqual(['testfile'], sftp.listdir())
# download it, it should have same content # and also in the server filesystem
self.assertEqual(['testfile'], os.listdir(self.upload_dir))
# download the file again, it should have same content
tempdir = tempfile.mkdtemp() tempdir = tempfile.mkdtemp()
self.addCleanup(lambda : shutil.rmtree(tempdir)) self.addCleanup(lambda : shutil.rmtree(tempdir))
local_file = os.path.join(tempdir, 'testfile') local_file = os.path.join(tempdir, 'testfile')
...@@ -133,31 +137,40 @@ class TestSFTPOperations(ProFTPdTestCase): ...@@ -133,31 +137,40 @@ class TestSFTPOperations(ProFTPdTestCase):
self.assertEqual(['destination'], os.listdir(self.upload_dir)) self.assertEqual(['destination'], os.listdir(self.upload_dir))
def test_partial_upload_are_deleted(self): def test_partial_upload_are_deleted(self):
class ErrorFile(StringIO.StringIO): test_self = self
def read(self, *args):
raise IOError("Something bad happened")
with self._getConnection() as sftp: with self._getConnection() as sftp:
class ErrorFile(StringIO.StringIO):
def read(self, *args):
# at this point, file is already created on server
test_self.assertEqual(['.in.destination.'], os.listdir(test_self.upload_dir))
# simulate a connection closed
sftp.sftp_client.close()
return "something that will not be sent to server"
with self.assertRaises(IOError): with self.assertRaises(IOError):
sftp.sftp_client.putfo(ErrorFile(), "destination") sftp.sftp_client.putfo(ErrorFile(), "destination")
# no half uploaded file is kept
self.assertEqual([], os.listdir(self.upload_dir)) self.assertEqual([], os.listdir(self.upload_dir))
class TestUserManagement(ProFTPdTestCase): class TestUserManagement(ProFTPdTestCase):
def test_user_can_be_added_from_script(self): def test_user_can_be_added_from_script(self):
raise NotImplementedError() with self.assertRaisesRegexp(AuthenticationException, 'Authentication failed'):
self._getConnection(username='bob', password='secret')
subprocess.check_call(
'echo secret | %s/bin/ftpasswd --name=bob --stdin' % self.computer_partition_root_path,
shell=True)
self.assertTrue(self._getConnection(username='bob', password='secret'))
class TestBan(ProFTPdTestCase): class TestBan(ProFTPdTestCase):
def test_client_are_banned_after_5_wrong_passwords(self): def test_client_are_banned_after_5_wrong_passwords(self):
# Simulate failed 5 login attempts # Simulate failed 5 login attempts
from paramiko.ssh_exception import AuthenticationException
for i in range(5): for i in range(5):
with self.assertRaisesRegexp(AuthenticationException, 'Authentication failed'): with self.assertRaisesRegexp(AuthenticationException, 'Authentication failed'):
self._getConnection(password='wrong') self._getConnection(password='wrong')
# after that, even with a valid password we cannot connect # after that, even with a valid password we cannot connect
from paramiko.ssh_exception import SSHException
with self.assertRaisesRegexp(SSHException, 'Connection reset by peer'): with self.assertRaisesRegexp(SSHException, 'Connection reset by peer'):
self._getConnection() self._getConnection()
...@@ -173,9 +186,7 @@ class TestInstanceParameterPort(ProFTPdTestCase): ...@@ -173,9 +186,7 @@ class TestInstanceParameterPort(ProFTPdTestCase):
@classmethod @classmethod
def getInstanceParmeterDict(cls): def getInstanceParmeterDict(cls):
cls.free_port = utils.findFreeTCPPort(cls.config['ipv4_address']) cls.free_port = utils.findFreeTCPPort(cls.config['ipv4_address'])
import json return {'port': cls.free_port}
import pdb;pdb.set_trace()
return {'port': cls.free_port, '_': json.dumps({'port': cls.free_port})}
def test_instance_parameter_port(self): def test_instance_parameter_port(self):
parameter_dict = self.computer_partition.getConnectionParameterDict() parameter_dict = self.computer_partition.getConnectionParameterDict()
......
...@@ -87,7 +87,9 @@ class SlapOSInstanceTestCase(unittest.TestCase): ...@@ -87,7 +87,9 @@ class SlapOSInstanceTestCase(unittest.TestCase):
} }
# TODO: read from environment / guess ipv4 from buildout file # TODO: read from environment / guess ipv4 from buildout file
ipv4_address = '127.0.0.1' # note that by default we don't use 127.0.0.1, because some tests want to
# check that we don't mess with 127.0.0.1
ipv4_address = '127.0.1.1'
config['proxy_host'] = config['ipv4_address'] = ipv4_address config['proxy_host'] = config['ipv4_address'] = ipv4_address
config['ipv6_address'] = '2001:67c:1254:26::3318' config['ipv6_address'] = '2001:67c:1254:26::3318'
config['proxy_port'] = findFreeTCPPort(ipv4_address) config['proxy_port'] = findFreeTCPPort(ipv4_address)
...@@ -124,7 +126,7 @@ class SlapOSInstanceTestCase(unittest.TestCase): ...@@ -124,7 +126,7 @@ class SlapOSInstanceTestCase(unittest.TestCase):
cluster_configuration=instance_parameter_dict, cluster_configuration=instance_parameter_dict,
environment=os.environ) environment=os.environ)
# TODO: log more details in this case # TODO: log more details in this case
assert software_status_dict['status_code'] == 0 assert instance_status_dict['status_code'] == 0
# FIXME: similar to test node, only one (root) partition is really supported for now. # FIXME: similar to test node, only one (root) partition is really supported for now.
computer_partition_list = [] computer_partition_list = []
...@@ -136,8 +138,6 @@ class SlapOSInstanceTestCase(unittest.TestCase): ...@@ -136,8 +138,6 @@ class SlapOSInstanceTestCase(unittest.TestCase):
partition_reference='testing partition {i}'.format(i=i, **config), partition_reference='testing partition {i}'.format(i=i, **config),
partition_parameter_kw=instance_parameter_dict)) partition_parameter_kw=instance_parameter_dict))
if instance_parameter_dict:
import pdb; pdb.set_trace()
# expose some class attributes so that tests can use them: # expose some class attributes so that tests can use them:
# the ComputerPartition instances, to getInstanceParmeterDict # the ComputerPartition instances, to getInstanceParmeterDict
cls.computer_partition = computer_partition_list[0] cls.computer_partition = computer_partition_list[0]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment