Merge remote branch 'tom/master'

This commit is contained in:
Brian Beggs 2010-05-14 10:59:41 -04:00
commit 4b322720b3
8 changed files with 73 additions and 13 deletions

View file

@ -43,6 +43,10 @@ class TestPubsubServer(unittest.TestCase):
def test001getdefaultconfig(self): def test001getdefaultconfig(self):
"""Get the default node config""" """Get the default node config"""
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode2')
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode3')
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode4')
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode5')
result = self.xmpp1['xep_0060'].getNodeConfig(self.pshost) result = self.xmpp1['xep_0060'].getNodeConfig(self.pshost)
self.statev['defaultconfig'] = result self.statev['defaultconfig'] = result
self.failUnless(isinstance(result, sleekxmpp.plugins.xep_0004.Form)) self.failUnless(isinstance(result, sleekxmpp.plugins.xep_0004.Form))
@ -130,6 +134,39 @@ class TestPubsubServer(unittest.TestCase):
self.failUnless(msg != False, "Account #1 did not get message event: perhaps node was advertised incorrectly?") self.failUnless(msg != False, "Account #1 did not get message event: perhaps node was advertised incorrectly?")
self.failUnless(result) self.failUnless(result)
# def test016speedtest(self):
# "Uncached speed test"
# import time
# start = time.time()
# for y in range(0, 50000, 1000):
# start2 = time.time()
# for x in range(y, y+1000):
# self.failUnless(self.xmpp1['xep_0060'].subscribe(self.pshost, "testnode4", subscribee="testuser%s@whatever" % x))
# print time.time() - start2
# seconds = time.time() - start
# print "--", seconds
# print "---------"
# time.sleep(15)
# self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode4'), "Could not delete non-cached test node")
# def test015speedtest(self):
# "cached speed test"
# result = self.xmpp1['xep_0060'].getNodeConfig(self.pshost)
# self.statev['defaultconfig'] = result
# self.statev['defaultconfig'].field['pubsub#node_type'].setValue("leaf")
# self.statev['defaultconfig'].field['sleek#saveonchange'].setValue(True)
# self.failUnless(self.xmpp1['xep_0060'].create_node(self.pshost, 'testnode4', self.statev['defaultconfig']))
# self.statev['defaultconfig'].field['sleek#saveonchange'].setValue(False)
# self.failUnless(self.xmpp1['xep_0060'].create_node(self.pshost, 'testnode5', self.statev['defaultconfig']))
# start = time.time()
# for y in range(0, 50000, 1000):
# start2 = time.time()
# for x in range(y, y+1000):
# self.failUnless(self.xmpp1['xep_0060'].subscribe(self.pshost, "testnode5", subscribee="testuser%s@whatever" % x))
# print time.time() - start2
# seconds = time.time() - start
# print "--", seconds
def test900cleanup(self): def test900cleanup(self):
"Cleaning up" "Cleaning up"
self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode2'), "Could not delete test node.") self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode2'), "Could not delete test node.")

View file

@ -271,12 +271,13 @@ class basexmpp(object):
name = self.roster[jid].get('name', '') name = self.roster[jid].get('name', '')
if show == 'unavailable': if show == 'unavailable':
logging.debug("%s %s got offline" % (jid, resource)) logging.debug("%s %s got offline" % (jid, resource))
if len(self.roster[jid]['presence']):
del self.roster[jid]['presence'][resource] del self.roster[jid]['presence'][resource]
else: if len(self.roster[jid]['presence']) == 0 and not self.roster[jid]['in_roster']:
del self.roster[jid] del self.roster[jid]
if not wasoffline: if not wasoffline:
self.event("got_offline", presence) self.event("got_offline", presence)
else:
return False
self.event("changed_status", presence) self.event("changed_status", presence)
name = '' name = ''
if name: if name:

View file

