]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
lib/uuid_kunit: add tests for the four random UUID/GUID generators
authorStepan Ionichev <sozdayvek@gmail.com>
Sat, 16 May 2026 12:09:15 +0000 (17:09 +0500)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 29 May 2026 04:24:58 +0000 (21:24 -0700)
uuid_kunit currently exercises only guid_parse() and uuid_parse() (plus
their invalid-input paths).  The four random generators exported from
lib/uuid.c -- generate_random_uuid(), generate_random_guid(), uuid_gen()
and guid_gen() -- have no direct kunit coverage.

Random output cannot be compared against a fixed expected value, but RFC
4122 section 4.4 specifies two invariants that any version-4 random
UUID/GUID must satisfy:

  - version 4 in the high nibble of the version byte
    (byte 6 in the wire uuid_t layout, byte 7 in the byte-swapped
    guid_t layout);
  - variant DCE 1.1 (binary 10x) in the high bits of byte 8.

Add four test cases that invoke each generator several times and verify
these bit patterns hold.  The same checks catch a regression in either the
mask/OR sequence in the generators or the layout constants.  Run the loop
a handful of times to cover the small but non-zero chance that an unmasked
random byte happens to satisfy the version/variant pattern by accident on
a single call.

Link: https://lore.kernel.org/20260516120915.40544-1-sozdayvek@gmail.com
Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com>
Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Brendan Higgins <brendan.higgins@linux.dev>
Cc: David Gow <david@davidgow.net>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/tests/uuid_kunit.c

index de71b2649dac6bec62c28fdc12dfcef44c19d043..2ef64fbe67d6f9de5762ac8d625332957cc9f1ee 100644 (file)
@@ -86,11 +86,67 @@ static void uuid_test_uuid_invalid(struct kunit *test)
        }
 }
 
+/*
+ * RFC 4122 section 4.4 says random UUIDs/GUIDs (version 4) must have:
+ *   - version 4 in the high nibble of the version byte,
+ *   - variant DCE 1.1 (binary 10x) in the high bits of byte 8.
+ *
+ * The version byte is byte 6 in the "wire" uuid_t layout and byte 7 in
+ * the byte-swapped guid_t layout.
+ */
+static void uuid_test_uuid_gen(struct kunit *test)
+{
+       uuid_t u;
+
+       for (unsigned int i = 0; i < 8; i++) {
+               uuid_gen(&u);
+               KUNIT_EXPECT_EQ(test, u.b[6] & 0xf0, 0x40);
+               KUNIT_EXPECT_EQ(test, u.b[8] & 0xc0, 0x80);
+       }
+}
+
+static void uuid_test_guid_gen(struct kunit *test)
+{
+       guid_t g;
+
+       for (unsigned int i = 0; i < 8; i++) {
+               guid_gen(&g);
+               KUNIT_EXPECT_EQ(test, g.b[7] & 0xf0, 0x40);
+               KUNIT_EXPECT_EQ(test, g.b[8] & 0xc0, 0x80);
+       }
+}
+
+static void uuid_test_generate_random_uuid(struct kunit *test)
+{
+       unsigned char buf[16];
+
+       for (unsigned int i = 0; i < 8; i++) {
+               generate_random_uuid(buf);
+               KUNIT_EXPECT_EQ(test, buf[6] & 0xf0, 0x40);
+               KUNIT_EXPECT_EQ(test, buf[8] & 0xc0, 0x80);
+       }
+}
+
+static void uuid_test_generate_random_guid(struct kunit *test)
+{
+       unsigned char buf[16];
+
+       for (unsigned int i = 0; i < 8; i++) {
+               generate_random_guid(buf);
+               KUNIT_EXPECT_EQ(test, buf[7] & 0xf0, 0x40);
+               KUNIT_EXPECT_EQ(test, buf[8] & 0xc0, 0x80);
+       }
+}
+
 static struct kunit_case uuid_test_cases[] = {
        KUNIT_CASE(uuid_test_guid_valid),
        KUNIT_CASE(uuid_test_uuid_valid),
        KUNIT_CASE(uuid_test_guid_invalid),
        KUNIT_CASE(uuid_test_uuid_invalid),
+       KUNIT_CASE(uuid_test_uuid_gen),
+       KUNIT_CASE(uuid_test_guid_gen),
+       KUNIT_CASE(uuid_test_generate_random_uuid),
+       KUNIT_CASE(uuid_test_generate_random_guid),
        {},
 };