// 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_SYS_SERVICE_CPP_TEST_BASE_H_
#define LIB_SYS_SERVICE_CPP_TEST_BASE_H_

#include <fcntl.h>
#include <lib/fdio/namespace.h>
#include <stdlib.h>

#include <fbl/unique_fd.h>
#include <gtest/gtest.h>

namespace sys {
namespace testing {

class TestBase : public ::testing::Test {
 protected:
  fdio_ns_t* ns() const { return ns_; }

  int MkDir(std::string dir) {
    std::string path = svc_ + dir;
    return mkdir(path.data(), 066);
  }

  int RmDir(std::string dir) {
    std::string path = svc_ + dir;
    return rmdir(path.data());
  }

 private:
  fdio_ns_t* ns_;
  std::string svc_;

  void SetUp() override {
    zx_status_t status = fdio_ns_create(&ns_);
    ASSERT_EQ(ZX_OK, status);

    char buf[] = "/tmp/svc.XXXXXX";
    svc_ = mkdtemp(buf);

    int ret = MkDir("/fuchsia.examples.EchoService");
    ASSERT_EQ(0, ret);
    ret = MkDir("/fuchsia.examples.EchoService/default");
    ASSERT_EQ(0, ret);
    ret = MkDir("/fuchsia.examples.EchoService/my_instance");
    ASSERT_EQ(0, ret);

    fbl::unique_fd fd(open(svc_.data(), O_RDONLY | O_DIRECTORY));
    ASSERT_TRUE(fd.is_valid());
    status = fdio_ns_bind_fd(ns_, "/svc", fd.get());
    ASSERT_EQ(ZX_OK, status);
  }

  void TearDown() override { fdio_ns_destroy(ns_); }
};

}  // namespace testing
}  // namespace sys

#endif  // LIB_SYS_SERVICE_CPP_TEST_BASE_H_