@ -93,10 +93,10 @@ class MUCPresence(ElementBase):
return self return self
def getNick(self): def getNick(self):
return self.parent['from'].resource return self.parent()['from'].resource
def getRoom(self): def getRoom(self):
return self.parent['from'].bare return self.parent()['from'].bare
def setNick(self, value): def setNick(self, value):
logging.warning("Cannot set nick through mucpresence plugin.") logging.warning("Cannot set nick through mucpresence plugin.")

View file

@ -22,7 +22,7 @@ class Error(ElementBase):
self['type'] = 'cancel' self['type'] = 'cancel'
self['condition'] = 'feature-not-implemented' self['condition'] = 'feature-not-implemented'
if self.parent is not None: if self.parent is not None:
self.parent['type'] = 'error' self.parent()['type'] = 'error'
def getCondition(self): def getCondition(self):
for child in self.xml.getchildren(): for child in self.xml.getchildren():

View file

@ -31,4 +31,5 @@ class HTMLIM(ElementBase):
return html return html
def delHtml(self): def delHtml(self):
return self.__del__() if self.parent is not None:
self.parent().xml.remove(self.xml)

View file

@ -22,4 +22,5 @@ class Nick(ElementBase):
return self.xml.text return self.xml.text
def delNick(self): def delNick(self):
return self.__del__() if self.parent is not None:
self.parent().xml.remove(self.xml)

View file

@ -9,6 +9,7 @@ from xml.etree import cElementTree as ET
import logging import logging
import traceback import traceback
import sys import sys
import weakref
if sys.version_info < (3,0): if sys.version_info < (3,0):
from . import tostring26 as tostring from . import tostring26 as tostring
@ -51,7 +52,10 @@ class ElementBase(tostring.ToString):
subitem = None subitem = None
def __init__(self, xml=None, parent=None): def __init__(self, xml=None, parent=None):
self.parent = parent if parent is None:
self.parent = None
else:
self.parent = weakref.ref(parent)
self.xml = xml self.xml = xml
self.plugins = {} self.plugins = {}
self.iterables = [] self.iterables = []
@ -158,7 +162,7 @@ class ElementBase(tostring.ToString):
else: else:
self.xml.append(new) self.xml.append(new)
if self.parent is not None: if self.parent is not None:
self.parent.xml.append(self.xml) self.parent().xml.append(self.xml)
return True #had to generate XML return True #had to generate XML
else: else:
return False return False
@ -302,9 +306,9 @@ class ElementBase(tostring.ToString):
self.xml.append(xml) self.xml.append(xml)
return self return self
def __del__(self): #def __del__(self): #prevents garbage collection of reference cycle
if self.parent is not None: # if self.parent is not None:
self.parent.xml.remove(self.xml) # self.parent.xml.remove(self.xml)
class StanzaBase(ElementBase): class StanzaBase(ElementBase):
name = 'stanza' name = 'stanza'

View file

@ -12,4 +12,20 @@ class testpresencestanzas(unittest.TestCase):
p['type'] = 'dnd' p['type'] = 'dnd'
self.failUnless(str(p) == "<presence><show>dnd</show></presence>") self.failUnless(str(p) == "<presence><show>dnd</show></presence>")
def testPresenceUnsolicitedOffline(self):
"Unsolicted offline presence does not spawn changed_status or update roster"
p = self.p.Presence()
p['type'] = 'unavailable'
p['from'] = 'bill@chadmore.com/gmail15af'
import sleekxmpp
c = sleekxmpp.ClientXMPP('crap@wherever', 'password')
happened = []
def handlechangedpresence(event):
happened.append(True)
c.add_event_handler("changed_status", handlechangedpresence)
c._handlePresence(p)
self.failUnless(happened == [], "changed_status event triggered for superfulous unavailable presence")
self.failUnless(c.roster == {}, "Roster updated for superfulous unavailable presence")
suite = unittest.TestLoader().loadTestsFromTestCase(testpresencestanzas) suite = unittest.TestLoader().loadTestsFromTestCase(testpresencestanzas)