| // Copyright 2020 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/developer/forensics/testing/stubs/loader.h" | |
| #include <lib/syslog/cpp/macros.h> | |
| #include <lib/zx/socket.h> | |
| #include "src/lib/fsl/socket/strings.h" | |
| #include "src/lib/fxl/strings/string_printf.h" | |
| namespace forensics { | |
| namespace stubs { | |
| using namespace fuchsia_net_http; | |
| LoaderResponse LoaderResponse::WithError(const Error error) { | |
| return LoaderResponse{ | |
| .error = error, | |
| .status_code = std::nullopt, | |
| .body = std::nullopt, | |
| }; | |
| } | |
| LoaderResponse LoaderResponse::WithError(const uint32_t status_code) { | |
| FX_CHECK(status_code < 200 || status_code >= 204); | |
| return LoaderResponse{ | |
| .error = std::nullopt, | |
| .status_code = status_code, | |
| .body = std::nullopt, | |
| }; | |
| } | |
| LoaderResponse LoaderResponse::WithBody(const uint32_t status_code, const std::string& body) { | |
| return LoaderResponse{ | |
| .error = std::nullopt, | |
| .status_code = status_code, | |
| .body = body, | |
| }; | |
| } | |
| Loader::~Loader() { | |
| FX_CHECK(next_response_ == responses_.end()) | |
| << fxl::StringPrintf("expected %ld more calls to Fetch() (%ld/%lu calls made)", | |
| std::distance(next_response_, responses_.cend()), | |
| std::distance(responses_.cbegin(), next_response_), responses_.size()); | |
| } | |
| void Loader::Fetch(FetchRequest& request, FetchCompleter::Sync& completer) { | |
| if (request.request().url().has_value()) { | |
| url_ = *request.request().url(); | |
| } | |
| FX_CHECK(next_response_ != responses_.end()) | |
| << fxl::StringPrintf("no more calls to Fetch() expected (%lu/%lu calls made)", | |
| std::distance(responses_.cbegin(), next_response_), responses_.size()); | |
| FX_CHECK(next_response_ != responses_.end()); | |
| Response response; | |
| if (next_response_->error.has_value()) { | |
| response.error(next_response_->error.value()); | |
| } else if (next_response_->status_code.has_value()) { | |
| response.status_code(next_response_->status_code.value()); | |
| if (next_response_->body.has_value()) { | |
| response.body(fsl::WriteStringToSocket(next_response_->body.value())); | |
| } | |
| } else { | |
| FX_LOGS(FATAL) << "Bad LoaderResponse"; | |
| } | |
| next_response_++; | |
| completer.Reply(std::move(response)); | |
| } | |
| std::string Loader::LastRequestUrl() const { return url_; } | |
| } // namespace stubs | |
| } // namespace forensics |