// 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 "lib/fsl/vmo/shared_vmo.h"

#include <string.h>

#include "gtest/gtest.h"
#include "lib/fsl/vmo/sized_vmo.h"
#include "lib/fsl/vmo/strings.h"

namespace fsl {
namespace {

TEST(SharedVmos, Unmappable) {
  std::string content("hello");
  SizedVmo vmo;
  ASSERT_TRUE(VmoFromString(content, &vmo));
  zx_handle_t vmo_handle = vmo.vmo().get();

  auto shared_vmo = fxl::MakeRefCounted<SharedVmo>(std::move(vmo.vmo()));
  ASSERT_NE(nullptr, shared_vmo.get());
  EXPECT_EQ(vmo_handle, shared_vmo->vmo().get());
  EXPECT_LE(content.size(), shared_vmo->vmo_size());
  EXPECT_EQ(0u, shared_vmo->map_flags());
  EXPECT_EQ(nullptr, shared_vmo->Map());
}

TEST(SharedVmos, Mapped) {
  std::string content("hello");
  SizedVmo vmo;
  ASSERT_TRUE(VmoFromString(content, &vmo));
  zx_handle_t vmo_handle = vmo.vmo().get();

  auto shared_vmo = fxl::MakeRefCounted<SharedVmo>(std::move(vmo.vmo()),
                                                   ZX_VM_PERM_READ);
  ASSERT_NE(nullptr, shared_vmo.get());
  EXPECT_EQ(vmo_handle, shared_vmo->vmo().get());
  EXPECT_LE(content.size(), shared_vmo->vmo_size());
  EXPECT_EQ(ZX_VM_PERM_READ, shared_vmo->map_flags());
  const char* data = static_cast<const char*>(shared_vmo->Map());
  EXPECT_NE(nullptr, data);
  EXPECT_EQ(0, memcmp(content.c_str(), data, content.size()));
  EXPECT_EQ(data, static_cast<const char*>(shared_vmo->Map()));
}

}  // namespace
}  // namespace fsl
