Skip to content

Commit 5f5ac58

Browse files
authored
Merge pull request #1572 from cbowman0/coverage_whitelist
Coverage for graphite.whitelist
2 parents d9c12b2 + 45bd8f9 commit 5f5ac58

File tree

3 files changed

+119
-5
lines changed

3 files changed

+119
-5
lines changed

webapp/graphite/util.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def deltaseconds(timedelta):
164164
class SafeUnpickler(object):
165165
PICKLE_SAFE = {
166166
'copy_reg': set(['_reconstructor']),
167-
'__builtin__': set(['object', 'list']),
167+
'__builtin__': set(['object', 'list', 'set']),
168168
'collections': set(['deque']),
169169
'graphite.render.datalib': set(['TimeSeries']),
170170
'graphite.intervals': set(['Interval', 'IntervalSet']),
@@ -190,7 +190,7 @@ def loads(cls, pickle_string):
190190
class SafeUnpickler(pickle.Unpickler):
191191
PICKLE_SAFE = {
192192
'copy_reg': set(['_reconstructor']),
193-
'__builtin__': set(['object', 'list']),
193+
'__builtin__': set(['object', 'list', 'set']),
194194
'collections': set(['deque']),
195195
'graphite.render.datalib': set(['TimeSeries']),
196196
'graphite.intervals': set(['Interval', 'IntervalSet']),

webapp/graphite/whitelist/views.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,8 @@ def show(request):
4141
return HttpResponse(content_type="text/plain", content=members)
4242

4343
def load_whitelist():
44-
fh = open(settings.WHITELIST_FILE, 'rb')
45-
whitelist = unpickle.load(fh)
46-
fh.close()
44+
buffer = open(settings.WHITELIST_FILE, 'rb').read()
45+
whitelist = unpickle.loads(buffer)
4746
return whitelist
4847

4948
def save_whitelist(whitelist):

webapp/tests/test_whitelist.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import errno
2+
import mock
3+
import os
4+
import pickle
5+
6+
from . import DATA_DIR
7+
8+
from django.conf import settings
9+
from django.core.urlresolvers import reverse
10+
from django.test import TestCase
11+
12+
from graphite.whitelist.views import load_whitelist, save_whitelist
13+
14+
class WhitelistTester(TestCase):
15+
settings.WHITELIST_FILE = os.path.join(DATA_DIR, 'lists/whitelist')
16+
17+
def wipe_whitelist(self):
18+
try:
19+
os.remove(settings.WHITELIST_FILE)
20+
except OSError:
21+
pass
22+
23+
def create_whitelist(self):
24+
try:
25+
os.makedirs(settings.WHITELIST_FILE.replace('whitelist', ''))
26+
except OSError:
27+
pass
28+
fh = open(settings.WHITELIST_FILE, 'wb')
29+
pickle.dump({'a.b.c.d', 'e.f.g.h'}, fh)
30+
fh.close()
31+
32+
def test_whitelist_show_no_whitelist(self):
33+
url = reverse('whitelist_show')
34+
with self.assertRaises(IOError):
35+
response = self.client.get(url)
36+
37+
def test_whitelist_show(self):
38+
url = reverse('whitelist_show')
39+
self.create_whitelist()
40+
self.addCleanup(self.wipe_whitelist)
41+
response = self.client.get(url)
42+
self.assertEqual(response.status_code, 200)
43+
self.assertEqual(response.content, "a.b.c.d\ne.f.g.h")
44+
45+
def test_whitelist_add(self):
46+
self.create_whitelist()
47+
self.addCleanup(self.wipe_whitelist)
48+
49+
url = reverse('whitelist_add')
50+
response = self.client.post(url, {'metrics': ['i.j.k.l']})
51+
self.assertEqual(response.status_code, 200)
52+
self.assertEqual(response.content, "OK")
53+
54+
url = reverse('whitelist_show')
55+
response = self.client.get(url)
56+
self.assertEqual(response.status_code, 200)
57+
self.assertEqual(response.content, "a.b.c.d\ne.f.g.h\ni.j.k.l")
58+
59+
def test_whitelist_add_existing(self):
60+
self.create_whitelist()
61+
self.addCleanup(self.wipe_whitelist)
62+
63+
url = reverse('whitelist_add')
64+
response = self.client.post(url, {'metrics': ['a.b.c.d']})
65+
self.assertEqual(response.status_code, 200)
66+
self.assertEqual(response.content, "OK")
67+
68+
url = reverse('whitelist_show')
69+
response = self.client.get(url)
70+
self.assertEqual(response.status_code, 200)
71+
self.assertEqual(response.content, "a.b.c.d\ne.f.g.h")
72+
73+
def test_whitelist_remove(self):
74+
self.create_whitelist()
75+
self.addCleanup(self.wipe_whitelist)
76+
77+
url = reverse('whitelist_remove')
78+
response = self.client.post(url, {'metrics': ['a.b.c.d']})
79+
self.assertEqual(response.status_code, 200)
80+
self.assertEqual(response.content, "OK")
81+
82+
url = reverse('whitelist_show')
83+
response = self.client.get(url)
84+
self.assertEqual(response.status_code, 200)
85+
self.assertEqual(response.content, "e.f.g.h")
86+
87+
def test_whitelist_remove_missing(self):
88+
self.create_whitelist()
89+
self.addCleanup(self.wipe_whitelist)
90+
91+
url = reverse('whitelist_remove')
92+
response = self.client.post(url, {'metrics': ['i.j.k.l']})
93+
self.assertEqual(response.status_code, 200)
94+
self.assertEqual(response.content, "OK")
95+
96+
url = reverse('whitelist_show')
97+
response = self.client.get(url)
98+
self.assertEqual(response.status_code, 200)
99+
self.assertEqual(response.content, "a.b.c.d\ne.f.g.h")
100+
101+
def test_save_whitelist(self):
102+
try:
103+
os.makedirs(settings.WHITELIST_FILE.replace('whitelist', ''))
104+
except OSError:
105+
pass
106+
self.addCleanup(self.wipe_whitelist)
107+
self.assertEqual(save_whitelist({'a.b.c.d','e.f.g.h'}), None)
108+
self.assertEqual(load_whitelist(), {'a.b.c.d','e.f.g.h'})
109+
110+
@mock.patch('os.rename')
111+
def test_save_whitelist_rename_failure(self, rename):
112+
self.addCleanup(self.wipe_whitelist)
113+
rename.side_effect = OSError(errno.EPERM, 'Operation not permitted')
114+
with self.assertRaises(OSError):
115+
save_whitelist({'a.b.c.d','e.f.g.h'})

0 commit comments

Comments
 (0)