blob: 5e2b24b9c0e14f6ba09eee1804bcb9e2935635aa [file] [log] [blame] [edit]
// Copyright 2021 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 "src/devices/lib/fidl-metadata/i2c.h"
#include <fidl/fuchsia.hardware.i2c.businfo/cpp/wire.h>
#include <zxtest/zxtest.h>
static void check_encodes(const cpp20::span<const fidl_metadata::i2c::Channel> i2c_channels) {
// Encode.
auto result = fidl_metadata::i2c::I2CChannelsToFidl(i2c_channels);
ASSERT_OK(result.status_value());
std::vector<uint8_t>& data = result.value();
// Decode.
fidl::unstable::DecodedMessage<fuchsia_hardware_i2c_businfo::wire::I2CBusMetadata> decoded(
fidl::internal::WireFormatVersion::kV2, data.data(), data.size());
ASSERT_OK(decoded.status());
auto metadata = decoded.PrimaryObject();
// Check everything looks sensible.
ASSERT_TRUE(metadata->has_channels());
auto channels = metadata->channels();
ASSERT_EQ(channels.count(), i2c_channels.size());
for (size_t i = 0; i < i2c_channels.size(); i++) {
ASSERT_TRUE(channels[i].has_bus_id());
ASSERT_EQ(channels[i].bus_id(), i2c_channels[i].bus_id);
ASSERT_TRUE(channels[i].has_address());
ASSERT_EQ(channels[i].address(), i2c_channels[i].address);
if (i2c_channels[i].did || i2c_channels[i].vid || i2c_channels[i].pid) {
ASSERT_TRUE(channels[i].has_vid());
ASSERT_EQ(channels[i].vid(), i2c_channels[i].vid);
ASSERT_TRUE(channels[i].has_pid());
ASSERT_EQ(channels[i].pid(), i2c_channels[i].pid);
ASSERT_TRUE(channels[i].has_did());
ASSERT_EQ(channels[i].did(), i2c_channels[i].did);
}
}
}
TEST(I2cMetadataTest, TestEncodeNoPlatformIDs) {
static constexpr fidl_metadata::i2c::Channel kI2cChannels[] = {{
.bus_id = 4,
.address = 0x01,
}};
ASSERT_NO_FATAL_FAILURE(check_encodes(kI2cChannels));
}
TEST(I2cMetadataTest, TestEncodeManyChannels) {
static constexpr fidl_metadata::i2c::Channel kI2cChannels[] = {
{
.bus_id = 1,
.address = 0x49,
.vid = 10,
.pid = 9,
.did = 8,
},
{
.bus_id = 0,
.address = 0x47,
.vid = 8,
.pid = 9,
.did = 9,
},
{
.bus_id = 92,
.address = 0xaa,
.vid = 0,
.pid = 0,
.did = 0,
},
};
ASSERT_NO_FATAL_FAILURE(check_encodes(kI2cChannels));
}
TEST(I2cMetadataTest, TestEncodeNoChannels) {
ASSERT_NO_FATAL_FAILURE(check_encodes(cpp20::span<const fidl_metadata::i2c::Channel>()));
}