4
4
import re
5
5
import logging
6
6
from locust import HttpUser , task , between
7
+ from requests .adapters import HTTPAdapter
7
8
8
9
def id_generator (size = 6 , chars = string .ascii_uppercase + string .digits ):
9
10
return '' .join (random .choice (chars ) for _ in range (size ))
@@ -14,7 +15,7 @@ class admin(HttpUser):
14
15
num_editors = 0
15
16
admin_instance = None
16
17
blogpage_id = None
17
- stopped = False
18
+ homepage_id = None
18
19
19
20
def make_new_editor (self ):
20
21
with self .client .post (f"/admin/users/new/" , data = {
@@ -37,7 +38,7 @@ def make_new_editor(self):
37
38
return admin .num_editors - 1
38
39
39
40
def make_blog_index_page (self ):
40
- with self .client .post ("/admin/pages/add/blog/blogindexpage/3 /" , data = {
41
+ with self .client .post (f "/admin/pages/add/blog/blogindexpage/{ admin . get_homepage_id () } /" , data = {
41
42
"title" : "Blog" ,
42
43
"slug" : "blog" ,
43
44
"intro" : """{"blocks":[{"key":"60mvf","text":"This is our blog!","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}}],"entityMap":{}}""" ,
@@ -54,31 +55,12 @@ def make_blog_index_page(self):
54
55
}, catch_response = True ) as response :
55
56
response .success ()
56
57
57
- def make_home_page (self ):
58
- with self .client .post ("/admin/pages/add/home/homepage/1/" , data = {
59
- "title" : "Home" ,
60
- "slug" : "home" ,
61
- "comment_notifications" : "on" ,
62
- "comments-TOTAL_FORMS" : "0" ,
63
- "comments-INITIAL_FORMS" : "0" ,
64
- "comments-MIN_NUM_FORMS" : "0" ,
65
- "action-publish" : "action-publish" ,
66
- "csrfmiddlewaretoken" : self .csrftoken ,
67
- }, headers = {
68
- 'X-CSRFToken' : self .csrftoken ,
69
- }, cookies = {
70
- "csrftoken" : self .csrftoken ,
71
- }, catch_response = True ) as response :
72
- response .success ()
73
-
74
58
def on_start (self ):
75
59
# create csrf token
76
60
response = self .client .get ("/admin/login/" )
77
61
self .csrftoken = response .cookies ['csrftoken' ]
78
62
79
63
self .login ()
80
-
81
- self .make_home_page ()
82
64
self .make_blog_index_page ()
83
65
84
66
def login (self ):
@@ -93,7 +75,7 @@ def login(self):
93
75
"csrftoken" : self .csrftoken ,
94
76
})
95
77
96
- def on_stop (self ):
78
+ def delete_editors (self ):
97
79
# get list of user Ids and delete them
98
80
ids_to_delete = set ()
99
81
@@ -117,18 +99,16 @@ def on_stop(self):
117
99
}, cookies = {
118
100
"csrftoken" : self .csrftoken ,
119
101
})
120
-
121
- # delete blog
122
- response = self .client .post (f"/admin/pages/{ admin .get_blogpage_id ()} /delete/" , data = {
102
+
103
+ def delete_blog ( self ):
104
+ self .client .post (f"/admin/pages/{ admin .get_blogpage_id ()} /delete/" , data = {
123
105
"csrfmiddlewaretoken" : self .csrftoken ,
124
106
}, headers = {
125
107
'X-CSRFToken' : self .csrftoken ,
126
108
}, cookies = {
127
109
"csrftoken" : self .csrftoken ,
128
110
})
129
111
130
- admin .stopped = True
131
-
132
112
@staticmethod
133
113
def create_editor (env ):
134
114
if not admin .admin_instance :
@@ -139,17 +119,30 @@ def create_editor(env):
139
119
@staticmethod
140
120
def get_blogpage_id ():
141
121
if not admin .blogpage_id :
142
- with admin .admin_instance .client .get (f"/admin/pages/3 /" , catch_response = True ) as response :
122
+ with admin .admin_instance .client .get (f"/admin/pages/{ admin . get_homepage_id () } /" , catch_response = True ) as response :
143
123
response .success ()
144
- admin .blogpage_id = re .findall (r'href=" /admin/pages/(\d+)/add_subpage' , response .text )[- 1 ]
124
+ admin .blogpage_id = re .findall (r'/admin/pages/(\d+)/add_subpage' , response .text )[- 1 ]
145
125
return admin .blogpage_id
146
126
127
+ @staticmethod
128
+ def get_homepage_id ():
129
+ if not admin .homepage_id :
130
+ with admin .admin_instance .client .get (f"/admin/pages/" , catch_response = True ) as response :
131
+ response .success ()
132
+ admin .homepage_id = re .findall (r'/admin/pages/(\d+)/add_subpage' , response .text )[- 1 ]
133
+ return admin .homepage_id
134
+
147
135
148
136
class editor (HttpUser ):
149
137
wait_time = between (5 , 10 )
150
138
fixed_count = 1000
151
139
weight = 10
152
140
blogs = set () # set of blog slugs
141
+ num_instances = 0
142
+
143
+ def __init__ (self , * args , ** kwargs ):
144
+ super ().__init__ (* args , ** kwargs )
145
+ self .client .mount ('http://' , HTTPAdapter (pool_maxsize = editor .fixed_count ))
153
146
154
147
def on_start (self ):
155
148
# create csrf token
@@ -160,11 +153,12 @@ def on_start(self):
160
153
self .logged_in = False
161
154
162
155
self .login ()
156
+ editor .num_instances += 1
163
157
164
158
def on_stop (self ):
165
- if admin . stopped :
166
- return
167
- admin .admin_instance .on_stop ()
159
+ editor . num_instances -= 1
160
+ if editor . num_instances == 0 :
161
+ admin .admin_instance .delete_editors ()
168
162
169
163
def login (self ):
170
164
# login as editor
@@ -218,14 +212,27 @@ def create_blog_post(self):
218
212
editor .blogs .add (blog_slug )
219
213
220
214
221
-
222
215
class reader (HttpUser ):
223
216
wait_time = between (1 , 3 )
224
217
fixed_count = 10000
225
218
weight = 1
219
+ num_instances = 0
220
+
221
+ def __init__ (self , * args , ** kwargs ):
222
+ super ().__init__ (* args , ** kwargs )
223
+ self .client .mount ('http://' , HTTPAdapter (pool_maxsize = reader .fixed_count ))
224
+
225
+ def on_start (self ):
226
+ reader .num_instances += 1
227
+
228
+ def on_stop (self ):
229
+ reader .num_instances -= 1
230
+ if reader .num_instances == 0 :
231
+ admin .admin_instance .delete_blog ()
226
232
227
233
@task
228
234
def view_blog_index (self ):
235
+ if not admin .blogpage_id : return
229
236
with self .client .get ("/blog/" , catch_response = True ) as response :
230
237
response .success ()
231
238
0 commit comments