1*e7c364b6SAndroid Build Coastguard Worker /*
2*e7c364b6SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*e7c364b6SAndroid Build Coastguard Worker *
4*e7c364b6SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e7c364b6SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e7c364b6SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e7c364b6SAndroid Build Coastguard Worker *
8*e7c364b6SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e7c364b6SAndroid Build Coastguard Worker *
10*e7c364b6SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e7c364b6SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e7c364b6SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e7c364b6SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e7c364b6SAndroid Build Coastguard Worker * limitations under the License.
15*e7c364b6SAndroid Build Coastguard Worker */
16*e7c364b6SAndroid Build Coastguard Worker
17*e7c364b6SAndroid Build Coastguard Worker #include <stddef.h>
18*e7c364b6SAndroid Build Coastguard Worker #include <stdio.h>
19*e7c364b6SAndroid Build Coastguard Worker
20*e7c364b6SAndroid Build Coastguard Worker #include <functional>
21*e7c364b6SAndroid Build Coastguard Worker #include <map>
22*e7c364b6SAndroid Build Coastguard Worker #include <memory>
23*e7c364b6SAndroid Build Coastguard Worker #include <string>
24*e7c364b6SAndroid Build Coastguard Worker #include <vector>
25*e7c364b6SAndroid Build Coastguard Worker
26*e7c364b6SAndroid Build Coastguard Worker #include <android-base/file.h>
27*e7c364b6SAndroid Build Coastguard Worker #include <android-base/logging.h>
28*e7c364b6SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
29*e7c364b6SAndroid Build Coastguard Worker #include <gtest/gtest.h>
30*e7c364b6SAndroid Build Coastguard Worker #include <gtest/gtest_prod.h>
31*e7c364b6SAndroid Build Coastguard Worker
32*e7c364b6SAndroid Build Coastguard Worker #include "common/test_constants.h"
33*e7c364b6SAndroid Build Coastguard Worker #include "minui/minui.h"
34*e7c364b6SAndroid Build Coastguard Worker #include "otautil/paths.h"
35*e7c364b6SAndroid Build Coastguard Worker #include "private/resources.h"
36*e7c364b6SAndroid Build Coastguard Worker #include "recovery_ui/device.h"
37*e7c364b6SAndroid Build Coastguard Worker #include "recovery_ui/screen_ui.h"
38*e7c364b6SAndroid Build Coastguard Worker
39*e7c364b6SAndroid Build Coastguard Worker static const std::vector<std::string> HEADERS{ "header" };
40*e7c364b6SAndroid Build Coastguard Worker static const std::vector<std::string> ITEMS{ "item1", "item2", "item3", "item4", "1234567890" };
41*e7c364b6SAndroid Build Coastguard Worker
42*e7c364b6SAndroid Build Coastguard Worker // TODO(xunchang) check if some draw functions are called when drawing menus.
43*e7c364b6SAndroid Build Coastguard Worker class MockDrawFunctions : public DrawInterface {
SetColor(UIElement) const44*e7c364b6SAndroid Build Coastguard Worker void SetColor(UIElement /* element */) const override {}
DrawHighlightBar(int,int,int,int) const45*e7c364b6SAndroid Build Coastguard Worker void DrawHighlightBar(int /* x */, int /* y */, int /* width */,
46*e7c364b6SAndroid Build Coastguard Worker int /* height */) const override {}
DrawHorizontalRule(int) const47*e7c364b6SAndroid Build Coastguard Worker int DrawHorizontalRule(int /* y */) const override {
48*e7c364b6SAndroid Build Coastguard Worker return 0;
49*e7c364b6SAndroid Build Coastguard Worker }
DrawTextLine(int,int,const std::string &,bool) const50*e7c364b6SAndroid Build Coastguard Worker int DrawTextLine(int /* x */, int /* y */, const std::string& /* line */,
51*e7c364b6SAndroid Build Coastguard Worker bool /* bold */) const override {
52*e7c364b6SAndroid Build Coastguard Worker return 0;
53*e7c364b6SAndroid Build Coastguard Worker }
DrawSurface(const GRSurface *,int,int,int,int,int,int) const54*e7c364b6SAndroid Build Coastguard Worker void DrawSurface(const GRSurface* /* surface */, int /* sx */, int /* sy */, int /* w */,
55*e7c364b6SAndroid Build Coastguard Worker int /* h */, int /* dx */, int /* dy */) const override {}
DrawFill(int,int,int,int) const56*e7c364b6SAndroid Build Coastguard Worker void DrawFill(int /* x */, int /* y */, int /* w */, int /* h */) const override {}
DrawTextIcon(int,int,const GRSurface *) const57*e7c364b6SAndroid Build Coastguard Worker void DrawTextIcon(int /* x */, int /* y */, const GRSurface* /* surface */) const override {}
DrawTextLines(int,int,const std::vector<std::string> &) const58*e7c364b6SAndroid Build Coastguard Worker int DrawTextLines(int /* x */, int /* y */,
59*e7c364b6SAndroid Build Coastguard Worker const std::vector<std::string>& /* lines */) const override {
60*e7c364b6SAndroid Build Coastguard Worker return 0;
61*e7c364b6SAndroid Build Coastguard Worker }
DrawWrappedTextLines(int,int,const std::vector<std::string> &) const62*e7c364b6SAndroid Build Coastguard Worker int DrawWrappedTextLines(int /* x */, int /* y */,
63*e7c364b6SAndroid Build Coastguard Worker const std::vector<std::string>& /* lines */) const override {
64*e7c364b6SAndroid Build Coastguard Worker return 0;
65*e7c364b6SAndroid Build Coastguard Worker }
66*e7c364b6SAndroid Build Coastguard Worker };
67*e7c364b6SAndroid Build Coastguard Worker
68*e7c364b6SAndroid Build Coastguard Worker class ScreenUITest : public testing::Test {
69*e7c364b6SAndroid Build Coastguard Worker protected:
70*e7c364b6SAndroid Build Coastguard Worker MockDrawFunctions draw_funcs_;
71*e7c364b6SAndroid Build Coastguard Worker };
72*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,StartPhoneMenuSmoke)73*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, StartPhoneMenuSmoke) {
74*e7c364b6SAndroid Build Coastguard Worker TextMenu menu(false, 10, 20, HEADERS, ITEMS, 0, 20, draw_funcs_);
75*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(menu.scrollable());
76*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(HEADERS[0], menu.text_headers()[0]);
77*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.ItemsCount());
78*e7c364b6SAndroid Build Coastguard Worker
79*e7c364b6SAndroid Build Coastguard Worker std::string message;
80*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(menu.ItemsOverflow(&message));
81*e7c364b6SAndroid Build Coastguard Worker for (size_t i = 0; i < menu.ItemsCount(); i++) {
82*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(ITEMS[i], menu.TextItem(i));
83*e7c364b6SAndroid Build Coastguard Worker }
84*e7c364b6SAndroid Build Coastguard Worker
85*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0, menu.selection());
86*e7c364b6SAndroid Build Coastguard Worker }
87*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,StartWearMenuSmoke)88*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, StartWearMenuSmoke) {
89*e7c364b6SAndroid Build Coastguard Worker TextMenu menu(true, 10, 8, HEADERS, ITEMS, 1, 20, draw_funcs_);
90*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(menu.scrollable());
91*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(HEADERS[0], menu.text_headers()[0]);
92*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.ItemsCount());
93*e7c364b6SAndroid Build Coastguard Worker
94*e7c364b6SAndroid Build Coastguard Worker std::string message;
95*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(menu.ItemsOverflow(&message));
96*e7c364b6SAndroid Build Coastguard Worker for (size_t i = 0; i < menu.ItemsCount() - 1; i++) {
97*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(ITEMS[i], menu.TextItem(i));
98*e7c364b6SAndroid Build Coastguard Worker }
99*e7c364b6SAndroid Build Coastguard Worker // Test of the last item is truncated
100*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ("12345678", menu.TextItem(4));
101*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(1, menu.selection());
102*e7c364b6SAndroid Build Coastguard Worker }
103*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,StartPhoneMenuItemsOverflow)104*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, StartPhoneMenuItemsOverflow) {
105*e7c364b6SAndroid Build Coastguard Worker TextMenu menu(false, 1, 20, HEADERS, ITEMS, 0, 20, draw_funcs_);
106*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(menu.scrollable());
107*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(1u, menu.ItemsCount());
108*e7c364b6SAndroid Build Coastguard Worker
109*e7c364b6SAndroid Build Coastguard Worker std::string message;
110*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(menu.ItemsOverflow(&message));
111*e7c364b6SAndroid Build Coastguard Worker for (size_t i = 0; i < menu.ItemsCount(); i++) {
112*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(ITEMS[i], menu.TextItem(i));
113*e7c364b6SAndroid Build Coastguard Worker }
114*e7c364b6SAndroid Build Coastguard Worker
115*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0u, menu.MenuStart());
116*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(1u, menu.MenuEnd());
117*e7c364b6SAndroid Build Coastguard Worker }
118*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,StartWearMenuItemsOverflow)119*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, StartWearMenuItemsOverflow) {
120*e7c364b6SAndroid Build Coastguard Worker TextMenu menu(true, 1, 20, HEADERS, ITEMS, 0, 20, draw_funcs_);
121*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(menu.scrollable());
122*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.ItemsCount());
123*e7c364b6SAndroid Build Coastguard Worker
124*e7c364b6SAndroid Build Coastguard Worker std::string message;
125*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(menu.ItemsOverflow(&message));
126*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ("Current item: 1/5", message);
127*e7c364b6SAndroid Build Coastguard Worker
128*e7c364b6SAndroid Build Coastguard Worker for (size_t i = 0; i < menu.ItemsCount(); i++) {
129*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(ITEMS[i], menu.TextItem(i));
130*e7c364b6SAndroid Build Coastguard Worker }
131*e7c364b6SAndroid Build Coastguard Worker
132*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0u, menu.MenuStart());
133*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(1u, menu.MenuEnd());
134*e7c364b6SAndroid Build Coastguard Worker }
135*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,PhoneMenuSelectSmoke)136*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, PhoneMenuSelectSmoke) {
137*e7c364b6SAndroid Build Coastguard Worker int sel = 0;
138*e7c364b6SAndroid Build Coastguard Worker TextMenu menu(false, 10, 20, HEADERS, ITEMS, sel, 20, draw_funcs_);
139*e7c364b6SAndroid Build Coastguard Worker // Mimic down button 10 times (2 * items size)
140*e7c364b6SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
141*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(++sel);
142*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(sel, menu.selection());
143*e7c364b6SAndroid Build Coastguard Worker
144*e7c364b6SAndroid Build Coastguard Worker // Wraps the selection for unscrollable menu when it reaches the boundary.
145*e7c364b6SAndroid Build Coastguard Worker int expected = (i + 1) % 5;
146*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(expected, menu.selection());
147*e7c364b6SAndroid Build Coastguard Worker
148*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0u, menu.MenuStart());
149*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.MenuEnd());
150*e7c364b6SAndroid Build Coastguard Worker }
151*e7c364b6SAndroid Build Coastguard Worker
152*e7c364b6SAndroid Build Coastguard Worker // Mimic up button 10 times
153*e7c364b6SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
154*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(--sel);
155*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(sel, menu.selection());
156*e7c364b6SAndroid Build Coastguard Worker
157*e7c364b6SAndroid Build Coastguard Worker int expected = (9 - i) % 5;
158*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(expected, menu.selection());
159*e7c364b6SAndroid Build Coastguard Worker
160*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0u, menu.MenuStart());
161*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.MenuEnd());
162*e7c364b6SAndroid Build Coastguard Worker }
163*e7c364b6SAndroid Build Coastguard Worker }
164*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,WearMenuSelectSmoke)165*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, WearMenuSelectSmoke) {
166*e7c364b6SAndroid Build Coastguard Worker int sel = 0;
167*e7c364b6SAndroid Build Coastguard Worker TextMenu menu(true, 10, 20, HEADERS, ITEMS, sel, 20, draw_funcs_);
168*e7c364b6SAndroid Build Coastguard Worker // Mimic pressing down button 10 times (2 * items size)
169*e7c364b6SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
170*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(++sel);
171*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(sel, menu.selection());
172*e7c364b6SAndroid Build Coastguard Worker
173*e7c364b6SAndroid Build Coastguard Worker // Stops the selection at the boundary if the menu is scrollable.
174*e7c364b6SAndroid Build Coastguard Worker int expected = std::min(i + 1, 4);
175*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(expected, menu.selection());
176*e7c364b6SAndroid Build Coastguard Worker
177*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0u, menu.MenuStart());
178*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.MenuEnd());
179*e7c364b6SAndroid Build Coastguard Worker }
180*e7c364b6SAndroid Build Coastguard Worker
181*e7c364b6SAndroid Build Coastguard Worker // Mimic pressing up button 10 times
182*e7c364b6SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
183*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(--sel);
184*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(sel, menu.selection());
185*e7c364b6SAndroid Build Coastguard Worker
186*e7c364b6SAndroid Build Coastguard Worker int expected = std::max(3 - i, 0);
187*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(expected, menu.selection());
188*e7c364b6SAndroid Build Coastguard Worker
189*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0u, menu.MenuStart());
190*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.MenuEnd());
191*e7c364b6SAndroid Build Coastguard Worker }
192*e7c364b6SAndroid Build Coastguard Worker }
193*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,WearMenuSelectItemsOverflow)194*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, WearMenuSelectItemsOverflow) {
195*e7c364b6SAndroid Build Coastguard Worker int sel = 1;
196*e7c364b6SAndroid Build Coastguard Worker TextMenu menu(true, 3, 20, HEADERS, ITEMS, sel, 20, draw_funcs_);
197*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.ItemsCount());
198*e7c364b6SAndroid Build Coastguard Worker
199*e7c364b6SAndroid Build Coastguard Worker // Scroll the menu to the end, and check the start & end of menu.
200*e7c364b6SAndroid Build Coastguard Worker for (int i = 0; i < 3; i++) {
201*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(++sel);
202*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(i + 2, sel);
203*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(i), menu.MenuStart());
204*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(i + 3), menu.MenuEnd());
205*e7c364b6SAndroid Build Coastguard Worker }
206*e7c364b6SAndroid Build Coastguard Worker
207*e7c364b6SAndroid Build Coastguard Worker // Press down button one more time won't change the MenuStart() and MenuEnd().
208*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(++sel);
209*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(4, sel);
210*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(2u, menu.MenuStart());
211*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(5u, menu.MenuEnd());
212*e7c364b6SAndroid Build Coastguard Worker
213*e7c364b6SAndroid Build Coastguard Worker // Scroll the menu to the top.
214*e7c364b6SAndroid Build Coastguard Worker // The expected menu sel, start & ends are:
215*e7c364b6SAndroid Build Coastguard Worker // sel 3, start 2, end 5
216*e7c364b6SAndroid Build Coastguard Worker // sel 2, start 2, end 5
217*e7c364b6SAndroid Build Coastguard Worker // sel 1, start 1, end 4
218*e7c364b6SAndroid Build Coastguard Worker // sel 0, start 0, end 3
219*e7c364b6SAndroid Build Coastguard Worker for (int i = 0; i < 4; i++) {
220*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(--sel);
221*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(3 - i, sel);
222*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(std::min(3 - i, 2)), menu.MenuStart());
223*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(std::min(6 - i, 5)), menu.MenuEnd());
224*e7c364b6SAndroid Build Coastguard Worker }
225*e7c364b6SAndroid Build Coastguard Worker
226*e7c364b6SAndroid Build Coastguard Worker // Press up button one more time won't change the MenuStart() and MenuEnd().
227*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(--sel);
228*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0, sel);
229*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0u, menu.MenuStart());
230*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(3u, menu.MenuEnd());
231*e7c364b6SAndroid Build Coastguard Worker }
232*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,GraphicMenuSelection)233*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, GraphicMenuSelection) {
234*e7c364b6SAndroid Build Coastguard Worker auto image = GRSurface::Create(50, 50, 50, 1);
235*e7c364b6SAndroid Build Coastguard Worker auto header = image->Clone();
236*e7c364b6SAndroid Build Coastguard Worker std::vector<const GRSurface*> items = {
237*e7c364b6SAndroid Build Coastguard Worker image.get(),
238*e7c364b6SAndroid Build Coastguard Worker image.get(),
239*e7c364b6SAndroid Build Coastguard Worker image.get(),
240*e7c364b6SAndroid Build Coastguard Worker };
241*e7c364b6SAndroid Build Coastguard Worker GraphicMenu menu(header.get(), items, 0, draw_funcs_);
242*e7c364b6SAndroid Build Coastguard Worker
243*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0, menu.selection());
244*e7c364b6SAndroid Build Coastguard Worker
245*e7c364b6SAndroid Build Coastguard Worker int sel = 0;
246*e7c364b6SAndroid Build Coastguard Worker for (int i = 0; i < 3; i++) {
247*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(++sel);
248*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ((i + 1) % 3, sel);
249*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(sel, menu.selection());
250*e7c364b6SAndroid Build Coastguard Worker }
251*e7c364b6SAndroid Build Coastguard Worker
252*e7c364b6SAndroid Build Coastguard Worker sel = 0;
253*e7c364b6SAndroid Build Coastguard Worker for (int i = 0; i < 3; i++) {
254*e7c364b6SAndroid Build Coastguard Worker sel = menu.Select(--sel);
255*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(2 - i, sel);
256*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(sel, menu.selection());
257*e7c364b6SAndroid Build Coastguard Worker }
258*e7c364b6SAndroid Build Coastguard Worker }
259*e7c364b6SAndroid Build Coastguard Worker
TEST_F(ScreenUITest,GraphicMenuValidate)260*e7c364b6SAndroid Build Coastguard Worker TEST_F(ScreenUITest, GraphicMenuValidate) {
261*e7c364b6SAndroid Build Coastguard Worker auto image = GRSurface::Create(50, 50, 50, 1);
262*e7c364b6SAndroid Build Coastguard Worker auto header = image->Clone();
263*e7c364b6SAndroid Build Coastguard Worker std::vector<const GRSurface*> items = {
264*e7c364b6SAndroid Build Coastguard Worker image.get(),
265*e7c364b6SAndroid Build Coastguard Worker image.get(),
266*e7c364b6SAndroid Build Coastguard Worker image.get(),
267*e7c364b6SAndroid Build Coastguard Worker };
268*e7c364b6SAndroid Build Coastguard Worker
269*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(GraphicMenu::Validate(200, 200, header.get(), items));
270*e7c364b6SAndroid Build Coastguard Worker
271*e7c364b6SAndroid Build Coastguard Worker // Menu exceeds the horizontal boundary.
272*e7c364b6SAndroid Build Coastguard Worker auto wide_surface = GRSurface::Create(300, 50, 300, 1);
273*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(GraphicMenu::Validate(299, 200, wide_surface.get(), items));
274*e7c364b6SAndroid Build Coastguard Worker
275*e7c364b6SAndroid Build Coastguard Worker // Menu exceeds the vertical boundary.
276*e7c364b6SAndroid Build Coastguard Worker items.emplace_back(image.get());
277*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(GraphicMenu::Validate(200, 249, header.get(), items));
278*e7c364b6SAndroid Build Coastguard Worker }
279*e7c364b6SAndroid Build Coastguard Worker
280*e7c364b6SAndroid Build Coastguard Worker static constexpr int kMagicAction = 101;
281*e7c364b6SAndroid Build Coastguard Worker
282*e7c364b6SAndroid Build Coastguard Worker enum class KeyCode : int {
283*e7c364b6SAndroid Build Coastguard Worker TIMEOUT = -1,
284*e7c364b6SAndroid Build Coastguard Worker NO_OP = 0,
285*e7c364b6SAndroid Build Coastguard Worker UP = 1,
286*e7c364b6SAndroid Build Coastguard Worker DOWN = 2,
287*e7c364b6SAndroid Build Coastguard Worker ENTER = 3,
288*e7c364b6SAndroid Build Coastguard Worker MAGIC = 1001,
289*e7c364b6SAndroid Build Coastguard Worker LAST,
290*e7c364b6SAndroid Build Coastguard Worker };
291*e7c364b6SAndroid Build Coastguard Worker
292*e7c364b6SAndroid Build Coastguard Worker static const std::map<KeyCode, int> kKeyMapping{
293*e7c364b6SAndroid Build Coastguard Worker // clang-format off
294*e7c364b6SAndroid Build Coastguard Worker { KeyCode::NO_OP, Device::kNoAction },
295*e7c364b6SAndroid Build Coastguard Worker { KeyCode::UP, Device::kHighlightUp },
296*e7c364b6SAndroid Build Coastguard Worker { KeyCode::DOWN, Device::kHighlightDown },
297*e7c364b6SAndroid Build Coastguard Worker { KeyCode::ENTER, Device::kInvokeItem },
298*e7c364b6SAndroid Build Coastguard Worker { KeyCode::MAGIC, kMagicAction },
299*e7c364b6SAndroid Build Coastguard Worker // clang-format on
300*e7c364b6SAndroid Build Coastguard Worker };
301*e7c364b6SAndroid Build Coastguard Worker
302*e7c364b6SAndroid Build Coastguard Worker class TestableScreenRecoveryUI : public ScreenRecoveryUI {
303*e7c364b6SAndroid Build Coastguard Worker public:
304*e7c364b6SAndroid Build Coastguard Worker int WaitKey() override;
305*e7c364b6SAndroid Build Coastguard Worker
306*e7c364b6SAndroid Build Coastguard Worker void SetKeyBuffer(const std::vector<KeyCode>& buffer);
307*e7c364b6SAndroid Build Coastguard Worker
308*e7c364b6SAndroid Build Coastguard Worker int KeyHandler(int key, bool visible) const;
309*e7c364b6SAndroid Build Coastguard Worker
310*e7c364b6SAndroid Build Coastguard Worker private:
311*e7c364b6SAndroid Build Coastguard Worker FRIEND_TEST(DISABLED_ScreenRecoveryUITest, Init);
312*e7c364b6SAndroid Build Coastguard Worker FRIEND_TEST(DISABLED_ScreenRecoveryUITest, RtlLocale);
313*e7c364b6SAndroid Build Coastguard Worker FRIEND_TEST(DISABLED_ScreenRecoveryUITest, RtlLocaleWithSuffix);
314*e7c364b6SAndroid Build Coastguard Worker FRIEND_TEST(DISABLED_ScreenRecoveryUITest, LoadAnimation);
315*e7c364b6SAndroid Build Coastguard Worker FRIEND_TEST(DISABLED_ScreenRecoveryUITest, LoadAnimation_MissingAnimation);
316*e7c364b6SAndroid Build Coastguard Worker
317*e7c364b6SAndroid Build Coastguard Worker std::vector<KeyCode> key_buffer_;
318*e7c364b6SAndroid Build Coastguard Worker size_t key_buffer_index_;
319*e7c364b6SAndroid Build Coastguard Worker };
320*e7c364b6SAndroid Build Coastguard Worker
SetKeyBuffer(const std::vector<KeyCode> & buffer)321*e7c364b6SAndroid Build Coastguard Worker void TestableScreenRecoveryUI::SetKeyBuffer(const std::vector<KeyCode>& buffer) {
322*e7c364b6SAndroid Build Coastguard Worker key_buffer_ = buffer;
323*e7c364b6SAndroid Build Coastguard Worker key_buffer_index_ = 0;
324*e7c364b6SAndroid Build Coastguard Worker }
325*e7c364b6SAndroid Build Coastguard Worker
KeyHandler(int key,bool) const326*e7c364b6SAndroid Build Coastguard Worker int TestableScreenRecoveryUI::KeyHandler(int key, bool) const {
327*e7c364b6SAndroid Build Coastguard Worker KeyCode key_code = static_cast<KeyCode>(key);
328*e7c364b6SAndroid Build Coastguard Worker if (kKeyMapping.find(key_code) != kKeyMapping.end()) {
329*e7c364b6SAndroid Build Coastguard Worker return kKeyMapping.at(key_code);
330*e7c364b6SAndroid Build Coastguard Worker }
331*e7c364b6SAndroid Build Coastguard Worker return Device::kNoAction;
332*e7c364b6SAndroid Build Coastguard Worker }
333*e7c364b6SAndroid Build Coastguard Worker
WaitKey()334*e7c364b6SAndroid Build Coastguard Worker int TestableScreenRecoveryUI::WaitKey() {
335*e7c364b6SAndroid Build Coastguard Worker if (IsKeyInterrupted()) {
336*e7c364b6SAndroid Build Coastguard Worker return static_cast<int>(RecoveryUI::KeyError::INTERRUPTED);
337*e7c364b6SAndroid Build Coastguard Worker }
338*e7c364b6SAndroid Build Coastguard Worker
339*e7c364b6SAndroid Build Coastguard Worker CHECK_LT(key_buffer_index_, key_buffer_.size());
340*e7c364b6SAndroid Build Coastguard Worker return static_cast<int>(key_buffer_[key_buffer_index_++]);
341*e7c364b6SAndroid Build Coastguard Worker }
342*e7c364b6SAndroid Build Coastguard Worker
343*e7c364b6SAndroid Build Coastguard Worker class DISABLED_ScreenRecoveryUITest : public ::testing::Test {
344*e7c364b6SAndroid Build Coastguard Worker protected:
345*e7c364b6SAndroid Build Coastguard Worker const std::string kTestLocale = "en-US";
346*e7c364b6SAndroid Build Coastguard Worker const std::string kTestRtlLocale = "ar";
347*e7c364b6SAndroid Build Coastguard Worker const std::string kTestRtlLocaleWithSuffix = "ar-EG";
348*e7c364b6SAndroid Build Coastguard Worker
SetUp()349*e7c364b6SAndroid Build Coastguard Worker void SetUp() override {
350*e7c364b6SAndroid Build Coastguard Worker has_graphics_ = gr_init() == 0;
351*e7c364b6SAndroid Build Coastguard Worker gr_exit();
352*e7c364b6SAndroid Build Coastguard Worker
353*e7c364b6SAndroid Build Coastguard Worker if (has_graphics_) {
354*e7c364b6SAndroid Build Coastguard Worker ui_ = std::make_unique<TestableScreenRecoveryUI>();
355*e7c364b6SAndroid Build Coastguard Worker }
356*e7c364b6SAndroid Build Coastguard Worker
357*e7c364b6SAndroid Build Coastguard Worker testdata_dir_ = from_testdata_base("");
358*e7c364b6SAndroid Build Coastguard Worker Paths::Get().set_resource_dir(testdata_dir_);
359*e7c364b6SAndroid Build Coastguard Worker res_set_resource_dir(testdata_dir_);
360*e7c364b6SAndroid Build Coastguard Worker }
361*e7c364b6SAndroid Build Coastguard Worker
362*e7c364b6SAndroid Build Coastguard Worker bool has_graphics_;
363*e7c364b6SAndroid Build Coastguard Worker std::unique_ptr<TestableScreenRecoveryUI> ui_;
364*e7c364b6SAndroid Build Coastguard Worker std::string testdata_dir_;
365*e7c364b6SAndroid Build Coastguard Worker };
366*e7c364b6SAndroid Build Coastguard Worker
367*e7c364b6SAndroid Build Coastguard Worker #define RETURN_IF_NO_GRAPHICS \
368*e7c364b6SAndroid Build Coastguard Worker do { \
369*e7c364b6SAndroid Build Coastguard Worker if (!has_graphics_) { \
370*e7c364b6SAndroid Build Coastguard Worker GTEST_LOG_(INFO) << "Test skipped due to no available graphics device"; \
371*e7c364b6SAndroid Build Coastguard Worker return; \
372*e7c364b6SAndroid Build Coastguard Worker } \
373*e7c364b6SAndroid Build Coastguard Worker } while (false)
374*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,Init)375*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, Init) {
376*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
377*e7c364b6SAndroid Build Coastguard Worker
378*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
379*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(kTestLocale, ui_->GetLocale());
380*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(ui_->rtl_locale_);
381*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(ui_->IsTextVisible());
382*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(ui_->WasTextEverVisible());
383*e7c364b6SAndroid Build Coastguard Worker }
384*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,dtor_NotCallingInit)385*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, dtor_NotCallingInit) {
386*e7c364b6SAndroid Build Coastguard Worker ui_.reset();
387*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(ui_);
388*e7c364b6SAndroid Build Coastguard Worker }
389*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,ShowText)390*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, ShowText) {
391*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
392*e7c364b6SAndroid Build Coastguard Worker
393*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
394*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(ui_->IsTextVisible());
395*e7c364b6SAndroid Build Coastguard Worker ui_->ShowText(true);
396*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->IsTextVisible());
397*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->WasTextEverVisible());
398*e7c364b6SAndroid Build Coastguard Worker
399*e7c364b6SAndroid Build Coastguard Worker ui_->ShowText(false);
400*e7c364b6SAndroid Build Coastguard Worker ASSERT_FALSE(ui_->IsTextVisible());
401*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->WasTextEverVisible());
402*e7c364b6SAndroid Build Coastguard Worker }
403*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,RtlLocale)404*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, RtlLocale) {
405*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
406*e7c364b6SAndroid Build Coastguard Worker
407*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestRtlLocale));
408*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->rtl_locale_);
409*e7c364b6SAndroid Build Coastguard Worker }
410*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,RtlLocaleWithSuffix)411*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, RtlLocaleWithSuffix) {
412*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
413*e7c364b6SAndroid Build Coastguard Worker
414*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestRtlLocaleWithSuffix));
415*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->rtl_locale_);
416*e7c364b6SAndroid Build Coastguard Worker }
417*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,ShowMenu)418*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, ShowMenu) {
419*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
420*e7c364b6SAndroid Build Coastguard Worker
421*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
422*e7c364b6SAndroid Build Coastguard Worker ui_->SetKeyBuffer({
423*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
424*e7c364b6SAndroid Build Coastguard Worker KeyCode::DOWN,
425*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
426*e7c364b6SAndroid Build Coastguard Worker KeyCode::DOWN,
427*e7c364b6SAndroid Build Coastguard Worker KeyCode::ENTER,
428*e7c364b6SAndroid Build Coastguard Worker });
429*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(3u, ui_->ShowMenu(HEADERS, ITEMS, 3, true,
430*e7c364b6SAndroid Build Coastguard Worker std::bind(&TestableScreenRecoveryUI::KeyHandler, ui_.get(),
431*e7c364b6SAndroid Build Coastguard Worker std::placeholders::_1, std::placeholders::_2)));
432*e7c364b6SAndroid Build Coastguard Worker
433*e7c364b6SAndroid Build Coastguard Worker ui_->SetKeyBuffer({
434*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
435*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
436*e7c364b6SAndroid Build Coastguard Worker KeyCode::NO_OP,
437*e7c364b6SAndroid Build Coastguard Worker KeyCode::NO_OP,
438*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
439*e7c364b6SAndroid Build Coastguard Worker KeyCode::ENTER,
440*e7c364b6SAndroid Build Coastguard Worker });
441*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(2u, ui_->ShowMenu(HEADERS, ITEMS, 0, true,
442*e7c364b6SAndroid Build Coastguard Worker std::bind(&TestableScreenRecoveryUI::KeyHandler, ui_.get(),
443*e7c364b6SAndroid Build Coastguard Worker std::placeholders::_1, std::placeholders::_2)));
444*e7c364b6SAndroid Build Coastguard Worker }
445*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,ShowMenu_NotMenuOnly)446*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, ShowMenu_NotMenuOnly) {
447*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
448*e7c364b6SAndroid Build Coastguard Worker
449*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
450*e7c364b6SAndroid Build Coastguard Worker ui_->SetKeyBuffer({
451*e7c364b6SAndroid Build Coastguard Worker KeyCode::MAGIC,
452*e7c364b6SAndroid Build Coastguard Worker });
453*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(kMagicAction),
454*e7c364b6SAndroid Build Coastguard Worker ui_->ShowMenu(HEADERS, ITEMS, 3, false,
455*e7c364b6SAndroid Build Coastguard Worker std::bind(&TestableScreenRecoveryUI::KeyHandler, ui_.get(),
456*e7c364b6SAndroid Build Coastguard Worker std::placeholders::_1, std::placeholders::_2)));
457*e7c364b6SAndroid Build Coastguard Worker }
458*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,ShowMenu_TimedOut)459*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, ShowMenu_TimedOut) {
460*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
461*e7c364b6SAndroid Build Coastguard Worker
462*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
463*e7c364b6SAndroid Build Coastguard Worker ui_->SetKeyBuffer({
464*e7c364b6SAndroid Build Coastguard Worker KeyCode::TIMEOUT,
465*e7c364b6SAndroid Build Coastguard Worker });
466*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(RecoveryUI::KeyError::TIMED_OUT),
467*e7c364b6SAndroid Build Coastguard Worker ui_->ShowMenu(HEADERS, ITEMS, 3, true, nullptr));
468*e7c364b6SAndroid Build Coastguard Worker }
469*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,ShowMenu_TimedOut_TextWasEverVisible)470*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, ShowMenu_TimedOut_TextWasEverVisible) {
471*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
472*e7c364b6SAndroid Build Coastguard Worker
473*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
474*e7c364b6SAndroid Build Coastguard Worker ui_->ShowText(true);
475*e7c364b6SAndroid Build Coastguard Worker ui_->ShowText(false);
476*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->WasTextEverVisible());
477*e7c364b6SAndroid Build Coastguard Worker
478*e7c364b6SAndroid Build Coastguard Worker ui_->SetKeyBuffer({
479*e7c364b6SAndroid Build Coastguard Worker KeyCode::TIMEOUT,
480*e7c364b6SAndroid Build Coastguard Worker KeyCode::DOWN,
481*e7c364b6SAndroid Build Coastguard Worker KeyCode::ENTER,
482*e7c364b6SAndroid Build Coastguard Worker });
483*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(4u, ui_->ShowMenu(HEADERS, ITEMS, 3, true,
484*e7c364b6SAndroid Build Coastguard Worker std::bind(&TestableScreenRecoveryUI::KeyHandler, ui_.get(),
485*e7c364b6SAndroid Build Coastguard Worker std::placeholders::_1, std::placeholders::_2)));
486*e7c364b6SAndroid Build Coastguard Worker }
487*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,ShowMenuWithInterrupt)488*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, ShowMenuWithInterrupt) {
489*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
490*e7c364b6SAndroid Build Coastguard Worker
491*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
492*e7c364b6SAndroid Build Coastguard Worker ui_->SetKeyBuffer({
493*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
494*e7c364b6SAndroid Build Coastguard Worker KeyCode::DOWN,
495*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
496*e7c364b6SAndroid Build Coastguard Worker KeyCode::DOWN,
497*e7c364b6SAndroid Build Coastguard Worker KeyCode::ENTER,
498*e7c364b6SAndroid Build Coastguard Worker });
499*e7c364b6SAndroid Build Coastguard Worker
500*e7c364b6SAndroid Build Coastguard Worker ui_->InterruptKey();
501*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(RecoveryUI::KeyError::INTERRUPTED),
502*e7c364b6SAndroid Build Coastguard Worker ui_->ShowMenu(HEADERS, ITEMS, 3, true,
503*e7c364b6SAndroid Build Coastguard Worker std::bind(&TestableScreenRecoveryUI::KeyHandler, ui_.get(),
504*e7c364b6SAndroid Build Coastguard Worker std::placeholders::_1, std::placeholders::_2)));
505*e7c364b6SAndroid Build Coastguard Worker
506*e7c364b6SAndroid Build Coastguard Worker ui_->SetKeyBuffer({
507*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
508*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
509*e7c364b6SAndroid Build Coastguard Worker KeyCode::NO_OP,
510*e7c364b6SAndroid Build Coastguard Worker KeyCode::NO_OP,
511*e7c364b6SAndroid Build Coastguard Worker KeyCode::UP,
512*e7c364b6SAndroid Build Coastguard Worker KeyCode::ENTER,
513*e7c364b6SAndroid Build Coastguard Worker });
514*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(RecoveryUI::KeyError::INTERRUPTED),
515*e7c364b6SAndroid Build Coastguard Worker ui_->ShowMenu(HEADERS, ITEMS, 0, true,
516*e7c364b6SAndroid Build Coastguard Worker std::bind(&TestableScreenRecoveryUI::KeyHandler, ui_.get(),
517*e7c364b6SAndroid Build Coastguard Worker std::placeholders::_1, std::placeholders::_2)));
518*e7c364b6SAndroid Build Coastguard Worker }
519*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,LoadAnimation)520*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, LoadAnimation) {
521*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
522*e7c364b6SAndroid Build Coastguard Worker
523*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
524*e7c364b6SAndroid Build Coastguard Worker // Make a few copies of loop00000.png from testdata.
525*e7c364b6SAndroid Build Coastguard Worker std::string image_data;
526*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ReadFileToString(testdata_dir_ + "/loop00000.png", &image_data));
527*e7c364b6SAndroid Build Coastguard Worker
528*e7c364b6SAndroid Build Coastguard Worker std::vector<std::string> tempfiles;
529*e7c364b6SAndroid Build Coastguard Worker TemporaryDir resource_dir;
530*e7c364b6SAndroid Build Coastguard Worker for (const auto& name : { "00002", "00100", "00050" }) {
531*e7c364b6SAndroid Build Coastguard Worker tempfiles.push_back(android::base::StringPrintf("%s/loop%s.png", resource_dir.path, name));
532*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::WriteStringToFile(image_data, tempfiles.back()));
533*e7c364b6SAndroid Build Coastguard Worker }
534*e7c364b6SAndroid Build Coastguard Worker for (const auto& name : { "00", "01" }) {
535*e7c364b6SAndroid Build Coastguard Worker tempfiles.push_back(android::base::StringPrintf("%s/intro%s.png", resource_dir.path, name));
536*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::WriteStringToFile(image_data, tempfiles.back()));
537*e7c364b6SAndroid Build Coastguard Worker }
538*e7c364b6SAndroid Build Coastguard Worker Paths::Get().set_resource_dir(resource_dir.path);
539*e7c364b6SAndroid Build Coastguard Worker
540*e7c364b6SAndroid Build Coastguard Worker ui_->LoadAnimation();
541*e7c364b6SAndroid Build Coastguard Worker
542*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(2u, ui_->intro_frames_.size());
543*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(3u, ui_->loop_frames_.size());
544*e7c364b6SAndroid Build Coastguard Worker
545*e7c364b6SAndroid Build Coastguard Worker for (const auto& name : tempfiles) {
546*e7c364b6SAndroid Build Coastguard Worker ASSERT_EQ(0, unlink(name.c_str()));
547*e7c364b6SAndroid Build Coastguard Worker }
548*e7c364b6SAndroid Build Coastguard Worker }
549*e7c364b6SAndroid Build Coastguard Worker
TEST_F(DISABLED_ScreenRecoveryUITest,LoadAnimation_MissingAnimation)550*e7c364b6SAndroid Build Coastguard Worker TEST_F(DISABLED_ScreenRecoveryUITest, LoadAnimation_MissingAnimation) {
551*e7c364b6SAndroid Build Coastguard Worker RETURN_IF_NO_GRAPHICS;
552*e7c364b6SAndroid Build Coastguard Worker
553*e7c364b6SAndroid Build Coastguard Worker ASSERT_TRUE(ui_->Init(kTestLocale));
554*e7c364b6SAndroid Build Coastguard Worker // We need a dir that doesn't contain any animation. However, using TemporaryDir will give
555*e7c364b6SAndroid Build Coastguard Worker // leftovers since this is a death test where TemporaryDir::~TemporaryDir() won't be called.
556*e7c364b6SAndroid Build Coastguard Worker Paths::Get().set_resource_dir("/proc/self");
557*e7c364b6SAndroid Build Coastguard Worker
558*e7c364b6SAndroid Build Coastguard Worker ::testing::FLAGS_gtest_death_test_style = "threadsafe";
559*e7c364b6SAndroid Build Coastguard Worker ASSERT_EXIT(ui_->LoadAnimation(), ::testing::KilledBySignal(SIGABRT), "");
560*e7c364b6SAndroid Build Coastguard Worker }
561*e7c364b6SAndroid Build Coastguard Worker
562*e7c364b6SAndroid Build Coastguard Worker #undef RETURN_IF_NO_GRAPHICS
563