// 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 {

std::vector<uint8_t> RandomArray(rng::Random* random, size_t size,
                                     const std::vector<uint8_t>& prefix) {
  EXPECT_TRUE(size >= prefix.size());
  std::vector<uint8_t> array(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;
}

std::vector<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;
    std::vector<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) {
      result.push_back(std::move(entry));
    }
  } while (token);
  return result;
}

}  // namespace ledger
