diff --git a/smoketests/__init__.py b/smoketests/__init__.py index 883ce063df1..be35ded6451 100644 --- a/smoketests/__init__.py +++ b/smoketests/__init__.py @@ -35,6 +35,9 @@ # and a dotnet installation is detected HAVE_DOTNET = False +# default value can be overriden by `--compose-file` flag +COMPOSE_FILE = "./docker-compose.yml" + # we need to late-bind the output stream to allow unittests to capture stdout/stderr. class CapturableHandler(logging.StreamHandler): diff --git a/smoketests/__main__.py b/smoketests/__main__.py index b82683aa962..5a3b97efd3d 100644 --- a/smoketests/__main__.py +++ b/smoketests/__main__.py @@ -15,7 +15,7 @@ def check_docker(): docker_ps = smoketests.run_cmd("docker", "ps", "--format=json") docker_ps = (json.loads(line) for line in docker_ps.splitlines()) for docker_container in docker_ps: - if "node" in docker_container["Image"]: + if "node" in docker_container["Image"] or "spacetime" in docker_container["Image"]: return docker_container["Names"] else: print("Docker container not found, is SpacetimeDB running?") @@ -79,6 +79,7 @@ def main(): # have docker logs print concurrently with the test output if args.compose_file: subprocess.Popen(["docker", "compose", "-f", args.compose_file, "logs", "-f"]) + smoketests.COMPOSE_FILE = args.compose_file else: docker_container = check_docker() subprocess.Popen(["docker", "logs", "-f", docker_container]) diff --git a/smoketests/tests/replication.py b/smoketests/tests/replication.py new file mode 100644 index 00000000000..b7de514eccb --- /dev/null +++ b/smoketests/tests/replication.py @@ -0,0 +1,48 @@ +import time +from .. import Smoketest, run_cmd, requires_docker +from .zz_docker import restart_docker, kill_node +#@requires_docker +class ReplicationTest(Smoketest): + MODULE_CODE = """ +use spacetimedb::{ReducerContext, Table}; + +#[spacetimedb::table(name = message, public)] +pub struct Message { + #[primary_key] + #[auto_inc] + id: u64, + text: String, +} + +#[spacetimedb::reducer] +fn send_message(ctx: &ReducerContext, text: String) { + ctx.db.message().insert(Message {id:0, text}); +} + +""" + def test_leader_failure(self): + """This test deploys a module with a scheduled reducer and check if client receives subscription update for scheduled table entry and deletion of reducer once it ran""" + print("hey") + # subscribe to empy scheduled_table + sub = self.subscribe("SELECT * FROM message", n=2) + + time.sleep(1) + for i in range(1,2): # Iterating from 1 to 100 + self.call("send_message", i) + + + leader = self.leader_node(); + print("leader", leader); + kill_node(leader) + restart_docker() + + time.sleep(1) + for i in range(5, 6): # Iterating from 1 to 100 + self.call("send_message", i) + + + leader = self.leader_node(); + print("leader", leader); + # print(sub()) + exit(1) + diff --git a/smoketests/tests/zz_docker.py b/smoketests/tests/zz_docker.py index 58ded478d0c..ac48077448f 100644 --- a/smoketests/tests/zz_docker.py +++ b/smoketests/tests/zz_docker.py @@ -1,21 +1,22 @@ import time -from .. import Smoketest, run_cmd, requires_docker +from .. import Smoketest, run_cmd, requires_docker, COMPOSE_FILE from urllib.request import urlopen from .add_remove_index import AddRemoveIndex def restart_docker(): + # Behold! # # You thought stop/start restarts? How wrong. Restart restarts. - run_cmd("docker", "compose", "restart") + run_cmd("docker", "compose", "-f", COMPOSE_FILE, "restart") # The suspense! # # Wait until compose believes the health probe succeeds. # # The container may decide to recompile, or grab a coffee at crates.io, or # whatever. In any case, restart doesn't mean the server is up yet. - run_cmd("docker", "compose", "up", "--no-recreate", "--detach", "--wait-timeout", "60") + run_cmd("docker", "compose","-f", COMPOSE_FILE, "up", "--no-recreate", "--detach", "--wait-timeout", "60") # Belts and suspenders! # # The health probe runs inside the container, but that doesn't mean we can