blob: e60158682fc65e8b9156ccc44480dedea2351f65 [file] [log] [blame] [edit]
/*
* SPDX-FileCopyrightText: Copyright (c) 2023-2024 NVIDIA CORPORATION &
* AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using ::testing::ElementsAre;
#include "utils.hpp"
#include <sdbusplus/bus.hpp>
TEST(ConvertUUIDToString, testGoodConversionToString)
{
std::vector<uint8_t> intUUID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
0x0c, 0x0d, 0x0e, 0x0f};
// convert intUUID to stringUUID
uuid_t stringUUID = utils::convertUUIDToString(intUUID);
EXPECT_STREQ(stringUUID.c_str(), "00010203-0405-0607-0809-0a0b0c0d0e0f\0");
}
TEST(ConvertUUIDToString, testGBadConversionToString)
{
std::vector<uint8_t> intUUID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
// convert intUUID to stringUUID
uuid_t stringUUID = utils::convertUUIDToString(intUUID);
EXPECT_STREQ(stringUUID.c_str(), "");
}
TEST(convertHexToString, testGoodHexConversionToString)
{
std::vector<uint8_t> data{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
// convert HEX to a string
std::string result = utils::convertHexToString(data, data.size());
EXPECT_STREQ(result.c_str(), "0001020304050607\0");
}
TEST(convertHexToString, testBadHexConversionToString)
{
std::vector<uint8_t> data;
// convert HEX to a string
std::string result = utils::convertHexToString(data, data.size());
EXPECT_STREQ(result.c_str(), "");
}
TEST(isValidDbusString, testGoodIsValidDbusString)
{
// test 1 byte
EXPECT_TRUE(utils::isValidDbusString("\x41\x41\x41"));
// test 2 bytes
EXPECT_TRUE(utils::isValidDbusString("\xC3\xA9\xC3\xA9\xC3\xA9"));
// test 3 bytes
EXPECT_TRUE(
utils::isValidDbusString("\xE2\x82\xAC\xE2\x82\xAC\xE2\x82\xAC"));
// test 4 bytes
EXPECT_TRUE(utils::isValidDbusString(
"\xF0\x90\x8D\x88\xF0\x90\x8D\x88\xF0\x90\x8D\x88"));
}
TEST(isValidDbusString, testBadIsValidDbusString)
{
// test 1 byte, it must be <= 0x7f
EXPECT_FALSE(utils::isValidDbusString("\x80"));
// test 2 bytes, the first two bits of the leading byte
// should be 11b
EXPECT_FALSE(utils::isValidDbusString("\xE3\xA9"));
// test 2 bytes, the first two bits of the subsequent byte
// should be 10b
EXPECT_FALSE(utils::isValidDbusString("\xC3\xE9"));
// test 3 bytes, the first three bits of the leading byte
// should be 111b
EXPECT_FALSE(utils::isValidDbusString("\xF2\x82\xAC"));
// test 3 bytes, the first two bits of the subsequent byte
// should be 10b
EXPECT_FALSE(utils::isValidDbusString("\xE2\xF2\xAC"));
// test 4 bytes, the first four bits of the leading byte
// should be 1111b
EXPECT_FALSE(utils::isValidDbusString("\xC0\x90\x8D\x88"));
// test 4 bytes, the first two bits of the subsequent byte
// should be 10b
EXPECT_FALSE(utils::isValidDbusString("\xF0\x90\xFD\x88"));
}
TEST(makeDBusNameValid, Functional)
{
const std::vector<std::array<std::string, 2>> data{
{{"HGX_GPU_SXM 1 DRAM_0_Temp_0", "HGX_GPU_SXM_1_DRAM_0_Temp_0"}},
{{"HGX_GPU_SXM 1 &^* DRAM_0_Temp_0", "HGX_GPU_SXM_1_DRAM_0_Temp_0"}},
{{"/xyz/openbmc_project/inventory/system/processors/GPU_SXM_1",
"/xyz/openbmc_project/inventory/system/processors/GPU_SXM_1"}},
{{"/xyz/openbmc_project/inventory/system/processors/GPU_SXM 1 DRAM_0",
"/xyz/openbmc_project/inventory/system/processors/GPU_SXM_1_DRAM_0"}},
{{"xyz.openbmc_project.Configuration.NSM_Temp",
"xyz.openbmc_project.Configuration.NSM_Temp"}},
{{"xyz.openbmc_project.Sensor.HGX_GPU_SXM 1 DRAM_0_Temp_0",
"xyz.openbmc_project.Sensor.HGX_GPU_SXM_1_DRAM_0_Temp_0"}},
};
for (const auto& e : data)
{
EXPECT_STREQ(utils::makeDBusNameValid(e[0]).c_str(), e[1].c_str());
}
}
TEST(getDeviceNameFromDeviceType, ValidDeviceTypes)
{
EXPECT_EQ(utils::getDeviceNameFromDeviceType(0), "GPU");
EXPECT_EQ(utils::getDeviceNameFromDeviceType(1), "SWITCH");
EXPECT_EQ(utils::getDeviceNameFromDeviceType(2), "BRIDGE");
EXPECT_EQ(utils::getDeviceNameFromDeviceType(3), "BASEBOARD");
EXPECT_EQ(utils::getDeviceNameFromDeviceType(4), "EROT");
EXPECT_EQ(utils::getDeviceNameFromDeviceType(5), "MCTPBRIDGE");
}
TEST(getDeviceNameFromDeviceType, UnknownDeviceType)
{
EXPECT_EQ(utils::getDeviceNameFromDeviceType(6), "NSM_DEV_ID_UNKNOWN");
EXPECT_EQ(utils::getDeviceNameFromDeviceType(255), "NSM_DEV_ID_UNKNOWN");
}
TEST(getDeviceInstanceName, ValidInstances)
{
EXPECT_EQ(utils::getDeviceInstanceName(0, 0), "GPU_0");
EXPECT_EQ(utils::getDeviceInstanceName(1, 1), "SWITCH_1");
EXPECT_EQ(utils::getDeviceInstanceName(2, 2), "BRIDGE_2");
EXPECT_EQ(utils::getDeviceInstanceName(3, 3), "BASEBOARD_3");
EXPECT_EQ(utils::getDeviceInstanceName(4, 4), "EROT_4");
EXPECT_EQ(utils::getDeviceInstanceName(5, 5), "MCTPBRIDGE_5");
}
TEST(getDeviceInstanceName, UnknownTypeWithValidInstance)
{
EXPECT_EQ(utils::getDeviceInstanceName(6, 0), "NSM_DEV_ID_UNKNOWN_0");
}
TEST(setBit, TestSettingBits)
{
utils::Bitfield256 bitMap{};
EXPECT_TRUE(bitMap.setBit(2));
EXPECT_EQ(bitMap.fields[0].byte, 0b00000000000000000000000000000100);
EXPECT_FALSE(bitMap.setBit(2));
EXPECT_TRUE(bitMap.setBit(33));
EXPECT_EQ(bitMap.fields[0].byte, 0b00000000000000000000000000000100);
EXPECT_EQ(bitMap.fields[1].byte, 0b00000000000000000000000000000010);
}
TEST(getSetBits, TestNoSetBits)
{
utils::Bitfield256 emptyBitField{};
EXPECT_EQ(emptyBitField.getSetBits(), "");
}
TEST(getSetBits, TestSetBits)
{
utils::Bitfield256 bitMap;
bitMap.fields[0].byte = 0b00000000000000000000000000000001;
EXPECT_EQ(bitMap.getSetBits(), "0");
bitMap.fields[0].byte = 0b00000000000000000000000000001101;
EXPECT_EQ(bitMap.getSetBits(), "0, 2, 3");
bitMap.fields[0].byte = 0b00000000000000000000000011110000;
bitMap.fields[2].byte = 0b00000000000000000000000000000001;
EXPECT_EQ(bitMap.getSetBits(), "4, 5, 6, 7, 64");
}
TEST(memFd, TestGoodWriteRead)
{
int fd = memfd_create("test", 0);
std::vector<uint8_t> data{0x01, 0x02, 0x03, 0x04, 0x05};
utils::writeBufferToFd(fd, data);
EXPECT_GT(fd, 0);
std::vector<uint8_t> readData;
utils::readFdToBuffer(fd, readData);
EXPECT_THAT(data, ElementsAre(0x01, 0x02, 0x03, 0x04, 0x05));
}
TEST(memFd, TestGoodWriteReadForEmptyBuffer)
{
int fd = memfd_create("test", 0);
std::vector<uint8_t> data;
utils::writeBufferToFd(fd, data);
EXPECT_GT(fd, 0);
std::vector<uint8_t> readData;
utils::readFdToBuffer(fd, readData);
EXPECT_THAT(data, ElementsAre());
}
TEST(convertMacAddressToString, TestGoodConversionMacAddressToString)
{
std::vector<uint8_t> macAddress{0x01, 0x01, 0x02, 0x03,
0x04, 0x05, 0x00, 0x00};
std::string macAddressString;
macAddressString.resize(sizeof("XX:XX:XX:XX:XX:XX"));
utils::convertMacAddressToString(macAddress.data(), macAddress.size(),
macAddressString);
macAddressString.resize(strlen(macAddressString.c_str()));
EXPECT_EQ(macAddressString, "01:01:02:03:04:05");
}
TEST(convertMacAddressToString, TestBadConversionMacAddressToString)
{
std::vector<uint8_t> macAddress{0x01, 0x01, 0x02, 0x03};
std::string macAddressString;
macAddressString.resize(sizeof("XX:XX:XX:XX:XX:XX"));
utils::convertMacAddressToString(macAddress.data(), macAddress.size(),
macAddressString);
macAddressString.resize(strlen(macAddressString.c_str()));
EXPECT_EQ(macAddressString, "");
}
TEST(convertGuid64ToString, TestGoodConversionGuid64ToString)
{
uint64_t guid = 0x0102030405060708;
std::string guidString;
utils::convertGuid64ToString(guid, guidString);
EXPECT_EQ(guidString, "0102-0304-0506-0708");
}