test.py: move tmpdirs, move config code to test_py_d.cfg
This commit is contained in:
parent
0094d89bad
commit
840b4d1d43
6 changed files with 246 additions and 215 deletions
|
|
@ -1 +1 @@
|
|||
13.2.dev9
|
||||
13.2.dev10
|
||||
|
|
|
|||
|
|
@ -108,7 +108,8 @@ def cleandir(d,do_msg=False):
|
|||
rmtree(os.path.join(d_enc,f),ignore_errors=True)
|
||||
|
||||
def mk_tmpdir(d):
|
||||
try: os.mkdir(d,0o755)
|
||||
try:
|
||||
os.makedirs( d, mode=0o755, exist_ok=True )
|
||||
except OSError as e:
|
||||
if e.errno != 17:
|
||||
raise
|
||||
|
|
|
|||
216
test/test.py
216
test/test.py
|
|
@ -204,190 +204,10 @@ if opt.exact_output:
|
|||
if skipping_deps:
|
||||
opt.no_daemon_autostart = True
|
||||
|
||||
cfgs = { # addr_idx_lists (except 31,32,33,34) must contain exactly 8 addresses
|
||||
'1': { 'wpasswd': 'Dorian-α',
|
||||
'kapasswd': 'Grok the blockchain',
|
||||
'addr_idx_list': '12,99,5-10,5,12',
|
||||
'dep_generators': {
|
||||
pwfile: 'walletgen',
|
||||
'mmdat': 'walletgen',
|
||||
'addrs': 'addrgen',
|
||||
'rawtx': 'txcreate',
|
||||
'txbump': 'txbump',
|
||||
'sigtx': 'txsign',
|
||||
'mmwords': 'export_mnemonic',
|
||||
'mmseed': 'export_seed',
|
||||
'mmhex': 'export_hex',
|
||||
'mmincog': 'export_incog',
|
||||
'mmincox': 'export_incog_hex',
|
||||
hincog_fn: 'export_incog_hidden',
|
||||
incog_id_fn: 'export_incog_hidden',
|
||||
'akeys.mmenc': 'keyaddrgen'
|
||||
},
|
||||
},
|
||||
'2': { 'wpasswd': 'Hodling away',
|
||||
'addr_idx_list': '37,45,3-6,22-23',
|
||||
'seed_len': 128,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen2',
|
||||
'addrs': 'addrgen2',
|
||||
'rawtx': 'txcreate2',
|
||||
'sigtx': 'txsign2',
|
||||
'mmwords': 'export_mnemonic2',
|
||||
},
|
||||
},
|
||||
'3': { 'wpasswd': 'Major miner',
|
||||
'addr_idx_list': '73,54,1022-1023,2-5',
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen3',
|
||||
'addrs': 'addrgen3',
|
||||
'rawtx': 'txcreate3',
|
||||
'sigtx': 'txsign3'
|
||||
},
|
||||
},
|
||||
'4': { 'wpasswd': 'Hashrate good',
|
||||
'addr_idx_list': '63,1004,542-544,7-9',
|
||||
'seed_len': 192,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen4',
|
||||
'mmbrain': 'walletgen4',
|
||||
'addrs': 'addrgen4',
|
||||
'rawtx': 'txcreate4',
|
||||
'sigtx': 'txsign4',
|
||||
'txdo': 'txdo4',
|
||||
},
|
||||
'bw_filename': 'brainwallet.mmbrain',
|
||||
'bw_params': '192,1',
|
||||
},
|
||||
'5': { 'wpasswd': 'My changed password-α',
|
||||
'hash_preset': '2',
|
||||
'dep_generators': {
|
||||
'mmdat': 'passchg',
|
||||
pwfile: 'passchg',
|
||||
},
|
||||
},
|
||||
'6': { 'seed_len': 128,
|
||||
'seed_id': 'FE3C6545',
|
||||
'ref_bw_seed_id': '33F10310',
|
||||
'wpasswd': 'reference password',
|
||||
'kapasswd': '',
|
||||
'dep_generators': {
|
||||
'mmdat': 'ref_walletgen_brain_1',
|
||||
pwfile: 'ref_walletgen_brain_1',
|
||||
'addrs': 'refaddrgen_1',
|
||||
'akeys.mmenc': 'refkeyaddrgen_1'
|
||||
},
|
||||
},
|
||||
'7': { 'seed_len': 192,
|
||||
'seed_id': '1378FC64',
|
||||
'ref_bw_seed_id': 'CE918388',
|
||||
'wpasswd': 'reference password',
|
||||
'kapasswd': '',
|
||||
'dep_generators': {
|
||||
'mmdat': 'ref_walletgen_brain_2',
|
||||
pwfile: 'ref_walletgen_brain_2',
|
||||
'addrs': 'refaddrgen_2',
|
||||
'akeys.mmenc': 'refkeyaddrgen_2'
|
||||
},
|
||||
},
|
||||
'8': { 'seed_len': 256,
|
||||
'seed_id': '98831F3A',
|
||||
'ref_bw_seed_id': 'B48CD7FC',
|
||||
'wpasswd': 'reference password',
|
||||
'kapasswd': '',
|
||||
'dep_generators': {
|
||||
'mmdat': 'ref_walletgen_brain_3',
|
||||
pwfile: 'ref_walletgen_brain_3',
|
||||
'addrs': 'refaddrgen_3',
|
||||
'akeys.mmenc': 'refkeyaddrgen_3'
|
||||
},
|
||||
},
|
||||
'9': { 'tool_enc_infn': 'tool_encrypt.in',
|
||||
'dep_generators': {
|
||||
'tool_encrypt.in': 'tool_encrypt',
|
||||
'tool_encrypt.in.mmenc': 'tool_encrypt',
|
||||
},
|
||||
},
|
||||
'14': { 'kapasswd': 'Maxwell',
|
||||
'wpasswd': 'The Halving',
|
||||
'addr_idx_list': '61,998,502-504,7-9',
|
||||
'seed_len': 256,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen14',
|
||||
'addrs': 'addrgen14',
|
||||
'akeys.mmenc': 'keyaddrgen14',
|
||||
},
|
||||
},
|
||||
'15': { 'wpasswd': 'Dorian-α',
|
||||
'kapasswd': 'Grok the blockchain',
|
||||
'addr_idx_list': '12,99,5-10,5,12',
|
||||
'dep_generators': {
|
||||
pwfile: 'walletgen_dfl_wallet',
|
||||
'addrs': 'addrgen_dfl_wallet',
|
||||
'rawtx': 'txcreate_dfl_wallet',
|
||||
'sigtx': 'txsign_dfl_wallet',
|
||||
'mmseed': 'export_seed_dfl_wallet',
|
||||
'del_dw_run': 'delete_dfl_wallet',
|
||||
},
|
||||
},
|
||||
'16': { 'wpasswd': 'My changed password',
|
||||
'hash_preset': '2',
|
||||
'dep_generators': {
|
||||
pwfile: 'passchg_dfl_wallet',
|
||||
},
|
||||
},
|
||||
'17': {},
|
||||
'18': {},
|
||||
'19': { 'wpasswd':'abc' },
|
||||
'20': { 'wpasswd': 'Vsize it',
|
||||
'addr_idx_list': '1-8',
|
||||
'seed_len': 256,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen5',
|
||||
'addrs': 'addrgen5',
|
||||
'rawtx': 'txcreate5',
|
||||
'sigtx': 'txsign5',
|
||||
},
|
||||
},
|
||||
'21': { 'wpasswd': 'Vsize it',
|
||||
'addr_idx_list': '1-8',
|
||||
'seed_len': 256,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen6',
|
||||
'addrs': 'addrgen6',
|
||||
'rawtx': 'txcreate6',
|
||||
'sigtx': 'txsign6',
|
||||
},
|
||||
},
|
||||
'22': {},
|
||||
'23': {},
|
||||
# 26,27,28 are taken
|
||||
'29': {}, # xmrwallet
|
||||
'31': {},
|
||||
'32': {},
|
||||
'33': {},
|
||||
'34': {},
|
||||
'40': {},
|
||||
'41': {},
|
||||
'99': {}, # dummy
|
||||
}
|
||||
from test.test_py_d.cfg import cfgs,fixup_cfgs
|
||||
|
||||
def fixup_cfgs():
|
||||
for k in ('6','7','8'):
|
||||
cfgs['2'+k] = {}
|
||||
cfgs['2'+k].update(cfgs[k])
|
||||
|
||||
for k in cfgs:
|
||||
cfgs[k]['tmpdir'] = os.path.join('test',f'tmp{k}')
|
||||
cfgs[k]['segwit'] = randbool() if opt.segwit_random else bool(opt.segwit or opt.bech32)
|
||||
|
||||
from copy import deepcopy
|
||||
for a,b in (('6','11'),('7','12'),('8','13')):
|
||||
cfgs[b] = deepcopy(cfgs[a])
|
||||
cfgs[b]['tmpdir'] = os.path.join('test','tmp'+b)
|
||||
|
||||
if g.debug_utf8:
|
||||
for k in cfgs: cfgs[k]['tmpdir'] += '-α'
|
||||
for k in cfgs:
|
||||
cfgs[k]['tmpdir'] = os.path.join('test','tmp',str(k))
|
||||
|
||||
fixup_cfgs()
|
||||
|
||||
|
|
@ -460,6 +280,7 @@ def create_tmp_dirs(shm_dir):
|
|||
for cfg in sorted(cfgs):
|
||||
mk_tmpdir(cfgs[cfg]['tmpdir'])
|
||||
else:
|
||||
os.makedirs( 'test/tmp', mode=0o755, exist_ok=True )
|
||||
for cfg in sorted(cfgs):
|
||||
src = os.path.join(shm_dir,cfgs[cfg]['tmpdir'].split('/')[-1])
|
||||
mk_tmpdir(src)
|
||||
|
|
@ -505,34 +326,7 @@ def set_restore_term_at_exit():
|
|||
|
||||
class CmdGroupMgr(object):
|
||||
|
||||
cmd_groups_dfl = {
|
||||
'misc': ('TestSuiteMisc',{}),
|
||||
'opts': ('TestSuiteOpts',{'full_data':True}),
|
||||
'cfg': ('TestSuiteCfg',{'full_data':True}),
|
||||
'helpscreens': ('TestSuiteHelp',{'modname':'misc','full_data':True}),
|
||||
'main': ('TestSuiteMain',{'full_data':True}),
|
||||
'conv': ('TestSuiteWalletConv',{'is3seed':True,'modname':'wallet'}),
|
||||
'ref': ('TestSuiteRef',{}),
|
||||
'ref3': ('TestSuiteRef3Seed',{'is3seed':True,'modname':'ref_3seed'}),
|
||||
'ref3_addr': ('TestSuiteRef3Addr',{'is3seed':True,'modname':'ref_3seed'}),
|
||||
'ref_altcoin': ('TestSuiteRefAltcoin',{}),
|
||||
'seedsplit': ('TestSuiteSeedSplit',{}),
|
||||
'tool': ('TestSuiteTool',{'full_data':True}),
|
||||
'input': ('TestSuiteInput',{'full_data':True}),
|
||||
'output': ('TestSuiteOutput',{'modname':'misc','full_data':True}),
|
||||
'autosign': ('TestSuiteAutosign',{}),
|
||||
'regtest': ('TestSuiteRegtest',{}),
|
||||
# 'chainsplit': ('TestSuiteChainsplit',{}),
|
||||
'ethdev': ('TestSuiteEthdev',{}),
|
||||
'xmrwallet': ('TestSuiteXMRWallet',{}),
|
||||
}
|
||||
|
||||
cmd_groups_extra = {
|
||||
'autosign_btc': ('TestSuiteAutosignBTC',{'modname':'autosign'}),
|
||||
'autosign_live': ('TestSuiteAutosignLive',{'modname':'autosign'}),
|
||||
'autosign_live_simulate': ('TestSuiteAutosignLiveSimulate',{'modname':'autosign'}),
|
||||
'create_ref_tx': ('TestSuiteRefTX',{'modname':'misc','full_data':True}),
|
||||
}
|
||||
from test.test_py_d.cfg import cmd_groups_dfl,cmd_groups_extra
|
||||
|
||||
cmd_groups = cmd_groups_dfl.copy()
|
||||
cmd_groups.update(cmd_groups_extra)
|
||||
|
|
|
|||
236
test/test_py_d/cfg.py
Executable file
236
test/test_py_d/cfg.py
Executable file
|
|
@ -0,0 +1,236 @@
|
|||
#!/usr/bin/env python3
|
||||
#
|
||||
# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
|
||||
# Copyright (C)2013-2022 The MMGen Project <mmgen@tuta.io>
|
||||
# Licensed under the GNU General Public License, Version 3:
|
||||
# https://www.gnu.org/licenses
|
||||
# Public project repositories:
|
||||
# https://github.com/mmgen/mmgen
|
||||
# https://gitlab.com/mmgen/mmgen
|
||||
|
||||
"""
|
||||
test.test_py_d.cfg: configuration data for test.py
|
||||
"""
|
||||
|
||||
from .common import *
|
||||
|
||||
cmd_groups_dfl = {
|
||||
'misc': ('TestSuiteMisc',{}),
|
||||
'opts': ('TestSuiteOpts',{'full_data':True}),
|
||||
'cfg': ('TestSuiteCfg',{'full_data':True}),
|
||||
'helpscreens': ('TestSuiteHelp',{'modname':'misc','full_data':True}),
|
||||
'main': ('TestSuiteMain',{'full_data':True}),
|
||||
'conv': ('TestSuiteWalletConv',{'is3seed':True,'modname':'wallet'}),
|
||||
'ref': ('TestSuiteRef',{}),
|
||||
'ref3': ('TestSuiteRef3Seed',{'is3seed':True,'modname':'ref_3seed'}),
|
||||
'ref3_addr': ('TestSuiteRef3Addr',{'is3seed':True,'modname':'ref_3seed'}),
|
||||
'ref_altcoin': ('TestSuiteRefAltcoin',{}),
|
||||
'seedsplit': ('TestSuiteSeedSplit',{}),
|
||||
'tool': ('TestSuiteTool',{'full_data':True}),
|
||||
'input': ('TestSuiteInput',{'full_data':True}),
|
||||
'output': ('TestSuiteOutput',{'modname':'misc','full_data':True}),
|
||||
'autosign': ('TestSuiteAutosign',{}),
|
||||
'regtest': ('TestSuiteRegtest',{}),
|
||||
# 'chainsplit': ('TestSuiteChainsplit',{}),
|
||||
'ethdev': ('TestSuiteEthdev',{}),
|
||||
'xmrwallet': ('TestSuiteXMRWallet',{}),
|
||||
}
|
||||
|
||||
cmd_groups_extra = {
|
||||
'autosign_btc': ('TestSuiteAutosignBTC',{'modname':'autosign'}),
|
||||
'autosign_live': ('TestSuiteAutosignLive',{'modname':'autosign'}),
|
||||
'autosign_live_simulate': ('TestSuiteAutosignLiveSimulate',{'modname':'autosign'}),
|
||||
'create_ref_tx': ('TestSuiteRefTX',{'modname':'misc','full_data':True}),
|
||||
}
|
||||
|
||||
cfgs = { # addr_idx_lists (except 31,32,33,34) must contain exactly 8 addresses
|
||||
'1': { 'wpasswd': 'Dorian-α',
|
||||
'kapasswd': 'Grok the blockchain',
|
||||
'addr_idx_list': '12,99,5-10,5,12',
|
||||
'dep_generators': {
|
||||
pwfile: 'walletgen',
|
||||
'mmdat': 'walletgen',
|
||||
'addrs': 'addrgen',
|
||||
'rawtx': 'txcreate',
|
||||
'txbump': 'txbump',
|
||||
'sigtx': 'txsign',
|
||||
'mmwords': 'export_mnemonic',
|
||||
'mmseed': 'export_seed',
|
||||
'mmhex': 'export_hex',
|
||||
'mmincog': 'export_incog',
|
||||
'mmincox': 'export_incog_hex',
|
||||
hincog_fn: 'export_incog_hidden',
|
||||
incog_id_fn: 'export_incog_hidden',
|
||||
'akeys.mmenc': 'keyaddrgen'
|
||||
},
|
||||
},
|
||||
'2': { 'wpasswd': 'Hodling away',
|
||||
'addr_idx_list': '37,45,3-6,22-23',
|
||||
'seed_len': 128,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen2',
|
||||
'addrs': 'addrgen2',
|
||||
'rawtx': 'txcreate2',
|
||||
'sigtx': 'txsign2',
|
||||
'mmwords': 'export_mnemonic2',
|
||||
},
|
||||
},
|
||||
'3': { 'wpasswd': 'Major miner',
|
||||
'addr_idx_list': '73,54,1022-1023,2-5',
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen3',
|
||||
'addrs': 'addrgen3',
|
||||
'rawtx': 'txcreate3',
|
||||
'sigtx': 'txsign3'
|
||||
},
|
||||
},
|
||||
'4': { 'wpasswd': 'Hashrate good',
|
||||
'addr_idx_list': '63,1004,542-544,7-9',
|
||||
'seed_len': 192,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen4',
|
||||
'mmbrain': 'walletgen4',
|
||||
'addrs': 'addrgen4',
|
||||
'rawtx': 'txcreate4',
|
||||
'sigtx': 'txsign4',
|
||||
'txdo': 'txdo4',
|
||||
},
|
||||
'bw_filename': 'brainwallet.mmbrain',
|
||||
'bw_params': '192,1',
|
||||
},
|
||||
'5': { 'wpasswd': 'My changed password-α',
|
||||
'hash_preset': '2',
|
||||
'dep_generators': {
|
||||
'mmdat': 'passchg',
|
||||
pwfile: 'passchg',
|
||||
},
|
||||
},
|
||||
'6': { 'seed_len': 128,
|
||||
'seed_id': 'FE3C6545',
|
||||
'ref_bw_seed_id': '33F10310',
|
||||
'wpasswd': 'reference password',
|
||||
'kapasswd': '',
|
||||
'dep_generators': {
|
||||
'mmdat': 'ref_walletgen_brain_1',
|
||||
pwfile: 'ref_walletgen_brain_1',
|
||||
'addrs': 'refaddrgen_1',
|
||||
'akeys.mmenc': 'refkeyaddrgen_1'
|
||||
},
|
||||
},
|
||||
'7': { 'seed_len': 192,
|
||||
'seed_id': '1378FC64',
|
||||
'ref_bw_seed_id': 'CE918388',
|
||||
'wpasswd': 'reference password',
|
||||
'kapasswd': '',
|
||||
'dep_generators': {
|
||||
'mmdat': 'ref_walletgen_brain_2',
|
||||
pwfile: 'ref_walletgen_brain_2',
|
||||
'addrs': 'refaddrgen_2',
|
||||
'akeys.mmenc': 'refkeyaddrgen_2'
|
||||
},
|
||||
},
|
||||
'8': { 'seed_len': 256,
|
||||
'seed_id': '98831F3A',
|
||||
'ref_bw_seed_id': 'B48CD7FC',
|
||||
'wpasswd': 'reference password',
|
||||
'kapasswd': '',
|
||||
'dep_generators': {
|
||||
'mmdat': 'ref_walletgen_brain_3',
|
||||
pwfile: 'ref_walletgen_brain_3',
|
||||
'addrs': 'refaddrgen_3',
|
||||
'akeys.mmenc': 'refkeyaddrgen_3'
|
||||
},
|
||||
},
|
||||
'9': { 'tool_enc_infn': 'tool_encrypt.in',
|
||||
'dep_generators': {
|
||||
'tool_encrypt.in': 'tool_encrypt',
|
||||
'tool_encrypt.in.mmenc': 'tool_encrypt',
|
||||
},
|
||||
},
|
||||
'11': {},
|
||||
'12': {},
|
||||
'13': {},
|
||||
'14': { 'kapasswd': 'Maxwell',
|
||||
'wpasswd': 'The Halving',
|
||||
'addr_idx_list': '61,998,502-504,7-9',
|
||||
'seed_len': 256,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen14',
|
||||
'addrs': 'addrgen14',
|
||||
'akeys.mmenc': 'keyaddrgen14',
|
||||
},
|
||||
},
|
||||
'15': { 'wpasswd': 'Dorian-α',
|
||||
'kapasswd': 'Grok the blockchain',
|
||||
'addr_idx_list': '12,99,5-10,5,12',
|
||||
'dep_generators': {
|
||||
pwfile: 'walletgen_dfl_wallet',
|
||||
'addrs': 'addrgen_dfl_wallet',
|
||||
'rawtx': 'txcreate_dfl_wallet',
|
||||
'sigtx': 'txsign_dfl_wallet',
|
||||
'mmseed': 'export_seed_dfl_wallet',
|
||||
'del_dw_run': 'delete_dfl_wallet',
|
||||
},
|
||||
},
|
||||
'16': { 'wpasswd': 'My changed password',
|
||||
'hash_preset': '2',
|
||||
'dep_generators': {
|
||||
pwfile: 'passchg_dfl_wallet',
|
||||
},
|
||||
},
|
||||
'17': {},
|
||||
'18': {},
|
||||
'19': { 'wpasswd':'abc' },
|
||||
'20': { 'wpasswd': 'Vsize it',
|
||||
'addr_idx_list': '1-8',
|
||||
'seed_len': 256,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen5',
|
||||
'addrs': 'addrgen5',
|
||||
'rawtx': 'txcreate5',
|
||||
'sigtx': 'txsign5',
|
||||
},
|
||||
},
|
||||
'21': { 'wpasswd': 'Vsize it',
|
||||
'addr_idx_list': '1-8',
|
||||
'seed_len': 256,
|
||||
'dep_generators': {
|
||||
'mmdat': 'walletgen6',
|
||||
'addrs': 'addrgen6',
|
||||
'rawtx': 'txcreate6',
|
||||
'sigtx': 'txsign6',
|
||||
},
|
||||
},
|
||||
'22': {},
|
||||
'23': {},
|
||||
'26': {},
|
||||
'27': {},
|
||||
'28': {},
|
||||
'29': {}, # xmrwallet
|
||||
'31': {},
|
||||
'32': {},
|
||||
'33': {},
|
||||
'34': {},
|
||||
'40': {},
|
||||
'41': {},
|
||||
'99': {}, # dummy
|
||||
}
|
||||
|
||||
def fixup_cfgs():
|
||||
for src,target in (
|
||||
('6','11'),
|
||||
('7','12'),
|
||||
('8','13'),
|
||||
('6','26'),
|
||||
('7','27'),
|
||||
('8','28')
|
||||
):
|
||||
cfgs[target].update(cfgs[src])
|
||||
cfgs[target]['tmpdir'] = os.path.join('test','tmp',target)
|
||||
|
||||
for k in cfgs:
|
||||
cfgs[k]['segwit'] = randbool() if opt.segwit_random else bool(opt.segwit or opt.bech32)
|
||||
|
||||
if g.debug_utf8:
|
||||
for k in cfgs:
|
||||
cfgs[k]['tmpdir'] += '-α'
|
||||
|
|
@ -53,7 +53,7 @@ class TestSuiteBase(object):
|
|||
|
||||
@property
|
||||
def tmpdir(self):
|
||||
return os.path.join('test','tmp{}{}'.format(self.tmpdir_num,'-α' if g.debug_utf8 else ''))
|
||||
return os.path.join('test','tmp','{}{}'.format(self.tmpdir_num,'-α' if g.debug_utf8 else ''))
|
||||
|
||||
@property
|
||||
def segwit_mmtype(self):
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ if proto.coin == 'XMR' or opt.type == 'zcash_z':
|
|||
cfg = {
|
||||
'name': 'the tool utility',
|
||||
'enc_passwd': 'Ten Satoshis',
|
||||
'tmpdir': 'test/tmp10',
|
||||
'tmpdir': 'test/tmp/10',
|
||||
'tmpdir_num': 10,
|
||||
'refdir': 'test/ref',
|
||||
'txfile': {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue