Page MenuHomePhabricator

No OneTemporary

diff --git a/test/functional/feature_notifications.py b/test/functional/feature_notifications.py
index 77506ea2e5..a8bad79458 100755
--- a/test/functional/feature_notifications.py
+++ b/test/functional/feature_notifications.py
@@ -1,103 +1,120 @@
#!/usr/bin/env python3
# Copyright (c) 2014-2019 The Bitcoin Core developers
# Copyright (c) 2018 The Bitcoin developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test the -alertnotify, -blocknotify and -walletnotify options."""
import os
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import assert_equal, connect_nodes_bi, wait_until
-FORK_WARNING_MESSAGE = "Warning: Large-work fork detected, forking after block {}\n"
+FORK_WARNING_MESSAGE = "Warning: Large-work fork detected, forking after block {}"
class NotificationsTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
self.setup_clean_chain = True
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
def setup_network(self):
- self.alert_filename = os.path.join(self.options.tmpdir, "alert.txt")
- self.block_filename = os.path.join(self.options.tmpdir, "blocks.txt")
- self.tx_filename = os.path.join(
- self.options.tmpdir, "transactions.txt")
+ self.alertnotify_dir = os.path.join(self.options.tmpdir, "alertnotify")
+ self.blocknotify_dir = os.path.join(self.options.tmpdir, "blocknotify")
+ self.walletnotify_dir = os.path.join(
+ self.options.tmpdir, "walletnotify")
+ os.mkdir(self.alertnotify_dir)
+ os.mkdir(self.blocknotify_dir)
+ os.mkdir(self.walletnotify_dir)
# -alertnotify and -blocknotify on node0, walletnotify on node1
self.extra_args = [["-blockversion=2",
- "-alertnotify=echo %s >> {}".format(
- self.alert_filename),
- "-blocknotify=echo %s >> {}".format(self.block_filename)],
+ "-alertnotify=echo > {}".format(
+ os.path.join(self.alertnotify_dir, '%s')),
+ "-blocknotify=echo > {}".format(os.path.join(self.blocknotify_dir, '%s'))],
["-blockversion=211",
"-rescan",
- "-walletnotify=echo %s >> {}".format(self.tx_filename)]]
+ "-walletnotify=echo > {}".format(os.path.join(self.walletnotify_dir, '%s'))]]
super().setup_network()
def run_test(self):
self.log.info("test -blocknotify")
block_count = 10
blocks = self.nodes[1].generate(block_count)
- # wait at most 10 seconds for expected file size before reading the
- # content
- wait_until(lambda: os.path.isfile(self.block_filename) and os.stat(
- self.block_filename).st_size >= (block_count * 65), timeout=10)
+ # wait at most 10 seconds for expected number of files before reading
+ # the content
+ wait_until(
+ lambda: len(
+ os.listdir(
+ self.blocknotify_dir)) == block_count,
+ timeout=10)
- # file content should equal the generated blocks hashes
- with open(self.block_filename, 'r', encoding="utf-8") as f:
- assert_equal(sorted(blocks), sorted(l.strip()
- for l in f.read().splitlines()))
+ # directory content should equal the generated blocks hashes
+ assert_equal(sorted(blocks), sorted(os.listdir(self.blocknotify_dir)))
self.log.info("test -walletnotify")
- # wait at most 10 seconds for expected file size before reading the
- # content
- wait_until(lambda: os.path.isfile(self.tx_filename) and os.stat(
- self.tx_filename).st_size >= (block_count * 65), timeout=10)
-
- # file content should equal the generated transaction hashes
+ # wait at most 10 seconds for expected number of files before reading
+ # the content
+ wait_until(
+ lambda: len(
+ os.listdir(
+ self.walletnotify_dir)) == block_count,
+ timeout=10)
+
+ # directory content should equal the generated transaction hashes
txids_rpc = list(
map(lambda t: t['txid'], self.nodes[1].listtransactions("*", block_count)))
- with open(self.tx_filename, 'r', encoding="ascii") as f:
- assert_equal(sorted(txids_rpc), sorted(l.strip()
- for l in f.read().splitlines()))
- os.remove(self.tx_filename)
+ assert_equal(
+ sorted(txids_rpc), sorted(
+ os.listdir(
+ self.walletnotify_dir)))
+ for tx_file in os.listdir(self.walletnotify_dir):
+ os.remove(os.path.join(self.walletnotify_dir, tx_file))
self.log.info("test -walletnotify after rescan")
# restart node to rescan to force wallet notifications
self.restart_node(1)
connect_nodes_bi(self.nodes[0], self.nodes[1])
- wait_until(lambda: os.path.isfile(self.tx_filename) and os.stat(
- self.tx_filename).st_size >= (block_count * 65), timeout=10)
+ wait_until(
+ lambda: len(
+ os.listdir(
+ self.walletnotify_dir)) == block_count,
+ timeout=10)
- # file content should equal the generated transaction hashes
+ # directory content should equal the generated transaction hashes
txids_rpc = list(
map(lambda t: t['txid'], self.nodes[1].listtransactions("*", block_count)))
- with open(self.tx_filename, 'r', encoding="ascii") as f:
- assert_equal(sorted(txids_rpc), sorted(l.strip()
- for l in f.read().splitlines()))
+ assert_equal(
+ sorted(txids_rpc), sorted(
+ os.listdir(
+ self.walletnotify_dir)))
# Create an invalid chain and ensure the node warns.
self.log.info("test -alertnotify for forked chain")
fork_block = self.nodes[0].getbestblockhash()
self.nodes[0].generate(1)
invalid_block = self.nodes[0].getbestblockhash()
self.nodes[0].generate(7)
# Invalidate a large branch, which should trigger an alert.
self.nodes[0].invalidateblock(invalid_block)
# Give bitcoind 10 seconds to write the alert notification
- wait_until(lambda: os.path.isfile(self.alert_filename) and
- os.path.getsize(self.alert_filename), timeout=10)
+ wait_until(lambda: len(os.listdir(self.alertnotify_dir)), timeout=10)
+
+ # The notification command is unable to properly handle the spaces on
+ # windows. Skip the content check in this case.
+ if os.name != 'nt':
+ assert FORK_WARNING_MESSAGE.format(
+ fork_block) in os.listdir(self.alertnotify_dir)
- self.log.info(self.alert_filename)
- with open(self.alert_filename, 'r', encoding='utf8') as f:
- assert_equal(f.read(), (FORK_WARNING_MESSAGE.format(fork_block)))
+ for notify_file in os.listdir(self.alertnotify_dir):
+ os.remove(os.path.join(self.alertnotify_dir, notify_file))
if __name__ == '__main__':
NotificationsTest().main()

File Metadata

Mime Type
text/x-diff
Expires
Wed, May 21, 20:13 (1 d, 8 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5865850
Default Alt Text
(7 KB)

Event Timeline