Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_encryption.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2016 The Bitcoin Core developers | # Copyright (c) 2016 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test Wallet encryption""" | """Test Wallet encryption""" | ||||
import time | import time | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import ( | from test_framework.util import ( | ||||
assert_equal, | assert_equal, | ||||
assert_raises_rpc_error, | assert_raises_rpc_error, | ||||
assert_greater_than, | |||||
assert_greater_than_or_equal, | |||||
) | ) | ||||
class WalletEncryptionTest(BitcoinTestFramework): | class WalletEncryptionTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
Show All 30 Lines | def run_test(self): | ||||
-13, "Please enter the wallet passphrase with walletpassphrase first", | -13, "Please enter the wallet passphrase with walletpassphrase first", | ||||
self.nodes[0].dumpprivkey, address) | self.nodes[0].dumpprivkey, address) | ||||
# Test wrong passphrase | # Test wrong passphrase | ||||
assert_raises_rpc_error(-14, "wallet passphrase entered was incorrect", | assert_raises_rpc_error(-14, "wallet passphrase entered was incorrect", | ||||
self.nodes[0].walletpassphrase, passphrase + "wrong", 10) | self.nodes[0].walletpassphrase, passphrase + "wrong", 10) | ||||
# Test walletlock and unlocked_until values | # Test walletlock and unlocked_until values | ||||
self.nodes[0].setmocktime(1) | self.mocktime = 1 | ||||
self.nodes[0].setmocktime(self.mocktime) | |||||
self.nodes[0].walletpassphrase(passphrase, 84600) | self.nodes[0].walletpassphrase(passphrase, 84600) | ||||
assert_equal(privkey, self.nodes[0].dumpprivkey(address)) | assert_equal(privkey, self.nodes[0].dumpprivkey(address)) | ||||
assert_equal( | assert_equal( | ||||
self.nodes[0].getwalletinfo()['unlocked_until'], 1 + 84600) | self.nodes[0].getwalletinfo()['unlocked_until'], 1 + 84600) | ||||
self.nodes[0].walletlock() | self.nodes[0].walletlock() | ||||
assert_raises_rpc_error( | assert_raises_rpc_error( | ||||
-13, "Please enter the wallet passphrase with walletpassphrase first", | -13, "Please enter the wallet passphrase with walletpassphrase first", | ||||
self.nodes[0].dumpprivkey, address) | self.nodes[0].dumpprivkey, address) | ||||
assert_equal(self.nodes[0].getwalletinfo()['unlocked_until'], 0) | assert_equal(self.nodes[0].getwalletinfo()['unlocked_until'], 0) | ||||
# Test passphrase changes | # Test passphrase changes | ||||
self.nodes[0].walletpassphrasechange(passphrase, passphrase2) | self.nodes[0].walletpassphrasechange(passphrase, passphrase2) | ||||
assert_raises_rpc_error(-14, "wallet passphrase entered was incorrect", | assert_raises_rpc_error(-14, "wallet passphrase entered was incorrect", | ||||
self.nodes[0].walletpassphrase, passphrase, 10) | self.nodes[0].walletpassphrase, passphrase, 10) | ||||
self.nodes[0].walletpassphrase(passphrase2, 10) | self.nodes[0].walletpassphrase(passphrase2, 10) | ||||
assert_equal(privkey, self.nodes[0].dumpprivkey(address)) | assert_equal(privkey, self.nodes[0].dumpprivkey(address)) | ||||
self.nodes[0].walletlock() | |||||
# Test timeout bounds | |||||
assert_raises_rpc_error(-8, "Timeout cannot be negative.", | |||||
self.nodes[0].walletpassphrase, passphrase2, -10) | |||||
# Check the timeout | |||||
# Check a time less than the limit | |||||
MAX_VALUE = 100000000 | |||||
expected_time = self.mocktime + MAX_VALUE - 600 | |||||
self.nodes[0].walletpassphrase(passphrase2, MAX_VALUE - 600) | |||||
actual_time = self.nodes[0].getwalletinfo()['unlocked_until'] | |||||
assert_greater_than_or_equal(actual_time, expected_time) | |||||
# 5 second buffer | |||||
assert_greater_than(expected_time + 5, actual_time) | |||||
# Check a time greater than the limit | |||||
expected_time = self.mocktime + MAX_VALUE - 1 | |||||
self.nodes[0].walletpassphrase(passphrase2, MAX_VALUE + 1000) | |||||
actual_time = self.nodes[0].getwalletinfo()['unlocked_until'] | |||||
assert_greater_than_or_equal(actual_time, expected_time) | |||||
# 5 second buffer | |||||
assert_greater_than(expected_time + 5, actual_time) | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
WalletEncryptionTest().main() | WalletEncryptionTest().main() |