// Copyright 2020 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 "tools/kazoo/outputs.h"
#include "tools/kazoo/syscall_library.h"
#include "tools/kazoo/test.h"
#include "tools/kazoo/test_ir_test_kernel_cases.test.h"
#include "tools/kazoo/test_ir_test_kernelwrappers.test.h"
#include "tools/kazoo/test_ir_test_one_protocol_two_methods.test.h"
#include "tools/kazoo/test_ir_test_one_protocol_two_methods_with_internal.test.h"
#include "tools/kazoo/test_ir_test_ownership_annotations.test.h"
#include "tools/kazoo/test_ir_test_selection.test.h"
#include "tools/kazoo/test_ir_test_vdsowrappers.test.h"

namespace {

TEST(CDeclOutput, Public) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_selection, &library));

  Writer writer;
  ASSERT_TRUE(PublicDeclarationsOutput(library, &writer));

  EXPECT_EQ(writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

#ifndef _ZX_SYSCALL_DECL
#error "<zircon/syscalls.h> is the public API header"
#endif

_ZX_SYSCALL_DECL(selection_futex_requeue, zx_status_t, /* no attributes */, 6,
    (value_ptr, wake_count, current_value, requeue_ptr, requeue_count, new_requeue_owner), (
    const zx_futex_t* value_ptr,
    uint32_t wake_count,
    zx_futex_t current_value,
    const zx_futex_t* requeue_ptr,
    uint32_t requeue_count,
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t new_requeue_owner))

_ZX_SYSCALL_DECL(selection_object_wait_one, zx_status_t, /* no attributes */, 4,
    (handle, signals, deadline, observed), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    zx_signals_t signals,
    zx_time_t deadline,
    zx_signals_t* observed))

_ZX_SYSCALL_DECL(selection_ktrace_read, zx_status_t, /* no attributes */, 5,
    (handle, data, offset, data_size, actual), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    void* data,
    uint32_t offset,
    size_t data_size,
    size_t* actual))

_ZX_SYSCALL_DECL(selection_pci_cfg_pio_rw, zx_status_t, /* no attributes */, 8,
    (handle, bus, dev, func, offset, val, width, write), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint8_t bus,
    uint8_t dev,
    uint8_t func,
    uint8_t offset,
    uint32_t* val,
    size_t width,
    bool write))

_ZX_SYSCALL_DECL(selection_job_set_policy, zx_status_t, /* no attributes */, 5,
    (handle, options, topic, policy, policy_size), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint32_t options,
    uint32_t topic,
    const void* policy,
    uint32_t policy_size))

_ZX_SYSCALL_DECL(selection_clock_get, zx_status_t, /* no attributes */, 2,
    (clock_id, out), (
    zx_clock_t clock_id,
    zx_time_t* out))

)");
}

TEST(CDeclOutput, Testonly) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_kernel_cases, &library));

  Writer writer;
  ASSERT_TRUE(PublicDeclarationsOutput(library, &writer));

  Writer testonly_writer;
  ASSERT_TRUE(TestonlyPublicDeclarationsOutput(library, &testonly_writer));

  EXPECT_EQ(writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

#ifndef _ZX_SYSCALL_DECL
#error "<zircon/syscalls.h> is the public API header"
#endif

_ZX_SYSCALL_DECL(kernelcases_bti_pin, zx_status_t, /* no attributes */, 8,
    (handle, options, vmo, offset, size, addrs, num_addrs, pmt), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint32_t options,
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
    uint64_t offset,
    uint64_t size,
    zx_paddr_t* addrs,
    size_t num_addrs,
    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* pmt))

_ZX_SYSCALL_DECL(kernelcases_thread_exit, void, __NO_RETURN, 0,
    (), (void))

_ZX_SYSCALL_DECL(kernelcases_mtrace_control, zx_status_t, /* no attributes */, 6,
    (handle, kind, action, options, ptr, ptr_size), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint32_t kind,
    uint32_t action,
    uint32_t options,
    void* ptr,
    size_t ptr_size))

