class CookieInstallerTests(unittest.TestCase): def setUp(self): self._reset() def _reset(self): # not very random at all self.c = CookieInstaller( secureRandom=lambda nbytes: 'x' * nbytes, insecureName='__', secureName='_s') self.request = http.Request(DummyChannel(), None) def test_installsCookieOnCookielessRequest(self): sess = self.c.getSet(self.request) self.assertEqual('x' * 16, sess) self.assertEqual( ['__=%s; Expires=Sat, 08 Dec 2029 23:55:42 GMT; Path=/' % ( base64.b64encode('x' * 16),)], self.request.cookies) def test_installsSecureCookieOnCookielessRequestHTTPS(self): self.request.isSecure = lambda: True sess = self.c.getSet(self.request) self.assertEqual('x' * 16, sess) self.assertEqual( ['_s=%s; Expires=Sat, 08 Dec 2029 23:55:42 GMT; Path=/; Secure' % ( base64.b64encode('x' * 16),)], self.request.cookies) def test_readsAlreadyInstalledCookie(self): """ Cookie must be very valid for it to be read. """ self.request.received_cookies['__'] = base64.b64encode('x' * 16) sess = self.c.getSet(self.request) self.assertEqual('x' * 16, sess) self.assertEqual([], self.request.cookies) def test_invalidCookiesIgnored(self): invalids = [ "", "\x00", base64.b64encode('z' * 15), base64.b64encode('z' * 17), # TODO: maybe support padding-free base64 in future base64.b64encode('z' * 16).rstrip("="), base64.b64encode('z' * 16) + "\x00", base64.b64encode('z' * 16) + ";", base64.b64encode('z' * 16) + "=", ] for invalid in invalids: self._reset() self.request.received_cookies['__'] = invalid sess = self.c.getSet(self.request) self.assertEqual('x' * 16, sess) self.assertEqual( ['__=%s; Expires=Sat, 08 Dec 2029 23:55:42 GMT; Path=/' % ( base64.b64encode('x' * 16),)], self.request.cookies) def test_installsCookieWithCustomDomain(self): self.c = CookieInstaller( secureRandom=lambda nbytes: 'x' * nbytes, insecureName='__', secureName='_s', domain='.customdomain.com') sess = self.c.getSet(self.request) self.assertEqual('x' * 16, sess) self.assertEqual( ['__=%s; Expires=Sat, 08 Dec 2029 23:55:42 GMT; ' 'Domain=.customdomain.com; Path=/' % ( base64.b64encode('x' * 16),)], self.request.cookies) def test_installsCookieWithCustomPath(self): self.c = CookieInstaller( secureRandom=lambda nbytes: 'x' * nbytes, insecureName='__', secureName='_s', path='/what') sess = self.c.getSet(self.request) self.assertEqual('x' * 16, sess) self.assertEqual( ['__=%s; Expires=Sat, 08 Dec 2029 23:55:42 GMT; ' 'Path=/what' % ( base64.b64encode('x' * 16),)], self.request.cookies) def test_installsCookieWithCustomExpires(self): self.c = CookieInstaller( secureRandom=lambda nbytes: 'x' * nbytes, insecureName='__', secureName='_s', expires='NEVER EVER') sess = self.c.getSet(self.request) self.assertEqual('x' * 16, sess) self.assertEqual( ['__=%s; Expires=NEVER EVER; Path=/' % ( base64.b64encode('x' * 16),)], self.request.cookies)