Improve e2e and replication testing setup (#1061)
* Add `--replication-restore-state-on-startup` with `false` as default Co-authored-by: Aidar Samerkhanov <aidar.samerkhanov@memgraph.io> Co-authored-by: Andi Skrgat <andi8647@gmail.com>
This commit is contained in:
13
tests/e2e/README.md
Normal file
13
tests/e2e/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# tests/e2e
|
||||
|
||||
Framework to run end-to-end tests against Memgraph.
|
||||
|
||||
## Notes
|
||||
|
||||
* If you change something under this directory and below (even a Python
|
||||
script), `make` has to be run again because all tests are copied to the build
|
||||
directory and executed from there.
|
||||
* Use/extend `run.sh` if you run any e2e tests:
|
||||
* if all tests have to executed, use `run.sh`
|
||||
* if a suite of tests have to be execute, take a look under `run.sh` how to do so
|
||||
* if only a single test have to be execute, take a look at each individual binary/script, it's possible to manually pick the test
|
||||
@@ -187,4 +187,9 @@ startup_config_dict = {
|
||||
"Path to cypherl file that is used for configuring users and database schema before server starts.",
|
||||
),
|
||||
"init_data_file": ("", "", "Path to cypherl file that is used for creating data after server starts."),
|
||||
"replication_restore_state_on_startup": (
|
||||
"false",
|
||||
"false",
|
||||
"Restore replication state on startup, e.g. recover replica",
|
||||
),
|
||||
}
|
||||
|
||||
@@ -33,13 +33,11 @@
|
||||
import atexit
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
from argparse import ArgumentParser
|
||||
from inspect import signature
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
|
||||
@@ -77,9 +75,9 @@ ACTIONS = {
|
||||
"info": lambda context: info(context),
|
||||
"stop": lambda context, name: stop(context, name),
|
||||
"start": lambda context, name: start(context, name),
|
||||
"sleep": lambda context, delta: time.sleep(float(delta)),
|
||||
"exit": lambda context: sys.exit(1),
|
||||
"quit": lambda context: sys.exit(1),
|
||||
"sleep": lambda _, delta: time.sleep(float(delta)),
|
||||
"exit": lambda _: sys.exit(1),
|
||||
"quit": lambda _: sys.exit(1),
|
||||
}
|
||||
|
||||
log = logging.getLogger("memgraph.tests.e2e")
|
||||
|
||||
@@ -13,7 +13,6 @@ import copy
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
|
||||
import mgclient
|
||||
|
||||
@@ -147,27 +147,33 @@ def test_basic_recovery(connection):
|
||||
data_directory = tempfile.TemporaryDirectory()
|
||||
CONFIGURATION = {
|
||||
"replica_1": {
|
||||
"args": ["--bolt-port", "7688", "--log-level=TRACE"],
|
||||
"args": ["--bolt-port", "7688", "--log-level=TRACE", "--replication-restore-state-on-startup=true"],
|
||||
"log_file": "replica1.log",
|
||||
"setup_queries": ["SET REPLICATION ROLE TO REPLICA WITH PORT 10001;"],
|
||||
},
|
||||
"replica_2": {
|
||||
"args": ["--bolt-port", "7689", "--log-level=TRACE"],
|
||||
"args": ["--bolt-port", "7689", "--log-level=TRACE", "--replication-restore-state-on-startup=true"],
|
||||
"log_file": "replica2.log",
|
||||
"setup_queries": ["SET REPLICATION ROLE TO REPLICA WITH PORT 10002;"],
|
||||
},
|
||||
"replica_3": {
|
||||
"args": ["--bolt-port", "7690", "--log-level=TRACE"],
|
||||
"args": ["--bolt-port", "7690", "--log-level=TRACE", "--replication-restore-state-on-startup=true"],
|
||||
"log_file": "replica3.log",
|
||||
"setup_queries": ["SET REPLICATION ROLE TO REPLICA WITH PORT 10003;"],
|
||||
},
|
||||
"replica_4": {
|
||||
"args": ["--bolt-port", "7691", "--log-level=TRACE"],
|
||||
"args": ["--bolt-port", "7691", "--log-level=TRACE", "--replication-restore-state-on-startup=true"],
|
||||
"log_file": "replica4.log",
|
||||
"setup_queries": ["SET REPLICATION ROLE TO REPLICA WITH PORT 10004;"],
|
||||
},
|
||||
"main": {
|
||||
"args": ["--bolt-port", "7687", "--log-level=TRACE", "--storage-recover-on-startup=true"],
|
||||
"args": [
|
||||
"--bolt-port",
|
||||
"7687",
|
||||
"--log-level=TRACE",
|
||||
"--storage-recover-on-startup=true",
|
||||
"--replication-restore-state-on-startup=true",
|
||||
],
|
||||
"log_file": "main.log",
|
||||
"setup_queries": [],
|
||||
"data_directory": f"{data_directory.name}",
|
||||
@@ -359,13 +365,19 @@ def test_replication_role_recovery(connection):
|
||||
data_directory = tempfile.TemporaryDirectory()
|
||||
CONFIGURATION = {
|
||||
"replica": {
|
||||
"args": ["--bolt-port", "7688", "--log-level=TRACE"],
|
||||
"args": ["--bolt-port", "7688", "--log-level=TRACE", "--replication-restore-state-on-startup=true"],
|
||||
"log_file": "replica.log",
|
||||
"setup_queries": ["SET REPLICATION ROLE TO REPLICA WITH PORT 10001;"],
|
||||
"data_directory": f"{data_directory.name}/replica",
|
||||
},
|
||||
"main": {
|
||||
"args": ["--bolt-port", "7687", "--log-level=TRACE", "--storage-recover-on-startup=true"],
|
||||
"args": [
|
||||
"--bolt-port",
|
||||
"7687",
|
||||
"--log-level=TRACE",
|
||||
"--storage-recover-on-startup=true",
|
||||
"--replication-restore-state-on-startup=true",
|
||||
],
|
||||
"log_file": "main.log",
|
||||
"setup_queries": [],
|
||||
"data_directory": f"{data_directory.name}/main",
|
||||
@@ -381,13 +393,19 @@ def test_replication_role_recovery(connection):
|
||||
# When we restart the replica, it does not need this query anymore since it needs to remember state
|
||||
CONFIGURATION = {
|
||||
"replica": {
|
||||
"args": ["--bolt-port", "7688", "--log-level=TRACE"],
|
||||
"args": ["--bolt-port", "7688", "--log-level=TRACE", "--replication-restore-state-on-startup=true"],
|
||||
"log_file": "replica.log",
|
||||
"setup_queries": [],
|
||||
"data_directory": f"{data_directory.name}/replica",
|
||||
},
|
||||
"main": {
|
||||
"args": ["--bolt-port", "7687", "--log-level=TRACE", "--storage-recover-on-startup=true"],
|
||||
"args": [
|
||||
"--bolt-port",
|
||||
"7687",
|
||||
"--log-level=TRACE",
|
||||
"--storage-recover-on-startup=true",
|
||||
"--replication-restore-state-on-startup=true",
|
||||
],
|
||||
"log_file": "main.log",
|
||||
"setup_queries": [],
|
||||
"data_directory": f"{data_directory.name}/main",
|
||||
@@ -511,17 +529,23 @@ def test_basic_recovery_when_replica_is_kill_when_main_is_down():
|
||||
data_directory = tempfile.TemporaryDirectory()
|
||||
CONFIGURATION = {
|
||||
"replica_1": {
|
||||
"args": ["--bolt-port", "7688", "--log-level=TRACE"],
|
||||
"args": ["--bolt-port", "7688", "--log-level=TRACE", "--replication-restore-state-on-startup=true"],
|
||||
"log_file": "replica1.log",
|
||||
"setup_queries": ["SET REPLICATION ROLE TO REPLICA WITH PORT 10001;"],
|
||||
},
|
||||
"replica_2": {
|
||||
"args": ["--bolt-port", "7689", "--log-level=TRACE"],
|
||||
"args": ["--bolt-port", "7689", "--log-level=TRACE", "--replication-restore-state-on-startup=true"],
|
||||
"log_file": "replica2.log",
|
||||
"setup_queries": ["SET REPLICATION ROLE TO REPLICA WITH PORT 10002;"],
|
||||
},
|
||||
"main": {
|
||||
"args": ["--bolt-port", "7687", "--log-level=TRACE", "--storage-recover-on-startup=true"],
|
||||
"args": [
|
||||
"--bolt-port",
|
||||
"7687",
|
||||
"--log-level=TRACE",
|
||||
"--storage-recover-on-startup=true",
|
||||
"--replication-restore-state-on-startup=true",
|
||||
],
|
||||
"log_file": "main.log",
|
||||
"setup_queries": [],
|
||||
"data_directory": f"{data_directory.name}",
|
||||
|
||||
37
tests/e2e/run.sh
Executable file
37
tests/e2e/run.sh
Executable file
@@ -0,0 +1,37 @@
|
||||
#!/bin/bash
|
||||
# TODO(gitbuda): Setup mgclient and pymgclient properly.
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../../libs/mgclient/lib
|
||||
|
||||
print_help() {
|
||||
echo -e "$0 ["workload name string"]"
|
||||
echo -e ""
|
||||
echo -e " NOTE: some tests require enterprise licence key,"
|
||||
echo -e " to run those define the folowing env vars:"
|
||||
echo -e " * MEMGRAPH_ORGANIZATION_NAME"
|
||||
echo -e " * MEMGRAPH_ENTERPRISE_LICENSE"
|
||||
exit 1
|
||||
}
|
||||
check_license() {
|
||||
if [ ! -v MEMGRAPH_ORGANIZATION_NAME ] || [ ! -v MEMGRAPH_ENTERPRISE_LICENSE ]; then
|
||||
echo "NOTE: MEMGRAPH_ORGANIZATION_NAME or MEMGRAPH_ENTERPRISE_LICENSE NOT defined -> dependent tests will NOT work"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "$#" -eq 0 ]; then
|
||||
check_license
|
||||
# NOTE: If you want to run all tests under specific folder/section just
|
||||
# replace the dot (root directory below) with the folder name, e.g.
|
||||
# `--workloads-root-directory replication`.
|
||||
python3 runner.py --workloads-root-directory .
|
||||
elif [ "$#" -eq 1 ]; then
|
||||
if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
|
||||
print_help
|
||||
fi
|
||||
check_license
|
||||
# NOTE: --workload-name comes from each individual folder/section
|
||||
# workloads.yaml file. E.g. `streams/workloads.yaml` has a list of
|
||||
# `workloads:` and each workload has it's `-name`.
|
||||
python3 runner.py --workloads-root-directory . --workload-name "$1"
|
||||
else
|
||||
print_help
|
||||
fi
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# TODO: andi as a side project
|
||||
python3 runner.py --workloads-root-directory disk_storage
|
||||
@@ -5,14 +5,6 @@ test_transaction_queue: &test_transaction_queue
|
||||
log_file: "transaction_queue.log"
|
||||
setup_queries: []
|
||||
validation_queries: []
|
||||
disk_test_transaction_queue: &disk_test_transaction_queue
|
||||
cluster:
|
||||
main:
|
||||
args: ["--bolt-port", "7687", "--log-level=TRACE", "--also-log-to-stderr"]
|
||||
log_file: "transaction_queue.log"
|
||||
setup_queries: ["STORAGE MODE ON_DISK_TRANSACTIONAL"]
|
||||
validation_queries: []
|
||||
|
||||
|
||||
workloads:
|
||||
- name: "test-transaction-queue" # should be the same as the python file
|
||||
@@ -20,8 +12,3 @@ workloads:
|
||||
proc: "tests/e2e/transaction_queue/procedures/"
|
||||
args: ["transaction_queue/test_transaction_queue.py"]
|
||||
<<: *test_transaction_queue
|
||||
- name: "test-transaction-queue on disk" # should be the same as the python file
|
||||
binary: "tests/e2e/pytest_runner.sh"
|
||||
proc: "tests/e2e/transaction_queue/procedures/"
|
||||
args: ["transaction_queue/test_transaction_queue.py"]
|
||||
<<: *disk_test_transaction_queue
|
||||
|
||||
Reference in New Issue
Block a user