diff options
Diffstat (limited to 'cmds/dumpstate/tests/dumpstate_test.cpp')
-rw-r--r-- | cmds/dumpstate/tests/dumpstate_test.cpp | 383 |
1 files changed, 83 insertions, 300 deletions
diff --git a/cmds/dumpstate/tests/dumpstate_test.cpp b/cmds/dumpstate/tests/dumpstate_test.cpp index db508b52bd..c7df1bb6a3 100644 --- a/cmds/dumpstate/tests/dumpstate_test.cpp +++ b/cmds/dumpstate/tests/dumpstate_test.cpp @@ -14,16 +14,15 @@ * limitations under the License. */ -#define LOG_TAG "dumpstate_test" +#define LOG_TAG "dumpstate" +#include <cutils/log.h> #include "DumpstateInternal.h" #include "DumpstateService.h" #include "android/os/BnDumpstate.h" #include "dumpstate.h" -#include "DumpPool.h" #include <gmock/gmock.h> -#include <gmock/gmock-matchers.h> #include <gtest/gtest.h> #include <fcntl.h> @@ -39,9 +38,7 @@ #include <android-base/strings.h> #include <android-base/unique_fd.h> #include <android/hardware/dumpstate/1.1/types.h> -#include <cutils/log.h> #include <cutils/properties.h> -#include <ziparchive/zip_archive.h> namespace android { namespace os { @@ -49,7 +46,6 @@ namespace dumpstate { using ::android::hardware::dumpstate::V1_1::DumpstateMode; using ::testing::EndsWith; -using ::testing::Eq; using ::testing::HasSubstr; using ::testing::IsEmpty; using ::testing::IsNull; @@ -70,7 +66,8 @@ class DumpstateListenerMock : public IDumpstateListener { MOCK_METHOD1(onError, binder::Status(int32_t error_code)); MOCK_METHOD0(onFinished, binder::Status()); MOCK_METHOD1(onScreenshotTaken, binder::Status(bool success)); - MOCK_METHOD0(onUiIntensiveBugreportDumpsFinished, binder::Status()); + MOCK_METHOD1(onUiIntensiveBugreportDumpsFinished, + binder::Status(const android::String16& callingpackage)); protected: MOCK_METHOD0(onAsBinder, IBinder*()); @@ -98,10 +95,6 @@ class DumpstateBaseTest : public Test { PropertiesHelper::unroot_ = unroot; } - void SetParallelRun(bool parallel_run) const { - PropertiesHelper::parallel_run_ = parallel_run; - } - bool IsStandalone() const { return calls_ == 1; } @@ -177,9 +170,11 @@ TEST_F(DumpOptionsTest, InitializeNone) { EXPECT_EQ(status, Dumpstate::RunStatus::OK); + EXPECT_FALSE(options_.do_add_date); + EXPECT_FALSE(options_.do_zip_file); EXPECT_EQ("", options_.out_dir); - EXPECT_FALSE(options_.stream_to_socket); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.use_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_TRUE(options_.do_vibrate); EXPECT_FALSE(options_.do_screenshot); @@ -194,13 +189,17 @@ TEST_F(DumpOptionsTest, InitializeAdbBugreport) { char* argv[] = { const_cast<char*>("dumpstatez"), const_cast<char*>("-S"), + const_cast<char*>("-d"), + const_cast<char*>("-z"), }; // clang-format on Dumpstate::RunStatus status = options_.Initialize(ARRAY_SIZE(argv), argv); EXPECT_EQ(status, Dumpstate::RunStatus::OK); - EXPECT_TRUE(options_.progress_updates_to_socket); + EXPECT_TRUE(options_.do_add_date); + EXPECT_TRUE(options_.do_zip_file); + EXPECT_TRUE(options_.use_control_socket); // Other options retain default values EXPECT_TRUE(options_.do_vibrate); @@ -208,7 +207,7 @@ TEST_F(DumpOptionsTest, InitializeAdbBugreport) { EXPECT_FALSE(options_.do_screenshot); EXPECT_FALSE(options_.do_progress_updates); EXPECT_FALSE(options_.is_remote_mode); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); EXPECT_FALSE(options_.limited_only); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::DEFAULT); } @@ -224,11 +223,13 @@ TEST_F(DumpOptionsTest, InitializeAdbShellBugreport) { Dumpstate::RunStatus status = options_.Initialize(ARRAY_SIZE(argv), argv); EXPECT_EQ(status, Dumpstate::RunStatus::OK); - EXPECT_TRUE(options_.stream_to_socket); + EXPECT_TRUE(options_.use_socket); // Other options retain default values EXPECT_TRUE(options_.do_vibrate); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.do_add_date); + EXPECT_FALSE(options_.do_zip_file); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_FALSE(options_.do_screenshot); EXPECT_FALSE(options_.do_progress_updates); @@ -239,93 +240,108 @@ TEST_F(DumpOptionsTest, InitializeAdbShellBugreport) { TEST_F(DumpOptionsTest, InitializeFullBugReport) { options_.Initialize(Dumpstate::BugreportMode::BUGREPORT_FULL, fd, fd, true); + EXPECT_TRUE(options_.do_add_date); EXPECT_TRUE(options_.do_screenshot); + EXPECT_TRUE(options_.do_zip_file); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::FULL); // Other options retain default values EXPECT_TRUE(options_.do_vibrate); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_FALSE(options_.do_progress_updates); EXPECT_FALSE(options_.is_remote_mode); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); + EXPECT_FALSE(options_.do_start_service); EXPECT_FALSE(options_.limited_only); } TEST_F(DumpOptionsTest, InitializeInteractiveBugReport) { options_.Initialize(Dumpstate::BugreportMode::BUGREPORT_INTERACTIVE, fd, fd, true); + EXPECT_TRUE(options_.do_add_date); + EXPECT_TRUE(options_.do_zip_file); EXPECT_TRUE(options_.do_progress_updates); + EXPECT_TRUE(options_.do_start_service); EXPECT_TRUE(options_.do_screenshot); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::INTERACTIVE); // Other options retain default values EXPECT_TRUE(options_.do_vibrate); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_FALSE(options_.is_remote_mode); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); EXPECT_FALSE(options_.limited_only); } TEST_F(DumpOptionsTest, InitializeRemoteBugReport) { options_.Initialize(Dumpstate::BugreportMode::BUGREPORT_REMOTE, fd, fd, false); + EXPECT_TRUE(options_.do_add_date); + EXPECT_TRUE(options_.do_zip_file); EXPECT_TRUE(options_.is_remote_mode); EXPECT_FALSE(options_.do_vibrate); EXPECT_FALSE(options_.do_screenshot); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::REMOTE); // Other options retain default values - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_FALSE(options_.do_progress_updates); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); EXPECT_FALSE(options_.limited_only); } TEST_F(DumpOptionsTest, InitializeWearBugReport) { options_.Initialize(Dumpstate::BugreportMode::BUGREPORT_WEAR, fd, fd, true); + EXPECT_TRUE(options_.do_add_date); EXPECT_TRUE(options_.do_screenshot); + EXPECT_TRUE(options_.do_zip_file); EXPECT_TRUE(options_.do_progress_updates); + EXPECT_TRUE(options_.do_start_service); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::WEAR); // Other options retain default values EXPECT_TRUE(options_.do_vibrate); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_FALSE(options_.is_remote_mode); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); EXPECT_FALSE(options_.limited_only); } TEST_F(DumpOptionsTest, InitializeTelephonyBugReport) { options_.Initialize(Dumpstate::BugreportMode::BUGREPORT_TELEPHONY, fd, fd, false); + EXPECT_TRUE(options_.do_add_date); EXPECT_FALSE(options_.do_screenshot); + EXPECT_TRUE(options_.do_zip_file); EXPECT_TRUE(options_.telephony_only); EXPECT_TRUE(options_.do_progress_updates); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::CONNECTIVITY); // Other options retain default values EXPECT_TRUE(options_.do_vibrate); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_FALSE(options_.is_remote_mode); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); EXPECT_FALSE(options_.limited_only); } TEST_F(DumpOptionsTest, InitializeWifiBugReport) { options_.Initialize(Dumpstate::BugreportMode::BUGREPORT_WIFI, fd, fd, false); + EXPECT_TRUE(options_.do_add_date); EXPECT_FALSE(options_.do_screenshot); + EXPECT_TRUE(options_.do_zip_file); EXPECT_TRUE(options_.wifi_only); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::WIFI); // Other options retain default values EXPECT_TRUE(options_.do_vibrate); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_FALSE(options_.do_progress_updates); EXPECT_FALSE(options_.is_remote_mode); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); EXPECT_FALSE(options_.limited_only); } @@ -334,6 +350,8 @@ TEST_F(DumpOptionsTest, InitializeLimitedOnlyBugreport) { char* argv[] = { const_cast<char*>("dumpstatez"), const_cast<char*>("-S"), + const_cast<char*>("-d"), + const_cast<char*>("-z"), const_cast<char*>("-q"), const_cast<char*>("-L"), const_cast<char*>("-o abc") @@ -343,7 +361,9 @@ TEST_F(DumpOptionsTest, InitializeLimitedOnlyBugreport) { Dumpstate::RunStatus status = options_.Initialize(ARRAY_SIZE(argv), argv); EXPECT_EQ(status, Dumpstate::RunStatus::OK); - EXPECT_TRUE(options_.progress_updates_to_socket); + EXPECT_TRUE(options_.do_add_date); + EXPECT_TRUE(options_.do_zip_file); + EXPECT_TRUE(options_.use_control_socket); EXPECT_FALSE(options_.do_vibrate); EXPECT_TRUE(options_.limited_only); EXPECT_EQ(" abc", std::string(options_.out_dir)); @@ -353,7 +373,7 @@ TEST_F(DumpOptionsTest, InitializeLimitedOnlyBugreport) { EXPECT_FALSE(options_.do_screenshot); EXPECT_FALSE(options_.do_progress_updates); EXPECT_FALSE(options_.is_remote_mode); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::DEFAULT); } @@ -370,16 +390,18 @@ TEST_F(DumpOptionsTest, InitializeDefaultBugReport) { Dumpstate::RunStatus status = options_.Initialize(ARRAY_SIZE(argv), argv); EXPECT_EQ(status, Dumpstate::RunStatus::OK); + EXPECT_TRUE(options_.do_add_date); EXPECT_TRUE(options_.do_screenshot); + EXPECT_TRUE(options_.do_zip_file); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::DEFAULT); // Other options retain default values EXPECT_TRUE(options_.do_vibrate); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.show_header_only); EXPECT_FALSE(options_.do_progress_updates); EXPECT_FALSE(options_.is_remote_mode); - EXPECT_FALSE(options_.stream_to_socket); + EXPECT_FALSE(options_.use_socket); EXPECT_FALSE(options_.wifi_only); EXPECT_FALSE(options_.limited_only); } @@ -388,6 +410,8 @@ TEST_F(DumpOptionsTest, InitializePartial1) { // clang-format off char* argv[] = { const_cast<char*>("dumpstate"), + const_cast<char*>("-d"), + const_cast<char*>("-z"), const_cast<char*>("-s"), const_cast<char*>("-S"), @@ -397,9 +421,11 @@ TEST_F(DumpOptionsTest, InitializePartial1) { Dumpstate::RunStatus status = options_.Initialize(ARRAY_SIZE(argv), argv); EXPECT_EQ(status, Dumpstate::RunStatus::OK); + EXPECT_TRUE(options_.do_add_date); + EXPECT_TRUE(options_.do_zip_file); // TODO: Maybe we should trim the filename - EXPECT_TRUE(options_.stream_to_socket); - EXPECT_TRUE(options_.progress_updates_to_socket); + EXPECT_TRUE(options_.use_socket); + EXPECT_TRUE(options_.use_control_socket); // Other options retain default values EXPECT_FALSE(options_.show_header_only); @@ -433,8 +459,10 @@ TEST_F(DumpOptionsTest, InitializePartial2) { EXPECT_TRUE(options_.is_remote_mode); // Other options retain default values - EXPECT_FALSE(options_.stream_to_socket); - EXPECT_FALSE(options_.progress_updates_to_socket); + EXPECT_FALSE(options_.do_add_date); + EXPECT_FALSE(options_.do_zip_file); + EXPECT_FALSE(options_.use_socket); + EXPECT_FALSE(options_.use_control_socket); EXPECT_FALSE(options_.limited_only); EXPECT_EQ(options_.dumpstate_hal_mode, DumpstateMode::DEFAULT); } @@ -467,31 +495,40 @@ TEST_F(DumpOptionsTest, InitializeUnknown) { EXPECT_EQ(status, Dumpstate::RunStatus::INVALID_INPUT); } -TEST_F(DumpOptionsTest, ValidateOptionsSocketUsage1) { - options_.progress_updates_to_socket = true; - options_.stream_to_socket = true; +TEST_F(DumpOptionsTest, ValidateOptionsNeedOutfile1) { + options_.do_zip_file = true; + // Writing to socket = !writing to file. + options_.use_socket = true; EXPECT_FALSE(options_.ValidateOptions()); - options_.stream_to_socket = false; + options_.use_socket = false; EXPECT_TRUE(options_.ValidateOptions()); } -TEST_F(DumpOptionsTest, ValidateOptionsSocketUsage2) { +TEST_F(DumpOptionsTest, ValidateOptionsNeedOutfile2) { options_.do_progress_updates = true; // Writing to socket = !writing to file. - options_.stream_to_socket = true; + options_.use_socket = true; EXPECT_FALSE(options_.ValidateOptions()); - options_.stream_to_socket = false; + options_.use_socket = false; + EXPECT_TRUE(options_.ValidateOptions()); +} + +TEST_F(DumpOptionsTest, ValidateOptionsNeedZipfile) { + options_.use_control_socket = true; + EXPECT_FALSE(options_.ValidateOptions()); + + options_.do_zip_file = true; EXPECT_TRUE(options_.ValidateOptions()); } TEST_F(DumpOptionsTest, ValidateOptionsRemoteMode) { - options_.do_progress_updates = true; options_.is_remote_mode = true; EXPECT_FALSE(options_.ValidateOptions()); - options_.do_progress_updates = false; + options_.do_zip_file = true; + options_.do_add_date = true; EXPECT_TRUE(options_.ValidateOptions()); } @@ -505,10 +542,6 @@ class DumpstateTest : public DumpstateBaseTest { ds.options_.reset(new Dumpstate::DumpOptions()); } - void TearDown() { - ds.ShutdownDumpPool(); - } - // Runs a command and capture `stdout` and `stderr`. int RunCommand(const std::string& title, const std::vector<std::string>& full_command, const CommandOptions& options = CommandOptions::DEFAULT) { @@ -536,10 +569,6 @@ class DumpstateTest : public DumpstateBaseTest { ds.progress_.reset(new Progress(initial_max, progress, 1.2)); } - void EnableParallelRunIfNeeded() { - ds.EnableParallelRunIfNeeded(); - } - std::string GetProgressMessage(int progress, int max, int old_max = 0, bool update_progress = true) { EXPECT_EQ(progress, ds.progress_->Get()) << "invalid progress"; @@ -978,83 +1007,6 @@ TEST_F(DumpstateTest, DumpFileUpdateProgress) { ds.listener_.clear(); } -TEST_F(DumpstateTest, DumpPool_withParallelRunEnabled_notNull) { - SetParallelRun(true); - EnableParallelRunIfNeeded(); - EXPECT_TRUE(ds.zip_entry_tasks_); - EXPECT_TRUE(ds.dump_pool_); -} - -TEST_F(DumpstateTest, DumpPool_withParallelRunDisabled_isNull) { - SetParallelRun(false); - EnableParallelRunIfNeeded(); - EXPECT_FALSE(ds.zip_entry_tasks_); - EXPECT_FALSE(ds.dump_pool_); -} - -class ZippedBugReportStreamTest : public DumpstateBaseTest { - public: - void SetUp() { - DumpstateBaseTest::SetUp(); - ds_.options_.reset(new Dumpstate::DumpOptions()); - } - void TearDown() { - CloseArchive(handle_); - } - - // Set bugreport mode and options before here. - void GenerateBugreport() { - ds_.Initialize(); - EXPECT_EQ(Dumpstate::RunStatus::OK, ds_.Run(/*calling_uid=*/-1, /*calling_package=*/"")); - } - - // Most bugreports droproot, ensure the file can be opened by shell to verify file content. - void CreateFd(const std::string& path, android::base::unique_fd* out_fd) { - out_fd->reset(TEMP_FAILURE_RETRY(open(path.c_str(), - O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NOFOLLOW, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))); - ASSERT_GE(out_fd->get(), 0) << "could not create FD for path " << path; - } - - void VerifyEntry(const ZipArchiveHandle archive, const std::string_view entry_name, - ZipEntry* data) { - int32_t e = FindEntry(archive, entry_name, data); - EXPECT_EQ(0, e) << ErrorCodeString(e) << " entry name: " << entry_name; - } - - // While testing dumpstate in process, using STDOUT may get confused about - // the internal fd redirection. Redirect to a dedicate fd to save content. - void RedirectOutputToFd(android::base::unique_fd& ufd) { - ds_.open_socket_fn_ = [&](const char*) -> int { return ufd.release(); }; - }; - - Dumpstate& ds_ = Dumpstate::GetInstance(); - ZipArchiveHandle handle_; -}; - -// Generate a quick LimitedOnly report redirected to a file, open it and verify entry exist. -TEST_F(ZippedBugReportStreamTest, StreamLimitedOnlyReport) { - std::string out_path = kTestDataPath + "StreamLimitedOnlyReportOut.zip"; - android::base::unique_fd out_fd; - CreateFd(out_path, &out_fd); - ds_.options_->limited_only = true; - ds_.options_->stream_to_socket = true; - RedirectOutputToFd(out_fd); - - GenerateBugreport(); - OpenArchive(out_path.c_str(), &handle_); - - ZipEntry entry; - VerifyEntry(handle_, "main_entry.txt", &entry); - std::string bugreport_txt_name; - bugreport_txt_name.resize(entry.uncompressed_length); - ExtractToMemory(handle_, &entry, reinterpret_cast<uint8_t*>(bugreport_txt_name.data()), - entry.uncompressed_length); - EXPECT_THAT(bugreport_txt_name, - testing::ContainsRegex("(bugreport-.+(-[[:digit:]]+){6}\\.txt)")); - VerifyEntry(handle_, bugreport_txt_name, &entry); -} - class DumpstateServiceTest : public DumpstateBaseTest { public: DumpstateService dss; @@ -1666,175 +1618,6 @@ TEST_F(DumpstateUtilTest, DumpFileOnDryRun) { EXPECT_THAT(out, EndsWith("skipped on dry run\n")); } -class DumpPoolTest : public DumpstateBaseTest { - public: - void SetUp() { - dump_pool_ = std::make_unique<DumpPool>(kTestDataPath); - DumpstateBaseTest::SetUp(); - CreateOutputFile(); - } - - void CreateOutputFile() { - out_path_ = kTestDataPath + "out.txt"; - out_fd_.reset(TEMP_FAILURE_RETRY(open(out_path_.c_str(), - O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NOFOLLOW, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))); - ASSERT_GE(out_fd_.get(), 0) << "could not create FD for path " - << out_path_; - } - - int getTempFileCounts(const std::string& folder) { - int count = 0; - std::unique_ptr<DIR, decltype(&closedir)> dir_ptr(opendir(folder.c_str()), - &closedir); - if (!dir_ptr) { - return -1; - } - int dir_fd = dirfd(dir_ptr.get()); - if (dir_fd < 0) { - return -1; - } - - struct dirent* de; - while ((de = readdir(dir_ptr.get()))) { - if (de->d_type != DT_REG) { - continue; - } - std::string file_name(de->d_name); - if (file_name.find(DumpPool::PREFIX_TMPFILE_NAME) != 0) { - continue; - } - count++; - } - return count; - } - - void setLogDuration(bool log_duration) { - dump_pool_->setLogDuration(log_duration); - } - - std::unique_ptr<DumpPool> dump_pool_; - android::base::unique_fd out_fd_; - std::string out_path_; -}; - -TEST_F(DumpPoolTest, EnqueueTaskWithFd) { - auto dump_func_1 = [](int out_fd) { - dprintf(out_fd, "A"); - }; - auto dump_func_2 = [](int out_fd) { - dprintf(out_fd, "B"); - sleep(1); - }; - auto dump_func_3 = [](int out_fd) { - dprintf(out_fd, "C"); - }; - setLogDuration(/* log_duration = */false); - dump_pool_->enqueueTaskWithFd(/* task_name = */"1", dump_func_1, std::placeholders::_1); - dump_pool_->enqueueTaskWithFd(/* task_name = */"2", dump_func_2, std::placeholders::_1); - dump_pool_->enqueueTaskWithFd(/* task_name = */"3", dump_func_3, std::placeholders::_1); - - dump_pool_->waitForTask("1", "", out_fd_.get()); - dump_pool_->waitForTask("2", "", out_fd_.get()); - dump_pool_->waitForTask("3", "", out_fd_.get()); - dump_pool_->shutdown(); - - std::string result; - ReadFileToString(out_path_, &result); - EXPECT_THAT(result, StrEq("A\nB\nC\n")); - EXPECT_THAT(getTempFileCounts(kTestDataPath), Eq(0)); -} - -TEST_F(DumpPoolTest, EnqueueTask_withDurationLog) { - bool run_1 = false; - auto dump_func_1 = [&]() { - run_1 = true; - }; - - dump_pool_->enqueueTask(/* task_name = */"1", dump_func_1); - dump_pool_->waitForTask("1", "", out_fd_.get()); - dump_pool_->shutdown(); - - std::string result; - ReadFileToString(out_path_, &result); - EXPECT_TRUE(run_1); - EXPECT_THAT(result, StrEq("------ 0.000s was the duration of '1' ------\n")); - EXPECT_THAT(getTempFileCounts(kTestDataPath), Eq(0)); -} - -TEST_F(DumpPoolTest, Shutdown_withoutCrash) { - bool run_1 = false; - auto dump_func_1 = [&]() { - run_1 = true; - }; - auto dump_func = []() { - sleep(1); - }; - - dump_pool_->start(/* thread_counts = */1); - dump_pool_->enqueueTask(/* task_name = */"1", dump_func_1); - dump_pool_->enqueueTask(/* task_name = */"2", dump_func); - dump_pool_->enqueueTask(/* task_name = */"3", dump_func); - dump_pool_->enqueueTask(/* task_name = */"4", dump_func); - dump_pool_->waitForTask("1", "", out_fd_.get()); - dump_pool_->shutdown(); - - EXPECT_TRUE(run_1); - EXPECT_THAT(getTempFileCounts(kTestDataPath), Eq(0)); -} - -class TaskQueueTest : public DumpstateBaseTest { -public: - void SetUp() { - DumpstateBaseTest::SetUp(); - } - - TaskQueue task_queue_; -}; - -TEST_F(TaskQueueTest, runTask) { - bool is_task1_run = false; - bool is_task2_run = false; - auto task_1 = [&](bool task_cancelled) { - if (task_cancelled) { - return; - } - is_task1_run = true; - }; - auto task_2 = [&](bool task_cancelled) { - if (task_cancelled) { - return; - } - is_task2_run = true; - }; - task_queue_.add(task_1, std::placeholders::_1); - task_queue_.add(task_2, std::placeholders::_1); - - task_queue_.run(/* do_cancel = */false); - - EXPECT_TRUE(is_task1_run); - EXPECT_TRUE(is_task2_run); -} - -TEST_F(TaskQueueTest, runTask_withCancelled) { - bool is_task1_cancelled = false; - bool is_task2_cancelled = false; - auto task_1 = [&](bool task_cancelled) { - is_task1_cancelled = task_cancelled; - }; - auto task_2 = [&](bool task_cancelled) { - is_task2_cancelled = task_cancelled; - }; - task_queue_.add(task_1, std::placeholders::_1); - task_queue_.add(task_2, std::placeholders::_1); - - task_queue_.run(/* do_cancel = */true); - - EXPECT_TRUE(is_task1_cancelled); - EXPECT_TRUE(is_task2_cancelled); -} - - } // namespace dumpstate } // namespace os } // namespace android |