| // 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_CONSOLE_SCRIPT_RUNNER_H_ |
| #define SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_SCRIPT_RUNNER_H_ |
| |
| #include <cstdint> |
| #include <filesystem> |
| #include <fstream> |
| #include <string> |
| |
| #include "src/developer/debug/zxdb/console/console.h" |
| #include "src/developer/debug/zxdb/console/output_buffer.h" |
| #include "src/lib/fxl/memory/weak_ptr.h" |
| |
| namespace zxdb { |
| |
| class Session; |
| |
| class ScriptRunner : public Console::OutputObserver { |
| public: |
| // |completion_callback| is called when the script finishes (either EOF or error). |
| // The bool parameter indicates if it was successful. |
| using CompletionCallback = fit::callback<void(bool success)>; |
| |
| ScriptRunner(Session* session, Console* console); |
| virtual ~ScriptRunner(); |
| |
| // Runs the script at |path|. |
| void Run(const std::filesystem::path& path, CompletionCallback cb); |
| |
| void set_timeout_s(uint64_t timeout_s) { timeout_s_ = timeout_s; } |
| |
| // Implements |Console::OutputObserver|. |
| void OnOutput(const OutputBuffer& output) override; |
| |
| // Returns an OutputBuffer with the collected output surrounded by "BEGIN OUTPUT" and "END OUTPUT" |
| // markers preceded by the current expected output and script line number. |
| OutputBuffer GetFailureContext(); |
| |
| private: |
| // Process the script until the next command or line of output. When the next command is reached, |
| void ProcessScriptLines(); |
| |
| // Dispatches the given |command| after the output of the currently executing has been completely |
| // processed. This is always issued asynchronously, but may be more than one tick of the message |
| // loop, depending on the amount of output being matched against for a given command. |
| void DispatchNextCommandWhenReady(const std::string& command); |
| |
| void Fail(const std::string& message); |
| void Complete(bool success); |
| |
| Console* console_; |
| |
| std::filesystem::path script_path_; |
| std::ifstream script_file_; |
| CompletionCallback completion_cb_; |
| |
| // The pattern of a single line that |OnOutput| is expecting. |
| std::string expected_output_pattern_; |
| |
| // This is passed to a FuzzyMatcher object to communicate that it should not expect the order of |
| // strings to be exact. |
| bool allow_out_of_order_output_ = false; |
| |
| // The output collected from all output events since the last dispatched command. When a timeout |
| // is reached without matching a particular output, this will be displayed in an error message. |
| std::string collected_output_; |
| |
| // Useful for debugging when timeout. |
| int line_number_ = 0; |
| |
| uint64_t timeout_s_ = 10; |
| bool has_failed_ = false; |
| |
| fxl::WeakPtrFactory<ScriptRunner> weak_factory_; |
| }; |
| |
| } // namespace zxdb |
| |
| #endif // SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_SCRIPT_RUNNER_H_ |