summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/pixelated/resources/mails_resource.py2
-rw-r--r--service/test/load/locustfile.py74
-rw-r--r--service/test_requirements.txt1
3 files changed, 76 insertions, 1 deletions
diff --git a/service/pixelated/resources/mails_resource.py b/service/pixelated/resources/mails_resource.py
index 7b5d1af4..61ada60e 100644
--- a/service/pixelated/resources/mails_resource.py
+++ b/service/pixelated/resources/mails_resource.py
@@ -217,7 +217,7 @@ class MailsResource(BaseResource):
with_attachment_content = yield self._fetch_attachment_contents(content_dict, _mail_service)
sent_mail = yield _mail_service.send_mail(with_attachment_content)
- respond_json_deferred(sent_mail.as_dict(), request)
+ respond_json_deferred(sent_mail.as_dict(), request, status_code=201)
@defer.inlineCallbacks
def _handle_put(self, request):
diff --git a/service/test/load/locustfile.py b/service/test/load/locustfile.py
new file mode 100644
index 00000000..7aca10e5
--- /dev/null
+++ b/service/test/load/locustfile.py
@@ -0,0 +1,74 @@
+import os
+import json
+import time
+from random import randint
+
+from leap.auth import SRPAuth
+from leap.exceptions import SRPAuthenticationError
+from locust import HttpLocust, TaskSet, task
+from pixelated.resources.login_resource import LoginResource
+
+LEAP_PROVIDER = os.environ.get('LEAP_PROVIDER', 'dev.pixelated-project.org')
+LEAP_SERVER_HOST = os.environ.get('LEAP_SERVER_HOST', 'https://api.%s:4430' % LEAP_PROVIDER)
+LEAP_VERIFY_CERTIFICATE = os.environ.get('LEAP_VERIFY_CERTIFICATE', '~/.leap/ca.crt')
+MAX_NUMBER_USER = os.environ.get('MAX_NUMBER_USER', 10000)
+INVITES_FILENAME = os.environ.get('INVITES_FILENAME', '/tmp/invite_codes.txt')
+
+
+def load_invite_from_number(number):
+ with open(INVITES_FILENAME) as invites_file:
+ lines = invites_file.readlines()
+ return lines[number].strip()
+
+
+class UserBehavior(TaskSet):
+ def on_start(self):
+ """ on_start is called when a Locust start before any task is scheduled """
+ self.login()
+
+ def _get_or_create_user(self, number):
+ srp_auth = SRPAuth(LEAP_SERVER_HOST, os.path.expanduser(LEAP_VERIFY_CERTIFICATE))
+ username, password = ('loadtest%d' % number), ('password_%d' % number)
+# username, password = 'loadtest123', 'asdfasdf'
+ try:
+ srp_auth.authenticate(username, password)
+ except SRPAuthenticationError:
+ srp_auth.register(username, password, load_invite_from_number(number))
+ return username, password
+
+ def login(self):
+ number = randint(1, int(MAX_NUMBER_USER))
+ username, password = self._get_or_create_user(number)
+ self.client.post("/%s" % LoginResource.BASE_URL, {"username": username, "password": password})
+ self.username = username
+ time.sleep(5)
+
+ @task(1)
+ def index(self):
+ self.client.get("/")
+
+ @task(2)
+ def mail_box(self):
+ self.client.get("/mails?q=tag:'inbox'&p=1&w=25")
+
+ @task(3)
+ def send_mail(self):
+ payload = {"tags": ["drafts"], "body": "some text lorem ipsum", "attachments": [], "ident": "",
+ "header": {"to": ["%s@%s" % (self.username, LEAP_PROVIDER)], "cc": [], "bcc": [], "subject": "load testing"}}
+ with self.client.post('/mails', json=payload, catch_response=True) as email_response:
+ if email_response.status_code == 201:
+ email_id = json.loads(email_response.content)['ident']
+ print email_id
+ self.delete_mail(email_id)
+ else:
+ email_response.failure('Error: email not Sent, status code: %s' % email_response.status_code)
+
+ def delete_mail(self, ident):
+ payload = {"idents": [ident]}
+ self.client.post('/mails/delete', json=payload)
+
+
+class WebsiteUser(HttpLocust):
+ task_set = UserBehavior
+ min_wait = 3000
+ max_wait = 15000
diff --git a/service/test_requirements.txt b/service/test_requirements.txt
index e53c1ad7..c1d12c78 100644
--- a/service/test_requirements.txt
+++ b/service/test_requirements.txt
@@ -10,3 +10,4 @@ tempdir==0.6
coverage
crochet==1.4.0
poster==0.8.1
+locust \ No newline at end of file