From 7878b9fe67cfb44000528b74d175cbcf1cea59cc Mon Sep 17 00:00:00 2001
From: lincyaw <814750204@qq.com>
Date: Sun, 25 Feb 2024 11:45:59 +0800
Subject: [PATCH] feat: strengthen the load generator with fuzz input

---
 src/loadgenerator/locustfile.py    | 35 ++++++++++++++++++++----------
 src/loadgenerator/requirements.in  |  1 +
 src/loadgenerator/requirements.txt | 16 +++++++++++---
 3 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/src/loadgenerator/locustfile.py b/src/loadgenerator/locustfile.py
index 7874fc7a01b..8522522926f 100644
--- a/src/loadgenerator/locustfile.py
+++ b/src/loadgenerator/locustfile.py
@@ -16,6 +16,9 @@
 
 import random
 from locust import HttpUser, TaskSet, between
+from faker import Faker
+import datetime
+fake = Faker()
 
 products = [
     '0PUK6V6EV0',
@@ -32,7 +35,7 @@ def index(l):
     l.client.get("/")
 
 def setCurrency(l):
-    currencies = ['EUR', 'USD', 'JPY', 'CAD']
+    currencies = ['EUR', 'USD', 'JPY', 'CAD', 'GBP', 'TRY']
     l.client.post("/setCurrency",
         {'currency_code': random.choice(currencies)})
 
@@ -47,22 +50,30 @@ def addToCart(l):
     l.client.get("/product/" + product)
     l.client.post("/cart", {
         'product_id': product,
-        'quantity': random.choice([1,2,3,4,5,10])})
+        'quantity': random.randint(1,100)})
+    
+def empty_cart(l):
+    l.client.post('/cart/empty')
 
 def checkout(l):
     addToCart(l)
+    current_year = datetime.datetime.now().year+1
     l.client.post("/cart/checkout", {
-        'email': 'someone@example.com',
-        'street_address': '1600 Amphitheatre Parkway',
-        'zip_code': '94043',
-        'city': 'Mountain View',
-        'state': 'CA',
-        'country': 'United States',
-        'credit_card_number': '4432-8015-6152-0454',
-        'credit_card_expiration_month': '1',
-        'credit_card_expiration_year': '2039',
-        'credit_card_cvv': '672',
+        'email': fake.email(),
+        'street_address': fake.street_address(),
+        'zip_code': fake.zipcode(),
+        'city': fake.city(),
+        'state': fake.state_abbr(),
+        'country': fake.country(),
+        'credit_card_number': fake.credit_card_number(card_type="visa"),
+        'credit_card_expiration_month': random.randint(1, 12),
+        'credit_card_expiration_year': random.randint(current_year, current_year + 70),
+        'credit_card_cvv': f"{random.randint(100, 999)}",
     })
+    
+def logout(l):
+    l.client.get('/logout')  
+
 
 class UserBehavior(TaskSet):
 
diff --git a/src/loadgenerator/requirements.in b/src/loadgenerator/requirements.in
index be8436126b5..21dcb0baade 100644
--- a/src/loadgenerator/requirements.in
+++ b/src/loadgenerator/requirements.in
@@ -1 +1,2 @@
 locust==2.22.0
+faker==23.2.1
\ No newline at end of file
diff --git a/src/loadgenerator/requirements.txt b/src/loadgenerator/requirements.txt
index 774320b8fc7..dc17329a12c 100644
--- a/src/loadgenerator/requirements.txt
+++ b/src/loadgenerator/requirements.txt
@@ -1,8 +1,8 @@
 #
-# This file is autogenerated by pip-compile with Python 3.11
+# This file is autogenerated by pip-compile with Python 3.9
 # by the following command:
 #
-#    pip-compile --output-file=requirements.txt requirements.in
+#    pip-compile requirements.in
 #
 blinker==1.7.0
     # via flask
@@ -18,6 +18,8 @@ click==8.1.7
     # via flask
 configargparse==1.7
     # via locust
+faker==23.2.1
+    # via -r requirements.in
 flask==3.0.2
     # via
     #   flask-cors
@@ -37,6 +39,8 @@ greenlet==3.0.3
     # via gevent
 idna==3.6
     # via requests
+importlib-metadata==7.0.1
+    # via flask
 itsdangerous==2.1.2
     # via flask
 jinja2==3.1.3
@@ -51,6 +55,8 @@ msgpack==1.0.7
     # via locust
 psutil==5.9.8
     # via locust
+python-dateutil==2.8.2
+    # via faker
 pyzmq==25.1.2
     # via locust
 requests==2.31.0
@@ -58,7 +64,9 @@ requests==2.31.0
 roundrobin==0.0.4
     # via locust
 six==1.16.0
-    # via geventhttpclient
+    # via
+    #   geventhttpclient
+    #   python-dateutil
 urllib3==2.2.0
     # via requests
 werkzeug==3.0.1
@@ -66,6 +74,8 @@ werkzeug==3.0.1
     #   flask
     #   flask-login
     #   locust
+zipp==3.17.0
+    # via importlib-metadata
 zope-event==5.0
     # via gevent
 zope-interface==6.1