From d3b9a792fa760922929430355dea19db2c3c79b1 Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Tue, 4 Apr 2023 11:58:53 +0200 Subject: [PATCH 01/11] ADR 013: bolt_agent, user_agent update, Bolt 5.3 * Update the default `user_agent` to conform the new common format * Added support for Bolt 5.3 with the new `bolt_agent` string --- boltstub/bolt_protocol.py | 13 +- nutkit/protocol/feature.py | 2 + .../scripts/{ => v5x0}/router.script | 0 .../{ => v5x0}/router_hello_delay.script | 0 .../{ => v5x0}/router_route_delay.script | 0 .../{ => v5x0}/router_with_db_name.script | 0 .../scripts/{ => v5x0}/session_run.script | 0 .../{ => v5x0}/session_run_auth_delay.script | 0 .../session_run_bolt_handshake_delay.script | 0 .../{ => v5x0}/session_run_chaining.script | 0 .../{ => v5x0}/transaction_chaining.script | 0 .../tx_without_commit_or_rollback.script | 0 .../scripts/v5x2/user_agent_custom.script | 14 ++ .../scripts/v5x2/user_agent_default.script | 14 ++ .../scripts/v5x3/user_agent_custom.script | 14 ++ .../scripts/v5x3/user_agent_default.script | 14 ++ .../test_bookmark_manager.py | 2 +- .../test_client_agent_strings.py | 121 ++++++++++++++++++ .../test_connection_acquisition_timeout_ms.py | 2 +- .../test_max_connection_pool_size.py | 2 +- .../versions/scripts/v5x3_return_1.script | 18 +++ tests/stub/versions/test_versions.py | 22 +++- 22 files changed, 230 insertions(+), 8 deletions(-) rename tests/stub/driver_parameters/scripts/{ => v5x0}/router.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/router_hello_delay.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/router_route_delay.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/router_with_db_name.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/session_run.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/session_run_auth_delay.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/session_run_bolt_handshake_delay.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/session_run_chaining.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/transaction_chaining.script (100%) rename tests/stub/driver_parameters/scripts/{ => v5x0}/tx_without_commit_or_rollback.script (100%) create mode 100644 tests/stub/driver_parameters/scripts/v5x2/user_agent_custom.script create mode 100644 tests/stub/driver_parameters/scripts/v5x2/user_agent_default.script create mode 100644 tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script create mode 100644 tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script create mode 100644 tests/stub/driver_parameters/test_client_agent_strings.py create mode 100644 tests/stub/versions/scripts/v5x3_return_1.script diff --git a/boltstub/bolt_protocol.py b/boltstub/bolt_protocol.py index 386f98b91..6da0e7908 100644 --- a/boltstub/bolt_protocol.py +++ b/boltstub/bolt_protocol.py @@ -488,7 +488,7 @@ class Bolt5x1Protocol(Bolt5x0Protocol): "S": Bolt5x0Protocol.messages["S"], } - server_agent = "Neo4j/5.1.0" + server_agent = "Neo4j/5.5.0" class Bolt5x2Protocol(Bolt5x1Protocol): @@ -497,4 +497,13 @@ class Bolt5x2Protocol(Bolt5x1Protocol): # allow the server to negotiate other bolt versions equivalent_versions = set() - server_agent = "Neo4j/5.2.0" + server_agent = "Neo4j/5.7.0" + + +class Bolt5x3Protocol(Bolt5x2Protocol): + protocol_version = (5, 3) + version_aliases = set() + # allow the server to negotiate other bolt versions + equivalent_versions = set() + + server_agent = "Neo4j/5.8.0" diff --git a/nutkit/protocol/feature.py b/nutkit/protocol/feature.py index 302d32d1b..a9c7c3ec6 100644 --- a/nutkit/protocol/feature.py +++ b/nutkit/protocol/feature.py @@ -88,6 +88,8 @@ class Feature(Enum): BOLT_5_1 = "Feature:Bolt:5.1" # The driver supports Bolt protocol version 5.2 BOLT_5_2 = "Feature:Bolt:5.2" + # The driver supports Bolt protocol version 5.3 + BOLT_5_3 = "Feature:Bolt:5.3" # The driver supports patching DateTimes to use UTC for Bolt 4.3 and 4.4 BOLT_PATCH_UTC = "Feature:Bolt:Patch:UTC" # The driver supports impersonation diff --git a/tests/stub/driver_parameters/scripts/router.script b/tests/stub/driver_parameters/scripts/v5x0/router.script similarity index 100% rename from tests/stub/driver_parameters/scripts/router.script rename to tests/stub/driver_parameters/scripts/v5x0/router.script diff --git a/tests/stub/driver_parameters/scripts/router_hello_delay.script b/tests/stub/driver_parameters/scripts/v5x0/router_hello_delay.script similarity index 100% rename from tests/stub/driver_parameters/scripts/router_hello_delay.script rename to tests/stub/driver_parameters/scripts/v5x0/router_hello_delay.script diff --git a/tests/stub/driver_parameters/scripts/router_route_delay.script b/tests/stub/driver_parameters/scripts/v5x0/router_route_delay.script similarity index 100% rename from tests/stub/driver_parameters/scripts/router_route_delay.script rename to tests/stub/driver_parameters/scripts/v5x0/router_route_delay.script diff --git a/tests/stub/driver_parameters/scripts/router_with_db_name.script b/tests/stub/driver_parameters/scripts/v5x0/router_with_db_name.script similarity index 100% rename from tests/stub/driver_parameters/scripts/router_with_db_name.script rename to tests/stub/driver_parameters/scripts/v5x0/router_with_db_name.script diff --git a/tests/stub/driver_parameters/scripts/session_run.script b/tests/stub/driver_parameters/scripts/v5x0/session_run.script similarity index 100% rename from tests/stub/driver_parameters/scripts/session_run.script rename to tests/stub/driver_parameters/scripts/v5x0/session_run.script diff --git a/tests/stub/driver_parameters/scripts/session_run_auth_delay.script b/tests/stub/driver_parameters/scripts/v5x0/session_run_auth_delay.script similarity index 100% rename from tests/stub/driver_parameters/scripts/session_run_auth_delay.script rename to tests/stub/driver_parameters/scripts/v5x0/session_run_auth_delay.script diff --git a/tests/stub/driver_parameters/scripts/session_run_bolt_handshake_delay.script b/tests/stub/driver_parameters/scripts/v5x0/session_run_bolt_handshake_delay.script similarity index 100% rename from tests/stub/driver_parameters/scripts/session_run_bolt_handshake_delay.script rename to tests/stub/driver_parameters/scripts/v5x0/session_run_bolt_handshake_delay.script diff --git a/tests/stub/driver_parameters/scripts/session_run_chaining.script b/tests/stub/driver_parameters/scripts/v5x0/session_run_chaining.script similarity index 100% rename from tests/stub/driver_parameters/scripts/session_run_chaining.script rename to tests/stub/driver_parameters/scripts/v5x0/session_run_chaining.script diff --git a/tests/stub/driver_parameters/scripts/transaction_chaining.script b/tests/stub/driver_parameters/scripts/v5x0/transaction_chaining.script similarity index 100% rename from tests/stub/driver_parameters/scripts/transaction_chaining.script rename to tests/stub/driver_parameters/scripts/v5x0/transaction_chaining.script diff --git a/tests/stub/driver_parameters/scripts/tx_without_commit_or_rollback.script b/tests/stub/driver_parameters/scripts/v5x0/tx_without_commit_or_rollback.script similarity index 100% rename from tests/stub/driver_parameters/scripts/tx_without_commit_or_rollback.script rename to tests/stub/driver_parameters/scripts/v5x0/tx_without_commit_or_rollback.script diff --git a/tests/stub/driver_parameters/scripts/v5x2/user_agent_custom.script b/tests/stub/driver_parameters/scripts/v5x2/user_agent_custom.script new file mode 100644 index 000000000..1285dae06 --- /dev/null +++ b/tests/stub/driver_parameters/scripts/v5x2/user_agent_custom.script @@ -0,0 +1,14 @@ +!: BOLT 5.2 + +C: HELLO {"[routing]": null, "user_agent": "Hello, I'm a banana 🍌!"} +S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} +C: LOGON {"{}": "*"} +S: SUCCESS {} +*: RESET +C: RUN "*" "*" "*" +S: SUCCESS {"fields": ["n"]} +C: PULL {"n": "*"} +S: RECORD [1] + SUCCESS {"type": "r"} +*: RESET +?: GOODBYE diff --git a/tests/stub/driver_parameters/scripts/v5x2/user_agent_default.script b/tests/stub/driver_parameters/scripts/v5x2/user_agent_default.script new file mode 100644 index 000000000..76c2c5ca6 --- /dev/null +++ b/tests/stub/driver_parameters/scripts/v5x2/user_agent_default.script @@ -0,0 +1,14 @@ +!: BOLT 5.2 + +C: HELLO {"[routing]": null, "user_agent": #USER_AGENT#} +S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} +C: LOGON {"{}": "*"} +S: SUCCESS {} +*: RESET +C: RUN "*" "*" "*" +S: SUCCESS {"fields": ["n"]} +C: PULL {"n": "*"} +S: RECORD [1] + SUCCESS {"type": "r"} +*: RESET +?: GOODBYE diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script new file mode 100644 index 000000000..d80f16752 --- /dev/null +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script @@ -0,0 +1,14 @@ +!: BOLT 5.3 + +C: HELLO {"[routing]": null, "user_agent": "Hello, I'm a banana 🍌!", "bolt_agent": {"U": "*"}} +S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} +C: LOGON {"{}": "*"} +S: SUCCESS {} +*: RESET +C: RUN "*" "*" "*" +S: SUCCESS {"fields": ["n"]} +C: PULL {"n": "*"} +S: RECORD [1] + SUCCESS {"type": "r"} +*: RESET +?: GOODBYE diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script new file mode 100644 index 000000000..71e81ad76 --- /dev/null +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script @@ -0,0 +1,14 @@ +!: BOLT 5.3 + +C: HELLO {"[routing]": null, "[user_agent]": null, "bolt_agent": {"U": "*"}} +S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} +C: LOGON {"{}": "*"} +S: SUCCESS {} +*: RESET +C: RUN "*" "*" "*" +S: SUCCESS {"fields": ["n"]} +C: PULL {"n": "*"} +S: RECORD [1] + SUCCESS {"type": "r"} +*: RESET +?: GOODBYE diff --git a/tests/stub/driver_parameters/test_bookmark_manager.py b/tests/stub/driver_parameters/test_bookmark_manager.py index 1eb0c8347..7943f6f0c 100644 --- a/tests/stub/driver_parameters/test_bookmark_manager.py +++ b/tests/stub/driver_parameters/test_bookmark_manager.py @@ -837,7 +837,7 @@ def test_multiple_bookmark_manager(self): ) def _start_server(self, server, script): - server.start(self.script_path(script), + server.start(self.script_path("v5x0", script), vars_={"#HOST#": self._router.host}) def assert_begin(self, line: str, bookmarks=None): diff --git a/tests/stub/driver_parameters/test_client_agent_strings.py b/tests/stub/driver_parameters/test_client_agent_strings.py new file mode 100644 index 000000000..a2aae9630 --- /dev/null +++ b/tests/stub/driver_parameters/test_client_agent_strings.py @@ -0,0 +1,121 @@ +import abc +from contextlib import contextmanager +import json +from typing import Optional + +from nutkit.frontend import Driver +import nutkit.protocol as types +from tests.shared import TestkitTestCase +from tests.stub.shared import StubServer + + +class _ClientAgentStringsTestBase(TestkitTestCase, abc.ABC): + @property + @abc.abstractmethod + def version_folder(self) -> str: + ... + + @abc.abstractmethod + def get_default_agent(self) -> Optional[str]: + ... + + def setUp(self): + super().setUp() + self._server = StubServer(9000) + self._driver = None + self._session = None + + def tearDown(self): + self._server.reset() + if self._session: + self._session.close() + if self._driver: + self._driver.close() + return super().tearDown() + + def _start_server(self, script, version_folder=None, vars_=None): + if version_folder is None: + version_folder = self.version_folder + self._server.start(self.script_path(version_folder, script), + vars_=vars_) + + @contextmanager + def driver(self, **kwargs): + auth = types.AuthorizationToken("basic", principal="neo4j", + credentials="pass") + uri = "bolt://%s" % self._server.address + driver = Driver(self._backend, uri, auth, **kwargs) + try: + yield driver + finally: + driver.close() + + @contextmanager + def session(self, driver=None, **driver_kwargs): + if driver is None: + with self.driver(**driver_kwargs) as driver: + session = driver.session("r") + try: + yield session + finally: + session.close() + else: + session = driver.session("r") + try: + yield session + finally: + session.close() + + def _session_run_return_1(self, **driver_kwargs): + with self.session(**driver_kwargs) as session: + result = session.run("RETURN 1 AS n") + list(result) + + def _extract_bolt_agent(self) -> str: + self._start_server("user_agent_default.script", + version_folder="v5x3") + self._session_run_return_1() + self._server.reset() + hellos = self._server.get_requests("HELLO ") + assert len(hellos) == 1 + hello = hellos[0] + hello_extra = hello[len("HELLO "):].strip() + hello_extra = json.loads(hello_extra) + return hello_extra["{}"]["bolt_agent"] + + def _test_default_user_agent(self): + vars_ = { + "#USER_AGENT#": json.dumps(self.get_default_agent()), + } + self._start_server("user_agent_default.script", vars_=vars_) + self._session_run_return_1() + + def _test_custom_user_agent(self): + self._start_server("user_agent_custom.script") + self._session_run_return_1(user_agent="Hello, I'm a banana 🍌!") + + +class TestClientAgentStringsV5x2(_ClientAgentStringsTestBase): + version_folder = "v5x2" + + def get_default_agent(self) -> Optional[str]: + return self. _extract_bolt_agent() + + def test_default_user_agent(self): + super()._test_default_user_agent() + + def test_custom_user_agent(self): + super()._test_custom_user_agent() + + +class TestClientAgentStringsV5x3(_ClientAgentStringsTestBase): + version_folder = "v5x3" + + def get_default_agent(self) -> Optional[str]: + return None + + def test_default_user_agent(self): + super()._test_default_user_agent() + + def test_custom_user_agent(self): + super()._test_custom_user_agent() diff --git a/tests/stub/driver_parameters/test_connection_acquisition_timeout_ms.py b/tests/stub/driver_parameters/test_connection_acquisition_timeout_ms.py index 903a0f000..b16b3be61 100644 --- a/tests/stub/driver_parameters/test_connection_acquisition_timeout_ms.py +++ b/tests/stub/driver_parameters/test_connection_acquisition_timeout_ms.py @@ -73,7 +73,7 @@ def _get_vars(self): def _start_server(self, server, script, vars_=None): if vars_ is None: vars_ = self._get_vars() - server.start(self.script_path(script), vars_=vars_) + server.start(self.script_path("v5x0", script), vars_=vars_) def test_should_work_when_every_step_is_done_in_time(self): """ diff --git a/tests/stub/driver_parameters/test_max_connection_pool_size.py b/tests/stub/driver_parameters/test_max_connection_pool_size.py index 60e464e14..718b5b49d 100644 --- a/tests/stub/driver_parameters/test_max_connection_pool_size.py +++ b/tests/stub/driver_parameters/test_max_connection_pool_size.py @@ -19,7 +19,7 @@ def setUp(self): # test for security reasons. self._server = StubServer(9999) self._server.start( - self.script_path("tx_without_commit_or_rollback.script") + self.script_path("v5x0", "tx_without_commit_or_rollback.script") ) self._driver = None self._sessions = [] diff --git a/tests/stub/versions/scripts/v5x3_return_1.script b/tests/stub/versions/scripts/v5x3_return_1.script new file mode 100644 index 000000000..daabd861c --- /dev/null +++ b/tests/stub/versions/scripts/v5x3_return_1.script @@ -0,0 +1,18 @@ +!: BOLT 5.1 + +C: HELLO {"{}": "*"} +S: SUCCESS {"server": "#SERVER_AGENT#", "connection_id": "bolt-123456789"} +A: LOGON {"{}": "*"} +*: RESET +{? + C: RUN {"U": "*"} {"{}": "*"} {"{}": "*"} + S: SUCCESS {"fields": ["n.name"]} + {{ + C: PULL {"n": {"Z": "*"}} + ---- + C: DISCARD {"n": {"Z": "*"}} + }} + S: SUCCESS {"type": "w"} +?} +*: RESET +?: GOODBYE diff --git a/tests/stub/versions/test_versions.py b/tests/stub/versions/test_versions.py index 6deef64d1..56324beee 100644 --- a/tests/stub/versions/test_versions.py +++ b/tests/stub/versions/test_versions.py @@ -145,15 +145,21 @@ def test_supports_bolt5x1(self): def test_supports_bolt5x2(self): self._run("5x2") + @driver_feature(types.Feature.BOLT_5_3) + def test_supports_bolt5x3(self): + self._run("5x3") + def test_server_version(self): - for version in ("5x2", "5x1", "5x0", "4x4", "4x3", "4x2", "4x1", "3"): + for version in ("5x3", "5x2", "5x1", "5x0", "4x4", "4x3", "4x2", "4x1", + "3"): if not self.driver_supports_bolt(version): continue with self.subTest(version=version): self._run(version, check_version=True) def test_server_agent(self): - for version in ("5x2", "5x1", "5x0", "4x4", "4x3", "4x2", "4x1", "3"): + for version in ("5x3", "5x2", "5x1", "5x0", "4x4", "4x3", "4x2", "4x1", + "3"): for agent, reject in ( ("Neo4j/4.3.0", False), ("Neo4j/4.1.0", False), @@ -185,7 +191,8 @@ def test_server_address_in_summary(self): # TODO: remove block when all drivers support the address field if get_driver_name() in ["javascript", "dotnet"]: self.skipTest("Backend doesn't support server address in summary") - for version in ("5x2", "5x1", "5x0", "4x4", "4x3", "4x2", "4x1", "3"): + for version in ("5x3", "5x2", "5x1", "5x0", "4x4", "4x3", "4x2", "4x1", + "3"): if not self.driver_supports_bolt(version): continue with self.subTest(version=version): @@ -283,6 +290,15 @@ def test_should_reject_server_using_verify_connectivity_bolt_5x2(self): version="5.2", script="v5x1_optional_hello.script" ) + @driver_feature(types.Feature.BOLT_5_3) + def test_should_reject_server_using_verify_connectivity_bolt_5x3(self): + # TODO remove this block once fixed + if get_driver_name() in ["dotnet", "go", "javascript"]: + self.skipTest("Skipped because it needs investigation") + self._test_should_reject_server_using_verify_connectivity( + version="5.3", script="v5x1_optional_hello.script" + ) + def _test_should_reject_server_using_verify_connectivity( self, version, script ): From 17b26d244a4c5d4c92fad231fdd8ae2adcfc25d7 Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Tue, 4 Apr 2023 12:21:54 +0200 Subject: [PATCH 02/11] Fix feature flag guards --- .../driver_parameters/test_client_agent_strings.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/stub/driver_parameters/test_client_agent_strings.py b/tests/stub/driver_parameters/test_client_agent_strings.py index a2aae9630..3dc358c52 100644 --- a/tests/stub/driver_parameters/test_client_agent_strings.py +++ b/tests/stub/driver_parameters/test_client_agent_strings.py @@ -85,7 +85,7 @@ def _extract_bolt_agent(self) -> str: def _test_default_user_agent(self): vars_ = { - "#USER_AGENT#": json.dumps(self.get_default_agent()), + "#USER_AGENT#": self.get_default_agent(), } self._start_server("user_agent_default.script", vars_=vars_) self._session_run_return_1() @@ -96,10 +96,14 @@ def _test_custom_user_agent(self): class TestClientAgentStringsV5x2(_ClientAgentStringsTestBase): + version_folder = "v5x2" + required_features = (types.Feature.BOLT_5_2,) def get_default_agent(self) -> Optional[str]: - return self. _extract_bolt_agent() + if self.driver_supports_features(types.Feature.BOLT_5_3): + return json.dumps(self._extract_bolt_agent()) + return '{"U": "*"}' def test_default_user_agent(self): super()._test_default_user_agent() @@ -109,7 +113,9 @@ def test_custom_user_agent(self): class TestClientAgentStringsV5x3(_ClientAgentStringsTestBase): + version_folder = "v5x3" + required_features = (types.Feature.BOLT_5_3,) def get_default_agent(self) -> Optional[str]: return None From 92e497378eaa33faa7635ad5b4094962b7e6fb83 Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Tue, 4 Apr 2023 12:22:46 +0200 Subject: [PATCH 03/11] code style --- tests/stub/driver_parameters/test_client_agent_strings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/stub/driver_parameters/test_client_agent_strings.py b/tests/stub/driver_parameters/test_client_agent_strings.py index 3dc358c52..1c41091cb 100644 --- a/tests/stub/driver_parameters/test_client_agent_strings.py +++ b/tests/stub/driver_parameters/test_client_agent_strings.py @@ -10,6 +10,7 @@ class _ClientAgentStringsTestBase(TestkitTestCase, abc.ABC): + @property @abc.abstractmethod def version_folder(self) -> str: From b52e1426d5e47e7945c40d0726f68d2e8673fb05 Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Thu, 6 Apr 2023 10:54:32 +0200 Subject: [PATCH 04/11] Fix Windows: use utf-8 for reading files in repo --- boltstub/parsing.py | 5 +++-- driver.py | 2 ++ tests/stub/shared.py | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/boltstub/parsing.py b/boltstub/parsing.py index 668cdba72..40c1bad22 100644 --- a/boltstub/parsing.py +++ b/boltstub/parsing.py @@ -54,7 +54,8 @@ def load_parser(): - with open(path.join(path.dirname(__file__), "grammar.lark"), "r") as fd: + grammar_path = path.join(path.dirname(__file__), "grammar.lark") + with open(grammar_path, "r", encoding="utf-8") as fd: return lark.Lark( fd, propagate_positions=True # , ambiguity="explicit" ) @@ -1561,7 +1562,7 @@ def parse(script: str, substitutions: Optional[dict] = None) -> Script: def parse_file(filename): - with open(filename) as fd: + with open(filename, encoding="utf-8") as fd: try: script = parse(fd.read()) except Exception: diff --git a/driver.py b/driver.py index 33dfd940a..6d1a7d035 100644 --- a/driver.py +++ b/driver.py @@ -1,3 +1,5 @@ +# neuer commentar + import os import shutil diff --git a/tests/stub/shared.py b/tests/stub/shared.py index fc4c7d0ff..b3f995aa5 100644 --- a/tests/stub/shared.py +++ b/tests/stub/shared.py @@ -80,14 +80,14 @@ def start(self, path=None, script=None, vars_=None): if path: self._last_rewritten_path = path script_fn = os.path.basename(path) - with open(path, "r") as f: + with open(path, "r", encoding="utf-8") as f: script = f.read() for v in vars_: script = script.replace(v, str(vars_[v])) if script: tempdir = tempfile.gettempdir() path = os.path.join(tempdir, script_fn) - with open(path, "w") as f: + with open(path, "w", encoding="utf-8") as f: f.write(script) f.flush() os.fsync(f) From 1835f7a93c5308b4b963ce887529f6092f1c3d3f Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Thu, 13 Apr 2023 11:39:12 +0200 Subject: [PATCH 05/11] Add test case where userAgent == boltAgent --- .../scripts/v5x3/user_agent_is_bolt_agent.script | 14 ++++++++++++++ .../driver_parameters/test_client_agent_strings.py | 8 ++++++++ 2 files changed, 22 insertions(+) create mode 100644 tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script new file mode 100644 index 000000000..027f95f0b --- /dev/null +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script @@ -0,0 +1,14 @@ +!: BOLT 5.3 + +C: HELLO {"[routing]": null, "user_agent": #AGENT_STRING#, "bolt_agent": #AGENT_STRING#} +S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} +C: LOGON {"{}": "*"} +S: SUCCESS {} +*: RESET +C: RUN "*" "*" "*" +S: SUCCESS {"fields": ["n"]} +C: PULL {"n": "*"} +S: RECORD [1] + SUCCESS {"type": "r"} +*: RESET +?: GOODBYE diff --git a/tests/stub/driver_parameters/test_client_agent_strings.py b/tests/stub/driver_parameters/test_client_agent_strings.py index 1c41091cb..978ae9359 100644 --- a/tests/stub/driver_parameters/test_client_agent_strings.py +++ b/tests/stub/driver_parameters/test_client_agent_strings.py @@ -126,3 +126,11 @@ def test_default_user_agent(self): def test_custom_user_agent(self): super()._test_custom_user_agent() + + def test_user_agent_is_bolt_agent(self): + bolt_agent = self._extract_bolt_agent() + vars_ = { + "#AGENT_STRING#": json.dumps(bolt_agent), + } + self._start_server("user_agent_is_bolt_agent.script", vars_=vars_) + self._session_run_return_1(user_agent=bolt_agent) From c0abd43fe95997f1039ca52d9862740facaf7a17 Mon Sep 17 00:00:00 2001 From: Dmitriy Tverdiakov Date: Thu, 20 Apr 2023 10:09:11 +0100 Subject: [PATCH 06/11] Expect user_agent to be omitted in test_user_agent_is_bolt_agent --- .../scripts/v5x3/user_agent_is_bolt_agent.script | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script index 027f95f0b..c067eabf7 100644 --- a/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script @@ -1,6 +1,6 @@ !: BOLT 5.3 -C: HELLO {"[routing]": null, "user_agent": #AGENT_STRING#, "bolt_agent": #AGENT_STRING#} +C: HELLO {"[routing]": null, "bolt_agent": #AGENT_STRING#} S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} C: LOGON {"{}": "*"} S: SUCCESS {} From d7c000f044ef013e6ab31e0c2098fdbab2cf6a97 Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Fri, 21 Apr 2023 13:29:58 +0200 Subject: [PATCH 07/11] Remove accidentally added comment --- driver.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/driver.py b/driver.py index 6d1a7d035..33dfd940a 100644 --- a/driver.py +++ b/driver.py @@ -1,5 +1,3 @@ -# neuer commentar - import os import shutil From 1946f5879f5e582ff1c6f018d030d2d00f5a530b Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Mon, 15 May 2023 15:39:03 +0200 Subject: [PATCH 08/11] Adopt tests for structured bolt agent As the ADR got updated the tests needed adjusting: * `user_agent` remains untouched * `bolt_agent` becomes a dictionary instead of a string Also added empty user_agent as test case. --- .../scripts/v5x2/user_agent_default.script | 2 +- .../user_agent_empty.script} | 4 +- .../scripts/v5x3/user_agent_custom.script | 2 +- .../scripts/v5x3/user_agent_default.script | 2 +- .../scripts/v5x3/user_agent_empty.script | 14 ++++++ .../test_client_agent_strings.py | 49 +++++-------------- 6 files changed, 30 insertions(+), 43 deletions(-) rename tests/stub/driver_parameters/scripts/{v5x3/user_agent_is_bolt_agent.script => v5x2/user_agent_empty.script} (76%) create mode 100644 tests/stub/driver_parameters/scripts/v5x3/user_agent_empty.script diff --git a/tests/stub/driver_parameters/scripts/v5x2/user_agent_default.script b/tests/stub/driver_parameters/scripts/v5x2/user_agent_default.script index 76c2c5ca6..3e2e8e01b 100644 --- a/tests/stub/driver_parameters/scripts/v5x2/user_agent_default.script +++ b/tests/stub/driver_parameters/scripts/v5x2/user_agent_default.script @@ -1,6 +1,6 @@ !: BOLT 5.2 -C: HELLO {"[routing]": null, "user_agent": #USER_AGENT#} +C: HELLO {"[routing]": null, "user_agent": {"U": "*"}} S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} C: LOGON {"{}": "*"} S: SUCCESS {} diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script b/tests/stub/driver_parameters/scripts/v5x2/user_agent_empty.script similarity index 76% rename from tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script rename to tests/stub/driver_parameters/scripts/v5x2/user_agent_empty.script index c067eabf7..1071d1a15 100644 --- a/tests/stub/driver_parameters/scripts/v5x3/user_agent_is_bolt_agent.script +++ b/tests/stub/driver_parameters/scripts/v5x2/user_agent_empty.script @@ -1,6 +1,6 @@ -!: BOLT 5.3 +!: BOLT 5.2 -C: HELLO {"[routing]": null, "bolt_agent": #AGENT_STRING#} +C: HELLO {"[routing]": null, "user_agent": ""} S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} C: LOGON {"{}": "*"} S: SUCCESS {} diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script index d80f16752..c9529787f 100644 --- a/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script @@ -1,6 +1,6 @@ !: BOLT 5.3 -C: HELLO {"[routing]": null, "user_agent": "Hello, I'm a banana 🍌!", "bolt_agent": {"U": "*"}} +C: HELLO {"[routing]": null, "user_agent": "Hello, I'm a banana 🍌!", "bolt_agent": {"product": {"U": "*"}, "[platform]": {"U": "*"}, "[language]": {"U": "*"}, "[language_details]": {"U": "*"}}} S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} C: LOGON {"{}": "*"} S: SUCCESS {} diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script index 71e81ad76..1749a692d 100644 --- a/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script @@ -1,6 +1,6 @@ !: BOLT 5.3 -C: HELLO {"[routing]": null, "[user_agent]": null, "bolt_agent": {"U": "*"}} +C: HELLO {"[routing]": null, "user_agent": {"U": "*"}, "bolt_agent": {"product": {"U": "*"}, "[platform]": {"U": "*"}, "[language]": {"U": "*"}, "[language_details]": {"U": "*"}}} S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} C: LOGON {"{}": "*"} S: SUCCESS {} diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_empty.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_empty.script new file mode 100644 index 000000000..00af8ad37 --- /dev/null +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_empty.script @@ -0,0 +1,14 @@ +!: BOLT 5.3 + +C: HELLO {"[routing]": null, "user_agent": "", "bolt_agent": {"product": {"U": "*"}, "[platform]": {"U": "*"}, "[language]": {"U": "*"}, "[language_details]": {"U": "*"}}} +S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} +C: LOGON {"{}": "*"} +S: SUCCESS {} +*: RESET +C: RUN "*" "*" "*" +S: SUCCESS {"fields": ["n"]} +C: PULL {"n": "*"} +S: RECORD [1] + SUCCESS {"type": "r"} +*: RESET +?: GOODBYE diff --git a/tests/stub/driver_parameters/test_client_agent_strings.py b/tests/stub/driver_parameters/test_client_agent_strings.py index 978ae9359..dc0844ecf 100644 --- a/tests/stub/driver_parameters/test_client_agent_strings.py +++ b/tests/stub/driver_parameters/test_client_agent_strings.py @@ -1,10 +1,8 @@ import abc from contextlib import contextmanager -import json -from typing import Optional -from nutkit.frontend import Driver import nutkit.protocol as types +from nutkit.frontend import Driver from tests.shared import TestkitTestCase from tests.stub.shared import StubServer @@ -16,10 +14,6 @@ class _ClientAgentStringsTestBase(TestkitTestCase, abc.ABC): def version_folder(self) -> str: ... - @abc.abstractmethod - def get_default_agent(self) -> Optional[str]: - ... - def setUp(self): super().setUp() self._server = StubServer(9000) @@ -72,65 +66,44 @@ def _session_run_return_1(self, **driver_kwargs): result = session.run("RETURN 1 AS n") list(result) - def _extract_bolt_agent(self) -> str: - self._start_server("user_agent_default.script", - version_folder="v5x3") - self._session_run_return_1() - self._server.reset() - hellos = self._server.get_requests("HELLO ") - assert len(hellos) == 1 - hello = hellos[0] - hello_extra = hello[len("HELLO "):].strip() - hello_extra = json.loads(hello_extra) - return hello_extra["{}"]["bolt_agent"] - def _test_default_user_agent(self): - vars_ = { - "#USER_AGENT#": self.get_default_agent(), - } - self._start_server("user_agent_default.script", vars_=vars_) + self._start_server("user_agent_default.script") self._session_run_return_1() def _test_custom_user_agent(self): self._start_server("user_agent_custom.script") self._session_run_return_1(user_agent="Hello, I'm a banana 🍌!") + def _test_empty_user_agent(self): + self._start_server("user_agent_empty.script") + self._session_run_return_1(user_agent="") + class TestClientAgentStringsV5x2(_ClientAgentStringsTestBase): version_folder = "v5x2" required_features = (types.Feature.BOLT_5_2,) - def get_default_agent(self) -> Optional[str]: - if self.driver_supports_features(types.Feature.BOLT_5_3): - return json.dumps(self._extract_bolt_agent()) - return '{"U": "*"}' - def test_default_user_agent(self): super()._test_default_user_agent() def test_custom_user_agent(self): super()._test_custom_user_agent() + def test_empty_user_agent(self): + super()._test_empty_user_agent() + class TestClientAgentStringsV5x3(_ClientAgentStringsTestBase): version_folder = "v5x3" required_features = (types.Feature.BOLT_5_3,) - def get_default_agent(self) -> Optional[str]: - return None - def test_default_user_agent(self): super()._test_default_user_agent() def test_custom_user_agent(self): super()._test_custom_user_agent() - def test_user_agent_is_bolt_agent(self): - bolt_agent = self._extract_bolt_agent() - vars_ = { - "#AGENT_STRING#": json.dumps(bolt_agent), - } - self._start_server("user_agent_is_bolt_agent.script", vars_=vars_) - self._session_run_return_1(user_agent=bolt_agent) + def test_empty_user_agent(self): + super()._test_empty_user_agent() From 27263e81b1ba06eb12f9b70e77d8bc0207b723d9 Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Mon, 15 May 2023 18:14:30 +0200 Subject: [PATCH 09/11] Remove test of empty user_agent (drivers are not unified) --- .../scripts/v5x2/user_agent_empty.script | 14 -------------- .../scripts/v5x3/user_agent_empty.script | 14 -------------- .../driver_parameters/test_client_agent_strings.py | 10 ---------- 3 files changed, 38 deletions(-) delete mode 100644 tests/stub/driver_parameters/scripts/v5x2/user_agent_empty.script delete mode 100644 tests/stub/driver_parameters/scripts/v5x3/user_agent_empty.script diff --git a/tests/stub/driver_parameters/scripts/v5x2/user_agent_empty.script b/tests/stub/driver_parameters/scripts/v5x2/user_agent_empty.script deleted file mode 100644 index 1071d1a15..000000000 --- a/tests/stub/driver_parameters/scripts/v5x2/user_agent_empty.script +++ /dev/null @@ -1,14 +0,0 @@ -!: BOLT 5.2 - -C: HELLO {"[routing]": null, "user_agent": ""} -S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} -C: LOGON {"{}": "*"} -S: SUCCESS {} -*: RESET -C: RUN "*" "*" "*" -S: SUCCESS {"fields": ["n"]} -C: PULL {"n": "*"} -S: RECORD [1] - SUCCESS {"type": "r"} -*: RESET -?: GOODBYE diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_empty.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_empty.script deleted file mode 100644 index 00af8ad37..000000000 --- a/tests/stub/driver_parameters/scripts/v5x3/user_agent_empty.script +++ /dev/null @@ -1,14 +0,0 @@ -!: BOLT 5.3 - -C: HELLO {"[routing]": null, "user_agent": "", "bolt_agent": {"product": {"U": "*"}, "[platform]": {"U": "*"}, "[language]": {"U": "*"}, "[language_details]": {"U": "*"}}} -S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} -C: LOGON {"{}": "*"} -S: SUCCESS {} -*: RESET -C: RUN "*" "*" "*" -S: SUCCESS {"fields": ["n"]} -C: PULL {"n": "*"} -S: RECORD [1] - SUCCESS {"type": "r"} -*: RESET -?: GOODBYE diff --git a/tests/stub/driver_parameters/test_client_agent_strings.py b/tests/stub/driver_parameters/test_client_agent_strings.py index dc0844ecf..0fc6cbfd6 100644 --- a/tests/stub/driver_parameters/test_client_agent_strings.py +++ b/tests/stub/driver_parameters/test_client_agent_strings.py @@ -74,10 +74,6 @@ def _test_custom_user_agent(self): self._start_server("user_agent_custom.script") self._session_run_return_1(user_agent="Hello, I'm a banana 🍌!") - def _test_empty_user_agent(self): - self._start_server("user_agent_empty.script") - self._session_run_return_1(user_agent="") - class TestClientAgentStringsV5x2(_ClientAgentStringsTestBase): @@ -90,9 +86,6 @@ def test_default_user_agent(self): def test_custom_user_agent(self): super()._test_custom_user_agent() - def test_empty_user_agent(self): - super()._test_empty_user_agent() - class TestClientAgentStringsV5x3(_ClientAgentStringsTestBase): @@ -104,6 +97,3 @@ def test_default_user_agent(self): def test_custom_user_agent(self): super()._test_custom_user_agent() - - def test_empty_user_agent(self): - super()._test_empty_user_agent() From 7e5000c5e6759190eb493d17c97f9c0f12163fe2 Mon Sep 17 00:00:00 2001 From: Robsdedude Date: Tue, 23 May 2023 11:44:22 +0200 Subject: [PATCH 10/11] Add constraints to product field in bolt_agent --- .../test_client_agent_strings.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/stub/driver_parameters/test_client_agent_strings.py b/tests/stub/driver_parameters/test_client_agent_strings.py index 0fc6cbfd6..0eb729b35 100644 --- a/tests/stub/driver_parameters/test_client_agent_strings.py +++ b/tests/stub/driver_parameters/test_client_agent_strings.py @@ -1,4 +1,6 @@ import abc +import json +import re from contextlib import contextmanager import nutkit.protocol as types @@ -97,3 +99,25 @@ def test_default_user_agent(self): def test_custom_user_agent(self): super()._test_custom_user_agent() + + def test_bolt_agent(self): + super()._test_default_user_agent() + + hellos = self._server.get_requests("HELLO") + assert len(hellos) == 1 + hello_extra = json.loads(hellos[0].split(maxsplit=1)[1]) + bolt_agent = hello_extra["{}"]["bolt_agent"]["{}"] + self._assert_bolt_agent_product_conforms_format(bolt_agent["product"]) + + self._server.reset() + super()._test_custom_user_agent() + + hellos = self._server.get_requests("HELLO") + assert len(hellos) == 1 + hello_extra = json.loads(hellos[0].split(maxsplit=1)[1]) + # asserts user agent is does not affect bolt agent + assert bolt_agent == hello_extra["{}"]["bolt_agent"]["{}"] + + @staticmethod + def _assert_bolt_agent_product_conforms_format(bolt_agent_product): + assert re.match(r"^.+/.+$", bolt_agent_product) From 4c7f49a26d278065c0435de479641d20775fdc2d Mon Sep 17 00:00:00 2001 From: Florent Biville Date: Wed, 24 May 2023 09:51:42 +0200 Subject: [PATCH 11/11] Fix wrong version numbers * Bolt 5.3 will be released with Neo4j 5.9, not 5.8. * Copy paste mistake in version test stub scripts Signed-off-by: Rouven Bauer --- boltstub/bolt_protocol.py | 2 +- .../scripts/v5x3/user_agent_custom.script | 2 +- .../scripts/v5x3/user_agent_default.script | 2 +- ....script => v3_and_up_optional_hello.script} | 0 ...cript => v5x1_and_up_optional_hello.script} | 0 .../stub/versions/scripts/v5x2_return_1.script | 2 +- .../stub/versions/scripts/v5x3_return_1.script | 2 +- tests/stub/versions/test_versions.py | 18 +++++++++--------- 8 files changed, 14 insertions(+), 14 deletions(-) rename tests/stub/versions/scripts/{v3_optional_hello.script => v3_and_up_optional_hello.script} (100%) rename tests/stub/versions/scripts/{v5x1_optional_hello.script => v5x1_and_up_optional_hello.script} (100%) diff --git a/boltstub/bolt_protocol.py b/boltstub/bolt_protocol.py index 6da0e7908..025a79866 100644 --- a/boltstub/bolt_protocol.py +++ b/boltstub/bolt_protocol.py @@ -506,4 +506,4 @@ class Bolt5x3Protocol(Bolt5x2Protocol): # allow the server to negotiate other bolt versions equivalent_versions = set() - server_agent = "Neo4j/5.8.0" + server_agent = "Neo4j/5.9.0" diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script index c9529787f..aceb70043 100644 --- a/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_custom.script @@ -1,7 +1,7 @@ !: BOLT 5.3 C: HELLO {"[routing]": null, "user_agent": "Hello, I'm a banana 🍌!", "bolt_agent": {"product": {"U": "*"}, "[platform]": {"U": "*"}, "[language]": {"U": "*"}, "[language_details]": {"U": "*"}}} -S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} +S: SUCCESS {"server": "Neo4j/5.9.0", "connection_id": "bolt-1"} C: LOGON {"{}": "*"} S: SUCCESS {} *: RESET diff --git a/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script b/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script index 1749a692d..6a0b71f0a 100644 --- a/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script +++ b/tests/stub/driver_parameters/scripts/v5x3/user_agent_default.script @@ -1,7 +1,7 @@ !: BOLT 5.3 C: HELLO {"[routing]": null, "user_agent": {"U": "*"}, "bolt_agent": {"product": {"U": "*"}, "[platform]": {"U": "*"}, "[language]": {"U": "*"}, "[language_details]": {"U": "*"}}} -S: SUCCESS {"server": "Neo4j/5.5.0", "connection_id": "bolt-1"} +S: SUCCESS {"server": "Neo4j/5.9.0", "connection_id": "bolt-1"} C: LOGON {"{}": "*"} S: SUCCESS {} *: RESET diff --git a/tests/stub/versions/scripts/v3_optional_hello.script b/tests/stub/versions/scripts/v3_and_up_optional_hello.script similarity index 100% rename from tests/stub/versions/scripts/v3_optional_hello.script rename to tests/stub/versions/scripts/v3_and_up_optional_hello.script diff --git a/tests/stub/versions/scripts/v5x1_optional_hello.script b/tests/stub/versions/scripts/v5x1_and_up_optional_hello.script similarity index 100% rename from tests/stub/versions/scripts/v5x1_optional_hello.script rename to tests/stub/versions/scripts/v5x1_and_up_optional_hello.script diff --git a/tests/stub/versions/scripts/v5x2_return_1.script b/tests/stub/versions/scripts/v5x2_return_1.script index daabd861c..c4b4ff671 100644 --- a/tests/stub/versions/scripts/v5x2_return_1.script +++ b/tests/stub/versions/scripts/v5x2_return_1.script @@ -1,4 +1,4 @@ -!: BOLT 5.1 +!: BOLT 5.2 C: HELLO {"{}": "*"} S: SUCCESS {"server": "#SERVER_AGENT#", "connection_id": "bolt-123456789"} diff --git a/tests/stub/versions/scripts/v5x3_return_1.script b/tests/stub/versions/scripts/v5x3_return_1.script index daabd861c..27e1a8172 100644 --- a/tests/stub/versions/scripts/v5x3_return_1.script +++ b/tests/stub/versions/scripts/v5x3_return_1.script @@ -1,4 +1,4 @@ -!: BOLT 5.1 +!: BOLT 5.3 C: HELLO {"{}": "*"} S: SUCCESS {"server": "#SERVER_AGENT#", "connection_id": "bolt-123456789"} diff --git a/tests/stub/versions/test_versions.py b/tests/stub/versions/test_versions.py index 56324beee..552deebce 100644 --- a/tests/stub/versions/test_versions.py +++ b/tests/stub/versions/test_versions.py @@ -224,7 +224,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_3x0(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="3", script="v3_optional_hello.script" + version="3", script="v3_and_up_optional_hello.script" ) @driver_feature(types.Feature.BOLT_4_1) @@ -233,7 +233,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_4x1(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="4.1", script="v3_optional_hello.script" + version="4.1", script="v3_and_up_optional_hello.script" ) @driver_feature(types.Feature.BOLT_4_2) @@ -242,7 +242,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_4x2(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="4.2", script="v3_optional_hello.script" + version="4.2", script="v3_and_up_optional_hello.script" ) @driver_feature(types.Feature.BOLT_4_3) @@ -251,7 +251,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_4x3(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="4.3", script="v3_optional_hello.script" + version="4.3", script="v3_and_up_optional_hello.script" ) @driver_feature(types.Feature.BOLT_4_4) @@ -260,7 +260,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_4x4(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="4.4", script="v3_optional_hello.script" + version="4.4", script="v3_and_up_optional_hello.script" ) @driver_feature(types.Feature.BOLT_5_0) @@ -269,7 +269,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_5x0(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="5.0", script="v3_optional_hello.script" + version="5.0", script="v3_and_up_optional_hello.script" ) @driver_feature(types.Feature.BOLT_5_1) @@ -278,7 +278,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_5x1(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="5.1", script="v5x1_optional_hello.script" + version="5.1", script="v5x1_and_up_optional_hello.script" ) @driver_feature(types.Feature.BOLT_5_2) @@ -287,7 +287,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_5x2(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="5.2", script="v5x1_optional_hello.script" + version="5.2", script="v5x1_and_up_optional_hello.script" ) @driver_feature(types.Feature.BOLT_5_3) @@ -296,7 +296,7 @@ def test_should_reject_server_using_verify_connectivity_bolt_5x3(self): if get_driver_name() in ["dotnet", "go", "javascript"]: self.skipTest("Skipped because it needs investigation") self._test_should_reject_server_using_verify_connectivity( - version="5.3", script="v5x1_optional_hello.script" + version="5.3", script="v5x1_and_up_optional_hello.script" ) def _test_should_reject_server_using_verify_connectivity(