diff options
-rw-r--r-- | tests/unit/screen_ui_test.cpp | 56 | ||||
-rw-r--r-- | updater/blockimg.cpp | 18 | ||||
-rw-r--r-- | wear_ui.cpp | 5 |
3 files changed, 60 insertions, 19 deletions
diff --git a/tests/unit/screen_ui_test.cpp b/tests/unit/screen_ui_test.cpp index 03e23ca42..269222faa 100644 --- a/tests/unit/screen_ui_test.cpp +++ b/tests/unit/screen_ui_test.cpp @@ -15,6 +15,7 @@ */ #include <stddef.h> +#include <stdio.h> #include <functional> #include <map> @@ -23,6 +24,8 @@ #include <vector> #include <android-base/logging.h> +#include <android-base/stringprintf.h> +#include <android-base/test_utils.h> #include <gtest/gtest.h> #include "common/test_constants.h" @@ -224,6 +227,19 @@ class TestableScreenRecoveryUI : public ScreenRecoveryUI { int KeyHandler(int key, bool visible) const; + // The following functions expose the protected members for test purpose. + void RunLoadAnimation() { + LoadAnimation(); + } + + size_t GetLoopFrames() const { + return loop_frames; + } + + size_t GetIntroFrames() const { + return intro_frames; + } + bool GetRtlLocale() const { return rtl_locale_; } @@ -260,14 +276,15 @@ class ScreenRecoveryUITest : public ::testing::Test { void SetUp() override { ui_ = std::make_unique<TestableScreenRecoveryUI>(); - std::string testdata_dir = from_testdata_base(""); - Paths::Get().set_resource_dir(testdata_dir); - res_set_resource_dir(testdata_dir); + testdata_dir_ = from_testdata_base(""); + Paths::Get().set_resource_dir(testdata_dir_); + res_set_resource_dir(testdata_dir_); ASSERT_TRUE(ui_->Init(kTestLocale)); } std::unique_ptr<TestableScreenRecoveryUI> ui_; + std::string testdata_dir_; }; TEST_F(ScreenRecoveryUITest, Init) { @@ -352,3 +369,36 @@ TEST_F(ScreenRecoveryUITest, ShowMenu_TimedOut_TextWasEverVisible) { std::bind(&TestableScreenRecoveryUI::KeyHandler, ui_.get(), std::placeholders::_1, std::placeholders::_2))); } + +TEST_F(ScreenRecoveryUITest, LoadAnimation) { + // Make a few copies of loop00000.png from testdata. + std::string image_data; + ASSERT_TRUE(android::base::ReadFileToString(testdata_dir_ + "/loop00000.png", &image_data)); + + std::vector<std::string> tempfiles; + TemporaryDir resource_dir; + for (const auto& name : { "00002", "00100", "00050" }) { + tempfiles.push_back(android::base::StringPrintf("%s/loop%s.png", resource_dir.path, name)); + ASSERT_TRUE(android::base::WriteStringToFile(image_data, tempfiles.back())); + } + for (const auto& name : { "00", "01" }) { + tempfiles.push_back(android::base::StringPrintf("%s/intro%s.png", resource_dir.path, name)); + ASSERT_TRUE(android::base::WriteStringToFile(image_data, tempfiles.back())); + } + Paths::Get().set_resource_dir(resource_dir.path); + + ui_->RunLoadAnimation(); + + ASSERT_EQ(2u, ui_->GetIntroFrames()); + ASSERT_EQ(3u, ui_->GetLoopFrames()); + + for (const auto& name : tempfiles) { + ASSERT_EQ(0, unlink(name.c_str())); + } +} + +TEST_F(ScreenRecoveryUITest, LoadAnimation_MissingAnimation) { + TemporaryDir resource_dir; + Paths::Get().set_resource_dir(resource_dir.path); + ASSERT_EXIT(ui_->RunLoadAnimation(), ::testing::KilledBySignal(SIGABRT), ""); +} diff --git a/updater/blockimg.cpp b/updater/blockimg.cpp index 156a82939..236644e7f 100644 --- a/updater/blockimg.cpp +++ b/updater/blockimg.cpp @@ -132,8 +132,7 @@ static bool FsyncDir(const std::string& dirname) { return true; } -// Update the last command index in the last_command_file if the current command writes to the -// stash either explicitly or implicitly. +// Update the last executed command index in the last_command_file. static bool UpdateLastCommandIndex(int command_index, const std::string& command_string) { const std::string& last_command_file = Paths::Get().last_command_file(); std::string last_command_tmp = last_command_file + ".tmp"; @@ -1161,10 +1160,6 @@ static int LoadSrcTgtVersion3(CommandParameters& params, RangeSet& tgt, size_t* return -1; } - if (!UpdateLastCommandIndex(params.cmdindex, params.cmdline)) { - LOG(WARNING) << "Failed to update the last command file."; - } - params.stashed += *src_blocks; // Can be deleted when the write has completed. if (!stash_exists) { @@ -1275,10 +1270,6 @@ static int PerformCommandStash(CommandParameters& params) { LOG(INFO) << "stashing " << blocks << " blocks to " << id; int result = WriteStash(params.stashbase, id, blocks, params.buffer, false, nullptr); if (result == 0) { - if (!UpdateLastCommandIndex(params.cmdindex, params.cmdline)) { - LOG(WARNING) << "Failed to update the last command file."; - } - params.stashed += blocks; } return result; @@ -1701,7 +1692,7 @@ static Value* PerformBlockImageUpdate(const char* name, State* state, params.createdstash = res; // When performing an update, save the index and cmdline of the current command into - // the last_command_file if this command writes to the stash either explicitly of implicitly. + // the last_command_file. // Upon resuming an update, read the saved index first; then // 1. In verification mode, check if the 'move' or 'diff' commands before the saved index has // the expected target blocks already. If not, these commands cannot be skipped and we need @@ -1797,6 +1788,11 @@ static Value* PerformBlockImageUpdate(const char* name, State* state, PLOG(ERROR) << "fsync failed"; goto pbiudone; } + + if (!UpdateLastCommandIndex(params.cmdindex, params.cmdline)) { + LOG(WARNING) << "Failed to update the last command file."; + } + fprintf(cmd_pipe, "set_progress %.4f\n", static_cast<double>(params.written) / total_blocks); fflush(cmd_pipe); } diff --git a/wear_ui.cpp b/wear_ui.cpp index f157d3ca3..f4a839923 100644 --- a/wear_ui.cpp +++ b/wear_ui.cpp @@ -32,11 +32,6 @@ WearRecoveryUI::WearRecoveryUI() kMenuUnusableRows(RECOVERY_UI_MENU_UNUSABLE_ROWS) { // TODO: kMenuUnusableRows should be computed based on the lines in draw_screen_locked(). - // TODO: The following three variables are likely not needed. The first two are detected - // automatically in ScreenRecoveryUI::LoadAnimation(), based on the actual files seen on device. - intro_frames = 22; - loop_frames = 60; - touch_screen_allowed_ = true; } |