From d57069856fd074ee77f82e82dc1e65deb12e90d7 Mon Sep 17 00:00:00 2001
From: PurvaG1700 <purvag1700@gmail.com>
Date: Sun, 2 Mar 2025 23:49:26 -0800
Subject: [PATCH] [ADD]- Added end to end varied workloads

---
 requirements.txt         |  1 +
 tests/varied_workload.py | 77 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 78 insertions(+)
 create mode 100644 tests/varied_workload.py

diff --git a/requirements.txt b/requirements.txt
index 49165e4..07b0ad1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,3 +3,4 @@ uvicorn
 tinydb
 pyyaml
 requests
+tqdm
\ No newline at end of file
diff --git a/tests/varied_workload.py b/tests/varied_workload.py
new file mode 100644
index 0000000..fe234c3
--- /dev/null
+++ b/tests/varied_workload.py
@@ -0,0 +1,77 @@
+import requests
+import random
+import json
+import time
+from tqdm import tqdm
+from utils import print_report
+
+baseurl = "http://localhost:8000"
+
+# Fetch all user IDs and friends list
+user_ids = json.loads(requests.get(baseurl + "/users").content)["ids"]
+user_friends = json.loads(requests.get(baseurl + "/users_and_friends").content)
+
+random.seed(0)
+
+# Workload Configurations
+workloads = {
+    "read_heavy": {"read": 0.8, "write": 0.2},
+    "write_heavy": {"read": 0.2, "write": 0.8},
+    "random_read": {"read": 1.0, "write": 0.0},
+    "frequent_users": {"read": 1.0, "write": 0.0, "frequent_percent": 0.7},
+    "frequent_after_write": {"read": 0.7, "write": 0.3},
+    "friend_based": {"read": 1.0, "write": 0.0, "friend_access": 0.7},
+}
+
+# Frequent users for workload testing (top 10 users)
+frequent_users = user_ids[:10]
+
+def generate_request(workload, last_updated=None):
+    """Generate read or write requests based on workload type"""
+    if random.random() < workload["read"]:
+        user_id = select_user(workload, last_updated)
+        return baseurl + f"/user/{user_id}", "GET"
+
+    # Write operation (updates user profile)
+    user_id = select_user(workload, last_updated)
+    url = baseurl + f"/update_user/?user_id={user_id}&name=UpdatedUser&followers=500&bio=Updated&posts=UpdatedPost"
+    return url, "POST"
+
+def select_user(workload, last_updated):
+    """Selects a user based on workload type"""
+    if "frequent_percent" in workload and random.random() < workload["frequent_percent"]:
+        return random.choice(frequent_users)
+
+    if "friend_access" in workload and random.random() < workload["friend_access"]:
+        return random.choice(user_friends.get(str(last_updated), user_ids))
+
+    return random.choice(user_ids)
+
+def run_workload(name, workload):
+    """Run a workload and log performance metrics"""
+    times = []
+    hits = []
+    start = time.time()
+    last_updated = None
+
+    for _ in tqdm(range(10000), desc=f"Running {name}"):
+        url, method = generate_request(workload, last_updated)
+        response = requests.request(method, url)
+
+        try:
+            content = json.loads(response.content)
+            if "time_ms" in content:
+                times.append(content["time_ms"])
+                hits.append(content["source"] == "cache")
+                if method == "POST":
+                    last_updated = content.get("user_id", last_updated)
+        except (json.JSONDecodeError, KeyError):
+            print(f"Error processing response: {response.content}")
+
+    end = time.time()
+    print(f"\n--- {name} Results ---")
+    print_report(hits, times, end - start)
+
+# Run all workloads
+for workload_name, workload_config in workloads.items():
+    run_workload(workload_name, workload_config)