Skip to content

Commit 5b644a2

Browse files
committed
pytest: ensure hsmtool tests do complete writes.
This may be causing the test flakiness we sometimes see in CI. Signed-off-by: Rusty Russell <[email protected]>
1 parent 3f05dff commit 5b644a2

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

tests/test_wallet.py

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,13 @@ def test_transaction_annotations(node_factory, bitcoind):
990990
assert(txs[1]['outputs'][fundidx]['channel'] == scid)
991991

992992

993+
def write_all(fd, bytestr):
994+
"""Wrapper, since os.write can do partial writes"""
995+
off = 0
996+
while off < len(bytestr):
997+
off += os.write(fd, bytestr[off:])
998+
999+
9931000
@unittest.skipIf(VALGRIND, "It does not play well with prompt and key derivation.")
9941001
def test_hsm_secret_encryption(node_factory):
9951002
l1 = node_factory.get_node(may_fail=True) # May fail when started without key
@@ -1002,9 +1009,9 @@ def test_hsm_secret_encryption(node_factory):
10021009
l1.daemon.opts.update({"encrypted-hsm": None})
10031010
l1.daemon.start(stdin=slave_fd, wait_for_initialized=False)
10041011
l1.daemon.wait_for_log(r'Enter hsm_secret password')
1005-
os.write(master_fd, password.encode("utf-8"))
1012+
write_all(master_fd, password.encode("utf-8"))
10061013
l1.daemon.wait_for_log(r'Confirm hsm_secret password')
1007-
os.write(master_fd, password.encode("utf-8"))
1014+
write_all(master_fd, password.encode("utf-8"))
10081015
l1.daemon.wait_for_log("Server started with public key")
10091016
id = l1.rpc.getinfo()["id"]
10101017
l1.stop()
@@ -1019,18 +1026,18 @@ def test_hsm_secret_encryption(node_factory):
10191026
l1.daemon.start(stdin=slave_fd, stderr=subprocess.STDOUT,
10201027
wait_for_initialized=False)
10211028
l1.daemon.wait_for_log(r'Enter hsm_secret password')
1022-
os.write(master_fd, password[2:].encode("utf-8"))
1029+
write_all(master_fd, password[2:].encode("utf-8"))
10231030
l1.daemon.wait_for_log(r'Confirm hsm_secret password')
1024-
os.write(master_fd, password[2:].encode("utf-8"))
1031+
write_all(master_fd, password[2:].encode("utf-8"))
10251032
assert(l1.daemon.proc.wait(WAIT_TIMEOUT) == 1)
10261033
assert(l1.daemon.is_in_log("Wrong password for encrypted hsm_secret."))
10271034

