123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #!/usr/bin/env python3
- #
- # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
- # Copyright (C)2013-2021 The MMGen Project <mmgen@tuta.io>
- #
- # Project source code repository: https://github.com/mmgen/mmgen
- # Licensed according to the terms of GPL Version 3. See LICENSE for details.
- """
- ts_misc.py: CfgFile tests for the MMGen test.py test suite
- """
- import shutil
- from ..include.common import *
- from .ts_base import *
- from mmgen.cfg import *
- class TestSuiteCfg(TestSuiteBase):
- 'CfgFile API'
- networks = ('btc',)
- tmpdir_nums = [40]
- base_passthru_opts = ()
- cmd_group = (
- ('nosysfile', (40,'init with missing system cfg sample file', [])),
- ('sysfile', (40,'init with system cfg sample file in place', [])),
- ('no_metadata_sample', (40,'init with unversioned cfg sample file', [])),
- ('altered_sample', (40,'init with user-modified cfg sample file', [])),
- ('old_sample', (40,'init with old v2 cfg sample file', [])),
- ('old_sample_bad_var', (40,'init with old v2 cfg sample file and bad variable in mmgen.cfg', [])),
- )
- def __init__(self,trunner,cfgs,spawn):
- os.environ['MMGEN_TEST_SUITE_CFGTEST'] = '1'
- TestSuiteBase.__init__(self,trunner,cfgs,spawn)
- def spawn_test(self,args=[]):
- return self.spawn('test/misc/cfg.py',['--data-dir={}'.format(self.path('data_dir'))]+args,cmd_dir='.')
- def path(self,id_str):
- return {
- 'ref': 'test/ref/mmgen.cfg',
- 'data_dir': '{}/data_dir'.format(self.tmpdir),
- 'shared_data': '{}/data_dir/{}'.format(self.tmpdir,CfgFileSampleSys.test_fn_subdir),
- 'usr': '{}/data_dir/mmgen.cfg'.format(self.tmpdir),
- 'sys': '{}/data_dir/{}/mmgen.cfg'.format(self.tmpdir,CfgFileSampleSys.test_fn_subdir),
- 'sample': '{}/data_dir/mmgen.cfg.sample'.format(self.tmpdir),
- }[id_str]
- def nosysfile(self):
- t = self.spawn_test()
- errstr = CfgFile.file_not_found_fs.format(CfgFileSampleSys.desc,self.path('shared_data')+'/mmgen.cfg')
- for i in (1,2,3,4,5):
- t.expect(errstr)
- for k in ('usr','sys','sample'):
- t.expect('{} cfg: {}'.format(k,self.path(k)))
- assert not os.path.exists(self.path(k)), self.path(k)
- t.read()
- return t
- def copy_sys_sample(self):
- os.makedirs(self.path('shared_data'),exist_ok=True)
- shutil.copy2(self.path('ref'),self.path('sys'))
- def sysfile(self):
- self.copy_sys_sample()
- t = self.spawn_test()
- t.read()
- u = read_from_file(self.path('usr'))
- S = read_from_file(self.path('sys'))
- assert u[-1] == '\n', u
- assert u.replace('\r\n','\n') == S, 'u != S'
- self.check_replaced_sample()
- return t
- def check_replaced_sample(self):
- S = read_from_file(self.path('sys'))
- s = read_from_file(self.path('sample'))
- assert s[-1] == '\n', s
- assert S.splitlines() == s.splitlines()[:-1], 'sys != sample[:-1]'
- def bad_sample(self,s,e):
- write_to_file(self.path('sample'),s)
- t = self.spawn_test()
- t.expect(e)
- t.read()
- self.check_replaced_sample()
- return t
- def no_metadata_sample(self):
- self.copy_sys_sample()
- s = read_from_file(self.path('sys'))
- e = CfgFileSampleUsr.out_of_date_fs.format(self.path('sample'))
- return self.bad_sample(s,e)
- def altered_sample(self):
- s = '\n'.join(read_from_file(self.path('sample')).splitlines()[1:]) + '\n'
- e = CfgFileSampleUsr.altered_by_user_fs.format(self.path('sample'))
- return self.bad_sample(s,e)
- def old_sample_common(self,old_set=False,args=[]):
- s = read_from_file(self.path('sys'))
- d = s.replace('monero_','zcash_').splitlines()
- a1 = ['','# Uncomment to make foo true:','# foo true']
- a2 = ['','# Uncomment to make bar false:','# bar false']
- d = d + a1 + a2
- chk = CfgFileSample.cls_make_metadata(d)
- write_to_file(self.path('sample'),'\n'.join(d+chk) + '\n')
- t = self.spawn_test(args=args)
- t.expect('options have changed')
- for s in ('have been added','monero_','have been removed','zcash_','foo','bar'):
- t.expect(s)
- if old_set:
- for s in ('must be deleted','bar','foo'):
- t.expect(s)
- cp = CfgFileSampleUsr.details_confirm_prompt + ' (y/N): '
- t.expect(cp,'y')
- for s in ('CHANGES','Removed','# zcash_','# foo','# bar','Added','# monero_'):
- t.expect(s)
- t.expect(cp,'n')
- if old_set:
- t.expect('unrecognized option')
- t.req_exit_val = 1
- if args == ['parse_test']:
- t.expect('parsed chunks: 29')
- t.expect('usr cfg: testnet=true rpc_password=passwOrd')
- t.read()
- if not old_set:
- self.check_replaced_sample()
- return t
- def old_sample(self):
- d = ['testnet true','rpc_password passwOrd']
- write_to_file(self.path('usr'),'\n'.join(d) + '\n')
- return self.old_sample_common(args=['parse_test'])
- def old_sample_bad_var(self):
- d = ['foo true','bar false']
- write_to_file(self.path('usr'),'\n'.join(d) + '\n')
- return self.old_sample_common(old_set=True)
|