tw.ctl: path cleanups; cmdtest ethdev: fix wallet_upgrade tests

This commit is contained in:
The MMGen Project 2024-03-09 11:33:25 +00:00
commit 3575d2afb2
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
2 changed files with 49 additions and 38 deletions

View file

@ -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,

View file

@ -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'