| // Copyright 2026 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MOCK_ASYNC_TASK_H_ | |
| #define SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MOCK_ASYNC_TASK_H_ | |
| #include <lib/fit/function.h> | |
| #include <cstdint> | |
| #include <memory> | |
| #include <string> | |
| #include <utility> | |
| #include <vector> | |
| #include "src/developer/debug/zxdb/client/async_task.h" | |
| #include "src/developer/debug/zxdb/client/async_task_provider.h" | |
| #include "src/developer/debug/zxdb/client/frame.h" | |
| #include "src/developer/debug/zxdb/common/err.h" | |
| #include "src/developer/debug/zxdb/symbols/identifier.h" | |
| #include "src/developer/debug/zxdb/symbols/location.h" | |
| #include "src/developer/debug/zxdb/symbols/symbol_context.h" | |
| namespace zxdb { | |
| // Mock implementation of AsyncTask supporting both console and debug_adapter unit tests. | |
| class MockAsyncTask : public AsyncTask { | |
| public: | |
| // Constructor specifying session, id, name, and optional location. | |
| MockAsyncTask(Session* session, uint64_t id, std::string name, Location loc = Location()) | |
| : AsyncTask(session), | |
| id_(id), | |
| type_(Type::kFuture), | |
| identifier_(IdentifierComponent(std::move(name))), | |
| state_("Pending"), | |
| location_(std::move(loc)) {} | |
| // Convenience constructor without session. | |
| MockAsyncTask(uint64_t id, std::string name, Location loc = Location()) | |
| : MockAsyncTask(nullptr, id, std::move(name), std::move(loc)) {} | |
| // Detailed constructor specifying id, type, identifier, state, optional location, and session. | |
| MockAsyncTask(uint64_t id, Type type, Identifier identifier, std::string state = "Pending", | |
| Location loc = Location(), Session* session = nullptr) | |
| : AsyncTask(session), | |
| id_(id), | |
| type_(type), | |
| identifier_(std::move(identifier)), | |
| state_(std::move(state)), | |
| location_(std::move(loc)) {} | |
| uint64_t GetId() const override { return id_; } | |
| Type GetType() const override { return type_; } | |
| const Location& GetLocation() const override { return location_; } | |
| const Identifier& GetIdentifier() const override { return identifier_; } | |
| std::string GetState() const override { return state_; } | |
| const std::vector<NamedValue>& GetValues() const override { return values_; } | |
| std::vector<Ref> GetChildren() const override { | |
| std::vector<Ref> refs = children_; | |
| for (const auto& child : owned_children_) { | |
| refs.push_back(*child); | |
| } | |
| return refs; | |
| } | |
| void set_id(uint64_t id) { id_ = id; } | |
| void set_type(Type type) { type_ = type; } | |
| void set_location(const Location& loc) { location_ = loc; } | |
| void set_identifier(Identifier identifier) { identifier_ = std::move(identifier); } | |
| void set_name(std::string name) { | |
| identifier_ = Identifier(IdentifierComponent(std::move(name))); | |
| } | |
| void set_state(std::string state) { state_ = std::move(state); } | |
| void set_values(std::vector<NamedValue> values) { values_ = std::move(values); } | |
| void set_children(std::vector<Ref> children) { children_ = std::move(children); } | |
| void AddChild(std::unique_ptr<MockAsyncTask> child) { | |
| owned_children_.push_back(std::move(child)); | |
| } | |
| private: | |
| uint64_t id_ = 0; | |
| Type type_ = Type::kFuture; | |
| Identifier identifier_; | |
| std::string state_; | |
| Location location_; | |
| std::vector<NamedValue> values_; | |
| std::vector<Ref> children_; | |
| std::vector<std::unique_ptr<MockAsyncTask>> owned_children_; | |
| }; | |
| // Mock implementation of AsyncTaskProvider that produces a mock hierarchy of async tasks. | |
| class MockAsyncTaskProvider : public AsyncTaskProvider { | |
| public: | |
| explicit MockAsyncTaskProvider(std::string fake_file_path = "") | |
| : fake_file_path_(std::move(fake_file_path)) {} | |
| bool CanHandle(Frame* /*frame*/) const override { return true; } | |
| void GetTasks( | |
| Frame* frame, | |
| fit::callback<void(const Err&, std::vector<std::unique_ptr<AsyncTask>>)> cb) override { | |
| std::vector<std::unique_ptr<AsyncTask>> tasks; | |
| Location loc(0x1234, FileLine(fake_file_path_, 42), 0, SymbolContext::ForRelativeAddresses()); | |
| auto root = std::make_unique<MockAsyncTask>(frame->session(), 1, "root", std::move(loc)); | |
| auto child = std::make_unique<MockAsyncTask>(frame->session(), 2, "child"); | |
| child->AddChild(std::make_unique<MockAsyncTask>(frame->session(), 3, "grandchild")); | |
| root->AddChild(std::move(child)); | |
| tasks.push_back(std::move(root)); | |
| auto zero_id_task = std::make_unique<MockAsyncTask>(frame->session(), 0, "zero_id_task"); | |
| tasks.push_back(std::move(zero_id_task)); | |
| cb(Err(), std::move(tasks)); | |
| } | |
| void set_fake_file_path(std::string fake_file_path) { | |
| fake_file_path_ = std::move(fake_file_path); | |
| } | |
| const std::string& fake_file_path() const { return fake_file_path_; } | |
| private: | |
| std::string fake_file_path_; | |
| }; | |
| } // namespace zxdb | |
| #endif // SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MOCK_ASYNC_TASK_H_ |