// Copyright 2016 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 "peridot/bin/ledger/tests/integration/test_utils.h"

#include <string>
#include <utility>
#include <vector>

#include <fuchsia/ledger/internal/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fsl/vmo/strings.h>
#include <lib/fxl/files/scoped_temp_dir.h>
#include <lib/fxl/macros.h>
#include <lib/fxl/time/time_delta.h>
#include <lib/zx/time.h>

#include "garnet/public/lib/callback/capture.h"
#include "gtest/gtest.h"
#include "peridot/bin/ledger/fidl/include/types.h"
#include "peridot/lib/convert/convert.h"

namespace ledger {

fidl::VectorPtr<uint8_t> RandomArray(rng::Random* random, size_t size,
                                     const std::vector<uint8_t>& prefix) {
  EXPECT_TRUE(size >= prefix.size());
  fidl::VectorPtr<uint8_t> array = fidl::VectorPtr<uint8_t>::New(size);
  for (size_t i = 0; i < prefix.size(); ++i) {
    array->at(i) = prefix[i];
  }
  random->Draw(&(*array)[prefix.size()], size - prefix.size());
  return array;
}

std::string ToString(const fuchsia::mem::BufferPtr& vmo) {
  std::string value;
  bool status = fsl::StringFromVmo(*vmo, &value);
  FXL_DCHECK(status);
  return value;
}

fidl::VectorPtr<uint8_t> ToArray(const fuchsia::mem::BufferPtr& vmo) {
  return convert::ToArray(ToString(vmo));
}

std::vector<Entry> SnapshotGetEntries(LoopController* loop_controller,
                                      PageSnapshotPtr* snapshot,
                                      fidl::VectorPtr<uint8_t> start,
                                      int* num_queries) {
  std::vector<Entry> result;
  std::unique_ptr<Token> token;
  if (num_queries) {
    *num_queries = 0;
  }
  do {
    Status status;
    fidl::VectorPtr<Entry> entries;
    auto waiter = loop_controller->NewWaiter();
    (*snapshot)->GetEntries(
        start.Clone(), std::move(token),
        callback::Capture(waiter->GetCallback(), &status, &entries, &token));
    if (!waiter->RunUntilCalled()) {
      ADD_FAILURE() << "|GetEntries| failed to call back.";
      return {};
    }
    if (status != Status::OK && status != Status::PARTIAL_RESULT) {
      ADD_FAILURE() << "Actual status: " << fidl::ToUnderlying(status);
      return {};
    }
    if (num_queries) {
      (*num_queries)++;
    }
    for (auto& entry : entries.take()) {
      result.push_back(std::move(entry));
    }
  } while (token);
  return result;
}

}  // namespace ledger
