mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 11:03:07 -04:00
drm/xe/tests: Add string encoding helper test
Before we start using string to KLV encoding helper, add a simple test to make sure it works as expected. Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Reviewed-by: Michał Winiarski <michal.winiarski@intel.com> #v1 Link: https://patch.msgid.link/20260708180755.2684-1-michal.wajdeczko@intel.com
This commit is contained in:
@@ -84,10 +84,94 @@ static void test_encode_u64(struct kunit *test)
|
||||
KUNIT_ASSERT_PTR_EQ(test, fail, xe_guc_klv_encode_u64(fail, ARRAY_SIZE(klvs), key, value));
|
||||
}
|
||||
|
||||
static u32 str_klv_size(const char *string)
|
||||
{
|
||||
return GUC_KLV_LEN_MIN + to_num_dwords(strlen(string) + 1);
|
||||
}
|
||||
|
||||
static void test_encode_string(struct kunit *test)
|
||||
{
|
||||
size_t longest_str = to_num_bytes(FIELD_MAX(GUC_KLV_0_LEN)) - 1;
|
||||
u32 avail = GUC_KLV_LEN_MIN + FIELD_MAX(GUC_KLV_0_LEN) + 1;
|
||||
const char *string = "abcdefghijklmnopqrstvwxyz";
|
||||
u16 key = TEST_KEY;
|
||||
u32 *klvs;
|
||||
u32 *next;
|
||||
char *buf;
|
||||
u32 n;
|
||||
|
||||
klvs = kunit_kcalloc(test, avail, sizeof(u32), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, klvs);
|
||||
|
||||
buf = kunit_kzalloc(test, longest_str + 2, GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
|
||||
|
||||
/* empty string, no space, must fail */
|
||||
for (n = 0; n < str_klv_size(""); n++) {
|
||||
klvs[0] = TEST_PAD;
|
||||
KUNIT_EXPECT_PTR_EQ(test, ERR_PTR(-ENOSPC),
|
||||
xe_guc_klv_encode_string(klvs, n, key, ""));
|
||||
KUNIT_EXPECT_EQ(test, klvs[0], TEST_PAD);
|
||||
}
|
||||
|
||||
/* empty string, must pass */
|
||||
KUNIT_EXPECT_PTR_EQ(test, klvs + str_klv_size(""),
|
||||
xe_guc_klv_encode_string(klvs, str_klv_size(""), key, ""));
|
||||
KUNIT_EXPECT_PTR_EQ(test, klvs + str_klv_size(""),
|
||||
xe_guc_klv_encode_string(klvs, avail, key, ""));
|
||||
|
||||
/* demo string, no space, must fail */
|
||||
for (n = 0; n < str_klv_size(string); n++) {
|
||||
klvs[0] = TEST_PAD;
|
||||
KUNIT_EXPECT_PTR_EQ(test, ERR_PTR(-ENOSPC),
|
||||
xe_guc_klv_encode_string(klvs, n, key, string));
|
||||
KUNIT_EXPECT_EQ(test, klvs[0], TEST_PAD);
|
||||
}
|
||||
|
||||
/* different string len, must pass */
|
||||
for (n = 0; n <= strlen(string); n++) {
|
||||
strscpy(buf, string, n + 1);
|
||||
kunit_info(test, "%u: '%s'\n", n, buf);
|
||||
KUNIT_ASSERT_EQ(test, n, strlen(buf));
|
||||
memset32(klvs, TEST_PAD, avail);
|
||||
|
||||
next = xe_guc_klv_encode_string(klvs, str_klv_size(buf), key, buf);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, next);
|
||||
KUNIT_EXPECT_PTR_EQ(test, next, klvs + str_klv_size(buf));
|
||||
KUNIT_EXPECT_STREQ_MSG(test, buf, (char *)(klvs + GUC_KLV_LEN_MIN), "n=%u", n);
|
||||
kunit_info(test, "%u: %*ph\n", n, (int)to_num_bytes(next - klvs), klvs);
|
||||
KUNIT_EXPECT_NE(test, *(next - 1), TEST_PAD);
|
||||
KUNIT_ASSERT_EQ(test, *next, TEST_PAD);
|
||||
|
||||
/* bigger buf doesn't matter */
|
||||
KUNIT_EXPECT_PTR_EQ(test,
|
||||
xe_guc_klv_encode_string(klvs, str_klv_size(buf), key, buf),
|
||||
xe_guc_klv_encode_string(klvs, avail, key, buf));
|
||||
}
|
||||
|
||||
/* don't crash if already failed */
|
||||
KUNIT_EXPECT_PTR_EQ(test, ERR_PTR(-EROFS),
|
||||
xe_guc_klv_encode_string(ERR_PTR(-EROFS), avail, key, ""));
|
||||
|
||||
/* too long string, must fail */
|
||||
memset(buf, 'X', longest_str + 1);
|
||||
buf[longest_str + 1] = '\0';
|
||||
KUNIT_EXPECT_LT(test, longest_str, strlen(buf));
|
||||
KUNIT_EXPECT_PTR_EQ(test, ERR_PTR(-E2BIG),
|
||||
xe_guc_klv_encode_string(klvs, avail, key, buf));
|
||||
|
||||
/* longest string, should pass */
|
||||
buf[longest_str] = '\0';
|
||||
KUNIT_EXPECT_EQ(test, longest_str, strlen(buf));
|
||||
KUNIT_EXPECT_PTR_EQ(test, klvs + str_klv_size(buf),
|
||||
xe_guc_klv_encode_string(klvs, avail, key, buf));
|
||||
}
|
||||
|
||||
static struct kunit_case guc_klv_helpers_test_cases[] = {
|
||||
KUNIT_CASE(test_count),
|
||||
KUNIT_CASE(test_encode_u32),
|
||||
KUNIT_CASE(test_encode_u64),
|
||||
KUNIT_CASE(test_encode_string),
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user