Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

root/tags/cherrypy-3.0.0/cherrypy/test/test_caching.py

Revision 1495 (checked in by fumanchu, 2 years ago)

Fixed bug in caching; invalid methods did not delete cached resource. See #509.

  • Property svn:eol-style set to native
Line 
1 from cherrypy.test import test
2 test.prefer_parent_path()
3
4 import os
5 curdir = os.path.join(os.getcwd(), os.path.dirname(__file__))
6
7 import cherrypy
8
9
10 def setup_server():
11    
12     class Root:
13        
14         _cp_config = {'tools.caching.on': True}
15        
16         def __init__(self):
17             cherrypy.counter = 0
18        
19         def index(self):
20             cherrypy.counter += 1
21             msg = "visit #%s" % cherrypy.counter
22             return msg
23         index.exposed = True
24
25     class UnCached(object):
26         _cp_config = {'tools.expires.on': True,
27                       'tools.staticdir.on': True,
28                       'tools.staticdir.dir': 'static',
29                       'tools.staticdir.root': curdir,
30                       }
31
32         def force(self):
33             self._cp_config['tools.expires.force'] = True
34             return "being forceful"
35         force.exposed = True
36
37         def dynamic(self):
38             cherrypy.response.headers['Cache-Control'] = 'private'
39             return "D-d-d-dynamic!"
40         dynamic.exposed = True
41
42         def cacheable(self):
43             cherrypy.response.headers['Etag'] = 'bibbitybobbityboo'
44             return "Hi, I'm cacheable."
45         cacheable.exposed = True
46
47         def specific(self):
48             return "I am being specific"
49         specific.exposed = True
50         specific._cp_config = {'tools.expires.secs': 86400}
51
52         class Foo(object):pass
53        
54         def wrongtype(self):
55             return "Woops"
56         wrongtype.exposed = True
57         wrongtype._cp_config = {'tools.expires.secs': Foo()}
58    
59     cherrypy.tree.mount(Root())
60     cherrypy.tree.mount(UnCached(), "/expires")
61     cherrypy.config.update({'environment': 'test_suite'})
62
63
64 from cherrypy.test import helper
65
66 class CacheTest(helper.CPWebCase):
67
68     def testCaching(self):
69         elapsed = 0.0
70         for trial in xrange(10):
71             self.getPage("/")
72             # The response should be the same every time,
73             # except for the Age response header.
74             self.assertBody('visit #1')
75             if trial != 0:
76                 age = int(self.assertHeader("Age"))
77                 self.assert_(age >= elapsed)
78                 elapsed = age
79        
80         # POST, PUT, DELETE should not be cached.
81         self.getPage("/", method="POST")
82         self.assertBody('visit #2')
83         # The previous request should have invalidated the cache,
84         # so this request will recalc the response.
85         self.getPage("/", method="GET")
86         self.assertBody('visit #3')
87         # ...but this request should get the cached copy.
88         self.getPage("/", method="GET")
89         self.assertBody('visit #3')
90         self.getPage("/", method="DELETE")
91         self.assertBody('visit #4')
92         # The previous request should have invalidated the cache,
93         # so this request will recalc the response.
94         self.getPage("/", method="GET")
95         self.assertBody('visit #5')
96    
97     def testExpiresTool(self):
98        
99         # test setting an expires header
100         self.getPage("/expires/specific")
101         self.assertStatus("200 OK")
102         self.assertHeader("Expires")
103        
104         # test exceptions for bad time values
105         self.getPage("/expires/wrongtype")
106         self.assertStatus(500)
107         self.assertInBody("TypeError")
108        
109         # static content should not have "cache prevention" headers
110         self.getPage("/expires/index.html")
111         self.assertStatus("200 OK")
112         self.assertNoHeader("Pragma")
113         self.assertNoHeader("Cache-Control")
114        
115         # dynamic content that sets indicators should not have
116         # "cache prevention" headers
117         self.getPage("/expires/cacheable")
118         self.assertStatus("200 OK")
119         self.assertNoHeader("Pragma")
120         self.assertNoHeader("Cache-Control")
121        
122         self.getPage('/expires/dynamic')
123         self.assertBody("D-d-d-dynamic!")
124         # the Cache-Control header should be untouched
125         self.assertHeader("Cache-Control", "private")
126        
127         # configure the tool to ignore indicators and replace existing headers
128         self.getPage("/expires/force")
129         self.assertStatus("200 OK")
130         # This also gives us a chance to test 0 expiry with no other headers
131         self.assertHeader("Pragma", "no-cache")
132         if cherrypy.server.protocol_version == "HTTP/1.1":
133             self.assertHeader("Cache-Control", "no-cache")
134         d = self.assertHeader("Date")
135         self.assertHeader("Expires", d)
136        
137         # static content should now have "cache prevention" headers
138         self.getPage("/expires/index.html")
139         self.assertStatus("200 OK")
140         self.assertHeader("Pragma", "no-cache")
141         if cherrypy.server.protocol_version == "HTTP/1.1":
142             self.assertHeader("Cache-Control", "no-cache")
143         d = self.assertHeader("Date")
144         self.assertHeader("Expires", d)
145        
146         # the cacheable handler should now have "cache prevention" headers
147         self.getPage("/expires/cacheable")
148         self.assertStatus("200 OK")
149         self.assertHeader("Pragma", "no-cache")
150         if cherrypy.server.protocol_version == "HTTP/1.1":
151             self.assertHeader("Cache-Control", "no-cache")
152         d = self.assertHeader("Date")
153         self.assertHeader("Expires", d)
154        
155         self.getPage('/expires/dynamic')
156         self.assertBody("D-d-d-dynamic!")
157         # dynamic sets Cache-Control to private but it should  be
158         # overwritten here ...
159         self.assertHeader("Pragma", "no-cache")
160         if cherrypy.server.protocol_version == "HTTP/1.1":
161             self.assertHeader("Cache-Control", "no-cache")
162         d = self.assertHeader("Date")
163         self.assertHeader("Expires", d)
164
165 if __name__ == '__main__':
166     setup_server()
167     helper.testmain()
168
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets