| // 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/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_out_voidptr.test.h" |
| #include "tools/kazoo/test_ir_test_rights_specs.test.h" |
| #include "tools/kazoo/test_ir_test_rust_selection.test.h" |
| #include "tools/kazoo/test_ir_test_selection.test.h" |
| |
| namespace { |
| |
| TEST(JsonOutput, KernelCases) { |
| SyscallLibrary library; |
| ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_kernel_cases, &library)); |
| |
| Writer writer; |
| ASSERT_TRUE(JsonOutput(library, &writer)); |
| |
| EXPECT_EQ(writer.Out(), |
| R"({ |
| "syscalls": [ |
| { |
| "name": "kernelcases_bti_pin", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "options", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "vmo", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "offset", |
| "type": "uint64_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "size", |
| "type": "uint64_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "addrs", |
| "type": "zx_paddr_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "num_addrs", |
| "type": "size_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "pmt", |
| "type": "zx_handle_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "kernelcases_thread_exit", |
| "attributes": [ |
| "*", |
| "noreturn" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| ], |
| "return_type": "void" |
| }, |
| { |
| "name": "kernelcases_mtrace_control", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "kind", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "action", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "options", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "ptr", |
| "type": "any", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "ptr_size", |
| "type": "size_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "kernelcases_read", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "options", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "bytes", |
| "type": "any", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "num_bytes", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "handles", |
| "type": "zx_handle_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "num_handles", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "actual_bytes", |
| "type": "uint32_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "actual_handles", |
| "type": "uint32_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "kernelcases_compiled_out_in_non_test", |
| "attributes": [ |
| "*", |
| "testonly" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "a", |
| "type": "int32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "b", |
| "type": "int32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| } |
| ] |
| } |
| )"); |
| } |
| |
| TEST(JsonOutput, RustCases) { |
| SyscallLibrary library; |
| ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_rust_selection, &library)); |
| |
| Writer writer; |
| ASSERT_TRUE(JsonOutput(library, &writer)); |
| |
| EXPECT_EQ(writer.Out(), |
| R"({ |
| "syscalls": [ |
| { |
| "name": "rust_simple_case", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| ], |
| "return_type": "zx_time_t" |
| }, |
| { |
| "name": "rust_multiple_in_handles", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handles", |
| "type": "zx_handle_t", |
| "is_array": true, |
| "attributes": [ |
| "IN" |
| ] |
| }, |
| { |
| "name": "num_handles", |
| "type": "size_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "rust_ano_ret_func", |
| "attributes": [ |
| "*", |
| "noreturn" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| ], |
| "return_type": "void" |
| }, |
| { |
| "name": "rust_no_return_value", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "x", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "void" |
| }, |
| { |
| "name": "rust_inout_args", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "op", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "offset", |
| "type": "uint64_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "size", |
| "type": "uint64_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "buffer", |
| "type": "any", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "buffer_size", |
| "type": "size_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "rust_const_input", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "input", |
| "type": "uint8_t", |
| "is_array": true, |
| "attributes": [ |
| "IN" |
| ] |
| }, |
| { |
| "name": "num_input", |
| "type": "size_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "rust_various_basic_type_names", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "a", |
| "type": "bool", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "b", |
| "type": "uint8_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "d", |
| "type": "int32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "e", |
| "type": "int64_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "f", |
| "type": "uint16_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "g", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "h", |
| "type": "uint64_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "i", |
| "type": "size_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "j", |
| "type": "uintptr_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "k", |
| "type": "any", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "l", |
| "type": "zx_time_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "m", |
| "type": "zx_ticks_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "void" |
| } |
| ] |
| } |
| )"); |
| } |
| |
| TEST(JsonOutput, SelectionCases) { |
| SyscallLibrary library; |
| ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_selection, &library)); |
| |
| Writer writer; |
| ASSERT_TRUE(JsonOutput(library, &writer)); |
| |
| EXPECT_EQ(writer.Out(), |
| R"({ |
| "syscalls": [ |
| { |
| "name": "selection_futex_requeue", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "value_ptr", |
| "type": "zx_futex_t", |
| "is_array": true, |
| "attributes": [ |
| "IN" |
| ] |
| }, |
| { |
| "name": "wake_count", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "current_value", |
| "type": "zx_futex_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "requeue_ptr", |
| "type": "zx_futex_t", |
| "is_array": true, |
| "attributes": [ |
| "IN" |
| ] |
| }, |
| { |
| "name": "requeue_count", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "new_requeue_owner", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "selection_object_wait_one", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "signals", |
| "type": "zx_signals_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "deadline", |
| "type": "zx_time_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "observed", |
| "type": "zx_signals_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "selection_ktrace_read", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "data", |
| "type": "any", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "offset", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "data_size", |
| "type": "size_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "actual", |
| "type": "size_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "selection_pci_cfg_pio_rw", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "bus", |
| "type": "uint8_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "dev", |
| "type": "uint8_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "func", |
| "type": "uint8_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "offset", |
| "type": "uint8_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "val", |
| "type": "uint32_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "width", |
| "type": "size_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "write", |
| "type": "bool", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "selection_job_set_policy", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "options", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "topic", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "policy", |
| "type": "any", |
| "is_array": true, |
| "attributes": [ |
| "IN" |
| ] |
| }, |
| { |
| "name": "policy_size", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "selection_clock_get", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "clock_id", |
| "type": "zx_clock_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "out", |
| "type": "zx_time_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| } |
| ] |
| } |
| )"); |
| } |
| |
| TEST(JsonOutput, RightsSpecs) { |
| SyscallLibrary library; |
| ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_rights_specs, &library)); |
| |
| Writer writer; |
| ASSERT_TRUE(JsonOutput(library, &writer)); |
| |
| EXPECT_EQ(writer.Out(), |
| R"({ |
| "syscalls": [ |
| { |
| "name": "rights_do_thing", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| "Create", "an", "exception", "channel", "for", "a", "given", "job", ",", "process", ",", "or", "thread", "." |
| ], |
| "requirements": [ |
| "handle", "must", "have", "ZX_RIGHT_INSPECT", "and", "have", "ZX_RIGHT_DUPLICATE", "and", "have", "ZX_RIGHT_TRANSFER", "and", "have", "ZX_RIGHT_MANAGE_THREAD", ".", |
| "If", "handle", "is", "of", "type", "ZX_OBJ_TYPE_JOB", "or", "ZX_OBJ_TYPE_PROCESS", ",", "it", "must", "have", "ZX_RIGHT_ENUMERATE", "." |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "options", |
| "type": "uint32_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "out", |
| "type": "zx_handle_t", |
| "is_array": true, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| }, |
| { |
| "name": "rights_no_short_desc", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| "handle", "must", "have", "ZX_RIGHT_DESTROY", "." |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "void" |
| } |
| ] |
| } |
| )"); |
| } |
| |
| TEST(JsonOutput, OutVoidptr) { |
| SyscallLibrary library; |
| ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_out_voidptr, &library)); |
| |
| Writer writer; |
| ASSERT_TRUE(JsonOutput(library, &writer)); |
| |
| EXPECT_EQ(writer.Out(), |
| R"({ |
| "syscalls": [ |
| { |
| "name": "ovp_void_pointer_out", |
| "attributes": [ |
| "*" |
| ], |
| "top_description": [ |
| ], |
| "requirements": [ |
| ], |
| "arguments": [ |
| { |
| "name": "handle", |
| "type": "zx_handle_t", |
| "is_array": false, |
| "attributes": [ |
| ] |
| }, |
| { |
| "name": "details", |
| "type": "any", |
| "is_array": true, |
| "attributes": [ |
| ] |
| } |
| ], |
| "return_type": "zx_status_t" |
| } |
| ] |
| } |
| )"); |
| } |
| |
| } // namespace |