10281035
# Test we can restore the same wallet with the same password
10291036
l1.daemon.start(stdin=slave_fd, wait_for_initialized=False)
10301037
l1.daemon.wait_for_log(r'The hsm_secret is encrypted')
1031-
os.write(master_fd, password.encode("utf-8"))
1038+
write_all(master_fd, password.encode("utf-8"))
10321039
l1.daemon.wait_for_log(r'Confirm hsm_secret password')
1033-
os.write(master_fd, password.encode("utf-8"))
1040+
write_all(master_fd, password.encode("utf-8"))
10341041
l1.daemon.wait_for_log("Server started with public key")
10351042
assert id == l1.rpc.getinfo()["id"]
10361043
l1.stop()
@@ -1066,9 +1073,9 @@ def test_hsmtool_secret_decryption(node_factory):
10661073
l1.daemon.opts.update({"encrypted-hsm": None})
10671074
l1.daemon.start(stdin=slave_fd, wait_for_initialized=False)
10681075
l1.daemon.wait_for_log(r'Enter hsm_secret password')
1069-
os.write(master_fd, password.encode("utf-8"))
1076+
write_all(master_fd, password.encode("utf-8"))
10701077
l1.daemon.wait_for_log(r'Confirm hsm_secret password')
1071-
os.write(master_fd, password.encode("utf-8"))
1078+
write_all(master_fd, password.encode("utf-8"))
10721079
l1.daemon.wait_for_log("Server started with public key")
10731080
node_id = l1.rpc.getinfo()["id"]
10741081
l1.stop()
@@ -1079,7 +1086,7 @@ def test_hsmtool_secret_decryption(node_factory):
10791086
hsmtool.start(stdin=slave_fd,
10801087
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
10811088
hsmtool.wait_for_log(r"Enter hsm_secret password:")
1082-
os.write(master_fd, "A wrong pass\n\n".encode("utf-8"))
1089+
write_all(master_fd, "A wrong pass\n\n".encode("utf-8"))
10831090
hsmtool.proc.wait(WAIT_TIMEOUT)
10841091
hsmtool.is_in_log(r"Wrong password")
10851092

@@ -1088,7 +1095,7 @@ def test_hsmtool_secret_decryption(node_factory):
10881095
hsmtool.start(stdin=slave_fd,
10891096
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
10901097
hsmtool.wait_for_log(r"Enter hsm_secret password:")
1091-
os.write(master_fd, password.encode("utf-8"))
1098+
write_all(master_fd, password.encode("utf-8"))
10921099
assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0
10931100
# Then test we can now start it without password
10941101
l1.daemon.opts.pop("encrypted-hsm")
@@ -1102,9 +1109,9 @@ def test_hsmtool_secret_decryption(node_factory):
11021109
hsmtool.start(stdin=slave_fd,
11031110
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
11041111
hsmtool.wait_for_log(r"Enter hsm_secret password:")
1105-
os.write(master_fd, password.encode("utf-8"))
1112+
write_all(master_fd, password.encode("utf-8"))
11061113
hsmtool.wait_for_log(r"Confirm hsm_secret password:")
1107-
os.write(master_fd, password.encode("utf-8"))
1114+
write_all(master_fd, password.encode("utf-8"))
11081115
assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0
11091116
# Now we need to pass the encrypted-hsm startup option
11101117
l1.stop()
@@ -1117,9 +1124,9 @@ def test_hsmtool_secret_decryption(node_factory):
11171124
wait_for_initialized=False)
11181125

11191126
l1.daemon.wait_for_log(r'The hsm_secret is encrypted')
1120-
os.write(master_fd, password.encode("utf-8"))
1127+
write_all(master_fd, password.encode("utf-8"))
11211128
l1.daemon.wait_for_log(r'Confirm hsm_secret password')
1122-
os.write(master_fd, password.encode("utf-8"))
1129+
write_all(master_fd, password.encode("utf-8"))
11231130
l1.daemon.wait_for_log("Server started with public key")
11241131
print(node_id, l1.rpc.getinfo()["id"])
11251132
assert node_id == l1.rpc.getinfo()["id"]
@@ -1131,7 +1138,7 @@ def test_hsmtool_secret_decryption(node_factory):
11311138
hsmtool.start(stdin=slave_fd,
11321139
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
11331140
hsmtool.wait_for_log(r"Enter hsm_secret password:")
1134-
os.write(master_fd, password.encode("utf-8"))
1141+
write_all(master_fd, password.encode("utf-8"))
11351142
assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0
11361143
l1.daemon.opts.pop("encrypted-hsm")
11371144
l1.daemon.start(stdin=slave_fd, wait_for_initialized=True)
@@ -1153,7 +1160,7 @@ def test_hsmtool_secret_decryption(node_factory):
11531160
hsmtool.start(stdin=slave_fd,
11541161
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
11551162
hsmtool.wait_for_log("Enter hsm_secret password:")
1156-
os.write(master_fd, password.encode("utf-8"))
1163+
write_all(master_fd, password.encode("utf-8"))
11571164
hsmtool.wait_for_log("Successfully decrypted")
11581165
assert hsmtool.proc.wait(WAIT_TIMEOUT) == 0
11591166

@@ -1208,12 +1215,12 @@ def test_hsmtool_generatehsm(node_factory):
12081215
hsmtool.start(stdin=slave_fd, stdout=subprocess.PIPE,
12091216
stderr=subprocess.PIPE)
12101217
hsmtool.wait_for_log(r"Select your language:")
1211-
os.write(master_fd, "0\n".encode("utf-8"))
1218+
write_all(master_fd, "0\n".encode("utf-8"))
12121219
hsmtool.wait_for_log(r"Introduce your BIP39 word list")
1213-
os.write(master_fd, "ritual idle hat sunny universe pluck key alpha wing "
1214-
"cake have wedding\n".encode("utf-8"))
1220+
write_all(master_fd, "ritual idle hat sunny universe pluck key alpha wing "
1221+
"cake have wedding\n".encode("utf-8"))
12151222
hsmtool.wait_for_log(r"Enter your passphrase:")
1216-
os.write(master_fd, "This is actually not a passphrase\n".encode("utf-8"))
1223+
write_all(master_fd, "This is actually not a passphrase\n".encode("utf-8"))
12171224
hsmtool.proc.wait(WAIT_TIMEOUT)
12181225
hsmtool.is_in_log(r"New hsm_secret file created")
12191226

0 commit comments

Comments
 (0)