Merge lp:~fgallina/django-preflight/safer-cache-gather into lp:django-preflight

Proposed by Fabián Ezequiel Gallina
Status: Merged
Approved by: Fabián Ezequiel Gallina
Approved revision: 31
Merged at revision: 31
Proposed branch: lp:~fgallina/django-preflight/safer-cache-gather
Merge into: lp:django-preflight
Diff against target: 125 lines (+88/-2)
2 files modified
preflight/models.py (+5/-2)
preflight/tests.py (+83/-0)
To merge this branch: bzr merge lp:~fgallina/django-preflight/safer-cache-gather
Reviewer Review Type Date Requested Status
Ricardo Kirkner (community) Approve
Review via email: mp+226739@code.launchpad.net

Commit message

More robust hit_rate calculation for gather_caches

To post a comment you must log in.
Revision history for this message
Ricardo Kirkner (ricardokirkner) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'preflight/models.py'
2--- preflight/models.py 2014-01-28 17:37:22 +0000
3+++ preflight/models.py 2014-07-14 19:46:56 +0000
4@@ -275,8 +275,11 @@
5 except Exception as exc:
6 stats = dict(error=unicode(exc))
7 else:
8- stats['hit_rate'] = 100 * int(
9- stats.get('get_hits')) / int(stats.get('cmd_get'))
10+ try:
11+ stats['hit_rate'] = 100 * int(
12+ stats.get('get_hits')) / int(stats.get('cmd_get'))
13+ except (ZeroDivisionError, TypeError):
14+ stats['hit_rate'] = 0
15
16 stats['backend'] = cache_settings['BACKEND']
17 stats['host'] = cache_settings.get('LOCATION', 'No location given')
18
19=== modified file 'preflight/tests.py'
20--- preflight/tests.py 2014-01-28 17:37:22 +0000
21+++ preflight/tests.py 2014-07-14 19:46:56 +0000
22@@ -5,6 +5,7 @@
23 from cStringIO import StringIO
24
25 from django.contrib.auth.models import AnonymousUser, User
26+from django.conf import settings
27 from django.core.management import call_command
28 from django.core.urlresolvers import reverse
29 from django.http import HttpResponse
30@@ -31,6 +32,7 @@
31 Preflight,
32 authenticate,
33 cleanse_setting,
34+ gather_caches,
35 gather_checks,
36 gather_switches,
37 gather_gargoyle,
38@@ -230,6 +232,87 @@
39 self.assertFalse(self.basic_preflight.authenticate(request))
40
41
42+class GatherCaches(TestCase):
43+
44+ def setUp(self):
45+ CACHES = {
46+ 'default': {
47+ 'BACKEND': ('django.core.cache.backends.'
48+ 'memcached.MemcachedCache'),
49+ 'LOCATION': 'default_location',
50+ },
51+ 'extra': {
52+ 'BACKEND': ('django.core.cache.backends.'
53+ 'locmem.LocMemCache'),
54+ 'LOCATION': 'extra_location',
55+ }
56+ }
57+ patcher = patch.multiple(settings, CACHES=CACHES)
58+ patcher.start()
59+ self.addCleanup(patcher.stop)
60+
61+ def set_stats(self, stats):
62+ patcher = patch('preflight.models.get_cache')
63+ mock_get_cache = patcher.start()
64+ self.addCleanup(patcher.stop)
65+ MockCache = Mock()
66+ if isinstance(stats, dict):
67+ mock_stats = [[None, stats]]
68+ MockCache._cache.get_stats.return_value = mock_stats
69+ else:
70+ mock_stats = []
71+ for stat in stats:
72+ mock_stats.append([[None, stat]])
73+ MockCache._cache.get_stats.side_effect = mock_stats
74+ mock_get_cache.return_value = MockCache
75+
76+ def test_not_raises_zero_division_error(self):
77+ self.set_stats([{'get_hits': 10, 'cmd_get': 0},
78+ {'get_hits': 10, 'cmd_get': 10}])
79+ caches = gather_caches()
80+
81+ expected = {
82+ 'default': {
83+ 'backend': settings.CACHES['default']['BACKEND'],
84+ 'host': settings.CACHES['default']['LOCATION'],
85+ 'hit_rate': 0,
86+ 'get_hits': 10,
87+ 'cmd_get': 0,
88+ },
89+ 'extra': {
90+ 'backend': settings.CACHES['extra']['BACKEND'],
91+ 'host': settings.CACHES['extra']['LOCATION'],
92+ 'hit_rate': 100,
93+ 'get_hits': 10,
94+ 'cmd_get': 10,
95+ }
96+ }
97+ self.assertEqual(caches, expected)
98+
99+ def test_not_raises_type_error(self):
100+ self.set_stats([{'get_hits': 10, 'cmd_get': None},
101+ {'get_hits': None, 'cmd_get': 10}])
102+ caches = gather_caches()
103+
104+ expected = {
105+ 'default': {
106+ 'backend': settings.CACHES['default']['BACKEND'],
107+ 'host': settings.CACHES['default']['LOCATION'],
108+ 'hit_rate': 0,
109+ 'get_hits': 10,
110+ 'cmd_get': None,
111+ },
112+ 'extra': {
113+ 'backend': settings.CACHES['extra']['BACKEND'],
114+ 'host': settings.CACHES['extra']['LOCATION'],
115+ 'hit_rate': 0,
116+ 'get_hits': None,
117+ 'cmd_get': 10,
118+ }
119+ }
120+ self.assertEqual(caches, expected)
121+
122+
123 class GatherChecksTestCase(TestCase):
124
125 def test(self):

Subscribers

People subscribed via source and target branches