Browse Source

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

The MMGen Project 1 year ago
parent
commit
3575d2afb2
2 changed files with 49 additions and 38 deletions
  1. 23 17
      mmgen/tw/ctl.py
  2. 26 21
      test/cmdtest_py_d/ct_ethdev.py

+ 23 - 17
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,

+ 26 - 21
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'