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

root/branches/cherrypy-2.x/cherrypy/test/test_cache_filter.py

Revision 1576 (checked in by dowski, 2 years ago)

Backport of [1187] to 2.x branch. (Age header in cached responses). See #567.

  • Property svn:eol-style set to native
Line 
1 import test
2 test.prefer_parent_path()
3
4 import cherrypy
5 from cherrypy.filters.cachefilter import expires
6 from cherrypy.lib.httptools import HTTPDate
7
8
9 def setup_server():
10     class Root:
11         def __init__(self):
12             cherrypy.counter = 0
13        
14         def index(self):
15             cherrypy.counter += 1
16             msg = "visit #%s" % cherrypy.counter
17             return msg
18         index.exposed = True
19        
20         def textplain(self):
21             cherrypy.response.headers['Content-type'] = 'text/plain'
22             cherrypy.response.headers['Last-Modified'] = HTTPDate()
23             return self.index()
24         textplain.exposed = True
25        
26     class UnCached(object):
27        
28         use_force = False
29        
30         def force(self):
31             self.use_force = True
32             expires(force=self.use_force)
33             return "being forceful"
34         force.exposed = True
35        
36         def dynamic(self):
37             cherrypy.response.headers['Cache-Control'] = 'private'
38             expires(force=self.use_force)
39             return "D-d-d-dynamic!"
40         dynamic.exposed = True
41        
42         def cacheable(self):
43             cherrypy.response.headers['Etag'] = 'bibbitybobbityboo'
44             expires(force=self.use_force)
45             return "Hi, I'm cacheable."
46         cacheable.exposed = True
47        
48         def specific(self):
49             expires(secs=86400, force=self.use_force)
50             return "I am being specific"
51         specific.exposed = True
52    
53     cherrypy.root = Root()
54     cherrypy.root.expires = UnCached()
55     cherrypy.config.update({
56         'global': {'server.log_to_screen': False,
57                    'server.environment': 'production',
58                    'cache_filter.on': True,
59                    },
60         '/expires': {'cache_filter.on': False},
61     })
62
63
64 import helper
65
66 class CacheFilterTest(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         # make sure that custom set Content-types get passed through on 304s
98         self.getPage("/textplain")
99         self.assertHeader("Content-type", "text/plain")
100         self.assertStatus("200 OK")
101         self.assertBody('visit #6')
102         date = self.assertHeader("Last-Modified")
103         self.getPage("/textplain", [("If-Modified-Since", date)])
104         self.assertHeader("Content-type", "text/plain")
105         self.assertStatus("304 Not Modified")
106        
107     def testExpiresTool(self):
108        
109         # test setting an expires header
110         self.getPage("/expires/specific")
111         self.assertStatus("200 OK")
112         self.assertHeader("Expires")
113        
114         # dynamic content that sets indicators should not have
115         # "cache prevention" headers
116         self.getPage("/expires/cacheable")
117         self.assertStatus("200 OK")
118         self.assertNoHeader("Pragma")
119         self.assertNoHeader("Cache-Control")
120        
121         self.getPage('/expires/dynamic')
122         self.assertBody("D-d-d-dynamic!")
123         # the Cache-Control header should be untouched
124         self.assertHeader("Cache-Control", "private")
125        
126         # configure the tool to ignore indicators and replace existing headers
127         self.getPage("/expires/force")
128         self.assertStatus("200 OK")
129         # This also gives us a chance to test 0 expiry with no other headers
130         self.assertHeader("Pragma", "no-cache")
131         conf = cherrypy.config.get
132         if conf('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         # the cacheable handler should now have "cache prevention" headers
138         self.getPage("/expires/cacheable")
139         self.assertStatus("200 OK")
140         self.assertHeader("Pragma", "no-cache")
141         if conf('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         self.getPage('/expires/dynamic')
147         self.assertBody("D-d-d-dynamic!")
148         # dynamic sets Cache-Control to private but it should  be
149         # overwritten here ...
150         self.assertHeader("Pragma", "no-cache")
151         if conf('server.protocol_version', '') == "HTTP/1.1":
152             self.assertHeader("Cache-Control", "no-cache")
153         d = self.assertHeader("Date")
154         self.assertHeader("Expires", d)
155
156
157 if __name__ == '__main__':
158     setup_server()
159     helper.testmain()
160
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets