Skip to content

Commit cddfe40

Browse files
committed
Coverage for graphite.whitelist
* Fix graphite.whitelist.load_whitelist() * Add test cases for show, add and remove * Test save_whitelist failure scenarios
1 parent d0295a2 commit cddfe40

File tree

2 files changed

+116
-2
lines changed

2 files changed

+116
-2
lines changed

webapp/graphite/whitelist/views.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from django.conf import settings
1919

2020
from graphite.compat import HttpResponse
21-
from graphite.util import unpickle
2221

2322

2423
def add(request):
@@ -42,7 +41,7 @@ def show(request):
4241

4342
def load_whitelist():
4443
fh = open(settings.WHITELIST_FILE, 'rb')
45-
whitelist = unpickle.load(fh)
44+
whitelist = pickle.load(fh)
4645
fh.close()
4746
return whitelist
4847

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)