Changeset View
Changeset View
Standalone View
Standalone View
test/functional/feature_uaclient.py
Show All 14 Lines | class UseragentTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
def run_test(self): | def run_test(self): | ||||
self.log.info("test -uaclientname and -uaclientversion") | self.log.info("test -uaclientname and -uaclientversion") | ||||
default_useragent = self.nodes[0].getnetworkinfo()["subversion"] | default_useragent = self.nodes[0].getnetworkinfo()["subversion"] | ||||
expected = "/Bitcoin ABC:" | expected = "/Bitcoin ABC:" | ||||
assert_equal(default_useragent[:len(expected)], expected) | assert_equal(default_useragent[: len(expected)], expected) | ||||
default_version = default_useragent[default_useragent.index(':') + 1:] | default_version = default_useragent[default_useragent.index(":") + 1 :] | ||||
default_version = default_version[:default_version.index('/')] | default_version = default_version[: default_version.index("/")] | ||||
self.restart_node(0, ["-uaclientname=Foo Client"]) | self.restart_node(0, ["-uaclientname=Foo Client"]) | ||||
foo_ua = self.nodes[0].getnetworkinfo()["subversion"] | foo_ua = self.nodes[0].getnetworkinfo()["subversion"] | ||||
expected = f"/Foo Client:{default_version}" | expected = f"/Foo Client:{default_version}" | ||||
assert_equal(foo_ua[:len(expected)], expected) | assert_equal(foo_ua[: len(expected)], expected) | ||||
self.restart_node(0, ["-uaclientversion=123.45"]) | self.restart_node(0, ["-uaclientversion=123.45"]) | ||||
foo_ua = self.nodes[0].getnetworkinfo()["subversion"] | foo_ua = self.nodes[0].getnetworkinfo()["subversion"] | ||||
expected = "/Bitcoin ABC:123.45" | expected = "/Bitcoin ABC:123.45" | ||||
assert_equal(foo_ua[:len(expected)], expected) | assert_equal(foo_ua[: len(expected)], expected) | ||||
self.log.info( | self.log.info("non-numeric version allowed (although not recommended in BIP14)") | ||||
"non-numeric version allowed (although not recommended in BIP14)") | |||||
self.restart_node(0, ["-uaclientversion=Version Two"]) | self.restart_node(0, ["-uaclientversion=Version Two"]) | ||||
foo_ua = self.nodes[0].getnetworkinfo()["subversion"] | foo_ua = self.nodes[0].getnetworkinfo()["subversion"] | ||||
expected = "/Bitcoin ABC:Version Two" | expected = "/Bitcoin ABC:Version Two" | ||||
assert_equal(foo_ua[:len(expected)], expected) | assert_equal(foo_ua[: len(expected)], expected) | ||||
self.log.info("test -uaclient doesn't break -uacomment") | self.log.info("test -uaclient doesn't break -uacomment") | ||||
self.restart_node(0, ["-uaclientname=Bar Client", | self.restart_node( | ||||
0, | |||||
[ | |||||
"-uaclientname=Bar Client", | |||||
"-uaclientversion=3000", | "-uaclientversion=3000", | ||||
"-uacomment=spam bacon and eggs"]) | "-uacomment=spam bacon and eggs", | ||||
], | |||||
) | |||||
bar_ua = self.nodes[0].getnetworkinfo()["subversion"] | bar_ua = self.nodes[0].getnetworkinfo()["subversion"] | ||||
expected = "/Bar Client:3000" | expected = "/Bar Client:3000" | ||||
assert_equal(bar_ua[:len(expected)], expected) | assert_equal(bar_ua[: len(expected)], expected) | ||||
assert "spam bacon and eggs" in bar_ua | assert "spam bacon and eggs" in bar_ua | ||||
self.log.info("test -uaclientname max length") | self.log.info("test -uaclientname max length") | ||||
self.stop_node(0) | self.stop_node(0) | ||||
expected = r"Error: Total length of network version string \([0-9]+\) exceeds maximum length \([0-9]+\)\. Reduce the number or size of uacomments\." | expected = ( | ||||
r"Error: Total length of network version string \([0-9]+\) exceeds maximum" | |||||
r" length \([0-9]+\)\. Reduce the number or size of uacomments\." | |||||
) | |||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
[f"-uaclientname={'a' * 256}"], expected, match=ErrorMatch.FULL_REGEX) | [f"-uaclientname={'a' * 256}"], expected, match=ErrorMatch.FULL_REGEX | ||||
) | |||||
self.log.info("test -uaclientversion max length") | self.log.info("test -uaclientversion max length") | ||||
expected = r"Error: Total length of network version string \([0-9]+\) exceeds maximum length \([0-9]+\)\. Reduce the number or size of uacomments\." | expected = ( | ||||
r"Error: Total length of network version string \([0-9]+\) exceeds maximum" | |||||
r" length \([0-9]+\)\. Reduce the number or size of uacomments\." | |||||
) | |||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
[f"-uaclientversion={'a' * 256}"], expected, match=ErrorMatch.FULL_REGEX) | [f"-uaclientversion={'a' * 256}"], expected, match=ErrorMatch.FULL_REGEX | ||||
) | |||||
self.log.info("test -uaclientname and -uaclientversion max length") | self.log.info("test -uaclientname and -uaclientversion max length") | ||||
expected = r"Error: Total length of network version string \([0-9]+\) exceeds maximum length \([0-9]+\)\. Reduce the number or size of uacomments\." | expected = ( | ||||
self.nodes[0].assert_start_raises_init_error( | r"Error: Total length of network version string \([0-9]+\) exceeds maximum" | ||||
[f"-uaclientname={'a' * 128}", f"-uaclientversion={'a' * 128}"], expected, match=ErrorMatch.FULL_REGEX) | r" length \([0-9]+\)\. Reduce the number or size of uacomments\." | ||||
) | |||||
self.nodes[0].assert_start_raises_init_error( | |||||
[f"-uaclientname={'a' * 128}", f"-uaclientversion={'a' * 128}"], | |||||
expected, | |||||
match=ErrorMatch.FULL_REGEX, | |||||
) | |||||
self.log.info( | self.log.info("test -uaclientname and -uaclientversion invalid characters") | ||||
"test -uaclientname and -uaclientversion invalid characters") | for invalid_char in ["/", ":", "(", ")", "*", "!", "₿", "🏃"]: | ||||
for invalid_char in ['/', ':', '(', ')', '*', '!', '₿', '🏃']: | |||||
# for client name | # for client name | ||||
expected = r"Error: -uaclientname \(" + \ | expected = ( | ||||
re.escape(invalid_char) + r"\) contains invalid characters\." | r"Error: -uaclientname \(" | ||||
+ re.escape(invalid_char) | |||||
+ r"\) contains invalid characters\." | |||||
) | |||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
[f"-uaclientname={invalid_char}"], | [f"-uaclientname={invalid_char}"], expected, match=ErrorMatch.FULL_REGEX | ||||
expected, match=ErrorMatch.FULL_REGEX) | ) | ||||
# for client version | # for client version | ||||
expected = r"Error: -uaclientversion \(" + \ | expected = ( | ||||
re.escape(invalid_char) + r"\) contains invalid characters\." | r"Error: -uaclientversion \(" | ||||
+ re.escape(invalid_char) | |||||
+ r"\) contains invalid characters\." | |||||
) | |||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
[f"-uaclientversion={invalid_char}"], | [f"-uaclientversion={invalid_char}"], | ||||
expected, match=ErrorMatch.FULL_REGEX) | expected, | ||||
match=ErrorMatch.FULL_REGEX, | |||||
) | |||||
# for both | # for both | ||||
expected = r"Error: -uaclientname \(" + \ | expected = ( | ||||
re.escape(invalid_char) + r"\) contains invalid characters\." | r"Error: -uaclientname \(" | ||||
self.nodes[0].assert_start_raises_init_error( | + re.escape(invalid_char) | ||||
[f"-uaclientname={invalid_char}", | + r"\) contains invalid characters\." | ||||
f"-uaclientversion={invalid_char}"], | ) | ||||
expected, match=ErrorMatch.FULL_REGEX) | self.nodes[0].assert_start_raises_init_error( | ||||
[f"-uaclientname={invalid_char}", f"-uaclientversion={invalid_char}"], | |||||
expected, | |||||
match=ErrorMatch.FULL_REGEX, | |||||
) | |||||
if __name__ == '__main__': | if __name__ == "__main__": | ||||
UseragentTest().main() | UseragentTest().main() |