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

Roundup Issue Tracker: http://roundup-tracker.org/