blob: 17455b8d72feed973befd68ca95fe7cdeff7dc92 [file] [log] [blame]
// 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_