[Checkins] SVN: Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/ getActivityChartData() refactored into individual methods for testing and tests added.
Charlie Clark
charlie at begeistert.org
Thu Dec 8 13:09:46 UTC 2011
Log message for revision 123628:
getActivityChartData() refactored into individual methods for testing and tests added.
Changed:
U Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/activity.py
U Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/tests/test_activity.py
-=-
Modified: Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/activity.py
===================================================================
--- Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/activity.py 2011-12-08 12:37:43 UTC (rev 123627)
+++ Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/activity.py 2011-12-08 13:09:46 UTC (rev 123628)
@@ -34,6 +34,7 @@
{'stores': 0, 'connections': 0, 'store_len': 40, 'end': 1323022511.8497, 'start': 1323022151.8497, 'load_len': 30, 'loads': 0, 'time_offset': '0m', 'link':''}],
'total_store_count': 0, 'total_connections': 0}
+
class View(object):
start_time = 'start_time'
@@ -63,6 +64,57 @@
return 0
return am.getHistoryLength()
+ def _get_timings(self, analysis):
+ """Calculate time intervals and format start and end times"""
+ segment_time = 0
+ start_time = ''
+ end_time = ''
+ if analysis is not None:
+ segment_time = analysis[0]['end'] - analysis[0]['start']
+ start_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z",
+ time.gmtime(analysis[0]['start']))
+ end_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z",
+ time.gmtime(analysis[-1]['end']))
+ return start_time, end_time, segment_time
+
+ def _chart_data(self, segment_time, segment_height, analysis):
+ """Utility function to calculate bar heights and time offsets"""
+
+ limit = max(((d['stores'] + d['loads']) for d in analysis))
+
+ now = analysis[-1]['end']
+ for div in analysis:
+ stores = div['stores']
+ loads = div['loads']
+ store_len = 0
+ load_len = 0
+
+ if stores > 0:
+ store_len = max((segment_height * stores / limit), 1)
+ if loads > 0:
+ load_len = max((segment_height * loads / limit), 1)
+
+ offset = div['end'] - now # Offset from most recent measurement.
+ if segment_time >= 3600:
+ # Show hours.
+ time_offset = '%dh' % (offset / 3600)
+ elif segment_time >= 60:
+ # Show minutes.
+ time_offset = '%dm' % (offset / 60)
+ elif segment_time >= 1:
+ # Show seconds.
+ time_offset = '%ds' % offset
+ else:
+ # Show fractions.
+ time_offset = '%.2fs' % offset
+
+ div.update({'link': 'chart_start=%s&chart_end=%s' % (div['start'], div['end']),
+ 'time_offset': time_offset,
+ 'store_len': store_len,
+ 'load_len': load_len,
+ })
+ yield div
+
def getActivityChartData(self, segment_height=200, REQUEST=None):
"""Returns information for generating an activity chart.
Default height is 200 pixels
@@ -70,7 +122,7 @@
segment_height = int(segment_height)
am = self._getActivityMonitor()
if am is None:
- return None
+ return
if REQUEST is not None:
start = float(REQUEST.get('chart_start', 0))
@@ -80,63 +132,16 @@
else:
analysis = am.getActivityAnalysis()
- segment_time = 0
- start_time = ''
- end_time = ''
- if analysis is not None:
- segment_time = analysis[0]['end'] - analysis[0]['start']
- start_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z",
- time.gmtime(analysis[0]['start']))
- end_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z",
- time.gmtime(analysis[-1]['end']))
+ start_time, end_time, segment_time = self._get_timings(analysis)
- divs = []
-
total_stores, total_loads, total_connections = (
sum(d[k] for d in analysis)
for k in ('stores', 'loads', 'connections')
)
- limit = max(((d['stores'] + d['loads']) for d in analysis))
-
- def calculated():
- """Utility function to calculate bar heights and time offsets"""
- now = analysis[-1]['end']
- for div in analysis:
- stores = div['stores']
- loads = div['loads']
- store_len = 0
- load_len = 0
-
- if stores > 0:
- store_len = max((segment_height * stores / limit), 1)
- if loads > 0:
- load_len = max((segment_height * loads / limit), 1)
-
- offset = div['end'] - now # Offset from most recent measurement.
- if segment_time >= 3600:
- # Show hours.
- time_offset = '%dh' % (offset / 3600)
- elif segment_time >= 60:
- # Show minutes.
- time_offset = '%dm' % (offset / 60)
- elif segment_time >= 1:
- # Show seconds.
- time_offset = '%ds' % offset
- else:
- # Show fractions.
- time_offset = '%.2fs' % offset
-
- div.update({'link': 'chart_start=%s&chart_end=%s' % (div['start'], div['end']),
- 'time_offset': time_offset,
- 'store_len': store_len,
- 'load_len': load_len,
- })
- yield div
-
return {'start_time': start_time,
'end_time': end_time,
- 'divs': calculated,
+ 'divs': self._chart_data(segment_time, segment_height, analysis),
'total_store_count': total_stores,
'total_load_count': total_loads,
'total_connections': total_connections,
Modified: Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/tests/test_activity.py
===================================================================
--- Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/tests/test_activity.py 2011-12-08 12:37:43 UTC (rev 123627)
+++ Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/tests/test_activity.py 2011-12-08 13:09:46 UTC (rev 123628)
@@ -14,6 +14,26 @@
import unittest
+seconds_activity = [
+ {'end':1, 'connections':15, 'start':0,'stores':5, 'loads':10},
+ {'end':2, 'connections':25, 'start':1,'stores':15,'loads':10}
+]
+
+minutes_activity = [
+ {'end':3600, 'connections':15, 'start':0, 'stores':250, 'loads':1000},
+ {'end':3601, 'connections':15, 'start':86400, 'stores':500, 'loads':2000}
+]
+
+hours_activity = [
+ {'end':86400, 'connections':15, 'start':0, 'stores':250,' loads':1000},
+ {'end':172800, 'connections':15, 'start':86400, 'stores':500, 'loads':2000}
+]
+
+fractional_activity = [
+ {'end':0.5, 'connections':15, 'start':0, 'stores':250, 'loads':1000},
+ {'end':1, 'connections':15, 'start':0.5, 'stores':500, 'loads':2000}
+]
+
class DummyDatabaseConnection:
def __init__(self):
@@ -23,7 +43,7 @@
return self
def getActivityMonitor(self):
- pass
+ return getattr(self, 'am', None)
class DummyDatabaseObject:
@@ -34,21 +54,18 @@
class DummyActivityMonitor:
+ def __init__(self, activity=seconds_activity):
+ self.activity = activity[:]
+
def getHistoryLength(self):
- pass
+ return 3600
- def getActivityAnalysis(start=None, end=None, divisions=None):
- pass
+ def getActivityAnalysis(self, start=None, end=None, divisions=None):
+ return self.activity
class Tests(unittest.TestCase):
- def setUp(self):
- pass
-
- def tearDown(self):
- pass
-
def _getTargetClass(self):
from zmi.core.browser.database.activity import View
return View
@@ -58,11 +75,76 @@
view = self._getTargetClass()
return view(root, {})
- def test_db(self):
+ def test_no_activity_monitor(self):
view = self._makeOne()
- return True
+ delattr(view._db, 'am')
+ history = view.getHistoryLength()
+ self.assertEqual(history, 0)
+ am = view._getActivityMonitor()
+ self.assertIsNone(am)
+
+ data = view.getActivityChartData()
+ self.assertIsNone(data)
+
+
+ def test_getHistoryLength(self):
+ view = self._makeOne()
+ self.assertEqual(view.getHistoryLength(), 3600)
+
+ def test_timings_seconds(self):
+ view = self._makeOne()
+ data = view._get_timings(seconds_activity)
+ expected = ('Thu, 01 Jan 1970 00:00:00 CET',
+ 'Thu, 01 Jan 1970 00:00:02 CET',
+ 1)
+ self.assertEqual(data, expected)
+
+ def test_timings_minutes(self):
+ view = self._makeOne()
+ data = view._get_timings(minutes_activity)
+ expected = ('Thu, 01 Jan 1970 00:00:00 CET',
+ 'Thu, 01 Jan 1970 01:00:01 CET',
+ 3600)
+ self.assertEqual(data, expected)
+
+ def test_timings_hours(self):
+ view = self._makeOne()
+ data = view._get_timings(hours_activity)
+ expected = ('Thu, 01 Jan 1970 00:00:00 CET',
+ 'Sat, 03 Jan 1970 00:00:00 CET',
+ 86400)
+ self.assertEqual(data, expected)
+
+ def test_timings_fractions(self):
+ view = self._makeOne()
+ data = view._get_timings(fractional_activity)
+ expected = ('Thu, 01 Jan 1970 00:00:00 CET',
+ 'Thu, 01 Jan 1970 00:00:01 CET',
+ 0.5)
+ self.assertEqual(data, expected)
+
+ def test_chart_data(self):
+ view = self._makeOne()
+ start, end, interval = view._get_timings(seconds_activity)
+ data = view._chart_data(interval, 200, seconds_activity).next()
+ expected = {'store_len': 40, 'end': 1, 'load_len': 80,
+ 'connections': 15, 'start': 0, 'link':
+ 'chart_start=0&chart_end=1', 'stores': 5, 'loads': 10,
+ 'time_offset': '-1s'}
+ self.assertEqual(data, expected)
+
+ def test_getActivityChartData(self):
+ view = self._makeOne()
+ data = view.getActivityChartData()
+ expected = {'start_time': 'Thu, 01 Jan 1970 00:00:00 CET',
+ 'total_load_count': 20,
+ 'end_time': 'Thu, 01 Jan 1970 00:00:02 CET',
+ 'total_store_count': 20, 'total_connections': 40,}
+ for k in expected:
+ self.assertEqual(data[k], expected[k])
+
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(Tests),
More information about the checkins
mailing list