blob: e8ef3e5d0f22439fe79f337d6eb29aabd9382e74 [file] [log] [blame]
{{/*
// Copyright 2022 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 <iostream>
#include <string>
#include <utility>
#include <vector>
#include <fidl/test.conformance/cpp/wire.h>
#include <gtest/gtest.h>
#include "src/lib/fidl/llcpp/tests/conformance/conformance_utils.h"
#ifdef __Fuchsia__
#include <zircon/syscalls.h>
#include "sdk/ctf/tests/pkg/fidl/cpp/test/handle_util.h"
#endif
{{ range .EncodeSuccessCases }}
{{- if .FuchsiaOnly }}
#ifdef __Fuchsia__
{{- end }}
TEST(Conformance, {{ .Name }}_Encode) {
{{- if .HandleDefs }}
const std::vector<zx_handle_t> handle_defs = {{ .HandleDefs }};
{{- end }}
[[maybe_unused]] fidl::Arena<ZX_CHANNEL_MAX_MSG_BYTES> allocator;
{{ .ValueBuild }}
const auto expected_bytes = {{ .Bytes }};
const auto expected_handles = {{ .Handles }};
alignas(FIDL_ALIGNMENT) auto obj = {{ .ValueVar }};
EXPECT_TRUE(llcpp_conformance_utils::EncodeSuccess(
{{ .WireFormatVersion }}, &obj, expected_bytes, expected_handles, {{ .CheckHandleRights }}));
}
{{- if .FuchsiaOnly }}
#endif // __Fuchsia__
{{- end }}
{{ end }}
{{ range .DecodeSuccessCases }}
{{- if .FuchsiaOnly }}
#ifdef __Fuchsia__
{{- end }}
TEST(Conformance, {{ .Name }}_Decode) {
{{- if .HandleDefs }}
const std::vector<zx_handle_info_t> handle_defs = {{ .HandleDefs }};
std::vector<zx_koid_t> {{ .HandleKoidVectorName }};
for (zx_handle_info_t def : handle_defs) {
zx_info_handle_basic_t info;
ASSERT_EQ(ZX_OK, zx_object_get_info(def.handle, ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr));
{{ .HandleKoidVectorName }}.push_back(info.koid);
}
{{- end }}
[[maybe_unused]] fidl::Arena<ZX_CHANNEL_MAX_MSG_BYTES> allocator;
auto bytes = {{ .Bytes }};
auto handles = {{ .Handles }};
auto equality_check = [&]({{ .ValueType }}& {{ .Equality.InputVar }}) -> bool {
{{ .Equality.HelperStatements }}
return {{ .Equality.Expr }};
};
EXPECT_TRUE(llcpp_conformance_utils::DecodeSuccess<{{ .ValueType }}>(
{{ .WireFormatVersion }}, std::move(bytes), std::move(handles), std::move(equality_check)));
}
{{- if .FuchsiaOnly }}
#endif // __Fuchsia__
{{- end }}
{{ end }}
{{ range .EncodeFailureCases }}
{{- if .FuchsiaOnly }}
#ifdef __Fuchsia__
{{- end }}
TEST(Conformance, {{ .Name }}_Encode_Failure) {
{{- if .HandleDefs }}
const std::vector<zx_handle_t> handle_defs = {{ .HandleDefs }};
{{- end }}
[[maybe_unused]] fidl::Arena<ZX_CHANNEL_MAX_MSG_BYTES> allocator;
{{ .ValueBuild }}
auto obj = {{ .ValueVar }};
EXPECT_TRUE(llcpp_conformance_utils::EncodeFailure({{ .WireFormatVersion }}, &obj, {{ .ErrorCode }}));
{{- if .HandleDefs }}
for (const auto handle : handle_defs) {
EXPECT_EQ(ZX_ERR_BAD_HANDLE, zx_object_get_info(handle, ZX_INFO_HANDLE_VALID, nullptr, 0, nullptr, nullptr));
}
{{- end }}
}
{{- if .FuchsiaOnly }}
#endif // __Fuchsia__
{{- end }}
{{ end }}
{{ range .DecodeFailureCases }}
{{- if .FuchsiaOnly }}
#ifdef __Fuchsia__
{{- end }}
TEST(Conformance, {{ .Name }}_Decode_Failure) {
{{- if .HandleDefs }}
const std::vector<zx_handle_info_t> handle_defs = {{ .HandleDefs }};
{{- end }}
auto bytes = {{ .Bytes }};
auto handles = {{ .Handles }};
EXPECT_TRUE(llcpp_conformance_utils::DecodeFailure<{{ .ValueType }}>(
{{ .WireFormatVersion }}, std::move(bytes), std::move(handles), {{ .ErrorCode }}));
{{- if .HandleDefs }}
for (const auto handle_info : handle_defs) {
EXPECT_EQ(ZX_ERR_BAD_HANDLE, zx_object_get_info(handle_info.handle, ZX_INFO_HANDLE_VALID, nullptr, 0, nullptr, nullptr));
}
{{- end }}
}
{{- if .FuchsiaOnly }}
#endif // __Fuchsia__
{{- end }}
{{ end }}