def test_FeedsLayer_uses_SlaveDatabasePolicy(self): """FeedsRequest should use the SlaveDatabasePolicy since they are read-only in nature. Also we don't want to send session cookies over them. """ request = LaunchpadTestRequest(SERVER_URL='http://feeds.launchpad.dev') setFirstLayer(request, FeedsLayer) policy = IDatabasePolicy(request) self.assertIsInstance(policy, SlaveOnlyDatabasePolicy)
def test_WebServiceRequest_uses_MasterDatabasePolicy(self): """WebService requests should always use the master flavor, since it's likely that clients won't support cookies and thus mixing read and write requests will result in incoherent views of the data. XXX 20090320 Stuart Bishop bug=297052: This doesn't scale of course and will meltdown when the API becomes popular. """ api_prefix = getUtility(IWebServiceConfiguration).active_versions[0] server_url = 'http://api.launchpad.dev/%s' % api_prefix request = LaunchpadTestRequest(SERVER_URL=server_url) setFirstLayer(request, WebServiceLayer) policy = IDatabasePolicy(request) self.assertIsInstance(policy, MasterDatabasePolicy)
def beforeTraversal(self, request): notify(StartRequestEvent(request)) request._traversalticks_start = tickcount.tickcount() threadid = thread.get_ident() threadrequestfile = open_for_writing( 'logs/thread-%s.request' % threadid, 'w') try: request_txt = unicode(request).encode('UTF-8') except Exception: request_txt = 'Exception converting request to string\n\n' try: request_txt += traceback.format_exc() except: request_txt += 'Unable to render traceback!' threadrequestfile.write(request_txt) threadrequestfile.close() # Tell our custom database adapter that the request has started. da.set_request_started() newInteraction(request) transaction.begin() # Now we are logged in, install the correct IDatabasePolicy for # this request. db_policy = IDatabasePolicy(request) getUtility(IStoreSelector).push(db_policy) getUtility(IOpenLaunchBag).clear() # Set the default layer. adapters = getGlobalSiteManager().adapters layer = adapters.lookup((providedBy(request), ), IDefaultSkin, '') if layer is not None: layers.setAdditionalLayer(request, layer) principal = self.getPrincipal(request) request.setPrincipal(principal) self.maybeRestrictToTeam(request) maybe_block_offsite_form_post(request)
def test_WebServiceRequest_uses_LaunchpadDatabasePolicy(self): """WebService requests with a session cookie will use the standard LaunchpadDatabasePolicy so their database queries can be outsourced to a slave database when possible. """ api_prefix = getUtility(IWebServiceConfiguration).active_versions[0] server_url = 'http://api.launchpad.dev/%s' % api_prefix request = LaunchpadTestRequest(SERVER_URL=server_url) newInteraction(request) try: # First, generate a valid session cookie. ISession(request)['whatever']['whatever'] = 'whatever' # Then stuff it into the request where we expect to # find it. The database policy is only interested if # a session cookie was sent with the request, not it # one has subsequently been set in the response. request._cookies = request.response._cookies setFirstLayer(request, WebServiceLayer) policy = IDatabasePolicy(request) self.assertIsInstance(policy, LaunchpadDatabasePolicy) finally: endInteraction()
def test_other_request_uses_LaunchpadDatabasePolicy(self): """By default, requests should use the LaunchpadDatabasePolicy.""" server_url = 'http://launchpad.dev/' request = LaunchpadTestRequest(SERVER_URL=server_url) policy = IDatabasePolicy(request) self.assertIsInstance(policy, LaunchpadDatabasePolicy)