Mercurial > p > roundup > code
view test/benchmark.py @ 5123:226052e0cc4c
Fixed incorrect header comparisons in compareMessages. It iterated
over every header in the new message and didn't detect when the new
message was missing a header that was in the reference message.
I have fixed that by retrieving all header names from the new and
reference (old) messages, lower casing the list and comparing them
(with a fixup for the x-roundup-version header). If the list of
headers isn't identical, I throw an error.
Also the Content-Type mime values are now being compared as well to
make sure the new message being generates matches the reference mime
content type.
Of course this broke some tests. A number of them were using
compareMessages when they should have been using assertEqual. That was
an easy fix.
Also some messages when retrieved from the content property are
missing trailing newlines. I think this is part of the signature
removal algorithm. This may be a bug or intended. In any case I am
fixing the tests to remove trailing newlines.
However I have a handful of tests that are not that obvious.
Two of are
test_mailgw.py:testMultipartCharsetLatin1AttachFile
test_mailgw.py:testMultipartCharsetUTF8AttachFile
I removed a:
Content-Transfer-Encoding: quoted-printable
message header from the reference message in both cases. The message
content-type was multipart/mixed and it had no content that was
outside of a mime part. Sending a message like this using mailx and
nmh resulted in an email being delivered that was missing a
Content-Transfer-Encoding, so I think I am ok here.
The last broken test also started as a missing
Content-Transfer-Encoding header. But there was a twist:
test-mailgw.py:testMultipartRFC822
had a reference copy with a mime type of text/plain which requires a
Content-Transfer-Encoding. However I never looked at the mime type of
the mail being generated. The generated mail was of type
multipart/mixed. So I changed the reference copy to remove the
Content-Transfer-Encoding and changed the reference mime type to
multipart/mixed.
Now all the mailgw tests are passing. With luck I haven't encoded an
invalid test.
Also did one minor spelling correction.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sun, 03 Jul 2016 18:54:18 -0400 |
| parents | d41f38de578e |
| children | 64b05e24dbd8 |
line wrap: on
line source
import sys, os, time from roundup.hyperdb import String, Password, Link, Multilink, Date, \ Interval, DatabaseError, Boolean, Number from roundup import date, password from db_test_base import config def setupSchema(db, module): status = module.Class(db, "status", name=String()) status.setkey("name") user = module.Class(db, "user", username=String(), password=Password(), assignable=Boolean(), age=Number(), roles=String()) user.setkey("username") file = module.FileClass(db, "file", name=String(), type=String(), comment=String(indexme="yes")) issue = module.IssueClass(db, "issue", title=String(indexme="yes"), status=Link("status"), nosy=Multilink("user"), deadline=Date(), foo=Interval(), files=Multilink("file"), assignedto=Link('user')) session = module.Class(db, 'session', title=String()) session.disableJournalling() db.post_init() db.commit() def main(backendname, time=time.time, numissues=10): try: exec('from roundup.backends import %s as backend'%backendname) except ImportError: return times = [] config.DATABASE = os.path.join('_benchmark', '%s-%s'%(backendname, numissues)) if not os.path.exists(config.DATABASE): db = backend.Database(config, 'admin') setupSchema(db, backend) # create a whole bunch of stuff db.user.create(**{'username': 'admin'}) db.status.create(name="unread") db.status.create(name="in-progress") db.status.create(name="testing") db.status.create(name="resolved") pc = -1 for i in range(numissues): db.user.create(**{'username': 'user %s'%i}) for j in range(10): db.user.set(str(i+1), assignable=1) db.user.set(str(i+1), assignable=0) db.issue.create(**{'title': 'issue %s'%i}) for j in range(10): db.issue.set(str(i+1), status='2', assignedto='2', nosy=[]) db.issue.set(str(i+1), status='1', assignedto='1', nosy=['1','2']) if (i*100/numissues) != pc: pc = (i*100/numissues) sys.stdout.write("%d%%\r"%pc) sys.stdout.flush() db.commit() else: db = backend.Database(config, 'admin') setupSchema(db, backend) sys.stdout.write('%7s: %-6d'%(backendname, numissues)) sys.stdout.flush() times.append(('start', time())) # fetch db.clearCache() for i in db.issue.list(): db.issue.get(i, 'title') times.append(('fetch', time())) # journals db.clearCache() for i in db.issue.list(): db.issue.history(i) times.append(('journal', time())) # "calculated" props db.clearCache() for i in db.issue.list(): db.issue.get(i, 'activity') db.issue.get(i, 'creator') db.issue.get(i, 'creation') times.append(('jprops', time())) # lookup db.clearCache() for i in range(numissues): db.user.lookup('user %s'%i) times.append(('lookup', time())) # filter db.clearCache() for i in range(100): db.issue.filter(None, {'assignedto': '1', 'title':'issue'}, ('+', 'activity'), ('+', 'status')) times.append(('filter', time())) # filter with multilink db.clearCache() for i in range(100): db.issue.filter(None, {'nosy': ['1'], 'assignedto': '1', 'title':'issue'}, ('+', 'activity'), ('+', 'status')) times.append(('filtml', time())) # results last = None for event, stamp in times: if last is None: first = stamp else: sys.stdout.write(' %-6.2f'%(stamp-last)) last = stamp print ' %-6.2f'%(last-first) sys.stdout.flush() if __name__ == '__main__': # 0 1 2 3 4 5 6 # 01234567890123456789012345678901234567890123456789012345678901234 print 'Test name fetch journl jprops lookup filter filtml TOTAL ' for name in 'anydbm metakit sqlite'.split(): main(name) for name in 'anydbm metakit sqlite'.split(): main(name, numissues=20) for name in 'anydbm metakit sqlite'.split(): main(name, numissues=100) # don't even bother benchmarking the dbm backends > 100! for name in 'metakit sqlite'.split(): main(name, numissues=1000) # vim: set et sts=4 sw=4 :
