blob: 2559e40a6a3d22a4b63113d435ca36d45bc68b26 [file] [log] [blame]
// Copyright 2021 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.
#include "src/sys/fuzzing/common/testing/artifact.h"
#include <lib/syslog/cpp/macros.h>
#include "src/sys/fuzzing/common/async-socket.h"
namespace fuzzing {
ZxPromise<Artifact> WatchArtifact(const ExecutorPtr& executor, ControllerPtr& controller) {
Bridge<FidlArtifact> bridge;
controller->WatchArtifact(bridge.completer.bind());
return ConsumeBridge(bridge).and_then(
[executor, fuzz_result = FuzzResult::NO_ERRORS, read = ZxFuture<Input>()](
Context& context, FidlArtifact& fidl_artifact) mutable -> ZxResult<Artifact> {
if (!read) {
if (fidl_artifact.IsEmpty()) {
return fpromise::ok(Artifact());
}
if (fidl_artifact.has_error()) {
return fpromise::error(fidl_artifact.error());
}
FX_DCHECK(fidl_artifact.has_result());
fuzz_result = fidl_artifact.result();
if (!fidl_artifact.has_input()) {
return fpromise::ok(Artifact(fuzz_result));
}
auto* fidl_input = fidl_artifact.mutable_input();
read = AsyncSocketRead(executor, std::move(*fidl_input));
}
if (!read(context)) {
return fpromise::pending();
}
if (read.is_error()) {
return fpromise::error(ZX_ERR_CANCELED);
}
return fpromise::ok(Artifact(fuzz_result, read.take_value()));
});
}
} // namespace fuzzing