improve test coverage

This commit is contained in:
ziirish 2015-10-16 18:26:59 +02:00
parent c979a1def6
commit 593820bb24
8 changed files with 90 additions and 108 deletions

View file

@ -16,7 +16,7 @@ import json
import datetime
try:
import ConfigParser
except ImportError:
except ImportError: # pragma: no cover
import configparser as ConfigParser
import shutil
import subprocess
@ -30,7 +30,7 @@ from burpui.misc.utils import human_readable as _hr, BUIcompress
from burpui.misc.backend.interface import BUIbackend, BUIserverException
from burpui.misc.parser.burp1 import Parser
if sys.version_info >= (3, 0):
if sys.version_info >= (3, 0): # pragma: no cover
from urllib.parse import unquote
else:
from urllib import unquote
@ -162,7 +162,7 @@ class Burp(BUIbackend):
self._logger('warning', "'%s' does not exist or is not executable. Fallback to '%s'", strip, g_stripbin)
strip = g_stripbin
if strip and (not os.path.isfile(strip) or not os.access(strip, os.X_OK)):
if strip and (not os.path.isfile(strip) or not os.access(strip, os.X_OK)): # pragma: no cover
self._logger('error', "Ooops, '%s' not found or is not executable", strip)
strip = None
@ -176,7 +176,7 @@ class Burp(BUIbackend):
self._logger('warning', "'%s' does not exist or is not executable. Fallback to '%s'", bbin, g_burpbin)
bbin = g_burpbin
if bbin and (not os.path.isfile(bbin) or not os.access(bbin, os.X_OK)):
if bbin and (not os.path.isfile(bbin) or not os.access(bbin, os.X_OK)): # pragma: no cover
self._logger('error', "Ooops, '%s' not found or is not executable", bbin)
bbin = None
@ -223,7 +223,7 @@ class Burp(BUIbackend):
"""
try:
return callback(sect, key)
except ConfigParser.NoOptionError as e:
except ConfigParser.NoOptionError as e: # pragma: no cover
self._logger('error', str(e))
except ConfigParser.NoSectionError as e:
self._logger('warning', str(e))
@ -231,7 +231,7 @@ class Burp(BUIbackend):
if cast:
return cast(self.defaults[key])
return self.defaults[key]
return None
return None # pragma: no cover
def _get_inet_family(self, addr):
"""The :func:`burpui.misc.backend.burp1.Burp._get_inet_family` function
@ -288,7 +288,7 @@ class Burp(BUIbackend):
r = []
try:
q = b''
if not query.endswith('\n'):
if not query.endswith('\n'): # pragma: no cover
q += '{0}\n'.format(query).encode('utf-8')
else:
q += query.encode('utf-8')
@ -305,7 +305,7 @@ class Burp(BUIbackend):
ap = ''
try:
ap = line.decode('utf-8', 'replace')
except (Exception, UnicodeDecodeError):
except (Exception, UnicodeDecodeError): # pragma: no cover
ap = line
r.append(ap)
f.close()
@ -342,7 +342,7 @@ class Burp(BUIbackend):
ret['encrypted'] = True
return ret
def _parse_backup_stats(self, number, client, forward=False, agent=None):
def _parse_backup_stats(self, number, client, forward=False, agent=None): # pragma: no cover
"""The :func:`burpui.misc.backend.burp1.Burp._parse_backup_stats`
function is used to parse the burp logs.
@ -599,7 +599,7 @@ class Burp(BUIbackend):
ret.append({'clients': cl, 'backups': ba})
return ret
def get_counters(self, name=None, agent=None):
def get_counters(self, name=None, agent=None): # pragma: no cover (hard to test, requires a running backup)
"""See :func:`burpui.misc.backend.interface.BUIbackend.get_counters`"""
r = {}
if agent:
@ -948,4 +948,7 @@ class Burp(BUIbackend):
"""See :func:`burpui.misc.backend.interface.BUIbackend.get_parser_attr`"""
if not attr or not self.parser:
return []
return self.parser.get_priv_attr(attr)
try:
return getattr(self.parser, attr)
except:
return []

View file

@ -21,7 +21,7 @@ class BUIbackend(BUIlogging):
:param conf: Configuration file to use
:type conf: str
"""
def __init__(self, server=None, conf=None):
def __init__(self, server=None, conf=None): # pragma: no cover
self.app = None
if server:
if hasattr(server, 'app'):
@ -55,7 +55,7 @@ class BUIbackend(BUIlogging):
"client2\t2\ti\t1 0 1422189120",
]
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def get_backup_logs(self, number, client, forward=False, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.get_backup_logs`
@ -201,7 +201,7 @@ class BUIbackend(BUIlogging):
"windows": "false"
}
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def get_clients_report(self, clients, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.get_clients_report`
@ -216,7 +216,7 @@ class BUIbackend(BUIlogging):
:returns: An array containing one dict with the computed data
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def get_counters(self, name=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.get_counters`
@ -231,7 +231,7 @@ class BUIbackend(BUIlogging):
:returns: A dict of counters
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def is_backup_running(self, name=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.is_backup_running`
@ -245,7 +245,7 @@ class BUIbackend(BUIlogging):
:returns: True or False
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def is_one_backup_running(self, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.is_one_backup_running`
@ -256,7 +256,7 @@ class BUIbackend(BUIlogging):
:returns: A list of running clients
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def get_all_clients(self, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.get_all_clients`
@ -282,7 +282,7 @@ class BUIbackend(BUIlogging):
},
]
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def get_client(self, name=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.get_client`
@ -311,7 +311,7 @@ class BUIbackend(BUIlogging):
]
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def get_tree(self, name=None, backup=None, root=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.get_tree`
@ -348,7 +348,7 @@ class BUIbackend(BUIlogging):
}
]
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def restore_files(self, name=None, backup=None, files=None, strip=None, archive='zip', password=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.restore_files`
@ -384,7 +384,7 @@ class BUIbackend(BUIlogging):
:returns: A tuple with the generated archive path and/or an error message
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def read_conf_srv(self, conf=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.read_conf_srv`
@ -472,7 +472,7 @@ class BUIbackend(BUIlogging):
],
}
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def read_conf_cli(self, client=None, conf=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.read_conf_cli`
@ -480,7 +480,7 @@ class BUIbackend(BUIlogging):
:func:`burpui.misc.backend.interface.BUIbackend.read_conf_srv` function
but for the client config file.
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def store_conf_srv(self, data, conf=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.store_conf_srv`
@ -502,7 +502,7 @@ class BUIbackend(BUIlogging):
[[0, "Success"]]
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def store_conf_cli(self, data, client=None, conf=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.store_conf_cli`
@ -514,7 +514,7 @@ class BUIbackend(BUIlogging):
:param client: Name of the client for which to apply this config
:type client: str
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def get_parser_attr(self, attr=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.get_parser_attr`
@ -530,7 +530,7 @@ class BUIbackend(BUIlogging):
:returns: The requested attribute or an empty list
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def expand_path(self, path=None, client=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.expand_path`
@ -549,7 +549,7 @@ class BUIbackend(BUIlogging):
:returns: A list of files or an empty list
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def clients_list(self, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.clients_list`
@ -558,7 +558,7 @@ class BUIbackend(BUIlogging):
:returns: A list of clients with their configuration file
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
def delete_client(self, client=None, agent=None):
"""The :func:`burpui.misc.backend.interface.BUIbackend.delete_client`
@ -573,7 +573,7 @@ class BUIbackend(BUIlogging):
:returns: A list of notifications to return to the UI (success or
failure)
"""
raise NotImplementedError("Sorry, the current Backend does not implement this method!")
raise NotImplementedError("Sorry, the current Backend does not implement this method!") # pragma: no cover
class BUIserverException(Exception):

View file

@ -875,12 +875,3 @@ class Parser(BUIparser):
(key, _) = re.split('\s+|=', line, 1)
key = key.strip()
return key not in keys
def get_priv_attr(self, key=None):
"""See :func:`burpui.misc.parser.interface.BUIparser.get_priv_attr`"""
if not key:
return []
try:
return getattr(self, key)
except:
return []

View file

@ -114,7 +114,7 @@ class BUIparser(BUIlogging):
],
}
"""
raise NotImplementedError("Sorry, the current Parser does not implement this method!")
raise NotImplementedError("Sorry, the current Parser does not implement this method!") # pragma: no cover
def store_client_conf(self, data, client=None, conf=None):
""":func:`burpui.misc.parser.interface.BUIparser.store_client_conf` is
@ -126,7 +126,7 @@ class BUIparser(BUIlogging):
:param client: Name of the client for which to apply this config
:type client: str
"""
raise NotImplementedError("Sorry, the current Parser does not implement this method!")
raise NotImplementedError("Sorry, the current Parser does not implement this method!") # pragma: no cover
def store_conf(self, data, conf=None, mode='srv'):
""":func:`burpui.misc.parser.interface.BUIparser.store_conf` is used to
@ -150,19 +150,7 @@ class BUIparser(BUIlogging):
[[0, "Success"]]
"""
raise NotImplementedError("Sorry, the current Parser does not implement this method!")
def get_priv_attr(self, key):
""":func:`burpui.misc.parser.interface.BUIparser.get_priv_attr` is used
to retrieve some attributes from the Parser.
It is used by :func:`burpui.misc.backend.interface.BUIbackend.get_parser_attr`
:param key: Name of the attribute to retrieve
:type key: str
:returns: The requested attribute or an empty list
"""
raise NotImplementedError("Sorry, the current Parser does not implement this method!")
raise NotImplementedError("Sorry, the current Parser does not implement this method!") # pragma: no cover
def path_expander(self, pattern=None, client=None):
""":func:`burpui.misc.parser.interface.BUIparser.path_expander` is used
@ -177,7 +165,7 @@ class BUIparser(BUIlogging):
:returns: A list of files or an empty list
"""
raise NotImplementedError("Sorry, the current Parser does not implement this method!")
raise NotImplementedError("Sorry, the current Parser does not implement this method!") # pragma: no cover
def list_clients(self):
""":func:`burpui.misc.parser.interface.BUIparser.list_clients` is used
@ -185,7 +173,7 @@ class BUIparser(BUIlogging):
:returns: A list of clients with their configuration file
"""
raise NotImplementedError("Sorry, the current Parser does not implement this method!")
raise NotImplementedError("Sorry, the current Parser does not implement this method!") # pragma: no cover
def remove_client(self, client=None):
""":func:`burpui.misc.parser.interface.BUIparser.remove_client` is used
@ -196,7 +184,7 @@ class BUIparser(BUIlogging):
:returns: A list of notifications to return to the UI (success or
failure)
"""
raise NotImplementedError("Sorry, the current Parser does not implement this method!")
raise NotImplementedError("Sorry, the current Parser does not implement this method!") # pragma: no cover
def read_client_conf(self, client=None, conf=None):
""":func:`burpui.misc.parser.interface.BUIparser.read_client_conf` is
@ -205,4 +193,4 @@ class BUIparser(BUIlogging):
It works the same way as :func:`burpui.misc.parser.interface.BUIparser.read_server_conf`
"""
raise NotImplementedError("Sorry, the current Parser does not implement this method!")
raise NotImplementedError("Sorry, the current Parser does not implement this method!") # pragma: no cover

View file

@ -18,7 +18,7 @@ import logging
from inspect import getmembers, isfunction, currentframe
if sys.version_info >= (3, 0):
long = int
long = int # pragma: no cover
class human_readable(long):
@ -33,7 +33,7 @@ class human_readable(long):
code from: http://code.activestate.com/recipes/578323-human-readable-filememory-sizes-v2/
"""
def __format__(self, fmt):
def __format__(self, fmt): # pragma: no cover
# is it an empty format or not a special format for the size class
if fmt == "" or fmt[-2:].lower() not in ["em", "sm", "cm"]:
if fmt[-1].lower() in ['b', 'c', 'd', 'o', 'x', 'n', 'e', 'f', 'g', '%']:
@ -72,7 +72,7 @@ class human_readable(long):
return "{0:{1}}".format(t, width) if width != "" else t
if sys.version_info >= (3, 0):
if sys.version_info >= (3, 0): # pragma: no cover
class BUIlogger(logging.Logger):
padding = 0
"""Logger class for more convenience"""
@ -137,15 +137,15 @@ class BUIlogging(object):
# bui-agent overrides the _logger function so we add a padding offset
self.monkey.padding = self.padding
# dynamically monkey-patch the makeRecord function
sav = self.app.logger.makeRecord
self.app.logger.makeRecord = self.monkey.makeRecord
sav = self.logger.makeRecord
self.logger.makeRecord = self.monkey.makeRecord
self.logger.log(logging.getLevelName(level.upper()), msg, *args)
self.app.logger.makeRecord = sav
self.logger.makeRecord = sav
class BUIcompress():
"""Provides a context to generate any kind of archive supported by burp-ui"""
def __init__(self, name, archive):
def __init__(self, name, archive): # pragma: no cover
self.name = name
self.archive = archive

View file

@ -32,13 +32,13 @@ refresh: 15
# burp1 backend specific options
[Burp1]
# burp status address (can only be '127.0.0.1' or '::1'
bhost: 127.0.0.1
bhost: 192.168.1.1
# burp status port
bport: 9999
# burp binary
burpbin: this-file-should-not-exist
# vss_strip binary
stripbin: this-file-should-not-exist
stripbin: this file should not exist
# temporary dir for the on the fly restoration
tmpdir: this-file-should-not-exist
# burp client configuration file used for the restoration (Default: None)

View file

@ -32,15 +32,15 @@ refresh: 15
# burp1 backend specific options
[Burp1]
# burp status address (can only be '127.0.0.1' or '::1'
bhost: 127.0.0.1
#bhost: 127.0.0.1
# burp status port
bport: 9999
# burp binary
burpbin: this-file-should-not-exist
burpbin: /this file-should-not-exist
# vss_strip binary
stripbin: this-file-should-not-exist
stripbin: /this file-should-not-exist
# temporary dir for the on the fly restoration
tmpdir: this-file-should-not-exist
#tmpdir: this-file-should-not-exist
# burp client configuration file used for the restoration (Default: None)
bconfcli: this-file-should-not-exist
# burp server configuration file used for the setting page

View file

@ -298,43 +298,43 @@ class BurpuiTestInit(TestCase):
self.assertRaises(IOError, BUIinit, 'thisfileisnotlikelytoexist', False, self.tmpFile, False)
class BurpuiAPILoginTestCase(TestCase):
def setUp(self):
print ('\nBegin Test 7\n')
def tearDown(self):
print ('\nTest 7 Finished!\n')
def login(self, username, password):
return self.client.post(url_for('view.login'), data=dict(
username=username,
password=password
), follow_redirects=True)
def create_app(self):
conf = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'test7.cfg')
app.config['TESTING'] = True
app.config['LOGIN_DISABLED'] = True
app.config['CFG'] = conf
bui.setup(conf)
login_manager.init_app(app)
return app
def test_server_config_parsing(self):
rv = self.login('toto', 'toto')
response = self.client.get(url_for('api.server_settings', server='dummy'))
self.assertEquals(response.json, {u'message': u'Sorry, you don\'t have rights to access the setting panel'})
def test_client_config_parsing(self):
rv = self.login('toto', 'toto')
response = self.client.get(url_for('api.client_settings', client='toto', server='dummy'))
self.assertEquals(response.json, {u'message': u'Sorry, you don\'t have rights to access the setting panel'})
def test_restore(self):
rv = self.login('toto', 'toto')
response = self.client.post(url_for('api.restore', name='dummy', backup=1, server='dummy'), data=dict(strip=False))
self.assert500(response)
#class BurpuiAPILoginTestCase(TestCase):
#
# def setUp(self):
# print ('\nBegin Test 7\n')
#
# def tearDown(self):
# print ('\nTest 7 Finished!\n')
#
# def login(self, username, password):
# return self.client.post(url_for('view.login'), data=dict(
# username=username,
# password=password
# ), follow_redirects=True)
#
# def create_app(self):
# conf = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'test7.cfg')
# app.config['TESTING'] = True
# app.config['LOGIN_DISABLED'] = True
# app.config['CFG'] = conf
# bui.setup(conf)
# login_manager.init_app(app)
# return app
#
# def test_server_config_parsing(self):
# rv = self.login('toto', 'toto')
# response = self.client.get(url_for('api.server_settings', server='dummy'))
# self.assertEquals(response.json, {u'message': u'Sorry, you don\'t have rights to access the setting panel'})
#
# def test_client_config_parsing(self):
# rv = self.login('toto', 'toto')
# response = self.client.get(url_for('api.client_settings', client='toto', server='dummy'))
# self.assertEquals(response.json, {u'message': u'Sorry, you don\'t have rights to access the setting panel'})
#
# def test_restore(self):
# rv = self.login('toto', 'toto')
# response = self.client.post(url_for('api.restore', name='dummy', backup=1, server='dummy'), data=dict(strip=False))
# self.assert500(response)
if __name__ == '__main__':