blob: 7b1ed422d5f84f979478c5685c45389c29a301d5 [file] [log] [blame]
// 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.
#include "tools/kazoo/syscall_library.h"
#include "gtest/gtest.h"
#include "tools/kazoo/test_ir_test_no_methods.test.h"
#include "tools/kazoo/test_ir_test_one_protocol_one_method.test.h"
#include "tools/kazoo/test_ir_test_pointers_and_vectors.test.h"
namespace {
TEST(SyscallLibrary, LoaderSimpleEmpty) {
SyscallLibrary library;
ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_no_methods, &library));
EXPECT_EQ(library.name(), "zz");
EXPECT_TRUE(library.syscalls().empty());
}
TEST(SyscallLibrary, LoaderSingleMethod) {
SyscallLibrary library;
ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_one_protocol_one_method, &library));
EXPECT_EQ(library.name(), "zz");
ASSERT_EQ(library.syscalls().size(), 1u);
const auto& sc = library.syscalls()[0];
EXPECT_EQ(sc->id(), "zz/Single");
EXPECT_EQ(sc->original_name(), "DoThing");
EXPECT_EQ(sc->category(), "single");
EXPECT_EQ(sc->name(), "single_do_thing");
EXPECT_EQ(sc->short_description(), "This does a single thing.");
EXPECT_EQ(sc->attributes().size(), 1u); // Doc is an attribute.
EXPECT_TRUE(sc->HasAttribute("Doc"));
EXPECT_FALSE(sc->is_noreturn());
const Struct& req = sc->request();
EXPECT_EQ(req.members().size(), 1u);
EXPECT_EQ(req.members()[0].name(), "an_input");
const Struct& resp = sc->response();
EXPECT_EQ(resp.members().size(), 1u);
EXPECT_EQ(resp.members()[0].name(), "status");
}
TEST(SyscallLibrary, LoaderVectors) {
SyscallLibrary library;
ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_pointers_and_vectors, &library));
EXPECT_EQ(library.name(), "zz");
ASSERT_EQ(library.syscalls().size(), 3u);
const auto& sc0 = library.syscalls()[0];
ASSERT_EQ(sc0->num_kernel_args(), 4u);
EXPECT_EQ(sc0->kernel_arguments()[0].name(), "bytes");
EXPECT_EQ(sc0->kernel_arguments()[1].name(), "num_bytes");
EXPECT_EQ(sc0->kernel_arguments()[2].name(), "str");
EXPECT_EQ(sc0->kernel_arguments()[3].name(), "str_size");
const auto& sc1 = library.syscalls()[1];
ASSERT_EQ(sc1->num_kernel_args(), 2u);
EXPECT_EQ(sc1->kernel_arguments()[0].name(), "ins");
EXPECT_EQ(sc1->kernel_arguments()[1].name(), "num_ins");
const auto& sc2 = library.syscalls()[2];
ASSERT_EQ(sc2->num_kernel_args(), 0u);
EXPECT_TRUE(sc2->kernel_return_type().IsVoid());
}
} // namespace