_ZX_SYSCALL_DECL(kernelcases_read, zx_status_t, /* no attributes */, 8,
    (handle, options, bytes, num_bytes, handles, num_handles, actual_bytes, actual_handles), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint32_t options,
    void* bytes,
    uint32_t num_bytes,
    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* handles,
    uint32_t num_handles,
    uint32_t* actual_bytes,
    uint32_t* actual_handles))

)");

  EXPECT_EQ(testonly_writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

#ifndef _ZX_SYSCALL_DECL
#error "<zircon/testonly-syscalls.h> is the public API header"
#endif

_ZX_SYSCALL_DECL(kernelcases_compiled_out_in_non_test, zx_status_t, /* no attributes */, 2,
    (a, b), (
    int32_t a,
    int32_t b))

)");
}

TEST(CDeclOutput, Private) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_selection, &library));

  Writer writer;
  ASSERT_TRUE(PrivateDeclarationsOutput(library, &writer));

  EXPECT_EQ(writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

KERNEL_SYSCALL(selection_futex_requeue, zx_status_t, /* no attributes */, 6,
    (value_ptr, wake_count, current_value, requeue_ptr, requeue_count, new_requeue_owner), (
    const zx_futex_t* value_ptr,
    uint32_t wake_count,
    zx_futex_t current_value,
    const zx_futex_t* requeue_ptr,
    uint32_t requeue_count,
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t new_requeue_owner))

KERNEL_SYSCALL(selection_object_wait_one, zx_status_t, /* no attributes */, 4,
    (handle, signals, deadline, observed), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    zx_signals_t signals,
    zx_time_t deadline,
    zx_signals_t* observed))

KERNEL_SYSCALL(selection_ktrace_read, zx_status_t, /* no attributes */, 5,
    (handle, data, offset, data_size, actual), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    void* data,
    uint32_t offset,
    size_t data_size,
    size_t* actual))

KERNEL_SYSCALL(selection_pci_cfg_pio_rw, zx_status_t, /* no attributes */, 8,
    (handle, bus, dev, func, offset, val, width, write), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint8_t bus,
    uint8_t dev,
    uint8_t func,
    uint8_t offset,
    uint32_t* val,
    size_t width,
    bool write))

KERNEL_SYSCALL(selection_job_set_policy, zx_status_t, /* no attributes */, 5,
    (handle, options, topic, policy, policy_size), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint32_t options,
    uint32_t topic,
    const void* policy,
    uint32_t policy_size))

KERNEL_SYSCALL(selection_clock_get, zx_status_t, /* no attributes */, 2,
    (clock_id, out), (
    zx_clock_t clock_id,
    zx_time_t* out))

)");
}
TEST(CDeclOutput, Kernel) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_kernel_cases, &library));

  Writer writer;
  ASSERT_TRUE(KernelDeclarationsOutput(library, &writer));

  EXPECT_EQ(writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

KERNEL_SYSCALL(kernelcases_bti_pin, zx_status_t, /* no attributes */, 8,
    (handle, options, vmo, offset, size, addrs, num_addrs, pmt), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint32_t options,
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
    uint64_t offset,
    uint64_t size,
    user_out_ptr<zx_paddr_t> addrs,
    size_t num_addrs,
    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) user_out_handle* pmt))

KERNEL_SYSCALL(kernelcases_thread_exit, void, __NO_RETURN, 0,
    (), (void))

KERNEL_SYSCALL(kernelcases_mtrace_control, zx_status_t, /* no attributes */, 6,
    (handle, kind, action, options, ptr, ptr_size), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint32_t kind,
    uint32_t action,
    uint32_t options,
    user_inout_ptr<void> ptr,
    size_t ptr_size))

KERNEL_SYSCALL(kernelcases_read, zx_status_t, /* no attributes */, 8,
    (handle, options, bytes, num_bytes, handles, num_handles, actual_bytes, actual_handles), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    uint32_t options,
    user_out_ptr<void> bytes,
    uint32_t num_bytes,
    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) user_out_ptr<zx_handle_t> handles,
    uint32_t num_handles,
    user_out_ptr<uint32_t> actual_bytes,
    user_out_ptr<uint32_t> actual_handles))

