123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- // Copyright 2014 The Crashpad Authors. All rights reserved.
- //
- // 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 "util/misc/uuid.h"
- #include <string.h>
- #include <sys/types.h>
- #include <string>
- #include "base/format_macros.h"
- #include "base/macros.h"
- #include "base/scoped_generic.h"
- #include "base/strings/stringprintf.h"
- #include "gtest/gtest.h"
- namespace crashpad {
- namespace test {
- namespace {
- TEST(UUID, UUID) {
- UUID uuid_zero;
- uuid_zero.InitializeToZero();
- EXPECT_EQ(uuid_zero.data_1, 0u);
- EXPECT_EQ(uuid_zero.data_2, 0u);
- EXPECT_EQ(uuid_zero.data_3, 0u);
- EXPECT_EQ(uuid_zero.data_4[0], 0u);
- EXPECT_EQ(uuid_zero.data_4[1], 0u);
- EXPECT_EQ(uuid_zero.data_5[0], 0u);
- EXPECT_EQ(uuid_zero.data_5[1], 0u);
- EXPECT_EQ(uuid_zero.data_5[2], 0u);
- EXPECT_EQ(uuid_zero.data_5[3], 0u);
- EXPECT_EQ(uuid_zero.data_5[4], 0u);
- EXPECT_EQ(uuid_zero.data_5[5], 0u);
- EXPECT_EQ(uuid_zero.ToString(), "00000000-0000-0000-0000-000000000000");
- static constexpr uint8_t kBytes[16] = {0x00,
- 0x01,
- 0x02,
- 0x03,
- 0x04,
- 0x05,
- 0x06,
- 0x07,
- 0x08,
- 0x09,
- 0x0a,
- 0x0b,
- 0x0c,
- 0x0d,
- 0x0e,
- 0x0f};
- UUID uuid;
- uuid.InitializeFromBytes(kBytes);
- EXPECT_EQ(uuid.data_1, 0x00010203u);
- EXPECT_EQ(uuid.data_2, 0x0405u);
- EXPECT_EQ(uuid.data_3, 0x0607u);
- EXPECT_EQ(uuid.data_4[0], 0x08u);
- EXPECT_EQ(uuid.data_4[1], 0x09u);
- EXPECT_EQ(uuid.data_5[0], 0x0au);
- EXPECT_EQ(uuid.data_5[1], 0x0bu);
- EXPECT_EQ(uuid.data_5[2], 0x0cu);
- EXPECT_EQ(uuid.data_5[3], 0x0du);
- EXPECT_EQ(uuid.data_5[4], 0x0eu);
- EXPECT_EQ(uuid.data_5[5], 0x0fu);
- EXPECT_EQ(uuid.ToString(), "00010203-0405-0607-0809-0a0b0c0d0e0f");
- // Test both operator== and operator!=.
- EXPECT_FALSE(uuid == uuid_zero);
- EXPECT_NE(uuid, uuid_zero);
- UUID uuid_2;
- uuid_2.InitializeFromBytes(kBytes);
- EXPECT_EQ(uuid_2, uuid);
- EXPECT_FALSE(uuid != uuid_2);
- // Make sure that operator== and operator!= check the entire UUID.
- ++uuid.data_1;
- EXPECT_NE(uuid, uuid_2);
- --uuid.data_1;
- ++uuid.data_2;
- EXPECT_NE(uuid, uuid_2);
- --uuid.data_2;
- ++uuid.data_3;
- EXPECT_NE(uuid, uuid_2);
- --uuid.data_3;
- for (size_t index = 0; index < arraysize(uuid.data_4); ++index) {
- ++uuid.data_4[index];
- EXPECT_NE(uuid, uuid_2);
- --uuid.data_4[index];
- }
- for (size_t index = 0; index < arraysize(uuid.data_5); ++index) {
- ++uuid.data_5[index];
- EXPECT_NE(uuid, uuid_2);
- --uuid.data_5[index];
- }
- // Make sure that the UUIDs are equal again, otherwise the test above may not
- // have been valid.
- EXPECT_EQ(uuid_2, uuid);
- static constexpr uint8_t kMoreBytes[16] = {0xff,
- 0xee,
- 0xdd,
- 0xcc,
- 0xbb,
- 0xaa,
- 0x99,
- 0x88,
- 0x77,
- 0x66,
- 0x55,
- 0x44,
- 0x33,
- 0x22,
- 0x11,
- 0x00};
- uuid.InitializeFromBytes(kMoreBytes);
- EXPECT_EQ(uuid.data_1, 0xffeeddccu);
- EXPECT_EQ(uuid.data_2, 0xbbaau);
- EXPECT_EQ(uuid.data_3, 0x9988u);
- EXPECT_EQ(uuid.data_4[0], 0x77u);
- EXPECT_EQ(uuid.data_4[1], 0x66u);
- EXPECT_EQ(uuid.data_5[0], 0x55u);
- EXPECT_EQ(uuid.data_5[1], 0x44u);
- EXPECT_EQ(uuid.data_5[2], 0x33u);
- EXPECT_EQ(uuid.data_5[3], 0x22u);
- EXPECT_EQ(uuid.data_5[4], 0x11u);
- EXPECT_EQ(uuid.data_5[5], 0x00u);
- EXPECT_EQ(uuid.ToString(), "ffeeddcc-bbaa-9988-7766-554433221100");
- EXPECT_NE(uuid, uuid_2);
- EXPECT_NE(uuid, uuid_zero);
- // Test that UUID is standard layout.
- memset(&uuid, 0x45, 16);
- EXPECT_EQ(uuid.data_1, 0x45454545u);
- EXPECT_EQ(uuid.data_2, 0x4545u);
- EXPECT_EQ(uuid.data_3, 0x4545u);
- EXPECT_EQ(uuid.data_4[0], 0x45u);
- EXPECT_EQ(uuid.data_4[1], 0x45u);
- EXPECT_EQ(uuid.data_5[0], 0x45u);
- EXPECT_EQ(uuid.data_5[1], 0x45u);
- EXPECT_EQ(uuid.data_5[2], 0x45u);
- EXPECT_EQ(uuid.data_5[3], 0x45u);
- EXPECT_EQ(uuid.data_5[4], 0x45u);
- EXPECT_EQ(uuid.data_5[5], 0x45u);
- EXPECT_EQ(uuid.ToString(), "45454545-4545-4545-4545-454545454545");
- UUID initialized_generated;
- initialized_generated.InitializeWithNew();
- EXPECT_NE(initialized_generated, uuid_zero);
- }
- TEST(UUID, FromString) {
- static constexpr struct TestCase {
- const char* uuid_string;
- bool success;
- } kCases[] = {
- // Valid:
- {"c6849cb5-fe14-4a79-8978-9ae6034c521d", true},
- {"00000000-0000-0000-0000-000000000000", true},
- {"ffffffff-ffff-ffff-ffff-ffffffffffff", true},
- // Outside HEX range:
- {"7318z10b-c453-4cef-9dc8-015655cb4bbc", false},
- {"7318a10b-c453-4cef-9dz8-015655cb4bbc", false},
- // Incomplete:
- {"15655cb4-", false},
- {"7318f10b-c453-4cef-9dc8-015655cb4bb", false},
- {"318f10b-c453-4cef-9dc8-015655cb4bb2", false},
- {"7318f10b-c453-4ef-9dc8-015655cb4bb2", false},
- {"", false},
- {"abcd", false},
- // Trailing data:
- {"6d247a34-53d5-40ec-a90d-d8dea9e94cc01", false}
- };
- UUID uuid_zero;
- uuid_zero.InitializeToZero();
- const std::string empty_uuid = uuid_zero.ToString();
- for (size_t index = 0; index < arraysize(kCases); ++index) {
- const TestCase& test_case = kCases[index];
- SCOPED_TRACE(base::StringPrintf(
- "index %" PRIuS ": %s", index, test_case.uuid_string));
- UUID uuid;
- uuid.InitializeToZero();
- EXPECT_EQ(uuid.InitializeFromString(test_case.uuid_string),
- test_case.success);
- if (test_case.success) {
- EXPECT_EQ(uuid.ToString(), test_case.uuid_string);
- } else {
- EXPECT_EQ(uuid.ToString(), empty_uuid);
- }
- }
- // Test for case insensitivty.
- UUID uuid;
- uuid.InitializeFromString("F32E5BDC-2681-4C73-A4E6-911FFD89B846");
- EXPECT_EQ(uuid.ToString(), "f32e5bdc-2681-4c73-a4e6-911ffd89b846");
- // Mixed case.
- uuid.InitializeFromString("5762C15D-50b5-4171-a2e9-7429C9EC6CAB");
- EXPECT_EQ(uuid.ToString(), "5762c15d-50b5-4171-a2e9-7429c9ec6cab");
- }
- #if defined(OS_WIN)
- TEST(UUID, FromSystem) {
- ::GUID system_uuid;
- ASSERT_EQ(UuidCreate(&system_uuid), RPC_S_OK);
- UUID uuid;
- uuid.InitializeFromSystemUUID(&system_uuid);
- RPC_WSTR system_string;
- ASSERT_EQ(UuidToString(&system_uuid, &system_string), RPC_S_OK);
- struct ScopedRpcStringFreeTraits {
- static RPC_WSTR* InvalidValue() { return nullptr; }
- static void Free(RPC_WSTR* rpc_string) {
- EXPECT_EQ(RpcStringFree(rpc_string), RPC_S_OK);
- }
- };
- using ScopedRpcString =
- base::ScopedGeneric<RPC_WSTR*, ScopedRpcStringFreeTraits>;
- ScopedRpcString scoped_system_string(&system_string);
- EXPECT_EQ(uuid.ToString16(), reinterpret_cast<wchar_t*>(system_string));
- }
- #endif // OS_WIN
- } // namespace
- } // namespace test
- } // namespace crashpad
|