// Copyright 2019 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.

#ifndef LIB_VFS_CPP_TESTING_DIR_TEST_UTIL_H_
#define LIB_VFS_CPP_TESTING_DIR_TEST_UTIL_H_

#include <fuchsia/io/cpp/fidl.h>
#include <lib/fdio/vfs.h>
#include <lib/gtest/real_loop_fixture.h>
#include <lib/vfs/cpp/internal/directory.h>

namespace vfs_tests {

class Dirent {
 public:
  static Dirent DirentForDot();

  static Dirent DirentForDirectory(const std::string& name);

  static Dirent DirentForFile(const std::string& name);

  static Dirent DirentForService(const std::string& name);

  std::string String();

  uint64_t ino() const { return ino_; }

  uint8_t type() const { return type_; }

  uint8_t size() const { return size_; }

  const std::string& name() const { return name_; }

  uint64_t size_in_bytes() const { return size_in_bytes_; }

 private:
  Dirent(uint64_t ino, uint8_t type, const std::string& name);

  uint64_t ino_;
  uint8_t type_;
  uint8_t size_;
  std::string name_;

  uint64_t size_in_bytes_;
};

class DirConnection : public gtest::RealLoopFixture {
 protected:
  virtual vfs::internal::Directory* GetDirectoryNode() = 0;

  void AssertOpen(async_dispatcher_t* dispatcher, uint32_t flags, zx_status_t expected_status,
                  bool test_on_open_event = true);

  void AssertReadDirents(fuchsia::io::DirectorySyncPtr& ptr, uint64_t max_bytes,
                         std::vector<Dirent>& expected_dirents,
                         zx_status_t expected_status = ZX_OK);

  void AssertRewind(fuchsia::io::DirectorySyncPtr& ptr, zx_status_t expected_status = ZX_OK);

  template <typename T>
  void AssertOpenPathImpl(std::string caller_file, int caller_line,
                          fuchsia::io::DirectorySyncPtr& dir_ptr, const std::string& path,
                          ::fidl::SynchronousInterfacePtr<T>& out_sync_ptr, uint32_t flags,
                          uint32_t mode = 0, zx_status_t expected_status = ZX_OK) {
    ::fidl::InterfacePtr<fuchsia::io::Node> node_ptr;
    dir_ptr->Open(flags | fuchsia::io::OPEN_FLAG_DESCRIBE, mode, path, node_ptr.NewRequest());
    bool on_open_called = false;
    node_ptr.events().OnOpen = [&](zx_status_t status,
                                   std::unique_ptr<fuchsia::io::NodeInfo> unused) {
      EXPECT_FALSE(on_open_called);  // should be called only once
      on_open_called = true;
      EXPECT_EQ(expected_status, status) << "from file " << caller_file << ", line " << caller_line;
    };

    RunLoopUntil([&]() { return on_open_called; }, zx::msec(1));

    // Bind channel to sync_ptr
    out_sync_ptr.Bind(node_ptr.Unbind().TakeChannel());
  }

  void AssertRead(fuchsia::io::FileSyncPtr& file, int count, const std::string& expected_str,
                  zx_status_t expected_status = ZX_OK);
};

}  // namespace vfs_tests

#define AssertOpenPath(...) AssertOpenPathImpl(__FILE__, __LINE__, __VA_ARGS__)

#endif  // LIB_VFS_CPP_TESTING_DIR_TEST_UTIL_H_