KERNEL_SYSCALL(kernelcases_compiled_out_in_non_test, zx_status_t, /* no attributes */, 2,
    (a, b), (
    int32_t a,
    int32_t b))

)");
}

TEST(CDeclOutput, VdsoWrappers) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_vdsowrappers, &library));

  Writer writer;
  ASSERT_TRUE(PrivateDeclarationsOutput(library, &writer));

  EXPECT_EQ(writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

BLOCKING_SYSCALL(syscall_blocking_write, zx_status_t, /* no attributes */, 4,
    (handle, buffer, buffer_size, offset), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
    const void* buffer,
    size_t buffer_size,
    uint64_t offset))

KERNEL_SYSCALL(syscall_test_wrapper, zx_status_t, /* no attributes */, 3,
    (a, b, c), (
    int32_t a,
    int32_t b,
    int32_t c))

)");
}

TEST(CDeclOutput, HandleOwnership) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_ownership_annotations, &library));

  Writer writer;
  ASSERT_TRUE(PrivateDeclarationsOutput(library, &writer));

  EXPECT_EQ(writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

KERNEL_SYSCALL(handleownership_fun0, void, /* no attributes */, 4,
    (in, num_in, out, num_out), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) const zx_handle_t* in,
    size_t num_in,
    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out,
    size_t num_out))

KERNEL_SYSCALL(handleownership_fun1, void, __NO_RETURN, 2,
    (in, num_in), (
    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) const zx_handle_t* in,
    size_t num_in))

KERNEL_SYSCALL(handleownership_fun2, void, /* no attributes */, 4,
    (in, num_in, out, num_out), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) const zx_handle_t* in,
    size_t num_in,
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t* out,
    size_t num_out))

KERNEL_SYSCALL(handleownership_fun3, void, /* no attributes */, 4,
    (in, num_in, out, num_out), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) const zx_handle_t* in,
    size_t num_in,
    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out,
    size_t num_out))

KERNEL_SYSCALL(handleownership_fun4, zx_status_t, /* no attributes */, 2,
    (in, out), (
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t in,
    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))

KERNEL_SYSCALL(handleownership_fun5, zx_status_t, /* no attributes */, 2,
    (in, out), (
    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t in,
    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t* out))

KERNEL_SYSCALL(handleownership_fun6, void, /* no attributes */, 4,
    (in, num_in, out, num_out), (
    _ZX_SYSCALL_ANNO(use_handle("FuchsiaUnchecked")) const zx_handle_t* in,
    size_t num_in,
    _ZX_SYSCALL_ANNO(acquire_handle("FuchsiaUnchecked")) zx_handle_t* out,
    size_t num_out))

)");
}

TEST(CDeclOutput, Asm) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_one_protocol_two_methods, &library));

  Writer writer;
  ASSERT_TRUE(PrivateDeclarationsOutput(library, &writer));

  EXPECT_EQ(writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

KERNEL_SYSCALL(couple_do_thing, zx_status_t, /* no attributes */, 1,
    (an_input), (
    int32_t an_input))

KERNEL_SYSCALL(couple_get_stuff, zx_status_t, /* no attributes */, 2,
    (an_input, input2), (
    int32_t an_input,
    int32_t input2))

)");
}

TEST(CDeclOutput, AsmWithInternal) {
  SyscallLibrary library;
  ASSERT_TRUE(
      SyscallLibraryLoader::FromJson(k_test_one_protocol_two_methods_with_internal, &library));

  Writer writer;
  ASSERT_TRUE(PrivateDeclarationsOutput(library, &writer));

  EXPECT_EQ(writer.Out(), R"(// 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

INTERNAL_SYSCALL(couple_do_thing, zx_status_t, /* no attributes */, 1,
    (an_input), (
    int32_t an_input))

KERNEL_SYSCALL(couple_get_stuff, zx_status_t, /* no attributes */, 2,
    (an_input, input2), (
    int32_t an_input,
    int32_t input2))

)");
}

}  // namespace
