tw.ctl: path cleanups; cmdtest ethdev: fix wallet_upgrade tests
This commit is contained in:
parent
65032a5b58
commit
3575d2afb2
2 changed files with 49 additions and 38 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue