From b12a2a08a4a388d00a0af4dca107bae28f8890da Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sat, 27 Jul 2024 09:16:43 +0000 Subject: [PATCH] test.common: new `VirtBlockDevice` class --- test/cmdtest_py_d/ct_wallet.py | 29 +++++++++-------------------- test/include/common.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/test/cmdtest_py_d/ct_wallet.py b/test/cmdtest_py_d/ct_wallet.py index 1a4730b6..63852728 100755 --- a/test/cmdtest_py_d/ct_wallet.py +++ b/test/cmdtest_py_d/ct_wallet.py @@ -25,7 +25,7 @@ import os from mmgen.util import msg,capfirst,get_extension from mmgen.wallet import get_wallet_cls -from ..include.common import cfg,joinpath,imsg +from ..include.common import cfg, joinpath, imsg, VirtBlockDevice from .common import ref_dir,ref_wallet_brainpass,ref_wallet_incog_offset,hincog_fn,hincog_bytes from .ct_base import CmdTestBase from .ct_shared import CmdTestShared @@ -166,26 +166,15 @@ class CmdTestWalletConv(CmdTestBase,CmdTestShared): uopts_chk = ['-H',hi_parms,sl_parm] ) def ref_hincog_blkdev_conv_out(self): - def do_run(cmd): - from subprocess import run,PIPE,DEVNULL - return run(cmd,stdout=PIPE,stderr=DEVNULL,check=True) - if self.skip_for_win(): + + if self.skip_for_win('no loop device') or self.skip_for_mac('no loop device'): return 'skip' - imsg('Creating block device image file') - ic_img = joinpath(self.tmpdir,'hincog_blkdev_img') - do_run(['dd','if=/dev/zero','of='+ic_img,'bs=1K','count=1']) - ic_dev = do_run(['sudo','/sbin/losetup','-f']).stdout.strip().decode() - ic_dev_mode_orig = '{:o}'.format( os.stat(ic_dev).st_mode & 0xfff ) - ic_dev_mode = '0666' - imsg(f'Changing permissions on loop device to {ic_dev_mode!r}') - do_run(['sudo','chmod',ic_dev_mode,ic_dev]) - imsg(f'Attaching loop device {ic_dev!r}') - do_run(['sudo','/sbin/losetup',ic_dev,ic_img]) - self.ref_hincog_conv_out(ic_f=ic_dev) - imsg(f'Detaching loop device {ic_dev!r}') - do_run(['sudo','/sbin/losetup','-d',ic_dev]) - imsg(f'Resetting permissions on loop device to {ic_dev_mode_orig!r}') - do_run(['sudo','chmod',ic_dev_mode_orig,ic_dev]) + + b = VirtBlockDevice(self.tmpdir, '1K', 1) + b.setup() + self.ref_hincog_conv_out(ic_f=b.dev) + b.destroy() + return 'ok' # wallet conversion tests diff --git a/test/include/common.py b/test/include/common.py index 86f12c95..16feeee1 100755 --- a/test/include/common.py +++ b/test/include/common.py @@ -326,3 +326,32 @@ def get_ethkey(): return cmdname else: die(1,f'ethkey executable not found (tried {cmdnames})') + +def do_run(cmd): + from subprocess import run,PIPE,DEVNULL + return run(cmd, stdout=PIPE, stderr=DEVNULL, check=True) + +class VirtBlockDevice: + + def __init__(self, tmpdir, blksize, blkcount): + self.tmpdir = tmpdir + self.blksize = blksize + self.blkcount = blkcount + + def setup(self): + imsg('Creating block device image file') + blkdev_img = joinpath(self.tmpdir, 'hincog_blkdev_img') + do_run(['dd', 'if=/dev/zero', f'of={blkdev_img}', f'bs={self.blksize}', f'count={self.blkcount}']) + self.dev = do_run(['sudo', '/sbin/losetup', '-f']).stdout.strip().decode() + self.dev_mode_orig = '{:o}'.format(os.stat(self.dev).st_mode & 0xfff) + dev_mode = '0666' + imsg(f'Changing permissions on loop device to {dev_mode!r}') + do_run(['sudo', 'chmod', dev_mode, self.dev]) + imsg(f'Attaching loop device {self.dev!r}') + do_run(['sudo', '/sbin/losetup', self.dev, blkdev_img]) + + def destroy(self): + imsg(f'Detaching loop device {self.dev!r}') + do_run(['sudo', '/sbin/losetup', '-d', self.dev]) + imsg(f'Resetting permissions on loop device to {self.dev_mode_orig!r}') + do_run(['sudo', 'chmod', self.dev_mode_orig, self.dev])