1 import sys, os, time, shutil
3 from roundup.hyperdb import String, Password, Link, Multilink, Date, \
4 Interval, DatabaseError, Boolean, Number
5 from roundup import date, password
6 from roundup.indexer import Indexer
8 def setupSchema(db, module):
9 status = module.Class(db, "status", name=String())
10 status.setkey("name")
11 user = module.Class(db, "user", username=String(), password=Password(),
12 assignable=Boolean(), age=Number(), roles=String())
13 user.setkey("username")
14 file = module.FileClass(db, "file", name=String(), type=String(),
15 comment=String(indexme="yes"))
16 issue = module.IssueClass(db, "issue", title=String(indexme="yes"),
17 status=Link("status"), nosy=Multilink("user"), deadline=Date(),
18 foo=Interval(), files=Multilink("file"), assignedto=Link('user'))
19 session = module.Class(db, 'session', title=String())
20 session.disableJournalling()
21 db.post_init()
22 status.create(name="unread")
23 status.create(name="in-progress")
24 status.create(name="testing")
25 status.create(name="resolved")
26 user.create(username='one')
27 user.create(username='two')
28 db.commit()
30 class config:
31 DATABASE='_test_dir'
32 GADFLY_DATABASE = ('test', DATABASE)
33 MAILHOST = 'localhost'
34 MAIL_DOMAIN = 'fill.me.in.'
35 TRACKER_NAME = 'Roundup issue tracker'
36 TRACKER_EMAIL = 'issue_tracker@%s'%MAIL_DOMAIN
37 TRACKER_WEB = 'http://some.useful.url/'
38 ADMIN_EMAIL = 'roundup-admin@%s'%MAIL_DOMAIN
39 FILTER_POSITION = 'bottom' # one of 'top', 'bottom', 'top and bottom'
40 ANONYMOUS_ACCESS = 'deny' # either 'deny' or 'allow'
41 ANONYMOUS_REGISTER = 'deny' # either 'deny' or 'allow'
42 MESSAGES_TO_AUTHOR = 'no' # either 'yes' or 'no'
43 EMAIL_SIGNATURE_POSITION = 'bottom'
45 def main(backendname, time=time.time, numissues=10):
46 try:
47 exec('from roundup.backends import %s as backend'%backendname)
48 except ImportError:
49 return
51 if os.path.exists(config.DATABASE):
52 shutil.rmtree(config.DATABASE)
54 times = []
55 db = backend.Database(config, 'test')
56 setupSchema(db, backend)
58 # create a whole bunch of stuff
59 for i in range(numissues):
60 db.issue.create(**{'title': 'issue %s'%i})
61 for j in range(10):
62 db.issue.set(str(i+1), status='2', assignedto='2', nosy=[])
63 db.issue.set(str(i+1), status='1', assignedto='1', nosy=['1','2'])
64 db.user.create(**{'username': 'user %s'%i})
65 for j in range(10):
66 db.user.set(str(i+1), assignable=1)
67 db.user.set(str(i+1), assignable=0)
68 db.commit()
69 sys.stdout.write('%7s: %-6d'%(backendname, numissues))
70 sys.stdout.flush()
72 times.append(('start', time()))
74 # fetch
75 for i in db.issue.list():
76 db.issue.get(i, 'title')
77 times.append(('fetch', time()))
79 # journals
80 for i in db.issue.list():
81 db.issue.history(i)
82 times.append(('journal', time()))
84 # "calculated" props
85 for i in db.issue.list():
86 db.issue.get(i, 'activity')
87 db.issue.get(i, 'creator')
88 db.issue.get(i, 'creation')
89 times.append(('jprops', time()))
91 # lookup
92 for i in range(numissues):
93 db.user.lookup('user %s'%i)
94 times.append(('lookup', time()))
96 # filter
97 for i in range(100):
98 db.issue.filter(None, {'nosy': ['1'], 'assignedto': '1',
99 'title':'issue'}, ('+', 'activity'), ('+', 'status'))
100 times.append(('filter', time()))
102 # results
103 last = None
104 for event, stamp in times:
105 if last is None:
106 first = stamp
107 else:
108 sys.stdout.write(' %-6.2f'%(stamp-last))
109 last = stamp
110 print ' %-6.2f'%(last-first)
111 sys.stdout.flush()
113 if __name__ == '__main__':
114 # 0 1 2 3 4 5 6
115 # 01234567890123456789012345678901234567890123456789012345678901234
116 print 'Test name fetch journl jprops lookup filter TOTAL '
117 for name in 'anydbm bsddb bsddb3 metakit sqlite'.split():
118 main(name)
119 for name in 'anydbm bsddb bsddb3 metakit sqlite'.split():
120 main(name, numissues=20)
121 # for name in 'anydbm bsddb bsddb3 metakit sqlite'.split():
122 # main(name, numissues=100)