Files
TheRock/rocm-libraries/projects/hipdnn/flatbuffers_sdk/tests/flatbuffer_utilities/TestKnobSettingWrapper.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

281 lines
11 KiB
C++

// Copyright © Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#include <array>
#include <gtest/gtest.h>
#include <memory>
#include <hipdnn_flatbuffers_sdk/data_objects/engine_config_generated.h>
#include <hipdnn_flatbuffers_sdk/flatbuffer_utilities/KnobSettingWrapper.hpp>
using namespace hipdnn_flatbuffers_sdk::flatbuffer_utilities;
class TestKnobSettingWrapper : public ::testing::Test
{
protected:
static flatbuffers::DetachedBuffer createKnobSetting(const std::string& knobId, int64_t value)
{
flatbuffers::FlatBufferBuilder builder;
auto knobIdOffset = builder.CreateString(knobId);
// Create the value
auto intValue = hipdnn_flatbuffers_sdk::data_objects::CreateIntValue(builder, value);
// Create the knob setting
hipdnn_flatbuffers_sdk::data_objects::KnobSettingBuilder settingBuilder(builder);
settingBuilder.add_knob_id(knobIdOffset);
settingBuilder.add_value_type(hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
settingBuilder.add_value(intValue.Union());
auto setting = settingBuilder.Finish();
builder.Finish(setting);
return builder.Release();
}
static flatbuffers::DetachedBuffer createKnobSettingWithString(const std::string& knobId,
const std::string& value)
{
flatbuffers::FlatBufferBuilder builder;
auto knobIdOffset = builder.CreateString(knobId);
auto strOffset = builder.CreateString(value);
auto stringValue
= hipdnn_flatbuffers_sdk::data_objects::CreateStringValue(builder, strOffset);
hipdnn_flatbuffers_sdk::data_objects::KnobSettingBuilder settingBuilder(builder);
settingBuilder.add_knob_id(knobIdOffset);
settingBuilder.add_value_type(hipdnn_flatbuffers_sdk::data_objects::KnobValue::StringValue);
settingBuilder.add_value(stringValue.Union());
auto setting = settingBuilder.Finish();
builder.Finish(setting);
return builder.Release();
}
static flatbuffers::DetachedBuffer createKnobSettingWithFloat(const std::string& knobId,
double value)
{
flatbuffers::FlatBufferBuilder builder;
auto knobIdOffset = builder.CreateString(knobId);
auto floatValue = hipdnn_flatbuffers_sdk::data_objects::CreateFloatValue(builder, value);
hipdnn_flatbuffers_sdk::data_objects::KnobSettingBuilder settingBuilder(builder);
settingBuilder.add_knob_id(knobIdOffset);
settingBuilder.add_value_type(hipdnn_flatbuffers_sdk::data_objects::KnobValue::FloatValue);
settingBuilder.add_value(floatValue.Union());
auto setting = settingBuilder.Finish();
builder.Finish(setting);
return builder.Release();
}
};
TEST_F(TestKnobSettingWrapper, ConstructFromFlatbufferPointer)
{
auto buffer = createKnobSetting("test_knob_42", 100);
auto setting
= flatbuffers::GetRoot<hipdnn_flatbuffers_sdk::data_objects::KnobSetting>(buffer.data());
const KnobSettingWrapper wrapper(setting);
EXPECT_TRUE(wrapper.isValid());
EXPECT_EQ(wrapper.knobId(), "test_knob_42");
EXPECT_EQ(wrapper.valueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
}
TEST_F(TestKnobSettingWrapper, ConstructFromBuffer)
{
auto buffer = createKnobSetting("test_knob_42", 100);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
EXPECT_TRUE(wrapper.isValid());
EXPECT_EQ(wrapper.knobId(), "test_knob_42");
EXPECT_EQ(wrapper.valueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
}
TEST_F(TestKnobSettingWrapper, ConstructFromNullPointer)
{
const KnobSettingWrapper wrapper(
static_cast<hipdnn_flatbuffers_sdk::data_objects::KnobSetting*>(nullptr));
EXPECT_FALSE(wrapper.isValid());
}
TEST_F(TestKnobSettingWrapper, ConstructFromNullBuffer)
{
const KnobSettingWrapper wrapper(nullptr, 0);
EXPECT_FALSE(wrapper.isValid());
}
TEST_F(TestKnobSettingWrapper, ConstructFromInvalidBuffer)
{
std::array<uint8_t, 10> invalidData
= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
const KnobSettingWrapper wrapper(invalidData.data(), invalidData.size());
EXPECT_FALSE(wrapper.isValid());
}
TEST_F(TestKnobSettingWrapper, GetKnobIdFromValidWrapper)
{
auto buffer = createKnobSetting("test_knob_999", 123);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
EXPECT_EQ(wrapper.knobId(), "test_knob_999");
}
TEST_F(TestKnobSettingWrapper, ValueAsIntValue)
{
auto buffer = createKnobSetting("test_knob_42", 100);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
EXPECT_EQ(wrapper.valueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
const auto& intValue = wrapper.valueAs<hipdnn_flatbuffers_sdk::data_objects::IntValue>();
EXPECT_EQ(intValue.value(), 100);
}
TEST_F(TestKnobSettingWrapper, ValueAsStringValue)
{
auto buffer = createKnobSettingWithString("test_knob_42", "test_value");
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
EXPECT_EQ(wrapper.valueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::StringValue);
const auto& stringValue = wrapper.valueAs<hipdnn_flatbuffers_sdk::data_objects::StringValue>();
EXPECT_EQ(std::string(stringValue.value()->c_str()), "test_value");
}
TEST_F(TestKnobSettingWrapper, ValueAsFloatValue)
{
auto buffer = createKnobSettingWithFloat("test_knob_42", 3.14159);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
EXPECT_EQ(wrapper.valueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::FloatValue);
const auto& floatValue = wrapper.valueAs<hipdnn_flatbuffers_sdk::data_objects::FloatValue>();
EXPECT_DOUBLE_EQ(floatValue.value(), 3.14159);
}
TEST_F(TestKnobSettingWrapper, ValueAsTypeMismatchThrows)
{
auto buffer = createKnobSetting("test_knob_42", 100);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
// Value is IntValue, trying to get as FloatValue should throw
EXPECT_THROW(wrapper.valueAs<hipdnn_flatbuffers_sdk::data_objects::FloatValue>(),
std::invalid_argument);
EXPECT_THROW(wrapper.valueAs<hipdnn_flatbuffers_sdk::data_objects::StringValue>(),
std::invalid_argument);
}
TEST_F(TestKnobSettingWrapper, GetKnobSettingFromValidWrapper)
{
auto buffer = createKnobSetting("test_knob_42", 100);
auto setting
= flatbuffers::GetRoot<hipdnn_flatbuffers_sdk::data_objects::KnobSetting>(buffer.data());
const KnobSettingWrapper wrapper(setting);
const auto& retrievedSetting = wrapper.getKnobSetting();
EXPECT_EQ(&retrievedSetting, setting);
}
TEST_F(TestKnobSettingWrapper, AccessMethodsOnInvalidWrapperThrow)
{
const KnobSettingWrapper wrapper(nullptr, 0);
EXPECT_FALSE(wrapper.isValid());
EXPECT_THROW(wrapper.knobId(), std::invalid_argument);
EXPECT_THROW(wrapper.valueType(), std::invalid_argument);
EXPECT_THROW(wrapper.getKnobSetting(), std::invalid_argument);
}
TEST_F(TestKnobSettingWrapper, MultipleDifferentKnobSettings)
{
// Test that wrapper correctly handles different knob settings
auto buffer1 = createKnobSetting("knob_1", 100);
auto buffer2 = createKnobSettingWithString("knob_2", "config_value");
auto buffer3 = createKnobSettingWithFloat("knob_3", 2.718);
const KnobSettingWrapper wrapper1(buffer1.data(), buffer1.size());
const KnobSettingWrapper wrapper2(buffer2.data(), buffer2.size());
const KnobSettingWrapper wrapper3(buffer3.data(), buffer3.size());
EXPECT_EQ(wrapper1.knobId(), "knob_1");
EXPECT_EQ(wrapper1.valueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
EXPECT_EQ(wrapper2.knobId(), "knob_2");
EXPECT_EQ(wrapper2.valueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::StringValue);
EXPECT_EQ(wrapper3.knobId(), "knob_3");
EXPECT_EQ(wrapper3.valueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::FloatValue);
}
TEST_F(TestKnobSettingWrapper, EmptyKnobId)
{
auto buffer = createKnobSetting("", 42);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
EXPECT_TRUE(wrapper.isValid());
EXPECT_EQ(wrapper.knobId(), "");
}
TEST_F(TestKnobSettingWrapper, LongKnobId)
{
const std::string longKnobId = "this.is.a.very.long.knob.id.with.many.parts.for.testing";
auto buffer = createKnobSetting(longKnobId, 42);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
EXPECT_TRUE(wrapper.isValid());
EXPECT_EQ(wrapper.knobId(), longKnobId);
}
TEST_F(TestKnobSettingWrapper, ToKnobSettingTWithIntValue)
{
auto buffer = createKnobSetting("test_knob_42", 100);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
auto knobSettingT = wrapper.toKnobSettingT();
ASSERT_NE(knobSettingT, nullptr);
EXPECT_EQ(knobSettingT->knob_id, "test_knob_42");
EXPECT_EQ(knobSettingT->value.type, hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
ASSERT_NE(knobSettingT->value.AsIntValue(), nullptr);
EXPECT_EQ(knobSettingT->value.AsIntValue()->value, 100);
}
TEST_F(TestKnobSettingWrapper, ToKnobSettingTWithStringValue)
{
auto buffer = createKnobSettingWithString("test_knob_99", "test_string_value");
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
auto knobSettingT = wrapper.toKnobSettingT();
ASSERT_NE(knobSettingT, nullptr);
EXPECT_EQ(knobSettingT->knob_id, "test_knob_99");
EXPECT_EQ(knobSettingT->value.type,
hipdnn_flatbuffers_sdk::data_objects::KnobValue::StringValue);
ASSERT_NE(knobSettingT->value.AsStringValue(), nullptr);
EXPECT_EQ(knobSettingT->value.AsStringValue()->value, "test_string_value");
}
TEST_F(TestKnobSettingWrapper, ToKnobSettingTWithFloatValue)
{
auto buffer = createKnobSettingWithFloat("test_knob_123", 3.14159);
const KnobSettingWrapper wrapper(buffer.data(), buffer.size());
auto knobSettingT = wrapper.toKnobSettingT();
ASSERT_NE(knobSettingT, nullptr);
EXPECT_EQ(knobSettingT->knob_id, "test_knob_123");
EXPECT_EQ(knobSettingT->value.type,
hipdnn_flatbuffers_sdk::data_objects::KnobValue::FloatValue);
ASSERT_NE(knobSettingT->value.AsFloatValue(), nullptr);
EXPECT_DOUBLE_EQ(knobSettingT->value.AsFloatValue()->value, 3.14159);
}
TEST_F(TestKnobSettingWrapper, ToKnobSettingTOnInvalidWrapperThrows)
{
const KnobSettingWrapper wrapper(nullptr, 0);
EXPECT_FALSE(wrapper.isValid());
EXPECT_THROW(wrapper.toKnobSettingT(), std::invalid_argument);
}