[web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
"""Fake objects to ease testing of cubicweb without a fully working environment:organization: Logilab:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""__docformat__="restructuredtext en"fromlogilab.databaseimportget_db_helperfromcubicweb.reqimportRequestSessionBasefromcubicweb.cwvregimportCubicWebVRegistryfromcubicweb.web.requestimportCubicWebRequestBasefromcubicweb.devtoolsimportBASE_URL,BaseApptestConfigurationclassFakeConfig(dict,BaseApptestConfiguration):translations={}apphome=Nonedef__init__(self,appid='data',apphome=None,cubes=()):self.appid=appidself.apphome=apphomeself._cubes=cubesself['auth-mode']='cookie'self['uid']=Noneself['base-url']=BASE_URLself['rql-cache-size']=100defcubes(self,expand=False):returnself._cubesdefsources(self):return{}classFakeRequest(CubicWebRequestBase):"""test implementation of an cubicweb request object"""def__init__(self,*args,**kwargs):ifnot(argsor'vreg'inkwargs):kwargs['vreg']=CubicWebVRegistry(FakeConfig(),initlog=False)kwargs['https']=Falseself._url=kwargs.pop('url','view?rql=Blop&vid=blop')super(FakeRequest,self).__init__(*args,**kwargs)self._session_data={}self._headers={}defheader_accept_language(self):"""returns an ordered list of preferred languages"""return('en',)defheader_if_modified_since(self):returnNonedefbase_url(self):"""return the root url of the instance"""returnBASE_URLdefrelative_path(self,includeparams=True):"""return the normalized path of the request (ie at least relative to the instance's root, but some other normalization may be needed so that the returned path may be used to compare to generated urls """ifself._url.startswith(BASE_URL):url=self._url[len(BASE_URL):]else:url=self._urlifincludeparams:returnurlreturnurl.split('?',1)[0]defset_content_type(self,content_type,filename=None,encoding=None):"""set output content type for this request. An optional filename may be given """passdefset_header(self,header,value,raw=True):"""set an output HTTP header"""self._headers[header]=valuedefadd_header(self,header,value):"""set an output HTTP header"""self._headers[header]=value# XXXdefremove_header(self,header):"""remove an output HTTP header"""self._headers.pop(header,None)defget_header(self,header,default=None):"""return the value associated with the given input header, raise KeyError if the header is not set """returnself._headers.get(header,default)defset_cookie(self,cookie,key,maxage=300,expires=None):"""set / update a cookie key by default, cookie will be available for the next 5 minutes """morsel=cookie[key]ifmaxageisnotNone:morsel['Max-Age']=maxageifexpires:morsel['expires']=expires.strftime('%a, %d %b %Y %H:%M:%S %z')# make sure cookie is set on the correct pathmorsel['path']=self.base_url_path()self.add_header('Set-Cookie',morsel.OutputString())self.add_header('Cookie',morsel.OutputString())defremove_cookie(self,cookie,key):self.remove_header('Set-Cookie')self.remove_header('Cookie')defvalidate_cache(self):passclassFakeUser(object):login='toto'eid=0defin_groups(self,groups):returnTrueclassFakeSession(RequestSessionBase):read_security=write_security=Trueset_read_security=set_write_security=lambda*args,**kwargs:Nonedef__init__(self,repo=None,user=None):self.repo=repoself.vreg=getattr(self.repo,'vreg',CubicWebVRegistry(FakeConfig(),initlog=False))self.pool=FakePool()self.user=userorFakeUser()self.is_internal_session=Falseself.transaction_data={}defexecute(self,*args,**kwargs):passdefcommit(self,*args):self.transaction_data.clear()defclose(self,*args):passdefsystem_sql(self,sql,args=None):passdefset_entity_cache(self,entity):passclassFakeRepo(object):querier=Nonedef__init__(self,schema,vreg=None,config=None):self.extids={}self.eids={}self._count=0self.schema=schemaself.config=configorFakeConfig()self.vreg=vregorCubicWebVRegistry(self.config,initlog=False)self.vreg.schema=schemadefinternal_session(self):returnFakeSession(self)defextid2eid(self,source,extid,etype,session,insert=True,recreate=False):try:returnself.extids[extid]exceptKeyError:ifnotinsert:returnNoneself._count+=1eid=self._countentity=source.before_entity_insertion(session,extid,etype,eid)self.extids[extid]=eidself.eids[eid]=extidsource.after_entity_insertion(session,extid,entity)returneiddefeid2extid(self,source,eid,session=None):returnself.eids[eid]classFakeSource(object):dbhelper=get_db_helper('sqlite')def__init__(self,uri):self.uri=uriclassFakePool(object):defsource(self,uri):returnFakeSource(uri)