diff options
author | Sybren A. Stüvel <sybren@blender.org> | 2021-09-17 12:53:00 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@blender.org> | 2021-09-17 13:22:00 +0300 |
commit | e1d7ce005f9f9ca84befdd531014d498966f27fc (patch) | |
tree | f518b7fa618a615d4a75f13e983e4f690ee759bd /source/blender/blenlib/tests | |
parent | 1cd20b0026838c3fb69c0b273db8513f89f31f22 (diff) |
Blenlib: introduce a UUID type
Add `BLI_uuid` and `DNA_uuid_types.h` with a UUID implementation
following RFC4122 (https://datatracker.ietf.org/doc/html/rfc4122.html).
The following features are implemented:
- A struct of 128 bits that can be used in DNA definitions.
- Generation of version 4 UUIDs, that is, purely random ones.
- UUID equality function.
- String to UUID and UUID to string conversion functions that are
compatible with RFC4122.
- C++ stream operator that outputs the UUID as string.
This UUID will be used by the asset system, to uniquely identify asset
catalogs.
Reviewed By: Severin, jacqueslucke
Differential Revision: https://developer.blender.org/D12475
Diffstat (limited to 'source/blender/blenlib/tests')
-rw-r--r-- | source/blender/blenlib/tests/BLI_uuid_test.cc | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/source/blender/blenlib/tests/BLI_uuid_test.cc b/source/blender/blenlib/tests/BLI_uuid_test.cc new file mode 100644 index 00000000000..2c9da920897 --- /dev/null +++ b/source/blender/blenlib/tests/BLI_uuid_test.cc @@ -0,0 +1,132 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "testing/testing.h" +#include <cstring> + +#include "BLI_uuid.h" + +TEST(BLI_uuid, generate_random) +{ + const UUID uuid = BLI_uuid_generate_random(); + + // The 4 MSbits represent the "version" of the UUID. + const uint16_t version = uuid.time_hi_and_version >> 12; + EXPECT_EQ(version, 4); + + // The 2 MSbits should be 0b10, indicating compliance with RFC4122. + const uint8_t reserved = uuid.clock_seq_hi_and_reserved >> 6; + EXPECT_EQ(reserved, 0b10); +} + +TEST(BLI_uuid, generate_many_random) +{ + const UUID first_uuid = BLI_uuid_generate_random(); + + /* Generate lots of UUIDs to get some indication that the randomness is okay. */ + for (int i = 0; i < 1000000; ++i) { + const UUID uuid = BLI_uuid_generate_random(); + EXPECT_FALSE(BLI_uuid_equal(first_uuid, uuid)); + + // Check that the non-random bits are set according to RFC4122. + const uint16_t version = uuid.time_hi_and_version >> 12; + EXPECT_EQ(version, 4); + const uint8_t reserved = uuid.clock_seq_hi_and_reserved >> 6; + EXPECT_EQ(reserved, 0b10); + } +} + +TEST(BLI_uuid, equality) +{ + const UUID uuid1 = BLI_uuid_generate_random(); + const UUID uuid2 = BLI_uuid_generate_random(); + + EXPECT_TRUE(BLI_uuid_equal(uuid1, uuid1)); + EXPECT_FALSE(BLI_uuid_equal(uuid1, uuid2)); +} + +TEST(BLI_uuid, string_formatting) +{ + UUID uuid; + std::string buffer(36, '\0'); + + memset(&uuid, 0, sizeof(uuid)); + BLI_uuid_format(buffer.data(), uuid); + EXPECT_EQ("00000000-0000-0000-0000-000000000000", buffer); + + /* Demo of where the bits end up in the formatted string. */ + uuid.time_low = 1; + uuid.time_mid = 2; + uuid.time_hi_and_version = 3; + uuid.clock_seq_hi_and_reserved = 4; + uuid.clock_seq_low = 5; + uuid.node[0] = 6; + uuid.node[5] = 7; + BLI_uuid_format(buffer.data(), uuid); + EXPECT_EQ("00000001-0002-0003-0405-060000000007", buffer); + + /* Somewhat more complex bit patterns. This is a version 1 UUID generated from Python. */ + const UUID uuid1 = {3540651616, 5282, 4588, 139, 153, 0xf7, 0x73, 0x69, 0x44, 0xdb, 0x8b}; + BLI_uuid_format(buffer.data(), uuid1); + EXPECT_EQ("d30a0e60-14a2-11ec-8b99-f7736944db8b", buffer); + + /* Namespace UUID, example listed in RFC4211. */ + const UUID namespace_dns = { + 0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8}; + BLI_uuid_format(buffer.data(), namespace_dns); + EXPECT_EQ("6ba7b810-9dad-11d1-80b4-00c04fd430c8", buffer); +} + +TEST(BLI_uuid, string_parsing_ok) +{ + UUID uuid; + std::string buffer(36, '\0'); + + const bool parsed_ok = BLI_uuid_parse_string(&uuid, "d30a0e60-14a2-11ec-8b99-f7736944db8b"); + EXPECT_TRUE(parsed_ok); + BLI_uuid_format(buffer.data(), uuid); + EXPECT_EQ("d30a0e60-14a2-11ec-8b99-f7736944db8b", buffer); +} + +TEST(BLI_uuid, string_parsing_capitalisation) +{ + UUID uuid; + std::string buffer(36, '\0'); + + /* RFC4122 demands acceptance of upper-case hex digits. */ + const bool parsed_ok = BLI_uuid_parse_string(&uuid, "D30A0E60-14A2-11EC-8B99-F7736944DB8B"); + EXPECT_TRUE(parsed_ok); + BLI_uuid_format(buffer.data(), uuid); + + /* Software should still output lower-case hex digits, though. */ + EXPECT_EQ("d30a0e60-14a2-11ec-8b99-f7736944db8b", buffer); +} + +TEST(BLI_uuid, string_parsing_fail) +{ + UUID uuid; + std::string buffer(36, '\0'); + + const bool parsed_ok = BLI_uuid_parse_string(&uuid, "d30a0e60!14a2-11ec-8b99-f7736944db8b"); + EXPECT_FALSE(parsed_ok); +} + +TEST(BLI_uuid, stream_operator) +{ + std::stringstream ss; + const UUID uuid = {3540651616, 5282, 4588, 139, 153, 0xf7, 0x73, 0x69, 0x44, 0xdb, 0x8b}; + ss << uuid; + EXPECT_EQ(ss.str(), "d30a0e60-14a2-11ec-8b99-f7736944db8b"); +} |