Files
TheRock/rocm-libraries/projects/hipdnn/backend/tests/descriptors/TestKnobSettingDescriptor.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

559 lines
20 KiB
C++

// Copyright © Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#include "DescriptorTestUtils.hpp"
#include "TestMacros.hpp"
#include "descriptors/KnobSettingDescriptor.hpp"
#include <gtest/gtest.h>
#include <array>
using namespace hipdnn_backend;
using namespace hipdnn_backend::test_utilities;
class TestKnobSettingDescriptor : public ::testing::Test
{
public:
std::shared_ptr<KnobSettingDescriptor> getDescriptor() const
{
return _wrapper->asDescriptor<KnobSettingDescriptor>();
}
void setKnobId(const std::string& knobId) const
{
ASSERT_NO_THROW(getDescriptor()->setAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE,
HIPDNN_TYPE_CHAR,
static_cast<int64_t>(knobId.size()),
knobId.c_str()));
}
void setInt64Value(int64_t value) const
{
ASSERT_NO_THROW(getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_INT64, 1, &value));
}
void setDoubleValue(double value) const
{
ASSERT_NO_THROW(getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_DOUBLE, 1, &value));
}
void setStringValue(const std::string& value) const
{
ASSERT_NO_THROW(getDescriptor()->setAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE,
HIPDNN_TYPE_CHAR,
static_cast<int64_t>(value.size()),
value.c_str()));
}
void makeFinalized(const std::string& knobId = "test_knob", int64_t value = 42) const
{
setKnobId(knobId);
setInt64Value(value);
ASSERT_NO_THROW(getDescriptor()->finalize());
}
protected:
std::unique_ptr<HipdnnBackendDescriptor> _wrapper;
void SetUp() override
{
_wrapper = createDescriptor<KnobSettingDescriptor>();
}
};
TEST_F(TestKnobSettingDescriptor, CreateDescriptor)
{
auto desc = getDescriptor();
ASSERT_NE(desc, nullptr);
ASSERT_FALSE(desc->isFinalized());
ASSERT_EQ(desc->getType(), HIPDNN_BACKEND_KNOB_CHOICE_DESCRIPTOR);
}
TEST_F(TestKnobSettingDescriptor, FinalizeWithKnobIdAndInt64Value)
{
setKnobId("test_knob_100");
setInt64Value(42);
ASSERT_NO_THROW(getDescriptor()->finalize());
ASSERT_TRUE(getDescriptor()->isFinalized());
}
TEST_F(TestKnobSettingDescriptor, FinalizeWithoutKnobIdFails)
{
setInt64Value(42);
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->finalize(), HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, FinalizeWithoutValueFails)
{
setKnobId("test_knob");
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->finalize(), HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, FinalizeAlreadyFinalizedFails)
{
makeFinalized();
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->finalize(), HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, SetAttributeAfterFinalizeFails)
{
makeFinalized();
const std::string knobId = "another_knob";
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->setAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE,
HIPDNN_TYPE_CHAR,
static_cast<int64_t>(knobId.size()),
knobId.c_str()),
HIPDNN_STATUS_NOT_INITIALIZED);
}
TEST_F(TestKnobSettingDescriptor, SetAttributeUnsupportedAttribute)
{
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->setAttribute(HIPDNN_ATTR_ENGINECFG_ENGINE, HIPDNN_TYPE_INT64, 1, nullptr),
HIPDNN_STATUS_NOT_SUPPORTED);
}
TEST_F(TestKnobSettingDescriptor, SetKnobIdAsChar)
{
const std::string knobId = "test_knob_id";
ASSERT_NO_THROW(getDescriptor()->setAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE,
HIPDNN_TYPE_CHAR,
static_cast<int64_t>(knobId.size()),
knobId.c_str()));
}
TEST_F(TestKnobSettingDescriptor, SetKnobIdWrongTypeFails)
{
int64_t val = 42;
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_INT64, 1, &val),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, SetKnobIdNullFails)
{
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, 5, nullptr),
HIPDNN_STATUS_BAD_PARAM_NULL_POINTER);
}
TEST_F(TestKnobSettingDescriptor, GetKnobIdAfterFinalize)
{
const std::string expectedId = "test_knob_id";
setKnobId(expectedId);
setInt64Value(42);
ASSERT_NO_THROW(getDescriptor()->finalize());
// Query size first
int64_t count = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, 0, &count, nullptr));
ASSERT_EQ(count, static_cast<int64_t>(expectedId.size() + 1));
// Get the value
std::vector<char> buffer(static_cast<size_t>(count));
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, count, nullptr, buffer.data()));
ASSERT_EQ(std::string(buffer.data()), expectedId);
}
TEST_F(TestKnobSettingDescriptor, SetAndGetInt64Value)
{
const int64_t expectedValue = 42;
setKnobId("test_knob");
setInt64Value(expectedValue);
ASSERT_NO_THROW(getDescriptor()->finalize());
int64_t actualValue = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_INT64, 1, nullptr, &actualValue));
ASSERT_EQ(actualValue, expectedValue);
}
TEST_F(TestKnobSettingDescriptor, SetAndGetDoubleValue)
{
const double expectedValue = 3.14;
setKnobId("test_knob");
setDoubleValue(expectedValue);
ASSERT_NO_THROW(getDescriptor()->finalize());
double actualValue = 0.0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_DOUBLE, 1, nullptr, &actualValue));
ASSERT_DOUBLE_EQ(actualValue, expectedValue);
}
TEST_F(TestKnobSettingDescriptor, SetAndGetStringValue)
{
const std::string expectedValue = "strval";
setKnobId("test_knob");
setStringValue(expectedValue);
ASSERT_NO_THROW(getDescriptor()->finalize());
// Query size first (two-call pattern)
int64_t count = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_CHAR, 0, &count, nullptr));
ASSERT_EQ(count, static_cast<int64_t>(expectedValue.size() + 1));
// Get the value
std::vector<char> buffer(static_cast<size_t>(count));
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_CHAR, count, nullptr, buffer.data()));
ASSERT_EQ(std::string(buffer.data()), expectedValue);
}
TEST_F(TestKnobSettingDescriptor, SetKnobValueWrongElementCountFailsInt64)
{
int64_t val = 42;
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_INT64, 2, &val),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, SetKnobValueWrongElementCountFailsDouble)
{
double val = 1.0;
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_DOUBLE, 2, &val),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, SetKnobValueNullPointerFails)
{
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_INT64, 1, nullptr),
HIPDNN_STATUS_BAD_PARAM_NULL_POINTER);
}
TEST_F(TestKnobSettingDescriptor, SetKnobValueUnsupportedTypeFails)
{
bool val = true;
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_BOOLEAN, 1, &val),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, GetAttributeBeforeFinalizeFails)
{
setKnobId("test_knob");
setInt64Value(42);
int64_t val = 0;
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_INT64, 1, nullptr, &val),
HIPDNN_STATUS_NOT_INITIALIZED);
}
TEST_F(TestKnobSettingDescriptor, GetAttributeUnsupportedAttributeFails)
{
makeFinalized();
int64_t val = 0;
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->getAttribute(
HIPDNN_ATTR_ENGINECFG_ENGINE, HIPDNN_TYPE_INT64, 1, nullptr, &val),
HIPDNN_STATUS_NOT_SUPPORTED);
}
TEST_F(TestKnobSettingDescriptor, GetKnobValueTypeMismatchFails)
{
makeFinalized(); // sets int64 value
double val = 0.0;
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_DOUBLE, 1, nullptr, &val),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, ToKnobSettingTProducesCorrectObject)
{
const std::string knobId = "test_knob_100";
const int64_t value = 42;
setKnobId(knobId);
setInt64Value(value);
ASSERT_NO_THROW(getDescriptor()->finalize());
auto knobSettingT = getDescriptor()->toKnobSettingT();
ASSERT_NE(knobSettingT, nullptr);
ASSERT_EQ(knobSettingT->knob_id, knobId);
ASSERT_EQ(knobSettingT->value.type, hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
ASSERT_EQ(knobSettingT->value.AsIntValue()->value, value);
}
TEST_F(TestKnobSettingDescriptor, ToKnobSettingTWithDoubleValue)
{
const std::string knobId = "double_knob";
const double value = 2.718;
setKnobId(knobId);
setDoubleValue(value);
ASSERT_NO_THROW(getDescriptor()->finalize());
auto knobSettingT = getDescriptor()->toKnobSettingT();
ASSERT_NE(knobSettingT, nullptr);
ASSERT_EQ(knobSettingT->knob_id, knobId);
ASSERT_EQ(knobSettingT->value.type,
hipdnn_flatbuffers_sdk::data_objects::KnobValue::FloatValue);
ASSERT_DOUBLE_EQ(knobSettingT->value.AsFloatValue()->value, value);
}
TEST_F(TestKnobSettingDescriptor, ToKnobSettingTBeforeFinalizeFails)
{
setKnobId("test_knob");
setInt64Value(42);
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->toKnobSettingT(), HIPDNN_STATUS_NOT_INITIALIZED);
}
TEST_F(TestKnobSettingDescriptor, GetKnobIdWithElementCount)
{
const std::string expectedId = "my_knob";
makeFinalized(expectedId);
int64_t count = 0;
std::vector<char> buffer(64);
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, 64, &count, buffer.data()));
ASSERT_EQ(count, static_cast<int64_t>(expectedId.size() + 1));
ASSERT_EQ(std::string(buffer.data()), expectedId);
}
TEST_F(TestKnobSettingDescriptor, GetKnobValueWithElementCount)
{
const int64_t expectedValue = 99;
makeFinalized("knob", expectedValue);
int64_t count = 0;
int64_t actualValue = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_INT64, 1, &count, &actualValue));
ASSERT_EQ(count, 1);
ASSERT_EQ(actualValue, expectedValue);
}
TEST_F(TestKnobSettingDescriptor, GetStringValueTruncatesToBufferSize)
{
const std::string longValue = "a_long_string_value";
setKnobId("test_knob");
setStringValue(longValue);
ASSERT_NO_THROW(getDescriptor()->finalize());
// Provide a buffer smaller than the string
const int64_t smallBufferSize = 8;
std::array<char, 8> buffer = {};
int64_t count = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE,
HIPDNN_TYPE_CHAR,
smallBufferSize,
&count,
buffer.data()));
// Should be truncated and null-terminated
ASSERT_EQ(count, smallBufferSize);
ASSERT_EQ(buffer.back(), '\0');
ASSERT_EQ(std::string(buffer.data()),
longValue.substr(0, static_cast<size_t>(smallBufferSize - 1)));
}
TEST_F(TestKnobSettingDescriptor, GetStringValueSizeQueryWithNullBuffer)
{
const std::string expectedValue = "query_size";
setKnobId("test_knob");
setStringValue(expectedValue);
ASSERT_NO_THROW(getDescriptor()->finalize());
int64_t count = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_CHAR, 0, &count, nullptr));
ASSERT_EQ(count, static_cast<int64_t>(expectedValue.size() + 1));
}
TEST_F(TestKnobSettingDescriptor, GetStringValueSizeQueryNullElementCountFails)
{
const std::string expectedValue = "test";
setKnobId("test_knob");
setStringValue(expectedValue);
ASSERT_NO_THROW(getDescriptor()->finalize());
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_CHAR, 0, nullptr, nullptr),
HIPDNN_STATUS_BAD_PARAM_NULL_POINTER);
}
TEST_F(TestKnobSettingDescriptor, ToKnobSettingTWithStringValue)
{
const std::string knobId = "string_knob";
const std::string value = "hello_world";
setKnobId(knobId);
setStringValue(value);
ASSERT_NO_THROW(getDescriptor()->finalize());
auto knobSettingT = getDescriptor()->toKnobSettingT();
ASSERT_NE(knobSettingT, nullptr);
ASSERT_EQ(knobSettingT->knob_id, knobId);
ASSERT_EQ(knobSettingT->value.type,
hipdnn_flatbuffers_sdk::data_objects::KnobValue::StringValue);
ASSERT_EQ(knobSettingT->value.AsStringValue()->value, value);
}
// ============================================================================
// Validation limit tests
// ============================================================================
TEST_F(TestKnobSettingDescriptor, SetEmptyKnobIdFails)
{
const std::string emptyId;
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, 0, emptyId.c_str()),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, SetKnobIdExceedsMaxLengthFails)
{
const std::string longId(static_cast<size_t>(KnobSettingDescriptor::MAX_KNOB_ID_LENGTH + 1),
'x');
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->setAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE,
HIPDNN_TYPE_CHAR,
static_cast<int64_t>(longId.size()),
longId.c_str()),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, SetKnobIdAtMaxLengthSucceeds)
{
const std::string maxId(static_cast<size_t>(KnobSettingDescriptor::MAX_KNOB_ID_LENGTH), 'x');
ASSERT_NO_THROW(getDescriptor()->setAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE,
HIPDNN_TYPE_CHAR,
static_cast<int64_t>(maxId.size()),
maxId.c_str()));
}
TEST_F(TestKnobSettingDescriptor, SetKnobStringValueExceedsMaxLengthFails)
{
const std::string longValue(
static_cast<size_t>(KnobSettingDescriptor::MAX_KNOB_STRING_VALUE_LENGTH + 1), 'y');
ASSERT_THROW_HIPDNN_STATUS(getDescriptor()->setAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE,
HIPDNN_TYPE_CHAR,
static_cast<int64_t>(longValue.size()),
longValue.c_str()),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, SetKnobStringValueAtMaxLengthSucceeds)
{
const std::string maxValue(
static_cast<size_t>(KnobSettingDescriptor::MAX_KNOB_STRING_VALUE_LENGTH), 'y');
ASSERT_NO_THROW(getDescriptor()->setAttribute(HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE,
HIPDNN_TYPE_CHAR,
static_cast<int64_t>(maxValue.size()),
maxValue.c_str()));
}
TEST_F(TestKnobSettingDescriptor, SetKnobIdNegativeElementCountFails)
{
const std::string knobId = "test";
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->setAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, -1, knobId.c_str()),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, GetKnobIdNegativeRequestedCountFails)
{
makeFinalized();
std::array<char, 16> buffer{};
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, -1, nullptr, buffer.data()),
HIPDNN_STATUS_BAD_PARAM);
}
TEST_F(TestKnobSettingDescriptor, GetStringValueNegativeRequestedCountFails)
{
setKnobId("test_knob");
setStringValue("some_value");
ASSERT_NO_THROW(getDescriptor()->finalize());
std::array<char, 16> buffer{};
ASSERT_THROW_HIPDNN_STATUS(
getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_CHAR, -1, nullptr, buffer.data()),
HIPDNN_STATUS_BAD_PARAM);
}
// ============================================================================
// Overwrite behavior tests
// ============================================================================
TEST_F(TestKnobSettingDescriptor, OverwriteKnobIdBeforeFinalize)
{
setKnobId("first_id");
setKnobId("second_id");
setInt64Value(42);
ASSERT_NO_THROW(getDescriptor()->finalize());
// Verify the second ID took effect
int64_t count = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, 0, &count, nullptr));
ASSERT_EQ(count, static_cast<int64_t>(std::string("second_id").size() + 1));
std::vector<char> buffer(static_cast<size_t>(count));
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, HIPDNN_TYPE_CHAR, count, nullptr, buffer.data()));
ASSERT_EQ(std::string(buffer.data()), "second_id");
}
TEST_F(TestKnobSettingDescriptor, OverwriteKnobValueBeforeFinalize)
{
setKnobId("test_knob");
setInt64Value(10);
setInt64Value(99);
ASSERT_NO_THROW(getDescriptor()->finalize());
// Verify the second value took effect
int64_t actualValue = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_INT64, 1, nullptr, &actualValue));
ASSERT_EQ(actualValue, 99);
}
TEST_F(TestKnobSettingDescriptor, OverwriteKnobValueTypeBeforeFinalize)
{
setKnobId("test_knob");
setInt64Value(42);
setDoubleValue(3.14);
ASSERT_NO_THROW(getDescriptor()->finalize());
// Verify the value is now a double
double actualValue = 0.0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_DOUBLE, 1, nullptr, &actualValue));
ASSERT_DOUBLE_EQ(actualValue, 3.14);
}
TEST_F(TestKnobSettingDescriptor, OverwriteIntValueWithStringBeforeFinalize)
{
setKnobId("test_knob");
setInt64Value(42);
setStringValue("overwritten");
ASSERT_NO_THROW(getDescriptor()->finalize());
// Verify the value is now a string
int64_t count = 0;
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_CHAR, 0, &count, nullptr));
ASSERT_EQ(count, static_cast<int64_t>(std::string("overwritten").size() + 1));
std::vector<char> buffer(static_cast<size_t>(count));
ASSERT_NO_THROW(getDescriptor()->getAttribute(
HIPDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, HIPDNN_TYPE_CHAR, count, nullptr, buffer.data()));
ASSERT_EQ(std::string(buffer.data()), "overwritten");
}