Mercurial > p > roundup > code
comparison test/session_common.py @ 6823:fe0091279f50
Refactor session db logging and key generation for sessions/otks
While I was working on the redis sessiondb stuff, I noticed that
log_wanrning, get_logger ... was duplicated. Also there was code to
generate a unique key for otks that was duplicated.
Changes:
creating new sessions_common.py and SessionsCommon class to provide
methods:
log_warning, log_info, log_debug, get_logger, getUniqueKey
getUniqueKey method is closer to the method used to make
session keys in client.py.
sessions_common.py now report when random_.py chooses a weak
random number generator. Removed same from rest.py.
get_logger reconciles all logging under
roundup.hyperdb.backends.<name of BasicDatabase class>
some backends used to log to root logger.
have BasicDatabase in other sessions_*.py modules inherit from
SessionCommon.
change logging to use log_* methods.
In addition:
remove unused imports reported by flake8 and other formatting
changes
modify actions.py, rest.py, templating.py to use getUniqueKey
method.
add tests for new methods
test_redis_session.py
swap out ModuleNotFoundError for ImportError to prevent crash in
python2 when redis is not present.
allow injection of username:password or just password into redis
connection URL. set pytest_redis_pw envirnment variable to password
or user:password when running test.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sun, 07 Aug 2022 01:51:11 -0400 |
| parents | 3f60a71b0812 |
| children | 39c482e6a246 |
comparison
equal
deleted
inserted
replaced
| 6822:5053ee6c846b | 6823:fe0091279f50 |
|---|---|
| 22 | 22 |
| 23 FIXME need to add getTimestamp method to sessions_rdbms.py and | 23 FIXME need to add getTimestamp method to sessions_rdbms.py and |
| 24 sessions_dbm.py. | 24 sessions_dbm.py. |
| 25 | 25 |
| 26 """ | 26 """ |
| 27 | |
| 28 import pytest, sys | |
| 29 | |
| 30 _py3 = sys.version_info[0] > 2 | |
| 31 if _py3: | |
| 32 skip_py2 = lambda func, *args, **kwargs: func | |
| 33 else: | |
| 34 from .pytest_patcher import mark_class | |
| 35 skip_py2 = mark_class(pytest.mark.skip( | |
| 36 reason="Skipping log test, test doesn't work on python2")) | |
| 37 | |
| 38 | |
| 27 class SessionTest(object): | 39 class SessionTest(object): |
| 28 def setUp(self): | 40 def setUp(self): |
| 29 # remove previous test, ignore errors | 41 # remove previous test, ignore errors |
| 30 if os.path.exists(config.DATABASE): | 42 if os.path.exists(config.DATABASE): |
| 31 shutil.rmtree(config.DATABASE) | 43 shutil.rmtree(config.DATABASE) |
| 183 def testLifetime(self): | 195 def testLifetime(self): |
| 184 ts = self.sessions.lifetime(300) | 196 ts = self.sessions.lifetime(300) |
| 185 week_ago = time.time() - 60*60*24*7 | 197 week_ago = time.time() - 60*60*24*7 |
| 186 self.assertGreater(week_ago + 302, ts) | 198 self.assertGreater(week_ago + 302, ts) |
| 187 self.assertLess(week_ago + 298, ts) | 199 self.assertLess(week_ago + 298, ts) |
| 200 | |
| 201 def testGetUniqueKey(self): | |
| 202 # 40 bytes of randomness gets larger when encoded | |
| 203 key = self.sessions.getUniqueKey() | |
| 204 self.assertEqual(len(key), 54) | |
| 205 | |
| 206 # length is bytes of randomness | |
| 207 key = self.sessions.getUniqueKey(length=23) | |
| 208 self.assertEqual(len(key), 31) | |
| 209 | |
| 210 key = self.sessions.getUniqueKey(length=200) | |
| 211 self.assertEqual(len(key), 267) | |
| 212 | |
| 213 def testget_logger(self): | |
| 214 logger = self.sessions.get_logger() | |
| 215 # why do rdbms session use session/otk as the table name | |
| 216 # while dbm uses sessions/otks? In any case check both. | |
| 217 self.assertIn(logger.name, ["roundup.hyperdb.backends.sessions", | |
| 218 "roundup.hyperdb.backends.session"]) | |
| 219 | |
| 220 logger = self.otks.get_logger() | |
| 221 self.assertIn(logger.name, ["roundup.hyperdb.backends.otks", | |
| 222 "roundup.hyperdb.backends.otk"]) | |
| 223 | |
| 224 def testget_logger_name_test(self): | |
| 225 self.sessions.name="otks" | |
| 226 logger = self.sessions.get_logger() | |
| 227 self.assertEqual(logger.name, "roundup.hyperdb.backends.otks") | |
| 228 | |
| 229 @skip_py2 | |
| 230 def test_log_warning(self): | |
| 231 """Only python3 pytest has the right context handler for this, | |
| 232 so skip this on python2. | |
| 233 """ | |
| 234 | |
| 235 self.sessions.name = "newdb" | |
| 236 | |
| 237 with self.assertLogs(logger="roundup.hyperdb.backends.newdb") as logs: | |
| 238 self.sessions.log_warning("hello world") | |
| 239 | |
| 240 self.assertEqual(len(logs.records), 1) | |
| 241 self.assertEqual(logs.records[0].levelname, "WARNING") | |
| 242 | |
| 243 @skip_py2 | |
| 244 def test_log_info(self): | |
| 245 """Only python3 pytest has the right context handler for this, | |
| 246 so skip this on python2. | |
| 247 """ | |
| 248 | |
| 249 self.sessions.name = "newdb" | |
| 250 | |
| 251 with self.assertLogs(logger="roundup.hyperdb.backends.newdb") as logs: | |
| 252 self.sessions.log_info("hello world") | |
| 253 | |
| 254 self.assertEqual(len(logs.records), 1) | |
| 255 self.assertEqual(logs.records[0].levelname, "INFO") | |
| 256 | |
| 257 @skip_py2 | |
| 258 def test_log_debug(self): | |
| 259 """Only python3 pytest has the right context handler for this, | |
| 260 so skip this on python2. | |
| 261 """ | |
| 262 | |
| 263 self.sessions.name = "newdb" | |
| 264 | |
| 265 with self.assertLogs(logger="roundup.hyperdb.backends.newdb", | |
| 266 level='DEBUG') as logs: | |
| 267 self.sessions.log_debug("hello world") | |
| 268 | |
| 269 self.assertEqual(len(logs.records), 1) | |
| 270 self.assertEqual(logs.records[0].levelname, "DEBUG") | |
| 271 |
