From a3e304d522623f64890e898b995f3454a1f445fe Mon Sep 17 00:00:00 2001
From: Alexander Aghili <alexander.w.aghili@gmail.com>
Date: Thu, 13 Mar 2025 22:20:42 -0700
Subject: [PATCH] added new b asic prozxy

---
 tests/proxy/basic_proxy.py | 43 +++++++++++++++++++++++++++++++++-----
 1 file changed, 38 insertions(+), 5 deletions(-)

diff --git a/tests/proxy/basic_proxy.py b/tests/proxy/basic_proxy.py
index e2a8762..c3c97d7 100644
--- a/tests/proxy/basic_proxy.py
+++ b/tests/proxy/basic_proxy.py
@@ -4,7 +4,7 @@ from ...utils.util import Logger
 from ..helper import KVSMultiClient, KVSTestFixture
 from ...utils.kvs_api import DEFAULT_TIMEOUT
 
-def basic_proxy(conductor: ClusterConductor, dir, log: Logger):
+def basic_proxy_one_client(conductor: ClusterConductor, dir, log: Logger):
     with KVSTestFixture(conductor, dir, log, node_count=4) as fx:
         c = KVSMultiClient(fx.clients, "client", log)
         conductor.add_shard("shard1", conductor.get_nodes([0, 1]))
@@ -17,18 +17,51 @@ def basic_proxy(conductor: ClusterConductor, dir, log: Logger):
 
         node_to_put = 0
         base_key = "key"
-        for i in range(0, 50):
+        for i in range(0, 300):
             r = c.put(node_to_put, f"{base_key}{i}", f"{i}", timeout=10)
             assert r.ok, f"expected ok for new key, got {r.status_code}"
             node_to_put += 1
             node_to_put = node_to_put % 4
 
-        r = c.get_all(0, timeout=10) # should get all of shard 1's keys
+        r = c.get_all(0, timeout=None) # should get all of shard 1's keys
         assert r.ok, f"expected ok for get, got {r.status_code}"
         items = r.json()["items"]
         keys = items.keys()
         for key in keys:
-            r = c.get(2, key, timeout=10)
+            r = c.get(2, key, timeout=30)
+            assert r.ok, f"expected ok for get, got {r.status_code}"
+            assert r.json()["value"] == items[key], f"wrong value returned: {r.json()}"
+
+        return True, "ok"
+
+
+def basic_proxy_many_clients(conductor: ClusterConductor, dir, log: Logger):
+    with KVSTestFixture(conductor, dir, log, node_count=7) as fx:
+        c = KVSMultiClient(fx.clients, "client", log)
+        conductor.add_shard("shard1", conductor.get_nodes([0, 1]))
+        conductor.add_shard("shard2", conductor.get_nodes([2, 3]))
+        conductor.add_shard("shard3", conductor.get_nodes([4, 5, 6]))
+        fx.broadcast_view(conductor.get_shard_view())
+        # test 1
+        # put 50 keys (at least one proxy expected here)
+        # get_all() on one shard
+        # then ask the other shard for that key (proxy MUST happen here)
+
+        node_to_put = 0
+        base_key = "key"
+        for i in range(0, 1000):
+            c1 = KVSMultiClient(fx.clients, "client", log)
+            r = c1.put(node_to_put, f"{base_key}{i}", f"{i}", timeout=10)
+            assert r.ok, f"expected ok for new key, got {r.status_code}"
+            node_to_put += 1
+            node_to_put = node_to_put % 7
+
+        r = c.get_all(0, timeout=None) # should get all of shard 1's keys
+        assert r.ok, f"expected ok for get, got {r.status_code}"
+        items = r.json()["items"]
+        keys = items.keys()
+        for key in keys:
+            r = c.get(2, key, timeout=30)
             assert r.ok, f"expected ok for get, got {r.status_code}"
             assert r.json()["value"] == items[key], f"wrong value returned: {r.json()}"
 
@@ -44,4 +77,4 @@ def partitioned_shards(conductor: ClusterConductor, dir, log: Logger):
         # have a time out where if it doesnt hang after like 50 keys, then its just wrong.
         return True, "ok"
 
-PROXY_TESTS = [TestCase("basic_proxy", basic_proxy)]
\ No newline at end of file
+PROXY_TESTS = [TestCase("basic_proxy_one_client", basic_proxy_one_client), TestCase("basic_proxy_many_clients", basic_proxy_many_clients)]
-- 
GitLab