-
Notifications
You must be signed in to change notification settings - Fork 105
Expand file tree
/
Copy pathsimpleloadtest.py
More file actions
127 lines (109 loc) · 3.92 KB
/
Copy pathsimpleloadtest.py
File metadata and controls
127 lines (109 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# A simple loadtest using locust.
# launch using: locust -f simpleloadtest.py --host=http://pencilcode.net
from locust import HttpLocust, TaskSet, task
import simplejson, random, os, resource, string, re
resource.setrlimit(resource.RLIMIT_NOFILE, (65536, 65536))
hosts = os.environ.get('SERVERS').split(',')
passfile = os.environ.get('PASSFILE')
passwords = {
'livetest': '123'
}
if passfile is not None:
passwords = simplejson.load(file(passfile))
listusers = True
class MyTaskSet(TaskSet):
def qualify(self, url):
result = 'http://' + random.choice(hosts) + url
return result
def userdomain(self, user):
if user is not None and len(user) > 0:
return user + '.pencilcode.net'
return 'pencilcode.net'
def topget(self, url):
name = re.sub('=[^&=]+', '=...', url)
return self.client.get(self.qualify(url),
headers={"User-Agent":"locust", "Host": self.userdomain(None)},
name=name)
def myget(self, user, url):
slashpos = url.find('/', 1) + 1 or len(url)
name = 'user:' + url[:slashpos]
if slashpos < len(url):
name += '...'
return self.client.get(self.qualify(url),
headers={"User-Agent":"locust", "Host": self.userdomain(user)},
name=name)
def mypost(self, user, url, data):
slashpos = url.find('/', 1) + 1 or len(url)
name = 'user:' + url[:slashpos]
if slashpos < len(url):
name += '...'
return self.client.post(self.qualify(url), data,
headers={"User-Agent":"locust", "Host": self.userdomain(user)},
name=name)
@task(1)
def index(self):
urls = ['/', '/welcome.css', '/image/vpencil-20-64.png',
'/image/art.png', '/image/music.png', '/image/adventure.png',
'/lib/jquery.js', '/lib/jquery.autocomplete.min.js',
'/lib/seedrandom.js', '/turtlebits.js']
if listusers:
urls.append('/load/?callback=loadusers')
if random.randrange(2) > 0:
prefix = random.choice(string.ascii_letters).lower();
else:
prefix = random.choice(passwords.keys())
urls.append('/load/?prefix=' + prefix)
for url in urls:
self.topget(url)
for url in ['/home/promo1', '/home/goldwheel-code.png']:
self.myget('promo', url)
@task(1)
def edit(self):
if listusers:
try:
topdir = self.topget("/load/").json()
except:
print 'error listing all users'
return
randuser = random.choice(topdir['list'])
randname = randuser['name']
if 'd' not in randuser['mode']:
return
else:
randname = random.choice(passwords.keys())
for url in ['/edit/', '/load/']:
self.myget(randname, url)
for url in ['/editor.js', '/favicon.ico',
'/apple-touch-icon.png']:
self.topget(url)
@task(1)
def browserandom(self):
randname = random.choice(passwords.keys())
try:
mydir = self.myget(randname, '/load/').json()
except Exception as e:
print 'error listing ' + randname + ' ' + str(e)
raise
if len(mydir['list']) == 0:
return
randfile = random.choice(mydir['list'])['name']
try:
self.myget(randname, '/load/' + randfile).json()
except Exception as e:
print 'error reading ' + randname + ' ' + randfile + ' ' + str(e)
raise
@task(1)
def saverandom(self):
randname = random.choice(passwords.keys())
try:
myok = self.mypost(randname, '/save/loadtest', {
'data': 'pen red\nfor [1..4]\n fd 100\n rt 90',
'key': passwords[randname]
}).json()
except Exception as e:
print 'error saving ' + randname + ' ' + str(e)
raise
class MyLocust(HttpLocust):
task_set = MyTaskSet
min_wait = 5000
max_wait = 20000