From 3575d2afb26393388ea05a8a0a1a7781ff32849d Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sat, 9 Mar 2024 11:33:25 +0000 Subject: [PATCH] tw.ctl: path cleanups; cmdtest ethdev: fix wallet_upgrade tests --- mmgen/tw/ctl.py | 40 +++++++++++++++++------------ test/cmdtest_py_d/ct_ethdev.py | 47 +++++++++++++++++++--------------- 2 files changed, 49 insertions(+), 38 deletions(-) diff --git a/mmgen/tw/ctl.py b/mmgen/tw/ctl.py index 456572be..226324a1 100755 --- a/mmgen/tw/ctl.py +++ b/mmgen/tw/ctl.py @@ -22,6 +22,7 @@ tw.ctl: Tracking wallet control class for the MMGen suite import json from collections import namedtuple +from pathlib import Path from ..util import msg,msg_r,suf,die from ..base_obj import AsyncInit @@ -52,6 +53,7 @@ class TwCtl(MMGenObject,metaclass=AsyncInit): use_tw_file = False aggressive_sync = False importing = False + tw_fn = 'tracking-wallet.json' def __new__(cls,cfg,proto,*args,**kwargs): return MMGenObject.__new__(proto.base_proto_subclass(cls,'tw.ctl')) @@ -63,6 +65,7 @@ class TwCtl(MMGenObject,metaclass=AsyncInit): mode = 'r', token_addr = None, no_rpc = False, + no_wallet_init = False, rpc_ignore_wallet = False): assert mode in ('r','w','i'), f"{mode!r}: wallet mode must be 'r','w' or 'i'" @@ -79,6 +82,21 @@ class TwCtl(MMGenObject,metaclass=AsyncInit): self.desc = self.base_desc = f'{self.proto.name} tracking wallet' self.cur_balances = {} # cache balances to prevent repeated lookups per program invocation + if self.use_tw_file: + if self.proto.coin == 'BTC': + self.tw_dir = Path(self.cfg.data_dir) + else: + self.tw_dir = Path( + self.cfg.data_dir_root, + 'altcoins', + self.proto.coin.lower(), + ('' if self.proto.network == 'mainnet' else self.proto.network) + ) + self.tw_path = self.tw_dir / self.tw_fn + + if no_wallet_init: + return + if self.use_tw_file: self.init_from_wallet_file() else: @@ -91,32 +109,20 @@ class TwCtl(MMGenObject,metaclass=AsyncInit): self.conv_types(self.data[self.data_key]) def init_from_wallet_file(self): - import os - tw_dir = ( - os.path.join(self.cfg.data_dir) if self.proto.coin == 'BTC' else - os.path.join( - self.cfg.data_dir_root, - 'altcoins', - self.proto.coin.lower(), - ('' if self.proto.network == 'mainnet' else 'testnet') - )) - self.tw_fn = os.path.join(tw_dir,'tracking-wallet.json') - from ..fileutil import check_or_create_dir,get_data_from_file - check_or_create_dir(tw_dir) - + check_or_create_dir(self.tw_dir) try: - self.orig_data = get_data_from_file( self.cfg, self.tw_fn, quiet=True ) + self.orig_data = get_data_from_file(self.cfg, self.tw_path, quiet=True) self.data = json.loads(self.orig_data) except: try: - os.stat(self.tw_fn) + self.tw_path.stat() except: self.orig_data = '' self.init_empty() self.force_write() else: - die( 'WalletFileError', f'File {self.tw_fn!r} exists but does not contain valid json data' ) + die('WalletFileError', f'File ‘{self.tw_path}’ exists but does not contain valid JSON data') else: self.upgrade_wallet_maybe() @@ -194,7 +200,7 @@ class TwCtl(MMGenObject,metaclass=AsyncInit): from ..fileutil import write_data_to_file write_data_to_file( self.cfg, - self.tw_fn, + self.tw_path, data, desc = f'{self.base_desc} data', ask_overwrite = False, diff --git a/test/cmdtest_py_d/ct_ethdev.py b/test/cmdtest_py_d/ct_ethdev.py index 0b333fdd..428b4358 100755 --- a/test/cmdtest_py_d/ct_ethdev.py +++ b/test/cmdtest_py_d/ct_ethdev.py @@ -24,6 +24,7 @@ import sys,os,re,shutil,asyncio,json from decimal import Decimal from collections import namedtuple from subprocess import run,PIPE,DEVNULL +from pathlib import Path from mmgen.color import yellow,blue,cyan,set_vt100 from mmgen.util import msg,rmsg,die @@ -565,20 +566,23 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared): write_to_file( self.genesis_fn, json.dumps(genesis_data,indent=' ')+'\n' ) init_genesis(self.genesis_fn) - def wallet_upgrade(self,src_file): + async def _wallet_upgrade(self, src_fn, expect1, expect2=None): if self.proto.coin == 'ETC': msg(f'skipping test {self.test_name!r} for ETC') return 'skip' - src_dir = joinpath(ref_dir,'ethereum') - dest_dir = joinpath(self.tr.data_dir,'altcoins',self.proto.coin.lower()) - w_from = joinpath(src_dir,src_file) - w_to = joinpath(dest_dir,'tracking-wallet.json') - os.makedirs(dest_dir,mode=0o750,exist_ok=True) - dest = shutil.copy2(w_from,w_to) - assert dest == w_to, dest + from mmgen.tw.ctl import TwCtl + twctl = await TwCtl(cfg, self.proto, no_wallet_init=True) + from_fn = Path(ref_dir) / 'ethereum' / src_fn + bak_fn = twctl.tw_dir / f'upgraded-{src_fn}' + twctl.tw_dir.mkdir(mode=0o750, parents=True, exist_ok=True) + dest = shutil.copy2(from_fn, twctl.tw_path) + assert dest == twctl.tw_path, f'{dest} != {twctl.tw_path}' t = self.spawn('mmgen-tool', self.eth_args + ['twview']) + t.expect(expect1) + if expect2: + t.expect(expect2) t.read() - os.unlink(w_to) + twctl.tw_path.rename(bak_fn) return t def daemon_version(self): @@ -586,10 +590,11 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared): t.expect('version') return t - def wallet_upgrade1(self): - return self.wallet_upgrade('tracking-wallet-v1.json') - def wallet_upgrade2(self): - return self.wallet_upgrade('tracking-wallet-v2.json') + async def wallet_upgrade1(self): + return await self._wallet_upgrade('tracking-wallet-v1.json', 'accounts field', 'network field') + + async def wallet_upgrade2(self): + return await self._wallet_upgrade('tracking-wallet-v2.json', 'token params field', 'network field') def addrgen(self,addrs='1-3,11-13,21-23'): t = self.spawn('mmgen-addrgen', self.eth_args + [dfl_words_file,addrs]) @@ -1447,12 +1452,11 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared): async def twmove(self): self.spawn('',msg_only=True) from mmgen.tw.ctl import TwCtl - twctl = await TwCtl(cfg,self.proto) + twctl = await TwCtl(cfg, self.proto, no_wallet_init=True) imsg('Moving tracking wallet') - bakfile = twctl.tw_fn + '.bak.json' - if os.path.exists(bakfile): - os.unlink(bakfile) - os.rename( twctl.tw_fn, bakfile ) + fn_bak = twctl.tw_path.with_suffix('.bak.json') + fn_bak.unlink(missing_ok=True) + twctl.tw_path.rename(fn_bak) return 'ok' def twimport(self,add_args=[],expect_str=None): @@ -1479,10 +1483,11 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared): async def twcompare(self): self.spawn('',msg_only=True) from mmgen.tw.ctl import TwCtl - twctl = await TwCtl(cfg,self.proto) - fn = twctl.tw_fn + twctl = await TwCtl(cfg, self.proto, no_wallet_init=True) + fn = twctl.tw_path + fn_bak = fn.with_suffix('.bak.json') imsg('Comparing imported tracking wallet with original') - data = [json.dumps(json.loads(read_from_file(f)),sort_keys=True) for f in (fn,fn+'.bak.json')] + data = [json.dumps(json.loads(f.read_text()), sort_keys=True) for f in (fn, fn_bak)] cmp_or_die(*data,'tracking wallets') return 'ok'