1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-18 20:38:10 +00:00

fix(core/ui): T3T1 UI tests: GetAddress

[no changelog]
This commit is contained in:
Martin Milata 2024-05-07 00:06:32 +02:00
parent 6ddf1c849a
commit e0fece2050
6 changed files with 148 additions and 47 deletions

View File

@ -45,6 +45,17 @@ impl<T: Component + Paginate + Clone> SwipePage<T> {
}
}
pub fn horizontal(inner: T) -> Self {
Self {
inner,
bounds: Rect::zero(),
axis: Axis::Horizontal,
pages: 1,
current: 0,
transition: None,
}
}
fn handle_transition(ctx: &mut EventCtx, event: Event, transition: &mut Transition<T>) -> bool {
let mut finished = false;
if let Event::Timer(EventCtx::ANIM_FRAME_TIMER) = event {

View File

@ -56,14 +56,12 @@ impl AddressDetails {
}
let result = Self {
details: Frame::left_aligned(details_title, para.into_paragraphs())
.with_cancel_button()
.with_border(theme::borders_horizontal_scroll()),
.with_cancel_button(),
xpub_view: Frame::left_aligned(
" \n ".into(),
Paragraph::new(&theme::TEXT_MONO_GREY_LIGHT, "").into_paragraphs(),
)
.with_cancel_button()
.with_border(theme::borders_horizontal_scroll()),
.with_cancel_button(),
xpubs: Vec::new(),
xpub_page_count: Vec::new(),
current_page: 0,

View File

@ -139,7 +139,7 @@ impl crate::ui::flow::Swipable for PromptScreen {}
#[cfg(feature = "ui_debug")]
impl crate::trace::Trace for PromptScreen {
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
t.component("StatusScreen");
t.component("PromptScreen");
t.child("button", &self.button);
}
}

View File

@ -222,7 +222,7 @@ impl GetAddress {
let [xtitle, text]: [TString; 2] = util::iter_into_array(i)?;
ad.add_xpub(xtitle, text)?;
}
let content_account = SwipePage::vertical(ad).map(|_| Some(FlowMsg::Cancelled));
let content_account = SwipePage::horizontal(ad).map(|_| Some(FlowMsg::Cancelled));
// Cancel
let content_cancel_info = Frame::left_aligned(

View File

@ -40,6 +40,14 @@ RESET_WORD_CHECK = [
(MID, grid(DISPLAY_HEIGHT, 5, 4)),
]
VERTICAL_MENU = [
(MID, grid(DISPLAY_HEIGHT, 4, 1)),
(MID, grid(DISPLAY_HEIGHT, 4, 2)),
(MID, grid(DISPLAY_HEIGHT, 4, 3)),
]
TAP_TO_CONFIRM = VERTICAL_MENU[1]
BUTTON_LETTERS_BIP39 = ("abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz")
BUTTON_LETTERS_SLIP39 = ("ab", "cd", "ef", "ghij", "klm", "nopq", "rs", "tuv", "wxyz")

View File

@ -358,15 +358,30 @@ class InputFlowShowAddressQRCode(InputFlowBase):
yield
self.debug.click(buttons.CORNER_BUTTON, wait=True)
# synchronize; TODO get rid of this once we have single-global-layout
self.debug.synchronize_at("SimplePage")
self.debug.swipe_left(wait=True)
self.debug.swipe_right(wait=True)
self.debug.swipe_left(wait=True)
self.debug.synchronize_at("VerticalMenu")
# menu
self.debug.click(buttons.VERTICAL_MENU[0], wait=True)
self.debug.synchronize_at("Qr")
# qr code
self.debug.click(buttons.CORNER_BUTTON, wait=True)
self.debug.press_no(wait=True)
self.debug.press_no(wait=True)
self.debug.press_yes()
# menu
self.debug.click(buttons.VERTICAL_MENU[1], wait=True)
# address details
self.debug.click(buttons.CORNER_BUTTON, wait=True)
# menu
self.debug.click(buttons.VERTICAL_MENU[2], wait=True)
# cancel
self.debug.swipe_up(wait=True)
# really cancel
self.debug.click(buttons.CORNER_BUTTON, wait=True)
# menu
layout = self.debug.click(buttons.CORNER_BUTTON, wait=True)
while "PromptScreen" not in layout.all_components():
layout = self.debug.swipe_up(wait=True)
self.debug.synchronize_at("PromptScreen")
# tap to confirm
self.debug.click(buttons.TAP_TO_CONFIRM)
class InputFlowShowAddressQRCodeCancel(InputFlowBase):
@ -403,12 +418,23 @@ class InputFlowShowAddressQRCodeCancel(InputFlowBase):
yield
self.debug.click(buttons.CORNER_BUTTON, wait=True)
# synchronize; TODO get rid of this once we have single-global-layout
self.debug.synchronize_at("SimplePage")
self.debug.swipe_left(wait=True)
self.debug.synchronize_at("VerticalMenu")
# menu
self.debug.click(buttons.VERTICAL_MENU[0], wait=True)
self.debug.synchronize_at("Qr")
# qr code
self.debug.click(buttons.CORNER_BUTTON, wait=True)
self.debug.press_no(wait=True)
self.debug.press_yes()
# menu
self.debug.click(buttons.VERTICAL_MENU[1], wait=True)
# address details
self.debug.click(buttons.CORNER_BUTTON, wait=True)
# menu
self.debug.click(buttons.VERTICAL_MENU[2], wait=True)
# cancel
self.debug.swipe_up(wait=True)
self.debug.synchronize_at("PromptScreen")
# really cancel
self.debug.click(buttons.TAP_TO_CONFIRM, wait=True)
class InputFlowShowMultisigXPUBs(InputFlowBase):
@ -494,36 +520,53 @@ class InputFlowShowMultisigXPUBs(InputFlowBase):
def input_flow_t3t1(self) -> BRGeneratorType:
yield # multisig address warning
self.debug.press_yes()
self.debug.click(buttons.CORNER_BUTTON, wait=True)
self.debug.synchronize_at("VerticalMenu")
self.debug.click(buttons.VERTICAL_MENU[1])
yield # show address
layout = self.debug.wait_layout()
TR.assert_in(layout.title(), "address__title_receive_address")
assert "(MULTISIG)" in layout.title()
assert layout.text_content().replace(" ", "") == self.address
self.debug.click(buttons.CORNER_BUTTON)
self.debug.click(buttons.CORNER_BUTTON, wait=True)
assert "VerticalMenu" in self.all_components()
# menu
self.debug.click(buttons.VERTICAL_MENU[0], wait=True)
self.debug.synchronize_at("Qr")
# qr code
assert "Qr" in self.all_components()
layout = self.debug.swipe_left(wait=True)
self.debug.click(buttons.CORNER_BUTTON, wait=True)
# menu
assert "VerticalMenu" in self.all_components()
self.debug.click(buttons.VERTICAL_MENU[1], wait=True)
layout = self.debug.synchronize_at("AddressDetails")
# address details
assert "Multisig 2 of 3" in layout.screen_content()
TR.assert_in(layout.screen_content(), "address_details__derivation_path_colon")
TR.assert_in(layout.screen_content(), "address_details__derivation_path")
# Three xpub pages with the same testing logic
for xpub_num in range(3):
expected_title = f"MULTISIG XPUB #{xpub_num + 1}"
# three xpub pages with the same testing logic
for _xpub_num in range(3):
layout = self.debug.swipe_left(wait=True)
layout = self.debug.swipe_left(wait=True)
assert expected_title in layout.title()
content = layout.text_content().replace(" ", "")
assert self.xpubs[xpub_num] in content
self.debug.click(buttons.CORNER_BUTTON, wait=True)
# show address
self.debug.press_no(wait=True)
# address mismatch
self.debug.press_no(wait=True)
# show address
layout = self.debug.synchronize_at("VerticalMenu")
# menu
self.debug.click(buttons.VERTICAL_MENU[2], wait=True)
# cancel
self.debug.swipe_up(wait=True)
# really cancel
self.debug.click(buttons.CORNER_BUTTON, wait=True)
layout = self.debug.synchronize_at("VerticalMenu")
# menu
self.debug.click(buttons.CORNER_BUTTON, wait=True)
layout = self.debug.synchronize_at("Paragraphs")
# address
while "PromptScreen" not in layout.all_components():
layout = self.debug.swipe_up(wait=True)
self.debug.synchronize_at("PromptScreen")
# tap to confirm
self.debug.press_yes()
@ -598,19 +641,42 @@ class InputFlowShowXpubQRCode(InputFlowBase):
if "coinjoin" in layout.title().lower() or br.code == B.UnknownDerivationPath:
self.debug.press_yes()
br = yield
layout = self.debug.wait_layout()
TR.assert_in(layout.title(), "address__title_receive_address")
self.debug.click(buttons.CORNER_BUTTON, wait=True)
# synchronize; TODO get rid of this once we have single-global-layout
self.debug.synchronize_at("SimplePage")
self.debug.swipe_left(wait=True)
self.debug.swipe_right(wait=True)
self.debug.swipe_left(wait=True)
assert "VerticalMenu" in self.all_components()
# menu
self.debug.click(buttons.VERTICAL_MENU[0], wait=True)
self.debug.synchronize_at("Qr")
# qr code
assert "Qr" in self.all_components()
self.debug.click(buttons.CORNER_BUTTON, wait=True)
self.debug.press_no(wait=True)
self.debug.press_no(wait=True)
for _ in range(br.pages - 1):
self.debug.swipe_up(wait=True)
# menu
assert "VerticalMenu" in self.all_components()
self.debug.click(buttons.VERTICAL_MENU[1], wait=True)
layout = self.debug.synchronize_at("AddressDetails")
# address details
TR.assert_in(layout.screen_content(), "address_details__derivation_path")
self.debug.click(buttons.CORNER_BUTTON, wait=True)
layout = self.debug.synchronize_at("VerticalMenu")
# menu
self.debug.click(buttons.VERTICAL_MENU[2], wait=True)
# cancel
self.debug.swipe_up(wait=True)
# really cancel
self.debug.click(buttons.CORNER_BUTTON, wait=True)
layout = self.debug.synchronize_at("VerticalMenu")
# menu
self.debug.click(buttons.CORNER_BUTTON, wait=True)
layout = self.debug.synchronize_at("Paragraphs")
# address
while "PromptScreen" not in layout.all_components():
layout = self.debug.swipe_up(wait=True)
self.debug.synchronize_at("PromptScreen")
# tap to confirm
self.debug.press_yes()
@ -1133,7 +1199,7 @@ class InputFlowBip39ResetBackup(InputFlowBase):
self.mnemonic = None
# NOTE: same as above, just two more YES
def input_flow_common(self) -> BRGeneratorType:
def input_flow_tt(self) -> BRGeneratorType:
# 1. Confirm Reset
# 2. Backup your seed
# 3. Confirm warning
@ -1142,6 +1208,24 @@ class InputFlowBip39ResetBackup(InputFlowBase):
# mnemonic phrases and rest
self.mnemonic = yield from get_mnemonic_and_confirm_success(self.debug)
def input_flow_tr(self) -> BRGeneratorType:
# 1. Confirm Reset
# 2. Backup your seed
# 3. Confirm warning
yield from click_through(self.debug, screens=3, code=B.ResetDevice)
# mnemonic phrases and rest
self.mnemonic = yield from get_mnemonic_and_confirm_success(self.debug)
def input_flow_t3t1(self) -> BRGeneratorType:
# 1. Confirm Reset x3
# 2. Backup your seed
# 3. Confirm warning
yield from click_through(self.debug, screens=3, code=B.ResetDevice)
# mnemonic phrases and rest
self.mnemonic = yield from get_mnemonic_and_confirm_success(self.debug)
class InputFlowBip39ResetPIN(InputFlowBase):
def __init__(self, client: Client):