fix auth_test

This commit is contained in:
s.logvinenko
2017-11-29 17:59:18 +03:00
parent c09e805697
commit 822020998e
+49 -50
View File
@@ -3,11 +3,16 @@ import unittest
import tempfile import tempfile
import signal import signal
from subprocess import Popen, PIPE, TimeoutExpired try:
import pexpect
except:
unittest.TestCase.fail("Error: The module pexpect not found")
from .helpers.ptrack_helpers import ProbackupTest, ProbackupException from .helpers.ptrack_helpers import ProbackupTest, ProbackupException
from testgres import QueryException from testgres import QueryException
module_name = 'auth_test' module_name = 'auth_test'
ptrack = False
class AuthTest(unittest.TestCase): class AuthTest(unittest.TestCase):
@@ -16,7 +21,6 @@ class AuthTest(unittest.TestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
global ptrack
super(AuthTest, cls).setUpClass() super(AuthTest, cls).setUpClass()
@@ -31,17 +35,17 @@ class AuthTest(unittest.TestCase):
'wal_level': 'replica' 'wal_level': 'replica'
} }
) )
modify_pg_hba(cls.node)
try:
add_backup_user(cls.node)
except QueryException:
assert False, "Query error. The backup user cannot be added."
cls.backup_dir = os.path.join(tempfile.tempdir, "backups") cls.backup_dir = os.path.join(tempfile.tempdir, "backups")
cls.pb.init_pb(cls.backup_dir) cls.pb.init_pb(cls.backup_dir)
cls.pb.add_instance(cls.backup_dir, cls.node.name, cls.node) cls.pb.add_instance(cls.backup_dir, cls.node.name, cls.node)
cls.pb.set_archiving(cls.backup_dir, cls.node.name, cls.node) cls.pb.set_archiving(cls.backup_dir, cls.node.name, cls.node)
cls.node.start() cls.node.start()
try:
add_backup_user(cls.node)
except QueryException:
assert False, "Query error. The backup user cannot be added."
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
@@ -54,49 +58,58 @@ class AuthTest(unittest.TestCase):
'--instance', self.node.name, '--instance', self.node.name,
'-h', '127.0.0.1', '-h', '127.0.0.1',
'-p', str(self.node.port), '-p', str(self.node.port),
'-U', 'backup' '-U', 'backup',
'-b', 'FULL' '-b', 'FULL'
] ]
def tearDown(self): def tearDown(self):
pass pass
@unittest.skip def tearDown(self):
pass
def test_empty_password(self): def test_empty_password(self):
try: print(run_pb_pexpect(self.cmd, '\0\r\n'))
run_pb_with_auth(self.cmd,'\0')
except:
pass
def test_wrong_password(self): def test_wrong_password(self):
try: print(run_pb_pexpect(self.cmd, 'wrong_password\r\n'))
run_pb_with_auth(self.cmd,'wrong_password')
except ProbackupException as e: def test_right_password(self):
self.fail(repr(e)) print(run_pb_pexpect(self.cmd, 'password\r\n'))
@unittest.skip
def test_ctrl_c_event(self): def test_ctrl_c_event(self):
try: print(run_pb_pexpect(self.cmd, kill=True))
run_pb_with_auth(self.cmd,kill=True)
except:
pass
def run_pb_with_auth(cmd, password=None, kill=False): def modify_pg_hba(node):
probackup = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) hba_conf = os.path.join(node.data_dir, "pg_hba.conf")
with open(hba_conf, 'r+', encoding='utf-8') as fio:
data = fio.read()
fio.seek(0)
fio.write('host\tall\tpostgres\t127.0.0.1/0\ttrust\n' + data)
if probackup.stdout.readline() == "Password as user :":
if signal: def run_pb_pexpect(cmd, password=None, kill=False):
os.kill(probackup.pid, signal.SIGINT) try:
try: with pexpect.spawn(" ".join(cmd)) as probackup:
out, err = probackup.communicate(password, 10) result = probackup.expect("Password .*:")
return probackup.returncode, out, err if kill:
except TimeoutExpired: try:
raise ProbackupException probackup.kill(signal.SIGINT)
except TIMEOUT:
raise ProbackupException("Error: Timeout exepired", " ".join(cmd))
elif result == 0:
probackup.sendline(password)
return probackup.readlines()
else:
raise ProbackupTest("Error: runtime error", " ".join(cmd))
except ProbackupTest:
raise ProbackupException("Error: pexpect error", " ".join(cmd))
def add_backup_user(node): def add_backup_user(node):
query = ''' query = """
CREATE ROLE backup WITH LOGIN PASSWORD 'password'; CREATE ROLE backup WITH LOGIN PASSWORD 'password';
GRANT USAGE ON SCHEMA pg_catalog TO backup; GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION current_setting(text) TO backup; GRANT EXECUTE ON FUNCTION current_setting(text) TO backup;
@@ -111,19 +124,5 @@ def add_backup_user(node):
GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup; GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_ptrack_clear() TO backup; GRANT EXECUTE ON FUNCTION pg_ptrack_clear() TO backup;
GRANT EXECUTE ON FUNCTION pg_ptrack_get_and_clear(oid, oid) TO backup; GRANT EXECUTE ON FUNCTION pg_ptrack_get_and_clear(oid, oid) TO backup;
''' """
node.psql("postgres", query.replace('\n','')) node.safe_psql("postgres", query)
# dirty hack
def modify_pg_hba(node):
hba_conf = os.path.join(node.data_dir, "pg_hba.conf")
with open(hba_conf, "w") as conf:
conf.write("# TYPE\tDATABASE\tUSER\tADDRESS\t\tMETHOD\n"
"local\tall\t\tall\t\t\ttrust\n"
"host\tall\t\tall\t127.0.0.1/32\tmd5\n"
"host\tall\t\tall\t::1/128\t\ttrust\n"
# replication
"local\treplication\tall\t\t\ttrust\n"
"host\treplication\tall\t127.0.0.1/32\ttrust\n"
"host\treplication\tall\t::1/128\t\ttrust\n")